Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'dvfs'
authoracarpena <alexandra.carpen-amarie@inria.fr>
Mon, 1 Jul 2013 00:36:14 +0000 (17:36 -0700)
committeracarpena <alexandra.carpen-amarie@inria.fr>
Mon, 1 Jul 2013 00:36:14 +0000 (17:36 -0700)
Conflicts:
buildtools/Cmake/MakeExe.cmake
src/include/surf/surf.h
src/surf/simgrid_dtd.c

166 files changed:
.cproject [new file with mode: 0644]
.gitignore
ChangeLog
buildtools/Cmake/AddTests.cmake
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/MakeExe.cmake
buildtools/Cmake/MakeJava.cmake
buildtools/jenkins/run.sh
buildtools/jenkins/runmingw.sh
doc/doxygen/module-msg.doc
examples/java/io/Node.java
examples/msg/actions/actions.tesh
examples/msg/bittorrent/peer.c
examples/msg/io/file.c
examples/msg/io/file_unlink.c
examples/msg/io/io.tesh
examples/msg/masterslave/masterslave_failure.c
examples/msg/masterslave/masterslave_mailbox.c
examples/msg/mc/bugged1.tesh
examples/msg/mc/bugged1_liveness.c
examples/msg/mc/bugged1_liveness.tesh
examples/msg/mc/bugged2.tesh
examples/msg/pastry/CMakeLists.txt [new file with mode: 0644]
examples/msg/pastry/pastry.c [new file with mode: 0644]
examples/msg/pastry/pastry.tesh [new file with mode: 0644]
examples/msg/pastry/pastry10.xml [new file with mode: 0644]
examples/msg/pastry/pastry_crosstraffic.tesh [new file with mode: 0644]
examples/msg/pmm/msg_pmm.c
examples/msg/properties/msg_prop.c
examples/msg/semaphores/CMakeLists.txt [new file with mode: 0644]
examples/msg/semaphores/synchro.c [new file with mode: 0644]
examples/platforms/content/storage_content.txt
examples/platforms/storage.xml
examples/simdag/goal/goal_test.c
examples/smpi/CMakeLists.txt
examples/smpi/replay/actions_allgatherv.txt [new file with mode: 0644]
examples/smpi/replay/actions_gather.txt [new file with mode: 0644]
examples/smpi/replay/actions_reducescatter.txt [new file with mode: 0644]
examples/smpi/replay/smpi_replay.tesh
include/msg/datatypes.h
include/msg/msg.h
include/simgrid/platf.h
include/simgrid/simix.h
include/smpi/mpif.h
include/smpi/smpi.h
include/surf/surfxml_parse.h
include/xbt/file_stat.h [deleted file]
src/bindings/java/jmsg.c
src/bindings/java/jmsg.h
src/bindings/java/jmsg_as.c [new file with mode: 0644]
src/bindings/java/jmsg_as.h [new file with mode: 0644]
src/bindings/java/jmsg_file.c
src/bindings/java/jmsg_file.h
src/bindings/java/jmsg_host.c
src/bindings/java/jmsg_host.h
src/bindings/java/jmsg_synchro.c
src/bindings/java/jmsg_synchro.h
src/bindings/java/jmsg_vm.h
src/bindings/java/org/simgrid/msg/As.java [new file with mode: 0644]
src/bindings/java/org/simgrid/msg/File.java
src/bindings/java/org/simgrid/msg/Host.java
src/bindings/java/org/simgrid/msg/Msg.java
src/bindings/java/org/simgrid/msg/Semaphore.java [new file with mode: 0644]
src/include/smpi/smpi_interface.h
src/include/surf/surf.h
src/include/xbt/xbt_os_time.h
src/mc/mc_compare.c
src/mc/mc_dpor.c
src/mc/mc_global.c
src/mc/mc_private.h
src/mc/mc_request.c
src/msg/msg_environment.c
src/msg/msg_host.c
src/msg/msg_io.c
src/msg/msg_process.c
src/msg/msg_synchro.c [new file with mode: 0644]
src/simdag/sd_daxloader.c
src/simgrid/sg_config.c
src/simix/smx_context_raw.c
src/simix/smx_global.c
src/simix/smx_host.c
src/simix/smx_host_private.h
src/simix/smx_io.c
src/simix/smx_io_private.h
src/simix/smx_network.c
src/simix/smx_private.h
src/simix/smx_smurf_private.h
src/simix/smx_synchro.c
src/simix/smx_user.c
src/smpi/colls/allgather-ompi-neighborexchange.c [new file with mode: 0644]
src/smpi/colls/allgatherv-mpich-rdb.c [new file with mode: 0644]
src/smpi/colls/allgatherv-ompi-bruck.c [new file with mode: 0644]
src/smpi/colls/allgatherv-ompi-neighborexchange.c [new file with mode: 0644]
src/smpi/colls/allreduce-ompi-ring-segmented.c [new file with mode: 0644]
src/smpi/colls/alltoall-ompi-pairwise.c [new file with mode: 0644]
src/smpi/colls/alltoallv-ompi-basic-linear.c [new file with mode: 0644]
src/smpi/colls/barrier-ompi.c [new file with mode: 0644]
src/smpi/colls/bcast-arrival-nb.c
src/smpi/colls/bcast-arrival-pattern-aware.c
src/smpi/colls/bcast-ompi-pipeline.c [new file with mode: 0644]
src/smpi/colls/bcast-ompi-split-bintree.c [new file with mode: 0644]
src/smpi/colls/coll_tuned_topo.c [new file with mode: 0644]
src/smpi/colls/coll_tuned_topo.h [new file with mode: 0644]
src/smpi/colls/colls.h
src/smpi/colls/gather-ompi.c [new file with mode: 0644]
src/smpi/colls/reduce-binomial.c
src/smpi/colls/reduce-ompi.c [new file with mode: 0644]
src/smpi/colls/reduce_scatter-mpich.c [new file with mode: 0644]
src/smpi/colls/reduce_scatter-ompi.c [new file with mode: 0644]
src/smpi/colls/scatter-ompi.c [new file with mode: 0644]
src/smpi/colls/smpi_mpich_selector.c [new file with mode: 0644]
src/smpi/colls/smpi_openmpi_selector.c [new file with mode: 0644]
src/smpi/private.h
src/smpi/smpi_base.c
src/smpi/smpi_bench.c
src/smpi/smpi_coll.c
src/smpi/smpi_f77.c
src/smpi/smpi_global.c
src/smpi/smpi_mpi.c
src/smpi/smpi_mpi_dt.c
src/smpi/smpi_mpi_dt_private.h
src/smpi/smpi_pmpi.c
src/smpi/smpi_replay.c
src/surf/cpu_cas01.c
src/surf/new_model.c
src/surf/simgrid.dtd
src/surf/simgrid_dtd.c
src/surf/storage.c
src/surf/storage_private.h
src/surf/surf_private.h
src/surf/surf_routing.c
src/surf/surf_routing_dijkstra.c
src/surf/surfxml_parse.c
src/surf/workstation.c
src/xbt/automaton/parserPromela.tab.cacc
src/xbt/automaton/parserPromela.tab.hacc
src/xbt/dynar.c
src/xbt/log.c
src/xbt/xbt_os_time.c
teshsuite/simdag/platforms/Evaluate_get_route_time.c
teshsuite/simdag/platforms/Evaluate_parse_time.c
teshsuite/simdag/platforms/flatifier.c
teshsuite/smpi/CMakeLists.txt
teshsuite/smpi/allreduce_coll.c
teshsuite/smpi/allreduce_coll_large.tesh [new file with mode: 0644]
teshsuite/smpi/barrier.c
teshsuite/smpi/barrier_coll.tesh [new file with mode: 0644]
teshsuite/smpi/bcast_coll.c
teshsuite/smpi/bcast_coll.tesh
teshsuite/smpi/gather_coll.c [new file with mode: 0644]
teshsuite/smpi/gather_coll.tesh [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/redscat.c
teshsuite/smpi/mpich-test/coll/runtests
teshsuite/smpi/mpich-test/env/runtests
teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c
teshsuite/smpi/mpich-test/pt2pt/sendrecv.c
teshsuite/smpi/reduce_coll.c
teshsuite/smpi/reduce_coll.tesh
teshsuite/smpi/reduce_scatter_coll.c [new file with mode: 0644]
teshsuite/smpi/reduce_scatter_coll.tesh [new file with mode: 0644]
teshsuite/smpi/scatter_coll.tesh [new file with mode: 0644]
teshsuite/smpi/shared.c [new file with mode: 0644]
teshsuite/smpi/shared.tesh [new file with mode: 0644]
tools/check_dist_archive
tools/check_dist_archive.exclude

diff --git a/.cproject b/.cproject
new file mode 100644 (file)
index 0000000..2d167a8
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 5.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
+       <storageModule moduleId="org.eclipse.cdt.core.settings">
+               <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1353180652">
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1353180652" name="Default"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_cdtBuildSystem" version="4.0.0"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.externalSettings"/>
+               </cconfiguration>
+       </storageModule>
+       <storageModule moduleId="org.eclipse.cdt.core.pathentry">
+               <pathentry kind="mac" name="main" path="" value="smpi_simulated_main"/>
+               <pathentry include="/usr/include/lua5.1" kind="inc" path="" system="true"/>
+               <pathentry include="/usr/include" kind="inc" path="" system="true"/>
+               <pathentry base-path="simgrid" include="include" kind="inc" path="" system="true"/>
+               <pathentry base-path="simgrid" include="src/include" kind="inc" path="" system="true"/>
+               <pathentry base-path="simgrid" include="src" kind="inc" path="" system="true"/>
+               <pathentry excluding="**/CMakeFiles/" kind="out" path=""/>
+               <pathentry kind="src" path=""/>
+       </storageModule>
+       <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+               <project id="simgrid.null.697056024" name="simgrid"/>
+       </storageModule>
+       <storageModule moduleId="refreshScope" versionNumber="2">
+               <configuration configurationName="Default">
+                       <resource resourceType="PROJECT" workspacePath="/simgrid"/>
+               </configuration>
+       </storageModule>
+       <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+       <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+       <storageModule moduleId="scannerConfiguration">
+               <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+               <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+                       <buildOutputProvider>
+                               <openAction enabled="true" filePath=""/>
+                               <parser enabled="true"/>
+                       </buildOutputProvider>
+                       <scannerInfoProvider id="specsFile">
+                               <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
+                               <parser enabled="true"/>
+                       </scannerInfoProvider>
+               </profile>
+               <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+                       <buildOutputProvider>
+                               <openAction enabled="true" filePath=""/>
+                               <parser enabled="true"/>
+                       </buildOutputProvider>
+                       <scannerInfoProvider id="makefileGenerator">
+                               <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
+                               <parser enabled="true"/>
+                       </scannerInfoProvider>
+               </profile>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.c.compiler.base.2037544368;cdt.managedbuild.tool.gnu.c.compiler.input.1851803849">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+                               <buildOutputProvider>
+                                       <openAction enabled="true" filePath=""/>
+                                       <parser enabled="true"/>
+                               </buildOutputProvider>
+                               <scannerInfoProvider id="specsFile">
+                                       <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
+                                       <parser enabled="true"/>
+                               </scannerInfoProvider>
+                       </profile>
+                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+                               <buildOutputProvider>
+                                       <openAction enabled="true" filePath=""/>
+                                       <parser enabled="true"/>
+                               </buildOutputProvider>
+                               <scannerInfoProvider id="makefileGenerator">
+                                       <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
+                                       <parser enabled="true"/>
+                               </scannerInfoProvider>
+                       </profile>
+               </scannerConfigBuildInfo>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.cpp.compiler.base.1129818443;cdt.managedbuild.tool.gnu.cpp.compiler.input.500761747">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+                               <buildOutputProvider>
+                                       <openAction enabled="true" filePath=""/>
+                                       <parser enabled="true"/>
+                               </buildOutputProvider>
+                               <scannerInfoProvider id="specsFile">
+                                       <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
+                                       <parser enabled="true"/>
+                               </scannerInfoProvider>
+                       </profile>
+                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+                               <buildOutputProvider>
+                                       <openAction enabled="true" filePath=""/>
+                                       <parser enabled="true"/>
+                               </buildOutputProvider>
+                               <scannerInfoProvider id="makefileGenerator">
+                                       <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
+                                       <parser enabled="true"/>
+                               </scannerInfoProvider>
+                       </profile>
+               </scannerConfigBuildInfo>
+       </storageModule>
+</cproject>
index adb5d0e..8ed5023 100644 (file)
@@ -104,7 +104,6 @@ doc/simgrid_modules.map
 
 ################################################
 ### Specific of project 
-.cproject
 .project
 .settings/
 .anjuta
@@ -233,6 +232,13 @@ examples/msg/mc/centralized_liveness
 
 src/replay/replay
 src/testall
+teshsuite/smpi/allgather_coll
+teshsuite/smpi/allgatherv_coll
+teshsuite/smpi/allreduce_coll
+teshsuite/smpi/alltoall_coll
+teshsuite/smpi/alltoallv_coll
+teshsuite/smpi/bcast_coll
+teshsuite/smpi/reduce_coll
 teshsuite/smpi/allreduce
 teshsuite/smpi/alltoall2
 teshsuite/smpi/alltoall_basic
@@ -395,8 +401,10 @@ teshsuite/smpi/mpich-test/pt2pt/waitall2
 teshsuite/smpi/mpich-test/pt2pt/waitall3
 teshsuite/smpi/mpich-test/pt2pt/waitall4
 teshsuite/smpi/mpich-test/pt2pt/waitany
+teshsuite/msg/pid
 teshsuite/msg/get_sender
 teshsuite/msg/trace/test_trace_integration
+teshsuite/simdag/availability/availability_test
 teshsuite/simdag/basic0
 teshsuite/simdag/basic1
 teshsuite/simdag/basic2
@@ -425,6 +433,7 @@ teshsuite/xbt/log_large_test
 teshsuite/xbt/parallel_log_crashtest
 testsuite/xbt/parmap_bench
 teshsuite/xbt/mmalloc_test
+teshsuite/xbt/parmap_test
 testsuite/run_tests
 testsuite/simdag/sd_test
 testsuite/surf/lmm_usage
index c055a54..a47f3a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,9 +9,15 @@ SimGrid (3.10) NOT RELEASED; urgency=low
  Java:
  * Reintegrate Java to the main archive as desynchronizing these
    package is not acceptable anymore (Java is now considered stable)
+ * Add explicit synchronization facilities through semaphores
  * Bugfix: Task.setDataSize() only changed the C world, not the value
    cached in the Java world
 
+ MSG:
+ * Dramatically change the way files are handled. API and internals changed, but
+   this part of MSG was not considered as production grade either.
+ * Add explicit synchronization facilities through semaphores
+
  SMPI:
  * SMPI is now included directly in the libsimgrid as the windows
    linker dont forces us on splitting it anymore.
@@ -24,10 +30,23 @@ SimGrid (3.10) NOT RELEASED; urgency=low
      version of MPE.
    - Bug Fix: the compute part of the reduce action is now taken into account.
  * smpirun generates the hostfile if needed (with given hostcount and platform)
+ * Integration of more than 100 STAR-MPI, mpich, OpenMPI collective algorithms
+   - allows to select one in particular with --cfg=smpi/coll_name:algorithm
+   - allows to use the decision logic of OpenMPI(1.7) or MPICH(3.0.4) by setting
+     --cfg=smpi/coll_selector:(mpich/ompi)
+ * Support for new functions : MPI_Issend, MPI_Ssend, Commutative operations in 
+   Reduce
+ * Add a --cfg:tracing/smpi/internals option, to trace internal communications 
+   happening inside a collective SMPI call.
+ * Fix the behavior of complex datatypes handling
+   
 
  PLATFORM:
  * Handle units for values (10ms, 10kiloflops, 10Bps, ...)
  * Remove rule based routing (no more pcre dependency)
+ * Add a limiter_link option to cluster tag, to specify a maximum reachable
+  bandwidth in fullduplex mode when it is < 2*nominal bw
+ * Add a loopback_bw and loopback_lat options to cluster tag. 
 
 -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
index b9d48b4..a176701 100644 (file)
@@ -346,6 +346,7 @@ if(NOT enable_memcheck)
     ADD_TEST(smpi-struct-thread                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
     ADD_TEST(smpi-pt2pt-thread                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
     ADD_TEST(smpi-compute-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
+    ADD_TEST(smpi-shared-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/shared.tesh)
     if(CONTEXT_UCONTEXT)
       ADD_TEST(smpi-bcast-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh)
       ADD_TEST(smpi-reduce-ucontext             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh)
@@ -355,6 +356,7 @@ if(NOT enable_memcheck)
       ADD_TEST(smpi-struct-ucontext             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
       ADD_TEST(smpi-pt2pt-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
       ADD_TEST(smpi-compute-ucontext            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
+      ADD_TEST(smpi-shared-ucontext             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/shared.tesh)
     endif()
     if(HAVE_RAWCTX)
       ADD_TEST(smpi-bcast-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh)
@@ -365,45 +367,73 @@ if(NOT enable_memcheck)
       ADD_TEST(smpi-struct-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
       ADD_TEST(smpi-pt2pt-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
       ADD_TEST(smpi-compute-raw                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
+      ADD_TEST(smpi-shared-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/shared.tesh)
     endif()
     if(HAVE_TRACING)
       ADD_TEST(smpi-tracing-ptp                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/tracing/smpi_traced.tesh)
       ADD_TEST(smpi-replay                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/smpi_replay.tesh)
     endif()
 
+
+    FOREACH (GATHER_COLL default ompi mpich ompi_basic_linear ompi_linear_sync ompi_binomial)
+        ADD_TEST(smpi-gather-coll-${GATHER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/gather:${GATHER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/gather_coll.tesh)
+    ENDFOREACH()
+    
     FOREACH (ALLGATHER_COLL default  2dmesh 3dmesh bruck GB loosely_lr lr
                            NTSLR NTSLR_NB pair rdb  rhv ring SMP_NTS
-                           smp_simple spreading_simple)
+                           smp_simple spreading_simple ompi mpich ompi_neighborexchange)
         ADD_TEST(smpi-allgather-coll-${ALLGATHER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allgather:${ALLGATHER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allgather_coll.tesh)
     ENDFOREACH()
-    FOREACH (ALLGATHERV_COLL default GB pair ring)
+    
+    FOREACH (ALLGATHERV_COLL default GB pair ring ompi mpich ompi_neighborexchange ompi_bruck mpich_rdb)
         ADD_TEST(smpi-allgatherv-coll-${ALLGATHERV_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allgatherv:${ALLGATHERV_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allgatherv_coll.tesh)
     ENDFOREACH()
+    
     FOREACH (ALLREDUCE_COLL default lr NTS rab1 rab2 rab_rdb
                            rab_rsag rdb smp_binomial smp_binomial_pipeline
-                           smp_rdb smp_rsag smp_rsag_lr smp_rsag_rab redbcast)
+                           smp_rdb smp_rsag smp_rsag_lr smp_rsag_rab redbcast ompi mpich ompi_ring_segmented)
         ADD_TEST(smpi-allreduce-coll-${ALLREDUCE_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allreduce:${ALLREDUCE_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allreduce_coll.tesh)
     ENDFOREACH()
+    
+    FOREACH (ALLREDUCE_COLL_LARGE ompi_ring_segmented)
+        ADD_TEST(smpi-allreduce-coll-${ALLREDUCE_COLL_LARGE} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/allreduce:${ALLREDUCE_COLL_LARGE} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/allreduce_coll_large.tesh)
+    ENDFOREACH()
+    
     FOREACH (ALLTOALL_COLL 2dmesh 3dmesh pair pair_one_barrier pair_light_barrier
                           pair_mpi_barrier rdb ring ring_light_barrier
                           ring_mpi_barrier ring_one_barrier
-                          simple bruck basic_linear)
+                          simple bruck basic_linear ompi mpich ompi_pairwise)
         ADD_TEST(smpi-alltoall-coll-${ALLTOALL_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoall:${ALLTOALL_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoall_coll.tesh)
     ENDFOREACH()
+    
     FOREACH (ALLTOALLV_COLL default pair pair_light_barrier pair_mpi_barrier
                            pair_one_barrier  ring ring_light_barrier
-                           ring_mpi_barrier ring_one_barrier bruck)
+                           ring_mpi_barrier ring_one_barrier bruck ompi ompi_basic_linear)
         ADD_TEST(smpi-alltoallv-coll-${ALLTOALLV_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/alltoallv:${ALLTOALLV_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/alltoallv_coll.tesh)
     ENDFOREACH()
+    
     FOREACH (BCAST_COLL default arrival_nb arrival_pattern_aware arrival_pattern_aware_wait arrival_scatter
                        binomial_tree flattree flattree_pipeline NTSB NTSL NTSL_Isend scatter_LR_allgather
-                       scatter_rdb_allgather SMP_binary SMP_binomial SMP_linear)
+                       scatter_rdb_allgather SMP_binary SMP_binomial SMP_linear ompi mpich ompi_split_bintree ompi_pipeline)
                ADD_TEST(smpi-bcast-coll-${BCAST_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/bcast:${BCAST_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast_coll.tesh)
     ENDFOREACH()
-    FOREACH (REDUCE_COLL default arrival_pattern_aware binomial flat_tree NTSL scatter_gather)
+    
+    FOREACH (REDUCE_COLL default arrival_pattern_aware binomial flat_tree NTSL scatter_gather ompi mpich ompi_chain ompi_binary ompi_basic_linear ompi_binomial ompi_in_order_binary)
         ADD_TEST(smpi-reduce-coll-${REDUCE_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/reduce:${REDUCE_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_coll.tesh)
     ENDFOREACH()
 
+    FOREACH (REDUCE_SCATTER_COLL default  ompi mpich ompi_basic_recursivehalving ompi_ring mpich_noncomm mpich_pair mpich_rdb)
+        ADD_TEST(smpi-reduce_scatter-coll-${REDUCE_SCATTER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/reduce_scatter:${REDUCE_SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_scatter_coll.tesh)
+    ENDFOREACH()
+
+    FOREACH (SCATTER_COLL default  ompi mpich ompi_basic_linear ompi_binomial)
+        ADD_TEST(smpi-scatter-coll-${SCATTER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/scatter:${SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/scatter_coll.tesh)
+    ENDFOREACH()
+
+    FOREACH (BARRIER_COLL default  ompi mpich ompi_basic_linear ompi_tree ompi_bruck ompi_recursivedoubling ompi_doublering)
+        ADD_TEST(smpi-barrier-coll-${BARRIER_COLL} ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg smpi/barrier:${BARRIER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/barrier_coll.tesh)
+    ENDFOREACH()
+
   endif()
 
   # END TESH TESTS
@@ -415,7 +445,9 @@ if(NOT enable_memcheck)
       ADD_TEST(smpi-mpich-context-raw           ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/context ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})
       ADD_TEST(smpi-mpich-profile-raw           ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/profile  ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} )
       ADD_TEST(smpi-mpich-coll-raw              ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/coll ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})
-      set_tests_properties(smpi-mpich-env-raw smpi-mpich-context-raw  smpi-mpich-pt2pt-raw smpi-mpich-coll-raw smpi-mpich-profile-raw PROPERTIES PASS_REGULAR_EXPRESSION "-- No differences found; test successful")
+      ADD_TEST(smpi-mpich-coll-selector-mpich-raw              ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/coll ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} -selector=mpich)
+      ADD_TEST(smpi-mpich-coll-selector-ompi-raw              ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/coll ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} -selector=ompi)
+      set_tests_properties(smpi-mpich-env-raw smpi-mpich-context-raw  smpi-mpich-pt2pt-raw smpi-mpich-coll-raw smpi-mpich-coll-selector-ompi-raw smpi-mpich-coll-selector-mpich-raw smpi-mpich-profile-raw PROPERTIES PASS_REGULAR_EXPRESSION "-- No differences found; test successful")
     endif()
   endif()
 
@@ -452,42 +484,16 @@ if(NOT enable_memcheck)
 
   # examples/msg/mc
   if(HAVE_MC)
-    ADD_TEST(mc-bugged1-thread                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
-    ADD_TEST(mc-centralized-thread              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh)
-    ADD_TEST(mc-chord-neverjoin-thread          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin.tesh)
     if(CONTEXT_UCONTEXT)
       ADD_TEST(mc-bugged1-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
       ADD_TEST(mc-bugged2-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh)
-      ADD_TEST(mc-centralized-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh)
-      ADD_TEST(mc-chord-neverjoin-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin.tesh)
       if(PROCESSOR_x86_64) # liveness model-checking works only on 64bits (for now ...)
-        ADD_TEST(mc-bugged1-liveness-ucontext                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1_liveness.tesh)
-        ADD_TEST(mc-chord-neverjoin-timeout-visited-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin_timeout_visited.tesh)
+        ADD_TEST(mc-bugged1-liveness-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1_liveness.tesh)
       endif()
     endif()
     if(HAVE_RAWCTX)
       ADD_TEST(mc-bugged1-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
       ADD_TEST(mc-bugged2-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh)
-      ADD_TEST(mc-centralized-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh)
-      ADD_TEST(mc-chord-neverjoin-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin.tesh)
-    endif()
-  endif()
-
-  ###
-  ### Declare that we know that some tests are broken
-  ###
-
-  # Those tests are broken : set to "fail" for release v3.6
-  if(release)
-    if(HAVE_MC)
-      set_tests_properties(mc-bugged1-thread PROPERTIES WILL_FAIL true)
-      set_tests_properties(mc-centralized-thread PROPERTIES WILL_FAIL true)
-      if(CONTEXT_UCONTEXT)
-        set_tests_properties(mc-centralized-ucontext PROPERTIES WILL_FAIL true)
-      endif()
-      if(HAVE_RAWCTX)
-        set_tests_properties(mc-centralized-raw PROPERTIES WILL_FAIL true)
-      endif()
     endif()
   endif()
 
index a7d43ff..4727446 100644 (file)
@@ -856,6 +856,9 @@ else()
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoall.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_alltoallv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_alltoallv.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_waitall.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_waitall.txt COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_reducescatter.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_reducescatter.txt COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_gather.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_gather.txt COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
 
   set(generated_files_to_clean
index 8987ce3..19633e9 100644 (file)
@@ -38,6 +38,7 @@ set(EXTRA_DIST
   src/smpi/colls/COPYRIGHTS
   src/smpi/colls/colls.h
   src/smpi/colls/colls_private.h
+  src/smpi/colls/coll_tuned_topo.h
   src/smpi/private.h
   src/smpi/smpi_mpi_dt_private.h
   src/surf/cpu_ti_private.h
@@ -110,6 +111,8 @@ set(SMPI_SRC
   src/smpi/smpi_mpi_dt.c
   src/smpi/smpi_pmpi.c
   src/smpi/smpi_replay.c
+  src/smpi/colls/smpi_openmpi_selector.c
+  src/smpi/colls/smpi_mpich_selector.c
   src/smpi/colls/colls_global.c
   src/smpi/colls/allgather-2dmesh.c
   src/smpi/colls/allgather-3dmesh.c
@@ -126,9 +129,13 @@ set(SMPI_SRC
   src/smpi/colls/allgather-SMP-NTS.c
   src/smpi/colls/allgather-smp-simple.c
   src/smpi/colls/allgather-spreading-simple.c
+  src/smpi/colls/allgather-ompi-neighborexchange.c
   src/smpi/colls/allgatherv-GB.c  
   src/smpi/colls/allgatherv-pair.c
   src/smpi/colls/allgatherv-ring.c
+  src/smpi/colls/allgatherv-ompi-neighborexchange.c
+  src/smpi/colls/allgatherv-ompi-bruck.c
+  src/smpi/colls/allgatherv-mpich-rdb.c
   src/smpi/colls/allreduce-lr.c
   src/smpi/colls/allreduce-NTS.c
   src/smpi/colls/allreduce-rab1.c
@@ -144,6 +151,7 @@ set(SMPI_SRC
   src/smpi/colls/allreduce-smp-rsag.c
   src/smpi/colls/allreduce-smp-rsag-lr.c
   src/smpi/colls/allreduce-smp-rsag-rab.c
+  src/smpi/colls/allreduce-ompi-ring-segmented.c
   src/smpi/colls/alltoall-2dmesh.c
   src/smpi/colls/alltoall-3dmesh.c
   #src/smpi/colls/alltoall-bruck.c
@@ -157,6 +165,7 @@ set(SMPI_SRC
   src/smpi/colls/alltoall-ring-mpi-barrier.c
   src/smpi/colls/alltoall-ring-one-barrier.c
   src/smpi/colls/alltoall-simple.c
+  src/smpi/colls/alltoall-ompi-pairwise.c
   src/smpi/colls/alltoallv-pair.c   
   src/smpi/colls/alltoallv-pair-light-barrier.c
   src/smpi/colls/alltoallv-pair-mpi-barrier.c
@@ -166,6 +175,7 @@ set(SMPI_SRC
   src/smpi/colls/alltoallv-ring-mpi-barrier.c
   src/smpi/colls/alltoallv-ring-one-barrier.c
   src/smpi/colls/alltoallv-bruck.c
+  src/smpi/colls/alltoallv-ompi-basic-linear.c
   src/smpi/colls/bcast-arrival-nb.c
   src/smpi/colls/bcast-arrival-pattern-aware.c
   src/smpi/colls/bcast-arrival-pattern-aware-wait.c
@@ -181,11 +191,20 @@ set(SMPI_SRC
   src/smpi/colls/bcast-SMP-binary.c
   src/smpi/colls/bcast-SMP-binomial.c
   src/smpi/colls/bcast-SMP-linear.c
+  src/smpi/colls/coll_tuned_topo.c
+  src/smpi/colls/bcast-ompi-split-bintree.c
+  src/smpi/colls/bcast-ompi-pipeline.c
   src/smpi/colls/reduce-arrival-pattern-aware.c
   src/smpi/colls/reduce-binomial.c
   src/smpi/colls/reduce-flat-tree.c
   src/smpi/colls/reduce-NTSL.c
   src/smpi/colls/reduce-scatter-gather.c
+  src/smpi/colls/reduce-ompi.c
+  src/smpi/colls/gather-ompi.c
+  src/smpi/colls/reduce_scatter-ompi.c
+  src/smpi/colls/reduce_scatter-mpich.c
+  src/smpi/colls/scatter-ompi.c
+  src/smpi/colls/barrier-ompi.c
   )
 
 if(SMPI_F2C)
@@ -330,6 +349,7 @@ set(MSG_SRC
   src/msg/msg_io.c
   src/msg/msg_mailbox.c
   src/msg/msg_process.c
+  src/msg/msg_synchro.c
   src/msg/msg_task.c
   src/msg/msg_vm.c
   )
@@ -393,6 +413,8 @@ set(BINDINGS_SRC
 set(JMSG_C_SRC
   src/bindings/java/jmsg.c
   src/bindings/java/jmsg.h
+  src/bindings/java/jmsg_as.c
+  src/bindings/java/jmsg_as.h
   src/bindings/java/jmsg_comm.c
   src/bindings/java/jmsg_comm.h
   src/bindings/java/jmsg_file.c
@@ -418,6 +440,7 @@ set(JMSG_C_SRC
 )
 
 set(JMSG_JAVA_SRC
+  src/bindings/java/org/simgrid/msg/As.java    
   src/bindings/java/org/simgrid/msg/Comm.java
   src/bindings/java/org/simgrid/msg/File.java
   src/bindings/java/org/simgrid/msg/Host.java
@@ -427,6 +450,7 @@ set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/msg/Msg.java
   src/bindings/java/org/simgrid/msg/MsgException.java
   src/bindings/java/org/simgrid/msg/Mutex.java
+  src/bindings/java/org/simgrid/msg/Semaphore.java
   src/bindings/java/org/simgrid/msg/NativeException.java
   src/bindings/java/org/simgrid/msg/Process.java
   src/bindings/java/org/simgrid/msg/ProcessKilledError.java
@@ -532,7 +556,6 @@ set(headers_to_install
   include/xbt/dynar.h
   include/xbt/ex.h
   include/xbt/fifo.h
-  include/xbt/file_stat.h
   include/xbt/function_types.h
   include/xbt/graph.h
   include/xbt/graphxml.h
@@ -832,14 +855,11 @@ set(EXAMPLES_CMAKEFILES_TXT
   examples/java/startKillTime/CMakeLists.txt
   examples/java/suspend/CMakeLists.txt
   examples/java/tracing/CMakeLists.txt
-  examples/scala/CMakeLists.txt
-  examples/scala/masterslave/CMakeLists.txt
-  examples/scala/master_slave_bypass/CMakeLists.txt
-  examples/scala/master_slave_kill/CMakeLists.txt
   examples/lua/CMakeLists.txt
   examples/msg/CMakeLists.txt
   examples/msg/actions/CMakeLists.txt
   examples/msg/bittorrent/CMakeLists.txt
+  examples/msg/chainsend/CMakeLists.txt
   examples/msg/chord/CMakeLists.txt
   examples/msg/cloud/CMakeLists.txt
   examples/msg/gpu/CMakeLists.txt
@@ -852,15 +872,20 @@ set(EXAMPLES_CMAKEFILES_TXT
   examples/msg/migration/CMakeLists.txt
   examples/msg/ns3/CMakeLists.txt
   examples/msg/parallel_task/CMakeLists.txt
+  examples/msg/pastry/CMakeLists.txt
   examples/msg/pmm/CMakeLists.txt
   examples/msg/priority/CMakeLists.txt
   examples/msg/properties/CMakeLists.txt
+  examples/msg/semaphores/CMakeLists.txt
   examples/msg/sendrecv/CMakeLists.txt
-  examples/msg/chainsend/CMakeLists.txt
   examples/msg/start_kill_time/CMakeLists.txt
   examples/msg/suspend/CMakeLists.txt
   examples/msg/token_ring/CMakeLists.txt
   examples/msg/tracing/CMakeLists.txt
+  examples/scala/CMakeLists.txt
+  examples/scala/master_slave_bypass/CMakeLists.txt
+  examples/scala/master_slave_kill/CMakeLists.txt
+  examples/scala/masterslave/CMakeLists.txt
   examples/simdag/CMakeLists.txt
   examples/simdag/dax/CMakeLists.txt
   examples/simdag/dot/CMakeLists.txt
@@ -879,20 +904,20 @@ set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/msg/CMakeLists.txt
   teshsuite/msg/trace/CMakeLists.txt
   teshsuite/simdag/CMakeLists.txt
+  teshsuite/simdag/availability/CMakeLists.txt
   teshsuite/simdag/network/CMakeLists.txt
   teshsuite/simdag/network/mxn/CMakeLists.txt
   teshsuite/simdag/network/p2p/CMakeLists.txt
   teshsuite/simdag/partask/CMakeLists.txt
   teshsuite/simdag/platforms/CMakeLists.txt
-  teshsuite/simdag/availability/CMakeLists.txt
-  teshsuite/xbt/CMakeLists.txt
   teshsuite/smpi/CMakeLists.txt
   teshsuite/smpi/mpich-test/CMakeLists.txt
-  teshsuite/smpi/mpich-test/env/CMakeLists.txt
   teshsuite/smpi/mpich-test/coll/CMakeLists.txt
   teshsuite/smpi/mpich-test/context/CMakeLists.txt
+  teshsuite/smpi/mpich-test/env/CMakeLists.txt
   teshsuite/smpi/mpich-test/profile/CMakeLists.txt
   teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt
+  teshsuite/xbt/CMakeLists.txt
   )
 
 set(TOOLS_CMAKEFILES_TXT
index 346c93c..c572a08 100644 (file)
@@ -10,29 +10,6 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools)
 ##################################################################
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/tesh)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/graphicator/)
-
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/xbt)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/surf)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/xbt)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/availability)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace)
-
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/async)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/bittorrent)
@@ -52,40 +29,45 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/suspend)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/tracing)
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_bypass)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_kill)
-
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/properties)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/actions)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/migration)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/suspend)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/priority)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/icomms)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/chord)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pmm)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/start_kill_time)
-
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/io)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/cloud)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gpu)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/tracing)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/mc)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/icomms)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/io)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/mc)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/migration)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/ns3)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pastry)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/pmm)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/priority)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/properties)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/semaphores)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/start_kill_time)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/suspend)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/tracing)
+
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_bypass)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_kill)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave)
+
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e1)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e2)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e3)
 
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dax)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dot)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/metaxml)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/properties)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling)
@@ -93,6 +75,26 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/smpi)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/smpi/MM)
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e1)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e2)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e3)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/availability)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/xbt)
+
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/surf)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/xbt)
+
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/graphicator/)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/tesh)
index a861c10..86d7dd3 100644 (file)
@@ -26,10 +26,11 @@ else()
 endif()
 message("-- [Java] SG_java includes: ${CHECK_INCLUDES}")
 
+target_link_libraries(SG_java simgrid)
+
 if(WIN32)
-  get_target_property(SIMGRID_LIB_NAME_NAME SG_java LIBRARY_OUTPUT_NAME)
   set_target_properties(SG_java PROPERTIES
-    LINK_FLAGS "-Wl,--subsystem,windows,--kill-at ${SIMGRID_LIB_NAME}"
+    LINK_FLAGS "-Wl,--subsystem,windows,--kill-at"
     PREFIX "")
   find_path(PEXPORTS_PATH NAMES pexports.exe PATHS NO_DEFAULT_PATHS)
   message(STATUS "pexports: ${PEXPORTS_PATH}")
@@ -37,8 +38,6 @@ if(WIN32)
     add_custom_command(TARGET SG_java POST_BUILD
       COMMAND ${PEXPORTS_PATH}/pexports.exe ${CMAKE_BINARY_DIR}/SG_java.dll > ${CMAKE_BINARY_DIR}/SG_java.def)
   endif(PEXPORTS_PATH)
-else()
-  target_link_libraries(SG_java simgrid)
 endif()
 
 # Rules to build simgrid.jar
index 5558ac8..fe5a509 100644 (file)
@@ -22,7 +22,7 @@ fi
 
 if [ "$build_mode" = "ModelChecker" ]
 then
-cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=ON -Denable_compile_warnings=ON .
+cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON .
 fi
 
 if [ "$build_mode" = "DynamicAnalysis" ]
@@ -47,7 +47,7 @@ fi
 
 if [ "$build_mode" = "ModelChecker" ]
 then
-cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=ON -Denable_compile_warnings=ON .
+cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON .
 fi
 
 if [ "$build_mode" = "DynamicAnalysis" ]
index b813165..dc901e8 100644 (file)
@@ -16,7 +16,7 @@ fi
 
 if [ "$build_mode" = "ModelChecker" ]
 then
-cmake -G "MSYS Makefiles" -Denable_model-checking=ON ..
+cmake -G "MSYS Makefiles" -Denable_model-checking=ON -Denable_compile_optimizations=OFF ..
 fi
 
 make
index 2241a15..d652b97 100644 (file)
@@ -29,6 +29,7 @@ us before digging into these badly documented internal modules).
    - \ref msg_file_management
    - \ref msg_task_usage
    - \ref msg_VMs
+   - \ref msg_synchro
    - \ref msg_trace_driven
    - \ref MSG_examples
    - \ref msg_deprecated_functions
@@ -92,6 +93,14 @@ details).
  *         by a process to execute, communicate or otherwise handle some task.
  */
 
+/** @defgroup msg_synchro Explicit Synchronization Functions
+ *  @ingroup MSG_API
+ *  @brief This section describes several explicit synchronization
+ *         mechanisms existing in MSG: semaphores (#msg_sem_t) and friends.
+ *
+ * In some situations, these things are very helpful to synchronize processes without message exchanges.
+ */
+
 /** @defgroup msg_VMs VMs
  *  @ingroup MSG_API
  *  @brief This section describes the interface created to mimic IaaS clouds.
index a0e1f95..353db84 100644 (file)
@@ -45,7 +45,7 @@ public class Node extends Process {
                                filename = FILENAME1;
                }
                Msg.info("Open file " + filename);
-               File file = new File(mount,filename, "rw");
+               File file = new File(mount,filename);
 
                long read = file.read(10000000,1);
                Msg.info("Having read " + read + " on " + filename);
@@ -54,6 +54,6 @@ public class Node extends Process {
                Msg.info("Having write " + write + " on " + filename);
 
                read = file.read(10000000,1);
-               Msg.info("Having read " + read + " on " + filename);            
+               Msg.info("Having read " + read + " on " + filename);    
        }
-}
\ No newline at end of file
+}
index cf77252..250d703 100644 (file)
@@ -2,6 +2,8 @@
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment_split.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [ 10.831247] (1:p0@host0) p0 recv p1 10.831247
 > [ 10.831247] (2:p1@host1) p1 send p0 1e10 10.831247
 > [ 10.831248] (1:p0@host0) p0 compute 12 0.000001
@@ -10,6 +12,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_allReduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
 > [ 51.095484] (1:p0@host0) p0 allReduce 5e8 5e8 51.095484
 > [ 51.095484] (2:p1@host1) p1 allReduce 5e8 5e8 51.095484
@@ -21,6 +25,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_barrier.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
 > [  0.000000] (2:p1@host1) p1 comm_size 3 0.000000
 > [  0.000000] (3:p2@host2) p2 comm_size 3 0.000000
@@ -33,6 +39,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_bcast.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
 > [  0.547742] (1:p0@host0) p0 bcast 5e8 0.547742
 > [  0.547742] (2:p1@host1) p1 bcast 5e8 0.547742
@@ -53,6 +61,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_reduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
 > [  0.547742] (2:p1@host1) p1 reduce 5e8 5e8 0.547742
 > [  0.547742] (3:p2@host2) p2 reduce 5e8 5e8 0.547742
@@ -64,6 +74,8 @@ $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deplo
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_with_isend.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> This example is still relevant if you want to learn about MSG-based trace replay, but if you want to simulate MPI-like traces, you should use the newer version that is in the examples/smpi/replay directory instead.
+> WARNING: THIS BINARY IS KINDA DEPRECATED
 > [  0.000000] (2:p1@host1) p1 Irecv p0 0.000000
 > [  0.000000] (3:p2@host2) p2 Irecv p1 0.000000
 > [  1.088979] (1:p0@host0) p0 send p1 1e9 1.088979
index 337db69..fc3e27f 100644 (file)
@@ -658,7 +658,7 @@ void update_choked_peers(peer_t peer)
             xbt_dict_size(peer->active_peers));
   //update the current round
   peer->round = (peer->round + 1) % 3;
-  char *key, *key_choked;
+  char *key, *key_choked=NULL;
   connection_t peer_choosed = NULL;
   connection_t peer_choked = NULL;
   //remove a peer from the list
index fc79986..4e0ee91 100644 (file)
@@ -33,35 +33,30 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file,
 int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
-  s_msg_stat_t stat;
-  void *ptr = NULL;
   char* mount = xbt_strdup("/home");
-  double read,write;
+  size_t read,write;
 
   if(!strcmp(MSG_process_get_name(MSG_process_self()),"0"))
-    file = MSG_file_open(mount,FILENAME1,"rw");
+    file = MSG_file_open(mount,FILENAME1);
   else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1"))
-    file = MSG_file_open(mount,FILENAME2,"rw");
+    file = MSG_file_open(mount,FILENAME2);
   else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2"))
-    file = MSG_file_open(mount,FILENAME3,"rw");
+    file = MSG_file_open(mount,FILENAME3);
   else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3"))
-    file = MSG_file_open(mount,FILENAME4,"rw");
+    file = MSG_file_open(mount,FILENAME4);
   else xbt_die("FILENAME NOT DEFINED %s",MSG_process_get_name(MSG_process_self()));
 
   XBT_INFO("\tOpen file '%s'",file->name);
 
-  read = MSG_file_read(ptr,10000000,sizeof(char*),file);     // Read for 10Mo
-  XBT_INFO("\tHave read    %8.1f on %s",read,file->name);
+  read = MSG_file_read(10000000,file);     // Read for 10MB
+  XBT_INFO("\tHave read    %zu on %s",read,file->name);
 
-  write = MSG_file_write(ptr,100000,sizeof(char*),file);  // Write for 100Ko
-  XBT_INFO("\tHave written %8.1f on %s",write,file->name);
+  write = MSG_file_write(100000,file);  // Write for 100KB
+  XBT_INFO("\tHave written %zu on %s",write,file->name);
 
-  read = MSG_file_read(ptr,10000000,sizeof(char*),file);     // Read for 10Mo
-  XBT_INFO("\tHave read    %8.1f on %s",read,file->name);
-
-  MSG_file_stat(file,&stat);
-  XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size);
-  MSG_file_free_stat(&stat);
+  read = MSG_file_read(110000,file);     // Read for 110KB
+  XBT_INFO("\tHave read    %zu on %s (of size %zu)",read,file->name,
+      MSG_file_get_size(file));
 
   XBT_INFO("\tClose file '%s'",file->name);
   MSG_file_close(file);
index f230372..911b499 100644 (file)
@@ -30,19 +30,12 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file,
 int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
-  s_msg_stat_t stat;
-  void *ptr = NULL;
   char* mount = xbt_strdup("/home");
-  double write;
+  size_t write;
 
   // First open
   XBT_INFO("\tOpen file '%s'",FILENAME1);
-  file = MSG_file_open(mount,FILENAME1,"rw");
-
-  // Print stat
-  MSG_file_stat(file,&stat);
-  XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size);
-  MSG_file_free_stat(&stat);
+  file = MSG_file_open(mount,FILENAME1);
 
   // Unlink the file
   XBT_INFO("\tUnlink file '%s'",file->name);
@@ -50,21 +43,11 @@ int host(int argc, char *argv[])
 
   // Re Open the file wich is in fact created
   XBT_INFO("\tOpen file '%s'",FILENAME1);
-  file = MSG_file_open(mount,FILENAME1,"rw");
-
-  // Print stat
-  MSG_file_stat(file,&stat);
-  XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size);
-  MSG_file_free_stat(&stat);
+  file = MSG_file_open(mount,FILENAME1);
 
   // Write into the new file
-  write = MSG_file_write(ptr,100000,sizeof(char*),file);  // Write for 100Ko
-  XBT_INFO("\tHave written %8.1f on %s",write,file->name);
-
-  // Print the stat
-  MSG_file_stat(file,&stat);
-  XBT_INFO("\tFile stat %s Size %.1f",file->name,stat.size);
-  MSG_file_free_stat(&stat);
+  write = MSG_file_write(100000,file);  // Write for 100Ko
+  XBT_INFO("\tHave written %zu on %s",write,file->name);
 
   // Close the file
   XBT_INFO("\tClose file '%s'",file->name);
index 224a1f8..5b7455a 100644 (file)
@@ -6,37 +6,30 @@ $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.f
 > [  0.000000] (2:1@alice)     Open file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml'
 > [  0.000000] (3:2@carl)      Open file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
 > [  0.000000] (4:3@bob)       Open file './doc/simgrid/examples/platforms/nancy.xml'
-> [  0.000005] (2:1@alice)     Have read       482.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
-> [  0.000040] (4:3@bob)       Have read      4028.0 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.000170] (1:0@denise)    Have read     17028.0 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.000226] (3:2@carl)      Have read     22645.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.003338] (2:1@alice)     Have written 100000.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
-> [  0.003374] (4:3@bob)       Have written 100000.0 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.003504] (1:0@denise)    Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.003560] (3:2@carl)      Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.004343] (2:1@alice)     Have read    100482.0 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
-> [  0.004343] (2:1@alice)     File stat ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml Size 100482.0
+> [  0.000005] (2:1@alice)     Have read    482 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
+> [  0.000040] (4:3@bob)       Have read    4028 on ./doc/simgrid/examples/platforms/nancy.xml
+> [  0.000170] (1:0@denise)    Have read    17028 on ./doc/simgrid/examples/platforms/g5k.xml
+> [  0.000226] (3:2@carl)      Have read    22645 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
+> [  0.003338] (2:1@alice)     Have written 100000 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
+> [  0.003374] (4:3@bob)       Have written 100000 on ./doc/simgrid/examples/platforms/nancy.xml
+> [  0.003504] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
+> [  0.003560] (3:2@carl)      Have written 100000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
+> [  0.004343] (2:1@alice)     Have read    100481 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml (of size 100481)
 > [  0.004343] (2:1@alice)     Close file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml'
-> [  0.004414] (4:3@bob)       Have read    104028.0 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.004414] (4:3@bob)       File stat ./doc/simgrid/examples/platforms/nancy.xml Size 104028.0
+> [  0.004414] (4:3@bob)       Have read    104027 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104027)
 > [  0.004414] (4:3@bob)       Close file './doc/simgrid/examples/platforms/nancy.xml'
-> [  0.004674] (1:0@denise)    Have read    117028.0 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.004674] (1:0@denise)    File stat ./doc/simgrid/examples/platforms/g5k.xml Size 117028.0
-> [  0.004674] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.004786] (3:2@carl)      Have read    122645.0 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.004786] (3:2@carl)      File stat ./doc/simgrid/examples/platforms/g5k_cabinets.xml Size 122645.0
-> [  0.004786] (3:2@carl)      Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
-> [  0.004786] (0:@) Simulation time 0.00478623
+> [  0.004604] (1:0@denise)    Have read    110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117027)
+> [  0.004604] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
+> [  0.004660] (3:2@carl)      Have read    110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122644)
+> [  0.004660] (3:2@carl)      Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
+> [  0.004660] (0:@) Simulation time 0.00465978
 
 $ ${bindir:=.}/io/file_unlink ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '4'
 > [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000000] (1:0@denise)    File stat ./doc/simgrid/examples/platforms/g5k.xml Size 17028.0
 > [  0.000000] (1:0@denise)    Unlink file './doc/simgrid/examples/platforms/g5k.xml'
 > [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000000] (1:0@denise)    File stat ./doc/simgrid/examples/platforms/g5k.xml Size 0.0
-> [  0.003333] (1:0@denise)    Have written 100000.0 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.003333] (1:0@denise)    File stat ./doc/simgrid/examples/platforms/g5k.xml Size 100000.0
+> [  0.003333] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
 > [  0.003333] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
 > [  0.003333] (1:0@denise)  
 > [  0.003333] (1:0@denise) ls ./
index 6a4f5e3..32b38ce 100644 (file)
@@ -16,7 +16,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
 
 int master(int argc, char *argv[]);
 int slave(int argc, char *argv[]);
-int forwarder(int argc, char *argv[]);
 msg_error_t test_all(const char *platform_file,
                      const char *application_file);
 
index 73dd03c..e2ab938 100644 (file)
@@ -16,9 +16,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
 
 int master(int argc, char *argv[]);
 int slave(int argc, char *argv[]);
-int forwarder(int argc, char *argv[]);
-msg_error_t test_all(const char *platform_file,
-                     const char *application_file);
 
 /** Emitter function  */
 int master(int argc, char *argv[])
index dbdc4eb..78c1f5e 100644 (file)
@@ -1,6 +1,7 @@
 #! ./tesh
 
 ! expect signal SIGABRT
+! timeout 20
 $ ${bindir:=.}/bugged1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
 > [  0.000000] (0:@) Check a safety property
@@ -9,21 +10,28 @@ $ ${bindir:=.}/bugged1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (4:client@HostD) Sent!
 > [  0.000000] (2:client@HostB) Sent!
+> [  0.000000] (3:client@HostC) Sent!
+> [  0.000000] (2:client@HostB) Sent!
+> [  0.000000] (3:client@HostC) Sent!
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (4:client@HostD) Sent!
+> [  0.000000] (2:client@HostB) Sent!
+> [  0.000000] (3:client@HostC) Sent!
 > [  0.000000] (2:client@HostB) Sent!
 > [  0.000000] (1:server@HostA) **************************
 > [  0.000000] (1:server@HostA) *** PROPERTY NOT VALID ***
 > [  0.000000] (1:server@HostA) **************************
 > [  0.000000] (1:server@HostA) Counter-example execution trace:
-> [  0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(2)client -> (1)server])
-> [  0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)server])
-> [  0.000000] (1:server@HostA) [(4)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(4)client -> (1)server])
-> [  0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(3)client -> (1)server])
-> [  0.000000] (1:server@HostA) Expanded states = 17
-> [  0.000000] (1:server@HostA) Visited states = 32
-> [  0.000000] (1:server@HostA) Executed transitions = 30
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(2)HostB (client)] iSend (src=(2)HostB (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(2)HostB (client)] Wait (comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(4)HostD (client)] iSend (src=(4)HostD (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(4)HostD (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) Expanded states = 22
+> [  0.000000] (1:server@HostA) Visited states = 56
+> [  0.000000] (1:server@HostA) Executed transitions = 52
index f014dcc..90dd58a 100644 (file)
@@ -11,9 +11,6 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(bugged1_liveness, "my log messages");
 
-#define NB_REQUESTS 3
-#define NB_CLIENTS 3
-
 int r=0; 
 int cs=0;
 
@@ -32,18 +29,16 @@ int coordinator(int argc, char *argv[])
   int CS_used = 0;   
   msg_task_t task = NULL, answer = NULL;        
 
-  int i;
-
-  for(i=0; i<(NB_REQUESTS * NB_CLIENTS); i++){
+  while(1){  
     MSG_task_receive(&task, "coordinator");
     const char *kind = MSG_task_get_name(task); 
     if (!strcmp(kind, "request")) {    
       char *req = MSG_task_get_data(task);
       if (CS_used) {           
-        //XBT_INFO("CS already used.");
+        XBT_INFO("CS already used.");
       } else {               
         if(strcmp(req, "1") != 0){
-          //XBT_INFO("CS idle. Grant immediatly");
+          XBT_INFO("CS idle. Grant immediatly");
           answer = MSG_task_create("grant", 0, 1000, NULL);
           MSG_task_send(answer, req);
           CS_used = 1;
@@ -51,7 +46,7 @@ int coordinator(int argc, char *argv[])
         }
       }
     } else {         
-      //XBT_INFO("CS release. resource now idle");
+      XBT_INFO("CS release. resource now idle");
       CS_used = 0;
     }
     MSG_task_destroy(task);
@@ -68,18 +63,15 @@ int client(int argc, char *argv[])
 
   char *my_mailbox = xbt_strdup(argv[1]);
   msg_task_t grant = NULL, release = NULL;
-  
-  int i;
-
-  for(i=0; i<NB_REQUESTS; i++){
-      
-    //XBT_INFO("Ask the request");
+    
+  while(1){
+    XBT_INFO("Ask the request");
     MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
 
     if(strcmp(my_mailbox, "1") == 0){
       r = 1;
       cs = 0;
-      //XBT_INFO("Propositions changed : r=1, cs=0");
+      XBT_INFO("Propositions changed : r=1, cs=0");
     }
 
     MSG_task_receive(&grant, my_mailbox);
@@ -88,14 +80,14 @@ int client(int argc, char *argv[])
     if((strcmp(my_mailbox, "1") == 0) && (strcmp("grant", kind) == 0)){
       cs = 1;
       r = 0;
-      //XBT_INFO("Propositions changed : r=0, cs=1");
+      XBT_INFO("Propositions changed : r=0, cs=1");
     }
 
     MSG_task_destroy(grant);
     grant = NULL;
     kind = NULL;
 
-    //XBT_INFO("%s got the answer. Sleep a bit and release it", argv[1]);
+    XBT_INFO("%s got the answer. Sleep a bit and release it", argv[1]);
 
     MSG_process_sleep(1);
 
@@ -109,7 +101,7 @@ int client(int argc, char *argv[])
     if(strcmp(my_mailbox, "1") == 0){
       cs=0;
       r=0;
-      //XBT_INFO("Propositions changed : r=0, cs=0");
+      XBT_INFO("Propositions changed : r=0, cs=0");
     }
     
   }
index ba35856..f69fd27 100644 (file)
@@ -18,27 +18,27 @@ $ ${bindir:=.}/bugged1_liveness --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%
 > [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
 > [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 > [  0.000000] (0:@) Counter-example that violates formula :
-> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(2)client -> (1)coordinator])
-> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)coordinator])
-> [  0.000000] (0:@) [(2)client] iRecv (dst=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
-> [  0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
-> [  0.000000] (0:@) [(3)client] iRecv (dst=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
-> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
-> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
-> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
-> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
-> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
-> [  0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend (src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait (comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv (dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend (src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iRecv (dst=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv (dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend (src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait (comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend (src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
 > [  0.000000] (0:@) Expanded pairs = 22
 > [  0.000000] (0:@) Visited pairs = 22
 > [  0.000000] (0:@) Executed transitions = 21
index fcd9ca5..bbfd7ac 100644 (file)
@@ -1,6 +1,7 @@
 #! ./tesh
 
 ! expect signal SIGABRT
+! timeout 20
 $ ${bindir:=.}/bugged2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
 > [  0.000000] (0:@) Check a safety property
@@ -15,50 +16,884 @@ $ ${bindir:=.}/bugged2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) OK
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) OK
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
 > [  0.000000] (3:client@HostC) Send 2!
 > [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
 > [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 1
 > [  0.000000] (1:server@HostA) OK
-> [  0.000000] (0:@) Expanded states = 68
-> [  0.000000] (0:@) Visited states = 132
-> [  0.000000] (0:@) Executed transitions = 124
\ No newline at end of file
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 1
+> [  0.000000] (2:client@HostB) Send 1!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (3:client@HostC) Send 2!
+> [  0.000000] (1:server@HostA) Received 2
+> [  0.000000] (1:server@HostA) **************************
+> [  0.000000] (1:server@HostA) *** PROPERTY NOT VALID ***
+> [  0.000000] (1:server@HostA) **************************
+> [  0.000000] (1:server@HostA) Counter-example execution trace:
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv (dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend (src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait (comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) Expanded states = 461
+> [  0.000000] (1:server@HostA) Visited states = 2271
+> [  0.000000] (1:server@HostA) Executed transitions = 2117
diff --git a/examples/msg/pastry/CMakeLists.txt b/examples/msg/pastry/CMakeLists.txt
new file mode 100644 (file)
index 0000000..39aef6b
--- /dev/null
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 2.6)
+
+set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+
+add_executable(pastry pastry.c)
+
+### Add definitions for compile
+target_link_libraries(pastry simgrid )
+
+set(tesh_files
+  ${tesh_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/pastry.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/pastry_crosstraffic.tesh
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/pastry10.xml
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/pastry.c
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/examples/msg/pastry/pastry.c b/examples/msg/pastry/pastry.c
new file mode 100644 (file)
index 0000000..cbcfcd5
--- /dev/null
@@ -0,0 +1,655 @@
+#include <stdio.h>
+#include <math.h>
+#include "msg/msg.h"
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+
+ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pastry,
+                             "Messages specific for this msg example");
+
+/***************************************
+ * PASTRY                              *
+ *                                     *
+ * TODO:                               *
+ *  - handle node departure            *
+ *  - handle objects on the network    *
+ *  - handle neighborood in the update *
+ *                                     *
+ ***************************************/
+
+#define COMM_SIZE 10
+#define COMP_SIZE 0
+#define MAILBOX_NAME_SIZE 10
+
+#define DOMAIN_SIZE 4
+#define LEVELS_COUNT 8 // sizeof(int)*8/DOMAIN_SIZE
+#define LEVEL_SIZE 16 // 2^DOMAIN_SIZE
+#define NEIGHBORHOOD_SIZE 6
+#define NAMESPACE_SIZE 6
+#define MAILBOX_NAME_SIZE 10
+
+static int nb_bits = 16;
+static int timeout = 50;
+static int max_simulation_time = 1000;
+
+extern long int smx_total_comms;
+
+
+typedef struct s_node {
+  int id;                                 //128bits generated random(2^128 -1)
+  int known_id;
+  char mailbox[MAILBOX_NAME_SIZE];        // my mailbox name (string representation of the id)
+  int namespace_set[NAMESPACE_SIZE];
+  int neighborhood_set[NEIGHBORHOOD_SIZE];
+  int routing_table[LEVELS_COUNT][LEVEL_SIZE];
+  int ready;
+  msg_comm_t comm_receive;                // current communication to receive
+  xbt_fifo_t pending_tasks;
+} s_node_t, *node_t;
+
+typedef struct s_state {
+  int id;
+  int namespace_set[NAMESPACE_SIZE];
+  int neighborhood_set[NEIGHBORHOOD_SIZE];
+  int routing_table[LEVELS_COUNT][LEVEL_SIZE];
+} s_state_t, *state_t;
+
+/**
+ * Types of tasks exchanged between nodes.
+ */
+typedef enum {
+  TASK_JOIN,
+  TASK_JOIN_REPLY,
+  TASK_JOIN_LAST_REPLY,
+  TASK_UPDATE
+} e_task_type_t;
+
+typedef struct s_task_data {
+  e_task_type_t type;                     // type of task
+  int sender_id;                          // id paramater (used by some types of tasks)
+  //int request_finger;                     // finger parameter (used by some types of tasks)
+  int answer_id;                          // answer (used by some types of tasks)
+  char answer_to[MAILBOX_NAME_SIZE];      // mailbox to send an answer to (if any)
+  //const char* issuer_host_name;           // used for logging
+  int steps;
+  state_t state;
+} s_task_data_t, *task_data_t;
+
+
+static void print_node(node_t node);
+static void print_node_id(node_t node);
+static void print_node_neighborood_set(node_t node);
+static void print_node_routing_table(node_t node);
+static void print_node_namespace_set(node_t node);
+static state_t node_get_state(node_t node);
+static void get_mailbox(int node_id, char* mailbox);
+static int domain(int a, int level);
+static int shl(int a, int b);
+static int closest_in_namespace_set(node_t node, int dest);
+static int routing_next(node_t node, int dest);
+static void create(node_t node);
+static int join(node_t node);
+
+
+/**
+ * \brief Gets the mailbox name of a host given its chord id.
+ * \param node_id id of a node
+ * \param mailbox pointer to where the mailbox name should be written
+ * (there must be enough space)
+ */
+static void get_mailbox(int node_id, char* mailbox)
+{
+  snprintf(mailbox, MAILBOX_NAME_SIZE - 1, "%d", node_id);
+}
+
+/**
+ * Get the specific level of a node id
+ */
+int domain_mask = 0;
+static int domain(int a, int level) {
+  if (domain_mask == 0)
+    domain_mask = pow(2, DOMAIN_SIZE) - 1;
+  int shift = (LEVELS_COUNT-level-1)*DOMAIN_SIZE;
+  return (a >> shift) & domain_mask;
+}
+
+/**
+ * Get the shared domains between the two givens ids
+ */
+static int shl(int a, int b) {
+  int l = 0;
+  while(l<LEVELS_COUNT && domain(a,l) == domain(b,l))
+    l++;
+  return l;
+}
+
+/*
+ * Get the cloest id to the dest in the node namespace_set
+ */
+static int closest_in_namespace_set(node_t node, int dest) {
+  int best_dist;
+  int res = -1;
+  if ((node->namespace_set[NAMESPACE_SIZE-1] <= dest) & (dest <= node->namespace_set[0])) {
+    best_dist = abs(node->id - dest);
+    res = node->id;
+    int i, dist;
+    for (i=0; i<NAMESPACE_SIZE; i++) {
+      if (node->namespace_set[i]!=-1) {
+       dist = abs(node->namespace_set[i] - dest);
+       if (dist<best_dist) {
+         best_dist = dist;
+          res = node->namespace_set[i];          
+       }
+      }
+    }
+  }
+  return res;
+}
+
+/*
+ * Find the next node to forward a meassage to
+ */
+static int routing_next(node_t node, int dest) {
+  int closest = closest_in_namespace_set(node, dest);
+  int res = -1;
+  if (closest!=-1)
+    return closest;
+
+  int l = shl(node->id, dest);
+  res = node->routing_table[l][domain(dest, l)];
+  if (res!=-1)
+    return res;
+
+  //rare case
+  int dist = abs(node->id - dest);
+  int i,j;
+  for (i=l; i<LEVELS_COUNT; i++) {
+    for (j=0; j<LEVEL_SIZE; j++) {
+      res = node->routing_table[i][j];
+      if (res!=-1 && abs(res - dest)<dist)
+        return res;
+    }
+  }
+
+  for (i=0; i<NEIGHBORHOOD_SIZE; i++) {
+    res = node->neighborhood_set[i];
+    if (res!=-1 && shl(res, dest)>=l && abs(res - dest)<dist)
+        return res;
+  }
+
+  for (i=0; i<NAMESPACE_SIZE; i++) {
+    res = node->namespace_set[i];
+    if (res!=-1 && shl(res, dest)>=l && abs(res - dest)<dist)
+        return res;
+  }
+
+  return node->id;
+}
+
+/*
+ * Handle a given task
+ */
+static void handle_task(node_t node, msg_task_t task) {
+  XBT_DEBUG("Handling task %p", task);
+  char mailbox[MAILBOX_NAME_SIZE];
+  int i, j, min, max, d;
+  msg_task_t task_sent;
+  task_data_t req_data;
+  task_data_t task_data = (task_data_t) MSG_task_get_data(task);
+  e_task_type_t type = task_data->type;
+  // If the node is not ready keep the task for later
+  if (node->ready != 0 && !(type==TASK_JOIN_LAST_REPLY || type==TASK_JOIN_REPLY)) {
+    XBT_DEBUG("Task pending %i", type);
+    xbt_fifo_push(node->pending_tasks, task);
+    return;
+  }
+  switch (type) {
+    /*
+     * Try to join the ring
+     */
+    case TASK_JOIN:;
+      int next = routing_next(node, task_data->answer_id);
+      XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next);      
+      type = TASK_JOIN_LAST_REPLY;
+
+      req_data = xbt_new0(s_task_data_t,1);
+      req_data->answer_id = task_data->sender_id;
+      req_data->steps = task_data->steps + 1;
+      
+      // if next different from current node forward the join
+      if (next!=node->id) {
+        get_mailbox(next, mailbox);
+        task_data->sender_id = node->id;
+       task_data->steps++;
+        task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, task_data);
+        MSG_task_send_with_timeout(task_sent, mailbox, timeout);
+        type = TASK_JOIN_REPLY;
+      } 
+      
+      // send back the current node state to the joining node
+      req_data->type = type;
+      req_data->sender_id = node->id;
+      get_mailbox(node->id, req_data->answer_to);
+      req_data->state = node_get_state(node);
+      task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
+      MSG_task_send_with_timeout(task_sent, task_data->answer_to, timeout);
+      break;
+
+    /*
+     * Join reply from all the node touched by the join
+     */
+    case TASK_JOIN_LAST_REPLY:
+      // if last node touched reply, copy its namespace set
+      // TODO: it's work only if the two nodes are side to side (is it really the case ?)
+      j = (task_data->sender_id < node->id) ? -1 : 0;
+      for (i=0; i<NAMESPACE_SIZE/2; i++) {
+        node->namespace_set[i] = task_data->state->namespace_set[i-j];
+        node->namespace_set[NAMESPACE_SIZE-1-i] = task_data->state->namespace_set[NAMESPACE_SIZE-1-i-j-1];
+      }
+      node->namespace_set[NAMESPACE_SIZE/2+j] = task_data->sender_id;
+      node->ready += task_data->steps + 1;
+    case TASK_JOIN_REPLY:
+      XBT_DEBUG("Joining Reply");
+
+      // if first node touched reply, copy its neighborood set
+      if (task_data->sender_id == node->known_id) {
+       node->neighborhood_set[0] = task_data->sender_id;
+        for (i=1; i<NEIGHBORHOOD_SIZE; i++)
+            node->neighborhood_set[i] = task_data->state->neighborhood_set[i-1]; 
+      }
+      
+      // copy the corresponding routing table levels
+      min = (node->id==task_data->answer_id) ? 0 : shl(node->id, task_data->answer_id);      
+      max = shl(node->id, task_data->sender_id)+1;
+      for (i=min;i<max;i++) {
+        d = domain(node->id, i); 
+        for (j=0; j<LEVEL_SIZE; j++)
+         if (d!=j)
+            node->routing_table[i][j] =  task_data->state->routing_table[i][j];
+      }
+
+      node->ready--;
+      // if the node is ready, do all the pending tasks and send update to known nodes
+      if (node->ready==0) {
+        XBT_DEBUG("Node %i is ready!!!", node->id);
+
+        while(xbt_fifo_size(node->pending_tasks))
+         handle_task(node, xbt_fifo_pop(node->pending_tasks));
+
+       for (i=0; i<NAMESPACE_SIZE; i++) {
+          j = node->namespace_set[i];
+          if (j!=-1) {
+            XBT_DEBUG("Send update to %i", j);
+            get_mailbox(j, mailbox);
+           
+           req_data = xbt_new0(s_task_data_t,1);
+            req_data->answer_id = node->id;
+            req_data->steps = 0;
+            req_data->type = TASK_UPDATE;
+            req_data->sender_id = node->id;
+            get_mailbox(node->id, req_data->answer_to);
+            req_data->state = node_get_state(node);
+            task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
+            MSG_task_send_with_timeout(task_sent, mailbox, timeout);
+          }
+        }
+      }
+      break;
+      
+    /*
+     * Recieved an update of state
+     */
+    case TASK_UPDATE:
+      XBT_DEBUG("Task update %i !!!", node->id);
+
+      /* Update namespace ses */
+      printf("Task update from %i !!!\n", task_data->sender_id);
+      print_node_id(node);
+      print_node_namespace_set(node);
+      int curr_namespace_set[NAMESPACE_SIZE];
+      int task_namespace_set[NAMESPACE_SIZE+1];
+      
+      // Copy the current namedspace
+      // and the task state namespace with state->id in the middle
+      i=0;
+      for (; i<NAMESPACE_SIZE/2; i++){
+        curr_namespace_set[i] = node->namespace_set[i];
+       task_namespace_set[i] = task_data->state->namespace_set[i];
+      }
+      task_namespace_set[i] = task_data->state->id;
+      for (; i<NAMESPACE_SIZE; i++){
+        curr_namespace_set[i] = node->namespace_set[i];        
+       task_namespace_set[i+1] = task_data->state->namespace_set[i];   
+      }
+
+      // get the index of values before and after node->id in task_namespace
+      min = -1;
+      max = -1;
+      for (i=0; i<=NAMESPACE_SIZE; i++) {
+       j = task_namespace_set[i];
+        if (i<NAMESPACE_SIZE)
+         printf("%08x %08x | ", j, curr_namespace_set[i]);
+       if (j != -1 && j < node->id) min = i;
+       if (j != -1 && max == -1 && j > node->id) max = i;
+      }
+      printf("\n");
+
+      // add lower elements
+      j = NAMESPACE_SIZE/2-1;
+      for (i=NAMESPACE_SIZE/2-1; i>=0; i--) {
+       printf("i:%i, j:%i, min:%i, currj:%08x, taskmin:%08x\n", i, j, min, curr_namespace_set[j], task_namespace_set[min]);
+        if (min<0) {
+         node->namespace_set[i] = curr_namespace_set[j];
+         j--; 
+       } else if (curr_namespace_set[j] == task_namespace_set[min]) {
+         node->namespace_set[i] = curr_namespace_set[j];
+         j--; min--;
+       } else if (curr_namespace_set[j] > task_namespace_set[min]) {
+          node->namespace_set[i] = curr_namespace_set[j];
+         j--;
+       } else {
+          node->namespace_set[i] = task_namespace_set[min];
+         min--;
+       }
+      }
+
+      // add greater elements
+      j = NAMESPACE_SIZE/2;
+      for (i=NAMESPACE_SIZE/2; i<NAMESPACE_SIZE; i++) {
+       printf("i:%i, j:%i, max:%i, currj:%08x, taskmax:%08x\n", i, j, max, curr_namespace_set[j], task_namespace_set[max]);          
+        if (min<0 || max>=NAMESPACE_SIZE) {
+         node->namespace_set[i] = curr_namespace_set[j];
+         j++;
+       } else if (curr_namespace_set[j] == -1) {
+         node->namespace_set[i] = task_namespace_set[max];
+         max++;
+       } else if (curr_namespace_set[j] == task_namespace_set[max]) {
+         node->namespace_set[i] = curr_namespace_set[j];
+         j++; max++;
+       } else if (curr_namespace_set[j] < task_namespace_set[max]) {
+          node->namespace_set[i] = curr_namespace_set[j];
+         j++;
+       } else {
+          node->namespace_set[i] = task_namespace_set[max];
+         max++;
+       }
+      }
+      print_node_namespace_set(node);
+
+      /* Update routing table */
+      for (i=shl(node->id, task_data->state->id); i<LEVELS_COUNT; i++) {
+        for (j=0; j<LEVEL_SIZE; j++) {
+          if (node->routing_table[i][j]==-1 && task_data->state->routing_table[i][j]==-1)
+            node->routing_table[i][j] = task_data->state->routing_table[i][j];
+        }
+      }
+  }               
+}
+
+/**
+ * \brief Initializes the current node as the first one of the system.
+ * \param node the current node
+ */
+static void create(node_t node){
+  node->ready = 0;
+  XBT_DEBUG("Create a new Pastry ring...");
+}
+
+/*
+ * Join the ring
+ */
+static int join(node_t node){
+  task_data_t req_data = xbt_new0(s_task_data_t,1);
+  req_data->type = TASK_JOIN;
+  req_data->sender_id = node->id;
+  req_data->answer_id = node->id;
+  req_data->steps = 0;
+  get_mailbox(node->id, req_data->answer_to);
+
+  char mailbox[MAILBOX_NAME_SIZE];
+  get_mailbox(node->known_id, mailbox);
+
+  msg_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
+  XBT_DEBUG("Trying to join Pastry ring... (with node %s)", mailbox);
+  MSG_task_send_with_timeout(task_sent, mailbox, timeout);
+
+  return 1;
+}
+
+/*
+ * Print the node infomations
+ */
+static void print_node(node_t node) {
+  printf("Node:\n");
+  print_node_id(node);
+  print_node_neighborood_set(node);
+  print_node_routing_table(node);
+  print_node_namespace_set(node);
+}
+
+/*
+ * Print the node id
+ */
+static void print_node_id(node_t node) {
+  int i;       
+  printf(" id: %i '%08x' ", node->id, node->id);
+  for (i=0;i<LEVELS_COUNT;i++)
+    printf(" %x", domain(node->id, i));
+  printf("\n");
+}
+
+/*
+ * Print the node neighborood set
+ */
+static void print_node_neighborood_set(node_t node) {
+  int i;       
+  printf(" neighborood:\n");
+  for (i=0; i<NEIGHBORHOOD_SIZE; i++)
+    printf("  %08x\n", node->neighborhood_set[i]);
+}
+
+/*
+ * Print the routing table
+ */
+static void print_node_routing_table(node_t node) {
+  int i,j;     
+  printf(" routing table:\n");
+  for (i=0; i<LEVELS_COUNT; i++){
+    printf("  ");
+    for (j=0; j<LEVEL_SIZE; j++)
+      printf("%08x ", node->routing_table[i][j]);
+    printf("\n");
+  }
+}
+
+/*
+ * Print the node namespace set
+ */
+static void print_node_namespace_set(node_t node) {
+  int i;
+  printf(" namespace:\n");
+  for (i=0; i<NAMESPACE_SIZE; i++)
+    printf("  %08x\n", node->namespace_set[i]);
+  printf("\n");
+
+}
+
+/*
+ * Get the corresponding state of a node
+ */
+static state_t node_get_state(node_t node) {
+  int i,j;     
+  state_t state = xbt_new0(s_state_t,1);
+  state->id = node->id;
+  for (i=0; i<NEIGHBORHOOD_SIZE; i++)
+    state->neighborhood_set[i] = node->neighborhood_set[i];
+
+  for (i=0; i<LEVELS_COUNT; i++)
+    for (j=0; j<LEVEL_SIZE; j++)
+      state->routing_table[i][j] = node->routing_table[i][j];
+
+  for (i=0; i<NAMESPACE_SIZE; i++)
+    state->namespace_set[i] = node->namespace_set[i];
+
+  return state;
+}
+
+
+/**
+ * \brief Node Function
+ * Arguments:
+ * - my id
+ * - the id of a guy I know in the system (except for the first node)
+ * - the time to sleep before I join (except for the first node)
+ * - the deadline time
+ */
+static int node(int argc, char *argv[])
+{
+  double init_time = MSG_get_clock();
+  msg_task_t task_received = NULL;  
+  int join_success = 0;  
+  double deadline;
+  xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node");
+  s_node_t node = {0};
+  node.id = atoi(argv[1]);
+  node.known_id = -1;
+  node.ready = -1;
+  node.pending_tasks = xbt_fifo_new();
+  get_mailbox(node.id, node.mailbox);
+  XBT_DEBUG("New node with id %s (%08x)", node.mailbox, node.id);
+  
+  int i,j,d;
+  for (i=0; i<LEVELS_COUNT; i++){
+    d = domain(node.id, i);
+    for (j=0; j<LEVEL_SIZE; j++)
+      node.routing_table[i][j] = (d==j) ? node.id : -1;
+  }
+
+  for (i=0; i<NEIGHBORHOOD_SIZE; i++)
+    node.neighborhood_set[i] = -1;
+
+  for (i=0; i<NAMESPACE_SIZE; i++)
+    node.namespace_set[i] = -1;
+
+  if (argc == 3) { // first ring
+    XBT_DEBUG("Hey! Let's create the system.");
+    deadline = atof(argv[2]);
+    create(&node);
+    join_success = 1;
+  }
+  else {
+    node.known_id = atoi(argv[2]);
+    double sleep_time = atof(argv[3]);
+    deadline = atof(argv[4]);
+
+    // sleep before starting
+    XBT_DEBUG("Let's sleep during %f", sleep_time);
+    MSG_process_sleep(sleep_time);
+    XBT_DEBUG("Hey! Let's join the system.");
+
+    join_success = join(&node);
+  }
+
+  if (join_success) {
+    XBT_DEBUG("Waiting â€¦.");
+
+    while (MSG_get_clock() < init_time + deadline
+//      && MSG_get_clock() < node.last_change_date + 1000
+        && MSG_get_clock() < max_simulation_time) {
+      if (node.comm_receive == NULL) {
+        task_received = NULL;
+        node.comm_receive = MSG_task_irecv(&task_received, node.mailbox);
+        // FIXME: do not make MSG_task_irecv() calls from several functions
+      }
+      if (!MSG_comm_test(node.comm_receive)) {
+        MSG_process_sleep(5);
+      } else {
+        // a transfer has occurred
+
+        msg_error_t status = MSG_comm_get_status(node.comm_receive);
+
+        if (status != MSG_OK) {
+          XBT_DEBUG("Failed to receive a task. Nevermind.");
+          MSG_comm_destroy(node.comm_receive);
+          node.comm_receive = NULL;
+        }
+        else {
+          // the task was successfully received
+          MSG_comm_destroy(node.comm_receive);
+          node.comm_receive = NULL;
+          handle_task(&node, task_received);
+        }
+      }
+
+    }
+    print_node(&node);
+  }
+  return 1;
+}
+
+/*
+ * Node data.
+ */
+/*typedef struct s_node {
+  int id;                                 // my id
+  char mailbox[MAILBOX_NAME_SIZE];        // my mailbox name (string representation of the id)
+  s_finger_t *fingers;                    // finger table, of size nb_bits (fingers[0] is my successor)
+  int pred_id;                            // predecessor id
+  char pred_mailbox[MAILBOX_NAME_SIZE];   // predecessor's mailbox name
+  int next_finger_to_fix;                 // index of the next finger to fix in fix_fingers()
+  msg_comm_t comm_receive;                // current communication to receive
+  double last_change_date;                // last time I changed a finger or my predecessor
+} s_node_t, *node_t;*/
+
+/**
+ * \brief Main function.
+ */
+int main(int argc, char *argv[])
+{
+  MSG_init(&argc, argv);
+  if (argc < 3) {
+    printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]);
+    printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]);
+    exit(1);
+  }
+  
+  char **options = &argv[1];
+  while (!strncmp(options[0], "-", 1)) {
+
+    int length = strlen("-nb_bits=");
+    if (!strncmp(options[0], "-nb_bits=", length) && strlen(options[0]) > length) {
+      nb_bits = atoi(options[0] + length);
+      XBT_DEBUG("Set nb_bits to %d", nb_bits);
+    }
+    else {
+
+      length = strlen("-timeout=");
+      if (!strncmp(options[0], "-timeout=", length) && strlen(options[0]) > length) {
+        timeout = atoi(options[0] + length);
+        XBT_DEBUG("Set timeout to %d", timeout);
+      }
+      else {
+        xbt_die("Invalid chord option '%s'", options[0]);
+      }
+    }
+    options++;
+  }
+
+  const char* platform_file = options[0];
+  const char* application_file = options[1];
+
+  MSG_create_environment(platform_file);
+  
+  MSG_function_register("node", node);
+  MSG_launch_application(application_file);
+
+  msg_error_t res = MSG_main();
+  XBT_CRITICAL("Messages created: %ld", smx_total_comms);
+  XBT_INFO("Simulated time: %g", MSG_get_clock());
+
+  if (res == MSG_OK)
+    return 0;
+  else
+    return 1;
+
+}
diff --git a/examples/msg/pastry/pastry.tesh b/examples/msg/pastry/pastry.tesh
new file mode 100644 (file)
index 0000000..fd9708d
--- /dev/null
@@ -0,0 +1,6 @@
+#! ./tesh
+
+p Testing the Chord implementation with MSG
+
+! output sort
+$ $SG_TEST_EXENV ${bindir:=.}/pastry$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --cfg=network/crosstraffic:0 --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
diff --git a/examples/msg/pastry/pastry10.xml b/examples/msg/pastry/pastry10.xml
new file mode 100644 (file)
index 0000000..37c6edf
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <process host="c-0.me" function="node"><argument value="42"/><argument value="6000000"/></process>
+  <process host="c-1.me" function="node"><argument value="366680" /><argument value="42" /><argument value="10" /><argument value="6000000" /></process>
+  <process host="c-2.me" function="node"><argument value="533744" /><argument value="366680" /><argument value="20" /><argument value="6000000" /></process>
+  <process host="c-3.me" function="node"><argument value="1319738" /><argument value="42" /><argument value="30" /><argument value="6000000" /></process>
+  <process host="c-4.me" function="node"><argument value="16509405" /><argument value="366680" /><argument value="40" /><argument value="6000000" /></process>
+  <process host="c-5.me" function="node"><argument value="10874876" /><argument value="533744" /><argument value="50" /><argument value="6000000" /></process>
+  <process host="c-6.me" function="node"><argument value="16728096" /><argument value="1319738" /><argument value="60" /><argument value="6000000" /></process>
+  <process host="c-7.me" function="node"><argument value="10004760" /><argument value="16509405" /><argument value="70" /><argument value="6000000" /></process>
+  <process host="c-8.me" function="node"><argument value="6518808" /><argument value="42" /><argument value="80" /><argument value="6000000" /></process>
+  <process host="c-9.me" function="node"><argument value="2015253" /><argument value="1319738" /><argument value="90" /><argument value="6000000" /></process>
+</platform>
diff --git a/examples/msg/pastry/pastry_crosstraffic.tesh b/examples/msg/pastry/pastry_crosstraffic.tesh
new file mode 100644 (file)
index 0000000..dce7b71
--- /dev/null
@@ -0,0 +1,3019 @@
+#! ./tesh
+
+p Testing the Chord implementation with MSG
+
+! output sort
+$ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (1:node@Gatien) Joining the ring with id 48, knowing node 1
+> [  0.000000] (2:node@McGee) Joining the ring with id 42, knowing node 1
+> [  0.000000] (3:node@iRMX) Joining the ring with id 38, knowing node 1
+> [  0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1
+> [  0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1
+> [  0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1
+> [  0.000000] (7:node@Boivin) Joining the ring with id 8, knowing node 1
+> [  0.000000] (8:node@Jacquelin) My finger table:
+> [  0.000000] (8:node@Jacquelin) Start | Succ 
+> [  0.000000] (8:node@Jacquelin)    2  |   1 
+> [  0.000000] (8:node@Jacquelin)    3  |   1 
+> [  0.000000] (8:node@Jacquelin)    5  |   1 
+> [  0.000000] (8:node@Jacquelin)    9  |   1 
+> [  0.000000] (8:node@Jacquelin)   17  |   1 
+> [  0.000000] (8:node@Jacquelin)   33  |   1 
+> [  0.000000] (8:node@Jacquelin) Predecessor: -1
+> [  6.274448] (1:node@Gatien) My finger table:
+> [  6.274448] (1:node@Gatien) Start | Succ 
+> [  6.274448] (1:node@Gatien)   49  |   1 
+> [  6.274448] (1:node@Gatien)   50  |  48 
+> [  6.274448] (1:node@Gatien)   52  |  48 
+> [  6.274448] (1:node@Gatien)   56  |  48 
+> [  6.274448] (1:node@Gatien)    0  |  48 
+> [  6.274448] (1:node@Gatien)   16  |  48 
+> [  6.274448] (1:node@Gatien) Predecessor: -1
+> [ 10.888356] (2:node@McGee) My finger table:
+> [ 10.888356] (2:node@McGee) Start | Succ 
+> [ 10.888356] (2:node@McGee)   43  |   1 
+> [ 10.888356] (2:node@McGee)   44  |  42 
+> [ 10.888356] (2:node@McGee)   46  |  42 
+> [ 10.888356] (2:node@McGee)   50  |  42 
+> [ 10.888356] (2:node@McGee)   58  |  42 
+> [ 10.888356] (2:node@McGee)   10  |  42 
+> [ 10.888356] (2:node@McGee) Predecessor: -1
+> [ 18.043675] (3:node@iRMX) My finger table:
+> [ 18.043675] (3:node@iRMX) Start | Succ 
+> [ 18.043675] (3:node@iRMX)   39  |   1 
+> [ 18.043675] (3:node@iRMX)   40  |  38 
+> [ 18.043675] (3:node@iRMX)   42  |  38 
+> [ 18.043675] (3:node@iRMX)   46  |  38 
+> [ 18.043675] (3:node@iRMX)   54  |  38 
+> [ 18.043675] (3:node@iRMX)    6  |  38 
+> [ 18.043675] (3:node@iRMX) Predecessor: -1
+> [ 20.005344] (4:node@Geoff) My finger table:
+> [ 20.005344] (4:node@Geoff) Start | Succ 
+> [ 20.005344] (4:node@Geoff)   33  |   1 
+> [ 20.005344] (4:node@Geoff)   34  |  32 
+> [ 20.005344] (4:node@Geoff)   36  |  32 
+> [ 20.005344] (4:node@Geoff)   40  |  32 
+> [ 20.005344] (4:node@Geoff)   48  |  32 
+> [ 20.005344] (4:node@Geoff)    0  |  32 
+> [ 20.005344] (4:node@Geoff) Predecessor: -1
+> [ 26.812602] (5:node@TeX) My finger table:
+> [ 26.812602] (5:node@TeX) Start | Succ 
+> [ 26.812602] (5:node@TeX)   22  |   1 
+> [ 26.812602] (5:node@TeX)   23  |  21 
+> [ 26.812602] (5:node@TeX)   25  |  21 
+> [ 26.812602] (5:node@TeX)   29  |  21 
+> [ 26.812602] (5:node@TeX)   37  |  21 
+> [ 26.812602] (5:node@TeX)   53  |  21 
+> [ 26.812602] (5:node@TeX) Predecessor: -1
+> [ 30.925131] (6:node@Jean_Yves) My finger table:
+> [ 30.925131] (6:node@Jean_Yves) Start | Succ 
+> [ 30.925131] (6:node@Jean_Yves)   15  |   1 
+> [ 30.925131] (6:node@Jean_Yves)   16  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   18  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   22  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   30  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   46  |  14 
+> [ 30.925131] (6:node@Jean_Yves) Predecessor: -1
+> [ 36.048886] (7:node@Boivin) My finger table:
+> [ 36.048886] (7:node@Boivin) Start | Succ 
+> [ 36.048886] (7:node@Boivin)    9  |   1 
+> [ 36.048886] (7:node@Boivin)   10  |   8 
+> [ 36.048886] (7:node@Boivin)   12  |   8 
+> [ 36.048886] (7:node@Boivin)   16  |   8 
+> [ 36.048886] (7:node@Boivin)   24  |   8 
+> [ 36.048886] (7:node@Boivin)   40  |   8 
+> [ 36.048886] (7:node@Boivin) Predecessor: -1
+> [ 75.000000] (8:node@Jacquelin) My finger table:
+> [ 75.000000] (8:node@Jacquelin) Start | Succ 
+> [ 75.000000] (8:node@Jacquelin)    2  |   1 
+> [ 75.000000] (8:node@Jacquelin)    3  |   1 
+> [ 75.000000] (8:node@Jacquelin)    5  |   1 
+> [ 75.000000] (8:node@Jacquelin)    9  |   1 
+> [ 75.000000] (8:node@Jacquelin)   17  |   1 
+> [ 75.000000] (8:node@Jacquelin)   33  |   1 
+> [ 75.000000] (8:node@Jacquelin) Predecessor: 32
+> [ 80.000000] (8:node@Jacquelin) My finger table:
+> [ 80.000000] (8:node@Jacquelin) Start | Succ 
+> [ 80.000000] (8:node@Jacquelin)    2  |   1 
+> [ 80.000000] (8:node@Jacquelin)    3  |   1 
+> [ 80.000000] (8:node@Jacquelin)    5  |   1 
+> [ 80.000000] (8:node@Jacquelin)    9  |   1 
+> [ 80.000000] (8:node@Jacquelin)   17  |   1 
+> [ 80.000000] (8:node@Jacquelin)   33  |   1 
+> [ 80.000000] (8:node@Jacquelin) Predecessor: 42
+> [ 81.274448] (8:node@Jacquelin) My finger table:
+> [ 81.274448] (8:node@Jacquelin) Start | Succ 
+> [ 81.274448] (8:node@Jacquelin)    2  |  42 
+> [ 81.274448] (8:node@Jacquelin)    3  |   1 
+> [ 81.274448] (8:node@Jacquelin)    5  |   1 
+> [ 81.274448] (8:node@Jacquelin)    9  |   1 
+> [ 81.274448] (8:node@Jacquelin)   17  |   1 
+> [ 81.274448] (8:node@Jacquelin)   33  |   1 
+> [ 81.274448] (8:node@Jacquelin) Predecessor: 48
+> [116.655207] (2:node@McGee) My finger table:
+> [116.655207] (2:node@McGee) Start | Succ 
+> [116.655207] (2:node@McGee)   43  |  48 
+> [116.655207] (2:node@McGee)   44  |  42 
+> [116.655207] (2:node@McGee)   46  |  42 
+> [116.655207] (2:node@McGee)   50  |  42 
+> [116.655207] (2:node@McGee)   58  |  42 
+> [116.655207] (2:node@McGee)   10  |  42 
+> [116.655207] (2:node@McGee) Predecessor: 1
+> [141.383343] (1:node@Gatien) My finger table:
+> [141.383343] (1:node@Gatien) Start | Succ 
+> [141.383343] (1:node@Gatien)   49  |   1 
+> [141.383343] (1:node@Gatien)   50  |  48 
+> [141.383343] (1:node@Gatien)   52  |  48 
+> [141.383343] (1:node@Gatien)   56  |  48 
+> [141.383343] (1:node@Gatien)    0  |  48 
+> [141.383343] (1:node@Gatien)   16  |  48 
+> [141.383343] (1:node@Gatien) Predecessor: 42
+> [187.430835] (2:node@McGee) My finger table:
+> [187.430835] (2:node@McGee) Start | Succ 
+> [187.430835] (2:node@McGee)   43  |  48 
+> [187.430835] (2:node@McGee)   44  |  42 
+> [187.430835] (2:node@McGee)   46  |  42 
+> [187.430835] (2:node@McGee)   50  |  42 
+> [187.430835] (2:node@McGee)   58  |  42 
+> [187.430835] (2:node@McGee)   10  |  42 
+> [187.430835] (2:node@McGee) Predecessor: 8
+> [224.180962] (2:node@McGee) My finger table:
+> [224.180962] (2:node@McGee) Start | Succ 
+> [224.180962] (2:node@McGee)   43  |  48 
+> [224.180962] (2:node@McGee)   44  |  42 
+> [224.180962] (2:node@McGee)   46  |  42 
+> [224.180962] (2:node@McGee)   50  |  42 
+> [224.180962] (2:node@McGee)   58  |  42 
+> [224.180962] (2:node@McGee)   10  |  42 
+> [224.180962] (2:node@McGee) Predecessor: 38
+> [238.097222] (7:node@Boivin) My finger table:
+> [238.097222] (7:node@Boivin) Start | Succ 
+> [238.097222] (7:node@Boivin)    9  |  38 
+> [238.097222] (7:node@Boivin)   10  |   8 
+> [238.097222] (7:node@Boivin)   12  |   8 
+> [238.097222] (7:node@Boivin)   16  |   8 
+> [238.097222] (7:node@Boivin)   24  |   8 
+> [238.097222] (7:node@Boivin)   40  |   8 
+> [238.097222] (7:node@Boivin) Predecessor: 1
+> [244.544647] (1:node@Gatien) My finger table:
+> [244.544647] (1:node@Gatien) Start | Succ 
+> [244.544647] (1:node@Gatien)   49  |   1 
+> [244.544647] (1:node@Gatien)   50  |   1 
+> [244.544647] (1:node@Gatien)   52  |  48 
+> [244.544647] (1:node@Gatien)   56  |  48 
+> [244.544647] (1:node@Gatien)    0  |  48 
+> [244.544647] (1:node@Gatien)   16  |  48 
+> [244.544647] (1:node@Gatien) Predecessor: 42
+> [251.309994] (7:node@Boivin) My finger table:
+> [251.309994] (7:node@Boivin) Start | Succ 
+> [251.309994] (7:node@Boivin)    9  |  38 
+> [251.309994] (7:node@Boivin)   10  |  38 
+> [251.309994] (7:node@Boivin)   12  |   8 
+> [251.309994] (7:node@Boivin)   16  |   8 
+> [251.309994] (7:node@Boivin)   24  |   8 
+> [251.309994] (7:node@Boivin)   40  |   8 
+> [251.309994] (7:node@Boivin) Predecessor: 1
+> [252.819580] (2:node@McGee) My finger table:
+> [252.819580] (2:node@McGee) Start | Succ 
+> [252.819580] (2:node@McGee)   43  |  48 
+> [252.819580] (2:node@McGee)   44  |  48 
+> [252.819580] (2:node@McGee)   46  |  42 
+> [252.819580] (2:node@McGee)   50  |  42 
+> [252.819580] (2:node@McGee)   58  |  42 
+> [252.819580] (2:node@McGee)   10  |  42 
+> [252.819580] (2:node@McGee) Predecessor: 38
+> [268.906974] (6:node@Jean_Yves) My finger table:
+> [268.906974] (6:node@Jean_Yves) Start | Succ 
+> [268.906974] (6:node@Jean_Yves)   15  |  38 
+> [268.906974] (6:node@Jean_Yves)   16  |  38 
+> [268.906974] (6:node@Jean_Yves)   18  |  14 
+> [268.906974] (6:node@Jean_Yves)   22  |  14 
+> [268.906974] (6:node@Jean_Yves)   30  |  14 
+> [268.906974] (6:node@Jean_Yves)   46  |  14 
+> [268.906974] (6:node@Jean_Yves) Predecessor: -1
+> [272.587495] (3:node@iRMX) My finger table:
+> [272.587495] (3:node@iRMX) Start | Succ 
+> [272.587495] (3:node@iRMX)   39  |  42 
+> [272.587495] (3:node@iRMX)   40  |  38 
+> [272.587495] (3:node@iRMX)   42  |  38 
+> [272.587495] (3:node@iRMX)   46  |  38 
+> [272.587495] (3:node@iRMX)   54  |  38 
+> [272.587495] (3:node@iRMX)    6  |  38 
+> [272.587495] (3:node@iRMX) Predecessor: 8
+> [275.995507] (8:node@Jacquelin) My finger table:
+> [275.995507] (8:node@Jacquelin) Start | Succ 
+> [275.995507] (8:node@Jacquelin)    2  |   8 
+> [275.995507] (8:node@Jacquelin)    3  |   8 
+> [275.995507] (8:node@Jacquelin)    5  |   1 
+> [275.995507] (8:node@Jacquelin)    9  |   1 
+> [275.995507] (8:node@Jacquelin)   17  |   1 
+> [275.995507] (8:node@Jacquelin)   33  |   1 
+> [275.995507] (8:node@Jacquelin) Predecessor: 48
+> [278.895082] (3:node@iRMX) My finger table:
+> [278.895082] (3:node@iRMX) Start | Succ 
+> [278.895082] (3:node@iRMX)   39  |  42 
+> [278.895082] (3:node@iRMX)   40  |  38 
+> [278.895082] (3:node@iRMX)   42  |  38 
+> [278.895082] (3:node@iRMX)   46  |  38 
+> [278.895082] (3:node@iRMX)   54  |  38 
+> [278.895082] (3:node@iRMX)    6  |  38 
+> [278.895082] (3:node@iRMX) Predecessor: 14
+> [285.028772] (3:node@iRMX) My finger table:
+> [285.028772] (3:node@iRMX) Start | Succ 
+> [285.028772] (3:node@iRMX)   39  |  42 
+> [285.028772] (3:node@iRMX)   40  |  42 
+> [285.028772] (3:node@iRMX)   42  |  38 
+> [285.028772] (3:node@iRMX)   46  |  38 
+> [285.028772] (3:node@iRMX)   54  |  38 
+> [285.028772] (3:node@iRMX)    6  |  38 
+> [285.028772] (3:node@iRMX) Predecessor: 14
+> [299.124613] (4:node@Geoff) My finger table:
+> [299.124613] (4:node@Geoff) Start | Succ 
+> [299.124613] (4:node@Geoff)   33  |  38 
+> [299.124613] (4:node@Geoff)   34  |  38 
+> [299.124613] (4:node@Geoff)   36  |  32 
+> [299.124613] (4:node@Geoff)   40  |  32 
+> [299.124613] (4:node@Geoff)   48  |  32 
+> [299.124613] (4:node@Geoff)    0  |  32 
+> [299.124613] (4:node@Geoff) Predecessor: -1
+> [302.471288] (5:node@TeX) My finger table:
+> [302.471288] (5:node@TeX) Start | Succ 
+> [302.471288] (5:node@TeX)   22  |  38 
+> [302.471288] (5:node@TeX)   23  |  38 
+> [302.471288] (5:node@TeX)   25  |  21 
+> [302.471288] (5:node@TeX)   29  |  21 
+> [302.471288] (5:node@TeX)   37  |  21 
+> [302.471288] (5:node@TeX)   53  |  21 
+> [302.471288] (5:node@TeX) Predecessor: -1
+> [309.606669] (3:node@iRMX) My finger table:
+> [309.606669] (3:node@iRMX) Start | Succ 
+> [309.606669] (3:node@iRMX)   39  |  42 
+> [309.606669] (3:node@iRMX)   40  |  42 
+> [309.606669] (3:node@iRMX)   42  |  38 
+> [309.606669] (3:node@iRMX)   46  |  38 
+> [309.606669] (3:node@iRMX)   54  |  38 
+> [309.606669] (3:node@iRMX)    6  |  38 
+> [309.606669] (3:node@iRMX) Predecessor: 32
+> [352.254169] (6:node@Jean_Yves) My finger table:
+> [352.254169] (6:node@Jean_Yves) Start | Succ 
+> [352.254169] (6:node@Jean_Yves)   15  |  32 
+> [352.254169] (6:node@Jean_Yves)   16  |  38 
+> [352.254169] (6:node@Jean_Yves)   18  |  14 
+> [352.254169] (6:node@Jean_Yves)   22  |  14 
+> [352.254169] (6:node@Jean_Yves)   30  |  14 
+> [352.254169] (6:node@Jean_Yves)   46  |  14 
+> [352.254169] (6:node@Jean_Yves) Predecessor: 8
+> [367.424317] (4:node@Geoff) My finger table:
+> [367.424317] (4:node@Geoff) Start | Succ 
+> [367.424317] (4:node@Geoff)   33  |  38 
+> [367.424317] (4:node@Geoff)   34  |  38 
+> [367.424317] (4:node@Geoff)   36  |  32 
+> [367.424317] (4:node@Geoff)   40  |  32 
+> [367.424317] (4:node@Geoff)   48  |  32 
+> [367.424317] (4:node@Geoff)    0  |  32 
+> [367.424317] (4:node@Geoff) Predecessor: 14
+> [368.585370] (1:node@Gatien) My finger table:
+> [368.585370] (1:node@Gatien) Start | Succ 
+> [368.585370] (1:node@Gatien)   49  |   1 
+> [368.585370] (1:node@Gatien)   50  |   1 
+> [368.585370] (1:node@Gatien)   52  |   1 
+> [368.585370] (1:node@Gatien)   56  |  48 
+> [368.585370] (1:node@Gatien)    0  |  48 
+> [368.585370] (1:node@Gatien)   16  |  48 
+> [368.585370] (1:node@Gatien) Predecessor: 42
+> [374.895628] (2:node@McGee) My finger table:
+> [374.895628] (2:node@McGee) Start | Succ 
+> [374.895628] (2:node@McGee)   43  |  48 
+> [374.895628] (2:node@McGee)   44  |  48 
+> [374.895628] (2:node@McGee)   46  |  48 
+> [374.895628] (2:node@McGee)   50  |  42 
+> [374.895628] (2:node@McGee)   58  |  42 
+> [374.895628] (2:node@McGee)   10  |  42 
+> [374.895628] (2:node@McGee) Predecessor: 38
+> [392.072209] (7:node@Boivin) My finger table:
+> [392.072209] (7:node@Boivin) Start | Succ 
+> [392.072209] (7:node@Boivin)    9  |  14 
+> [392.072209] (7:node@Boivin)   10  |  38 
+> [392.072209] (7:node@Boivin)   12  |  14 
+> [392.072209] (7:node@Boivin)   16  |   8 
+> [392.072209] (7:node@Boivin)   24  |   8 
+> [392.072209] (7:node@Boivin)   40  |   8 
+> [392.072209] (7:node@Boivin) Predecessor: 1
+> [398.554322] (4:node@Geoff) My finger table:
+> [398.554322] (4:node@Geoff) Start | Succ 
+> [398.554322] (4:node@Geoff)   33  |  38 
+> [398.554322] (4:node@Geoff)   34  |  38 
+> [398.554322] (4:node@Geoff)   36  |  32 
+> [398.554322] (4:node@Geoff)   40  |  32 
+> [398.554322] (4:node@Geoff)   48  |  32 
+> [398.554322] (4:node@Geoff)    0  |  32 
+> [398.554322] (4:node@Geoff) Predecessor: 21
+> [400.952052] (6:node@Jean_Yves) My finger table:
+> [400.952052] (6:node@Jean_Yves) Start | Succ 
+> [400.952052] (6:node@Jean_Yves)   15  |  21 
+> [400.952052] (6:node@Jean_Yves)   16  |  38 
+> [400.952052] (6:node@Jean_Yves)   18  |  21 
+> [400.952052] (6:node@Jean_Yves)   22  |  14 
+> [400.952052] (6:node@Jean_Yves)   30  |  14 
+> [400.952052] (6:node@Jean_Yves)   46  |  14 
+> [400.952052] (6:node@Jean_Yves) Predecessor: 8
+> [405.305451] (8:node@Jacquelin) My finger table:
+> [405.305451] (8:node@Jacquelin) Start | Succ 
+> [405.305451] (8:node@Jacquelin)    2  |   8 
+> [405.305451] (8:node@Jacquelin)    3  |   8 
+> [405.305451] (8:node@Jacquelin)    5  |   8 
+> [405.305451] (8:node@Jacquelin)    9  |   1 
+> [405.305451] (8:node@Jacquelin)   17  |   1 
+> [405.305451] (8:node@Jacquelin)   33  |   1 
+> [405.305451] (8:node@Jacquelin) Predecessor: 48
+> [410.451797] (3:node@iRMX) My finger table:
+> [410.451797] (3:node@iRMX) Start | Succ 
+> [410.451797] (3:node@iRMX)   39  |  42 
+> [410.451797] (3:node@iRMX)   40  |  42 
+> [410.451797] (3:node@iRMX)   42  |  42 
+> [410.451797] (3:node@iRMX)   46  |  38 
+> [410.451797] (3:node@iRMX)   54  |  38 
+> [410.451797] (3:node@iRMX)    6  |  38 
+> [410.451797] (3:node@iRMX) Predecessor: 32
+> [420.675344] (4:node@Geoff) My finger table:
+> [420.675344] (4:node@Geoff) Start | Succ 
+> [420.675344] (4:node@Geoff)   33  |  38 
+> [420.675344] (4:node@Geoff)   34  |  38 
+> [420.675344] (4:node@Geoff)   36  |  38 
+> [420.675344] (4:node@Geoff)   40  |  32 
+> [420.675344] (4:node@Geoff)   48  |  32 
+> [420.675344] (4:node@Geoff)    0  |  32 
+> [420.675344] (4:node@Geoff) Predecessor: 21
+> [423.624187] (5:node@TeX) My finger table:
+> [423.624187] (5:node@TeX) Start | Succ 
+> [423.624187] (5:node@TeX)   22  |  32 
+> [423.624187] (5:node@TeX)   23  |  38 
+> [423.624187] (5:node@TeX)   25  |  32 
+> [423.624187] (5:node@TeX)   29  |  21 
+> [423.624187] (5:node@TeX)   37  |  21 
+> [423.624187] (5:node@TeX)   53  |  21 
+> [423.624187] (5:node@TeX) Predecessor: -1
+> [437.092176] (5:node@TeX) My finger table:
+> [437.092176] (5:node@TeX) Start | Succ 
+> [437.092176] (5:node@TeX)   22  |  32 
+> [437.092176] (5:node@TeX)   23  |  38 
+> [437.092176] (5:node@TeX)   25  |  32 
+> [437.092176] (5:node@TeX)   29  |  21 
+> [437.092176] (5:node@TeX)   37  |  21 
+> [437.092176] (5:node@TeX)   53  |  21 
+> [437.092176] (5:node@TeX) Predecessor: 14
+> [492.679275] (1:node@Gatien) My finger table:
+> [492.679275] (1:node@Gatien) Start | Succ 
+> [492.679275] (1:node@Gatien)   49  |   1 
+> [492.679275] (1:node@Gatien)   50  |   1 
+> [492.679275] (1:node@Gatien)   52  |   1 
+> [492.679275] (1:node@Gatien)   56  |   1 
+> [492.679275] (1:node@Gatien)    0  |  48 
+> [492.679275] (1:node@Gatien)   16  |  48 
+> [492.679275] (1:node@Gatien) Predecessor: 42
+> [518.542807] (7:node@Boivin) My finger table:
+> [518.542807] (7:node@Boivin) Start | Succ 
+> [518.542807] (7:node@Boivin)    9  |  14 
+> [518.542807] (7:node@Boivin)   10  |  38 
+> [518.542807] (7:node@Boivin)   12  |  14 
+> [518.542807] (7:node@Boivin)   16  |  21 
+> [518.542807] (7:node@Boivin)   24  |   8 
+> [518.542807] (7:node@Boivin)   40  |   8 
+> [518.542807] (7:node@Boivin) Predecessor: 1
+> [535.761245] (2:node@McGee) My finger table:
+> [535.761245] (2:node@McGee) Start | Succ 
+> [535.761245] (2:node@McGee)   43  |  48 
+> [535.761245] (2:node@McGee)   44  |  48 
+> [535.761245] (2:node@McGee)   46  |  48 
+> [535.761245] (2:node@McGee)   50  |   1 
+> [535.761245] (2:node@McGee)   58  |  42 
+> [535.761245] (2:node@McGee)   10  |  42 
+> [535.761245] (2:node@McGee) Predecessor: 38
+> [536.972611] (8:node@Jacquelin) My finger table:
+> [536.972611] (8:node@Jacquelin) Start | Succ 
+> [536.972611] (8:node@Jacquelin)    2  |   8 
+> [536.972611] (8:node@Jacquelin)    3  |   8 
+> [536.972611] (8:node@Jacquelin)    5  |   8 
+> [536.972611] (8:node@Jacquelin)    9  |  14 
+> [536.972611] (8:node@Jacquelin)   17  |   1 
+> [536.972611] (8:node@Jacquelin)   33  |   1 
+> [536.972611] (8:node@Jacquelin) Predecessor: 48
+> [549.045448] (3:node@iRMX) My finger table:
+> [549.045448] (3:node@iRMX) Start | Succ 
+> [549.045448] (3:node@iRMX)   39  |  42 
+> [549.045448] (3:node@iRMX)   40  |  42 
+> [549.045448] (3:node@iRMX)   42  |  42 
+> [549.045448] (3:node@iRMX)   46  |  48 
+> [549.045448] (3:node@iRMX)   54  |  38 
+> [549.045448] (3:node@iRMX)    6  |  38 
+> [549.045448] (3:node@iRMX) Predecessor: 32
+> [555.217227] (6:node@Jean_Yves) My finger table:
+> [555.217227] (6:node@Jean_Yves) Start | Succ 
+> [555.217227] (6:node@Jean_Yves)   15  |  21 
+> [555.217227] (6:node@Jean_Yves)   16  |  38 
+> [555.217227] (6:node@Jean_Yves)   18  |  21 
+> [555.217227] (6:node@Jean_Yves)   22  |  32 
+> [555.217227] (6:node@Jean_Yves)   30  |  14 
+> [555.217227] (6:node@Jean_Yves)   46  |  14 
+> [555.217227] (6:node@Jean_Yves) Predecessor: 8
+> [560.036449] (5:node@TeX) My finger table:
+> [560.036449] (5:node@TeX) Start | Succ 
+> [560.036449] (5:node@TeX)   22  |  32 
+> [560.036449] (5:node@TeX)   23  |  38 
+> [560.036449] (5:node@TeX)   25  |  32 
+> [560.036449] (5:node@TeX)   29  |  32 
+> [560.036449] (5:node@TeX)   37  |  21 
+> [560.036449] (5:node@TeX)   53  |  21 
+> [560.036449] (5:node@TeX) Predecessor: 14
+> [577.866994] (4:node@Geoff) My finger table:
+> [577.866994] (4:node@Geoff) Start | Succ 
+> [577.866994] (4:node@Geoff)   33  |  38 
+> [577.866994] (4:node@Geoff)   34  |  38 
+> [577.866994] (4:node@Geoff)   36  |  38 
+> [577.866994] (4:node@Geoff)   40  |  42 
+> [577.866994] (4:node@Geoff)   48  |  32 
+> [577.866994] (4:node@Geoff)    0  |  32 
+> [577.866994] (4:node@Geoff) Predecessor: 21
+> [803.668999] (0:@) Messages created: 768
+> [803.668999] (0:@) Simulated time: 803.669
+
+! output sort
+$ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.xml ${srcdir:=.}/chord10.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%11.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:Constant
+> [   0.000000] (0:@) Configuration change: Set 'network/model' to 'Constant'
+> [   0.000000] (0:@) Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [   0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738
+> [   0.000000] (1:node@c-0.me) My finger table:
+> [   0.000000] (1:node@c-0.me) Start | Succ 
+> [   0.000000] (1:node@c-0.me)   43  |  42 
+> [   0.000000] (1:node@c-0.me)   44  |  42 
+> [   0.000000] (1:node@c-0.me)   46  |  42 
+> [   0.000000] (1:node@c-0.me)   50  |  42 
+> [   0.000000] (1:node@c-0.me)   58  |  42 
+> [   0.000000] (1:node@c-0.me)   74  |  42 
+> [   0.000000] (1:node@c-0.me)  106  |  42 
+> [   0.000000] (1:node@c-0.me)  170  |  42 
+> [   0.000000] (1:node@c-0.me)  298  |  42 
+> [   0.000000] (1:node@c-0.me)  554  |  42 
+> [   0.000000] (1:node@c-0.me)  1066  |  42 
+> [   0.000000] (1:node@c-0.me)  2090  |  42 
+> [   0.000000] (1:node@c-0.me)  4138  |  42 
+> [   0.000000] (1:node@c-0.me)  8234  |  42 
+> [   0.000000] (1:node@c-0.me)  16426  |  42 
+> [   0.000000] (1:node@c-0.me)  32810  |  42 
+> [   0.000000] (1:node@c-0.me)  65578  |  42 
+> [   0.000000] (1:node@c-0.me)  131114  |  42 
+> [   0.000000] (1:node@c-0.me)  262186  |  42 
+> [   0.000000] (1:node@c-0.me)  524330  |  42 
+> [   0.000000] (1:node@c-0.me)  1048618  |  42 
+> [   0.000000] (1:node@c-0.me)  2097194  |  42 
+> [   0.000000] (1:node@c-0.me)  4194346  |  42 
+> [   0.000000] (1:node@c-0.me)  8388650  |  42 
+> [   0.000000] (1:node@c-0.me) Predecessor: -1
+> [   0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42
+> [   0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680
+> [   0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42
+> [   0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680
+> [   0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744
+> [   0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738
+> [   0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405
+> [   0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42
+> [   4.000000] (3:node@c-2.me) My finger table:
+> [   4.000000] (3:node@c-2.me) Start | Succ 
+> [   4.000000] (3:node@c-2.me)  533745  | 366680 
+> [   4.000000] (3:node@c-2.me)  533746  | 533744 
+> [   4.000000] (3:node@c-2.me)  533748  | 533744 
+> [   4.000000] (3:node@c-2.me)  533752  | 533744 
+> [   4.000000] (3:node@c-2.me)  533760  | 533744 
+> [   4.000000] (3:node@c-2.me)  533776  | 533744 
+> [   4.000000] (3:node@c-2.me)  533808  | 533744 
+> [   4.000000] (3:node@c-2.me)  533872  | 533744 
+> [   4.000000] (3:node@c-2.me)  534000  | 533744 
+> [   4.000000] (3:node@c-2.me)  534256  | 533744 
+> [   4.000000] (3:node@c-2.me)  534768  | 533744 
+> [   4.000000] (3:node@c-2.me)  535792  | 533744 
+> [   4.000000] (3:node@c-2.me)  537840  | 533744 
+> [   4.000000] (3:node@c-2.me)  541936  | 533744 
+> [   4.000000] (3:node@c-2.me)  550128  | 533744 
+> [   4.000000] (3:node@c-2.me)  566512  | 533744 
+> [   4.000000] (3:node@c-2.me)  599280  | 533744 
+> [   4.000000] (3:node@c-2.me)  664816  | 533744 
+> [   4.000000] (3:node@c-2.me)  795888  | 533744 
+> [   4.000000] (3:node@c-2.me)  1058032  | 533744 
+> [   4.000000] (3:node@c-2.me)  1582320  | 533744 
+> [   4.000000] (3:node@c-2.me)  2630896  | 533744 
+> [   4.000000] (3:node@c-2.me)  4728048  | 533744 
+> [   4.000000] (3:node@c-2.me)  8922352  | 533744 
+> [   4.000000] (3:node@c-2.me) Predecessor: -1
+> [   4.000000] (6:node@c-5.me) My finger table:
+> [   4.000000] (6:node@c-5.me) Start | Succ 
+> [   4.000000] (6:node@c-5.me)  10874877  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874878  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874880  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874884  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874892  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [   4.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [   4.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [   4.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [   4.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [   4.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [   4.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [   4.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [   4.000000] (6:node@c-5.me) Predecessor: -1
+> [   5.000000] (5:node@c-4.me) My finger table:
+> [   5.000000] (5:node@c-4.me) Start | Succ 
+> [   5.000000] (5:node@c-4.me)  16509406  | 366680 
+> [   5.000000] (5:node@c-4.me)  16509407  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509409  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509413  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [   5.000000] (5:node@c-4.me)  256477  | 16509405 
+> [   5.000000] (5:node@c-4.me)  780765  | 16509405 
+> [   5.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [   5.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [   5.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [   5.000000] (5:node@c-4.me) Predecessor: -1
+> [   5.000000] (8:node@c-7.me) My finger table:
+> [   5.000000] (8:node@c-7.me) Start | Succ 
+> [   5.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10004762  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004764  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [   5.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [   5.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [   5.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [   5.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [   5.000000] (8:node@c-7.me) Predecessor: -1
+> [   6.000000] (2:node@c-1.me) My finger table:
+> [   6.000000] (2:node@c-1.me) Start | Succ 
+> [   6.000000] (2:node@c-1.me)  366681  |  42 
+> [   6.000000] (2:node@c-1.me)  366682  | 366680 
+> [   6.000000] (2:node@c-1.me)  366684  | 366680 
+> [   6.000000] (2:node@c-1.me)  366688  | 366680 
+> [   6.000000] (2:node@c-1.me)  366696  | 366680 
+> [   6.000000] (2:node@c-1.me)  366712  | 366680 
+> [   6.000000] (2:node@c-1.me)  366744  | 366680 
+> [   6.000000] (2:node@c-1.me)  366808  | 366680 
+> [   6.000000] (2:node@c-1.me)  366936  | 366680 
+> [   6.000000] (2:node@c-1.me)  367192  | 366680 
+> [   6.000000] (2:node@c-1.me)  367704  | 366680 
+> [   6.000000] (2:node@c-1.me)  368728  | 366680 
+> [   6.000000] (2:node@c-1.me)  370776  | 366680 
+> [   6.000000] (2:node@c-1.me)  374872  | 366680 
+> [   6.000000] (2:node@c-1.me)  383064  | 366680 
+> [   6.000000] (2:node@c-1.me)  399448  | 366680 
+> [   6.000000] (2:node@c-1.me)  432216  | 366680 
+> [   6.000000] (2:node@c-1.me)  497752  | 366680 
+> [   6.000000] (2:node@c-1.me)  628824  | 366680 
+> [   6.000000] (2:node@c-1.me)  890968  | 366680 
+> [   6.000000] (2:node@c-1.me)  1415256  | 366680 
+> [   6.000000] (2:node@c-1.me)  2463832  | 366680 
+> [   6.000000] (2:node@c-1.me)  4560984  | 366680 
+> [   6.000000] (2:node@c-1.me)  8755288  | 366680 
+> [   6.000000] (2:node@c-1.me) Predecessor: -1
+> [   8.000000] (7:node@c-6.me) My finger table:
+> [   8.000000] (7:node@c-6.me) Start | Succ 
+> [   8.000000] (7:node@c-6.me)  16728097  | 1319738 
+> [   8.000000] (7:node@c-6.me)  16728098  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728100  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [   8.000000] (7:node@c-6.me)  16416  | 16728096 
+> [   8.000000] (7:node@c-6.me)  81952  | 16728096 
+> [   8.000000] (7:node@c-6.me)  213024  | 16728096 
+> [   8.000000] (7:node@c-6.me)  475168  | 16728096 
+> [   8.000000] (7:node@c-6.me)  999456  | 16728096 
+> [   8.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [   8.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [   8.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [   8.000000] (7:node@c-6.me) Predecessor: -1
+> [   9.000000] (10:node@c-9.me) My finger table:
+> [   9.000000] (10:node@c-9.me) Start | Succ 
+> [   9.000000] (10:node@c-9.me)  2015254  | 1319738 
+> [   9.000000] (10:node@c-9.me)  2015255  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015257  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015261  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015269  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [   9.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [   9.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [   9.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [   9.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [   9.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [   9.000000] (10:node@c-9.me) Predecessor: -1
+> [  11.000000] (4:node@c-3.me) My finger table:
+> [  11.000000] (4:node@c-3.me) Start | Succ 
+> [  11.000000] (4:node@c-3.me)  1319739  |  42 
+> [  11.000000] (4:node@c-3.me)  1319740  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319742  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [  11.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [  11.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [  11.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [  11.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [  11.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [  11.000000] (4:node@c-3.me) Predecessor: -1
+> [  16.000000] (9:node@c-8.me) My finger table:
+> [  16.000000] (9:node@c-8.me) Start | Succ 
+> [  16.000000] (9:node@c-8.me)  6518809  |  42 
+> [  16.000000] (9:node@c-8.me)  6518810  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518812  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [  16.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [  16.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [  16.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [  16.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [  16.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [  16.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [  16.000000] (9:node@c-8.me) Predecessor: -1
+> [  26.000000] (4:node@c-3.me) My finger table:
+> [  26.000000] (4:node@c-3.me) Start | Succ 
+> [  26.000000] (4:node@c-3.me)  1319739  |  42 
+> [  26.000000] (4:node@c-3.me)  1319740  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319742  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [  26.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [  26.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [  26.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [  26.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [  26.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [  26.000000] (4:node@c-3.me) Predecessor: 16728096
+> [  31.000000] (2:node@c-1.me) My finger table:
+> [  31.000000] (2:node@c-1.me) Start | Succ 
+> [  31.000000] (2:node@c-1.me)  366681  |  42 
+> [  31.000000] (2:node@c-1.me)  366682  | 366680 
+> [  31.000000] (2:node@c-1.me)  366684  | 366680 
+> [  31.000000] (2:node@c-1.me)  366688  | 366680 
+> [  31.000000] (2:node@c-1.me)  366696  | 366680 
+> [  31.000000] (2:node@c-1.me)  366712  | 366680 
+> [  31.000000] (2:node@c-1.me)  366744  | 366680 
+> [  31.000000] (2:node@c-1.me)  366808  | 366680 
+> [  31.000000] (2:node@c-1.me)  366936  | 366680 
+> [  31.000000] (2:node@c-1.me)  367192  | 366680 
+> [  31.000000] (2:node@c-1.me)  367704  | 366680 
+> [  31.000000] (2:node@c-1.me)  368728  | 366680 
+> [  31.000000] (2:node@c-1.me)  370776  | 366680 
+> [  31.000000] (2:node@c-1.me)  374872  | 366680 
+> [  31.000000] (2:node@c-1.me)  383064  | 366680 
+> [  31.000000] (2:node@c-1.me)  399448  | 366680 
+> [  31.000000] (2:node@c-1.me)  432216  | 366680 
+> [  31.000000] (2:node@c-1.me)  497752  | 366680 
+> [  31.000000] (2:node@c-1.me)  628824  | 366680 
+> [  31.000000] (2:node@c-1.me)  890968  | 366680 
+> [  31.000000] (2:node@c-1.me)  1415256  | 366680 
+> [  31.000000] (2:node@c-1.me)  2463832  | 366680 
+> [  31.000000] (2:node@c-1.me)  4560984  | 366680 
+> [  31.000000] (2:node@c-1.me)  8755288  | 366680 
+> [  31.000000] (2:node@c-1.me) Predecessor: 16509405
+> [  32.000000] (5:node@c-4.me) My finger table:
+> [  32.000000] (5:node@c-4.me) Start | Succ 
+> [  32.000000] (5:node@c-4.me)  16509406  | 366680 
+> [  32.000000] (5:node@c-4.me)  16509407  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509409  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509413  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [  32.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [  32.000000] (5:node@c-4.me)  256477  | 16509405 
+> [  32.000000] (5:node@c-4.me)  780765  | 16509405 
+> [  32.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [  32.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [  32.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [  32.000000] (5:node@c-4.me) Predecessor: 10004760
+> [  38.000000] (3:node@c-2.me) My finger table:
+> [  38.000000] (3:node@c-2.me) Start | Succ 
+> [  38.000000] (3:node@c-2.me)  533745  | 16509405 
+> [  38.000000] (3:node@c-2.me)  533746  | 533744 
+> [  38.000000] (3:node@c-2.me)  533748  | 533744 
+> [  38.000000] (3:node@c-2.me)  533752  | 533744 
+> [  38.000000] (3:node@c-2.me)  533760  | 533744 
+> [  38.000000] (3:node@c-2.me)  533776  | 533744 
+> [  38.000000] (3:node@c-2.me)  533808  | 533744 
+> [  38.000000] (3:node@c-2.me)  533872  | 533744 
+> [  38.000000] (3:node@c-2.me)  534000  | 533744 
+> [  38.000000] (3:node@c-2.me)  534256  | 533744 
+> [  38.000000] (3:node@c-2.me)  534768  | 533744 
+> [  38.000000] (3:node@c-2.me)  535792  | 533744 
+> [  38.000000] (3:node@c-2.me)  537840  | 533744 
+> [  38.000000] (3:node@c-2.me)  541936  | 533744 
+> [  38.000000] (3:node@c-2.me)  550128  | 533744 
+> [  38.000000] (3:node@c-2.me)  566512  | 533744 
+> [  38.000000] (3:node@c-2.me)  599280  | 533744 
+> [  38.000000] (3:node@c-2.me)  664816  | 533744 
+> [  38.000000] (3:node@c-2.me)  795888  | 533744 
+> [  38.000000] (3:node@c-2.me)  1058032  | 533744 
+> [  38.000000] (3:node@c-2.me)  1582320  | 533744 
+> [  38.000000] (3:node@c-2.me)  2630896  | 533744 
+> [  38.000000] (3:node@c-2.me)  4728048  | 533744 
+> [  38.000000] (3:node@c-2.me)  8922352  | 533744 
+> [  38.000000] (3:node@c-2.me) Predecessor: 10874876
+> [  50.000000] (1:node@c-0.me) My finger table:
+> [  50.000000] (1:node@c-0.me) Start | Succ 
+> [  50.000000] (1:node@c-0.me)   43  |  42 
+> [  50.000000] (1:node@c-0.me)   44  |  42 
+> [  50.000000] (1:node@c-0.me)   46  |  42 
+> [  50.000000] (1:node@c-0.me)   50  |  42 
+> [  50.000000] (1:node@c-0.me)   58  |  42 
+> [  50.000000] (1:node@c-0.me)   74  |  42 
+> [  50.000000] (1:node@c-0.me)  106  |  42 
+> [  50.000000] (1:node@c-0.me)  170  |  42 
+> [  50.000000] (1:node@c-0.me)  298  |  42 
+> [  50.000000] (1:node@c-0.me)  554  |  42 
+> [  50.000000] (1:node@c-0.me)  1066  |  42 
+> [  50.000000] (1:node@c-0.me)  2090  |  42 
+> [  50.000000] (1:node@c-0.me)  4138  |  42 
+> [  50.000000] (1:node@c-0.me)  8234  |  42 
+> [  50.000000] (1:node@c-0.me)  16426  |  42 
+> [  50.000000] (1:node@c-0.me)  32810  |  42 
+> [  50.000000] (1:node@c-0.me)  65578  |  42 
+> [  50.000000] (1:node@c-0.me)  131114  |  42 
+> [  50.000000] (1:node@c-0.me)  262186  |  42 
+> [  50.000000] (1:node@c-0.me)  524330  |  42 
+> [  50.000000] (1:node@c-0.me)  1048618  |  42 
+> [  50.000000] (1:node@c-0.me)  2097194  |  42 
+> [  50.000000] (1:node@c-0.me)  4194346  |  42 
+> [  50.000000] (1:node@c-0.me)  8388650  |  42 
+> [  50.000000] (1:node@c-0.me) Predecessor: 366680
+> [  60.000000] (1:node@c-0.me) My finger table:
+> [  60.000000] (1:node@c-0.me) Start | Succ 
+> [  60.000000] (1:node@c-0.me)   43  |  42 
+> [  60.000000] (1:node@c-0.me)   44  |  42 
+> [  60.000000] (1:node@c-0.me)   46  |  42 
+> [  60.000000] (1:node@c-0.me)   50  |  42 
+> [  60.000000] (1:node@c-0.me)   58  |  42 
+> [  60.000000] (1:node@c-0.me)   74  |  42 
+> [  60.000000] (1:node@c-0.me)  106  |  42 
+> [  60.000000] (1:node@c-0.me)  170  |  42 
+> [  60.000000] (1:node@c-0.me)  298  |  42 
+> [  60.000000] (1:node@c-0.me)  554  |  42 
+> [  60.000000] (1:node@c-0.me)  1066  |  42 
+> [  60.000000] (1:node@c-0.me)  2090  |  42 
+> [  60.000000] (1:node@c-0.me)  4138  |  42 
+> [  60.000000] (1:node@c-0.me)  8234  |  42 
+> [  60.000000] (1:node@c-0.me)  16426  |  42 
+> [  60.000000] (1:node@c-0.me)  32810  |  42 
+> [  60.000000] (1:node@c-0.me)  65578  |  42 
+> [  60.000000] (1:node@c-0.me)  131114  |  42 
+> [  60.000000] (1:node@c-0.me)  262186  |  42 
+> [  60.000000] (1:node@c-0.me)  524330  |  42 
+> [  60.000000] (1:node@c-0.me)  1048618  |  42 
+> [  60.000000] (1:node@c-0.me)  2097194  |  42 
+> [  60.000000] (1:node@c-0.me)  4194346  |  42 
+> [  60.000000] (1:node@c-0.me)  8388650  |  42 
+> [  60.000000] (1:node@c-0.me) Predecessor: 1319738
+> [  70.000000] (1:node@c-0.me) My finger table:
+> [  70.000000] (1:node@c-0.me) Start | Succ 
+> [  70.000000] (1:node@c-0.me)   43  | 1319738 
+> [  70.000000] (1:node@c-0.me)   44  |  42 
+> [  70.000000] (1:node@c-0.me)   46  |  42 
+> [  70.000000] (1:node@c-0.me)   50  |  42 
+> [  70.000000] (1:node@c-0.me)   58  |  42 
+> [  70.000000] (1:node@c-0.me)   74  |  42 
+> [  70.000000] (1:node@c-0.me)  106  |  42 
+> [  70.000000] (1:node@c-0.me)  170  |  42 
+> [  70.000000] (1:node@c-0.me)  298  |  42 
+> [  70.000000] (1:node@c-0.me)  554  |  42 
+> [  70.000000] (1:node@c-0.me)  1066  |  42 
+> [  70.000000] (1:node@c-0.me)  2090  |  42 
+> [  70.000000] (1:node@c-0.me)  4138  |  42 
+> [  70.000000] (1:node@c-0.me)  8234  |  42 
+> [  70.000000] (1:node@c-0.me)  16426  |  42 
+> [  70.000000] (1:node@c-0.me)  32810  |  42 
+> [  70.000000] (1:node@c-0.me)  65578  |  42 
+> [  70.000000] (1:node@c-0.me)  131114  |  42 
+> [  70.000000] (1:node@c-0.me)  262186  |  42 
+> [  70.000000] (1:node@c-0.me)  524330  |  42 
+> [  70.000000] (1:node@c-0.me)  1048618  |  42 
+> [  70.000000] (1:node@c-0.me)  2097194  |  42 
+> [  70.000000] (1:node@c-0.me)  4194346  |  42 
+> [  70.000000] (1:node@c-0.me)  8388650  |  42 
+> [  70.000000] (1:node@c-0.me) Predecessor: 6518808
+> [  85.000000] (4:node@c-3.me) My finger table:
+> [  85.000000] (4:node@c-3.me) Start | Succ 
+> [  85.000000] (4:node@c-3.me)  1319739  | 6518808 
+> [  85.000000] (4:node@c-3.me)  1319740  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319742  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [  85.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [  85.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [  85.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [  85.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [  85.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [  85.000000] (4:node@c-3.me) Predecessor: 42
+> [  86.000000] (8:node@c-7.me) My finger table:
+> [  86.000000] (8:node@c-7.me) Start | Succ 
+> [  86.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [  86.000000] (8:node@c-7.me)  10004762  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004764  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [  86.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [  86.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [  86.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [  86.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [  86.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [  86.000000] (8:node@c-7.me) Predecessor: 533744
+> [  90.000000] (7:node@c-6.me) My finger table:
+> [  90.000000] (7:node@c-6.me) Start | Succ 
+> [  90.000000] (7:node@c-6.me)  16728097  | 1319738 
+> [  90.000000] (7:node@c-6.me)  16728098  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728100  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [  90.000000] (7:node@c-6.me)  16416  | 16728096 
+> [  90.000000] (7:node@c-6.me)  81952  | 16728096 
+> [  90.000000] (7:node@c-6.me)  213024  | 16728096 
+> [  90.000000] (7:node@c-6.me)  475168  | 16728096 
+> [  90.000000] (7:node@c-6.me)  999456  | 16728096 
+> [  90.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [  90.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [  90.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [  90.000000] (7:node@c-6.me) Predecessor: 2015253
+> [ 109.000000] (9:node@c-8.me) My finger table:
+> [ 109.000000] (9:node@c-8.me) Start | Succ 
+> [ 109.000000] (9:node@c-8.me)  6518809  |  42 
+> [ 109.000000] (9:node@c-8.me)  6518810  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518812  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 109.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 109.000000] (9:node@c-8.me) Predecessor: 366680
+> [ 110.000000] (9:node@c-8.me) My finger table:
+> [ 110.000000] (9:node@c-8.me) Start | Succ 
+> [ 110.000000] (9:node@c-8.me)  6518809  |  42 
+> [ 110.000000] (9:node@c-8.me)  6518810  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518812  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 110.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 110.000000] (9:node@c-8.me) Predecessor: 1319738
+> [ 145.000000] (1:node@c-0.me) My finger table:
+> [ 145.000000] (1:node@c-0.me) Start | Succ 
+> [ 145.000000] (1:node@c-0.me)   43  | 1319738 
+> [ 145.000000] (1:node@c-0.me)   44  |  42 
+> [ 145.000000] (1:node@c-0.me)   46  |  42 
+> [ 145.000000] (1:node@c-0.me)   50  |  42 
+> [ 145.000000] (1:node@c-0.me)   58  |  42 
+> [ 145.000000] (1:node@c-0.me)   74  |  42 
+> [ 145.000000] (1:node@c-0.me)  106  |  42 
+> [ 145.000000] (1:node@c-0.me)  170  |  42 
+> [ 145.000000] (1:node@c-0.me)  298  |  42 
+> [ 145.000000] (1:node@c-0.me)  554  |  42 
+> [ 145.000000] (1:node@c-0.me)  1066  |  42 
+> [ 145.000000] (1:node@c-0.me)  2090  |  42 
+> [ 145.000000] (1:node@c-0.me)  4138  |  42 
+> [ 145.000000] (1:node@c-0.me)  8234  |  42 
+> [ 145.000000] (1:node@c-0.me)  16426  |  42 
+> [ 145.000000] (1:node@c-0.me)  32810  |  42 
+> [ 145.000000] (1:node@c-0.me)  65578  |  42 
+> [ 145.000000] (1:node@c-0.me)  131114  |  42 
+> [ 145.000000] (1:node@c-0.me)  262186  |  42 
+> [ 145.000000] (1:node@c-0.me)  524330  |  42 
+> [ 145.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 145.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 145.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 145.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 145.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 157.000000] (4:node@c-3.me) My finger table:
+> [ 157.000000] (4:node@c-3.me) Start | Succ 
+> [ 157.000000] (4:node@c-3.me)  1319739  | 6518808 
+> [ 157.000000] (4:node@c-3.me)  1319740  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319742  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 157.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 157.000000] (4:node@c-3.me) Predecessor: 366680
+> [ 184.000000] (7:node@c-6.me) My finger table:
+> [ 184.000000] (7:node@c-6.me) Start | Succ 
+> [ 184.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 184.000000] (7:node@c-6.me)  16728098  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728100  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 184.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 184.000000] (7:node@c-6.me) Predecessor: 6518808
+> [ 202.000000] (2:node@c-1.me) My finger table:
+> [ 202.000000] (2:node@c-1.me) Start | Succ 
+> [ 202.000000] (2:node@c-1.me)  366681  | 1319738 
+> [ 202.000000] (2:node@c-1.me)  366682  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366684  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366688  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366696  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366712  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 202.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 202.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 202.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 202.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 202.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 202.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 202.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 202.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 202.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 202.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 202.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 202.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 202.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 202.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 202.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 202.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 202.000000] (2:node@c-1.me) Predecessor: 42
+> [ 221.000000] (9:node@c-8.me) My finger table:
+> [ 221.000000] (9:node@c-8.me) Start | Succ 
+> [ 221.000000] (9:node@c-8.me)  6518809  | 16728096 
+> [ 221.000000] (9:node@c-8.me)  6518810  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518812  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 221.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 221.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 240.000000] (6:node@c-5.me) My finger table:
+> [ 240.000000] (6:node@c-5.me) Start | Succ 
+> [ 240.000000] (6:node@c-5.me)  10874877  | 533744 
+> [ 240.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 240.000000] (6:node@c-5.me)  10874880  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10874884  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10874892  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 240.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 240.000000] (6:node@c-5.me) Predecessor: -1
+> [ 247.000000] (5:node@c-4.me) My finger table:
+> [ 247.000000] (5:node@c-4.me) Start | Succ 
+> [ 247.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 247.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 247.000000] (5:node@c-4.me)  16509409  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509413  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 247.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 247.000000] (5:node@c-4.me) Predecessor: 10004760
+> [ 250.000000] (1:node@c-0.me) My finger table:
+> [ 250.000000] (1:node@c-0.me) Start | Succ 
+> [ 250.000000] (1:node@c-0.me)   43  | 366680 
+> [ 250.000000] (1:node@c-0.me)   44  | 366680 
+> [ 250.000000] (1:node@c-0.me)   46  |  42 
+> [ 250.000000] (1:node@c-0.me)   50  |  42 
+> [ 250.000000] (1:node@c-0.me)   58  |  42 
+> [ 250.000000] (1:node@c-0.me)   74  |  42 
+> [ 250.000000] (1:node@c-0.me)  106  |  42 
+> [ 250.000000] (1:node@c-0.me)  170  |  42 
+> [ 250.000000] (1:node@c-0.me)  298  |  42 
+> [ 250.000000] (1:node@c-0.me)  554  |  42 
+> [ 250.000000] (1:node@c-0.me)  1066  |  42 
+> [ 250.000000] (1:node@c-0.me)  2090  |  42 
+> [ 250.000000] (1:node@c-0.me)  4138  |  42 
+> [ 250.000000] (1:node@c-0.me)  8234  |  42 
+> [ 250.000000] (1:node@c-0.me)  16426  |  42 
+> [ 250.000000] (1:node@c-0.me)  32810  |  42 
+> [ 250.000000] (1:node@c-0.me)  65578  |  42 
+> [ 250.000000] (1:node@c-0.me)  131114  |  42 
+> [ 250.000000] (1:node@c-0.me)  262186  |  42 
+> [ 250.000000] (1:node@c-0.me)  524330  |  42 
+> [ 250.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 250.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 250.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 250.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 250.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 251.000000] (3:node@c-2.me) My finger table:
+> [ 251.000000] (3:node@c-2.me) Start | Succ 
+> [ 251.000000] (3:node@c-2.me)  533745  | 10004760 
+> [ 251.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 251.000000] (3:node@c-2.me)  533748  | 533744 
+> [ 251.000000] (3:node@c-2.me)  533752  | 533744 
+> [ 251.000000] (3:node@c-2.me)  533760  | 533744 
+> [ 251.000000] (3:node@c-2.me)  533776  | 533744 
+> [ 251.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 251.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 251.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 251.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 251.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 251.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 251.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 251.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 251.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 251.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 251.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 251.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 251.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 251.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 251.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 251.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 251.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 251.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 251.000000] (3:node@c-2.me) Predecessor: 10874876
+> [ 253.000000] (8:node@c-7.me) My finger table:
+> [ 253.000000] (8:node@c-7.me) Start | Succ 
+> [ 253.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 253.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 253.000000] (8:node@c-7.me)  10004764  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 253.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 253.000000] (8:node@c-7.me) Predecessor: 533744
+> [ 263.000000] (2:node@c-1.me) My finger table:
+> [ 263.000000] (2:node@c-1.me) Start | Succ 
+> [ 263.000000] (2:node@c-1.me)  366681  | 1319738 
+> [ 263.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 263.000000] (2:node@c-1.me)  366684  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366688  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366696  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366712  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 263.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 263.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 263.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 263.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 263.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 263.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 263.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 263.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 263.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 263.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 263.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 263.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 263.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 263.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 263.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 263.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 263.000000] (2:node@c-1.me) Predecessor: 42
+> [ 268.000000] (4:node@c-3.me) My finger table:
+> [ 268.000000] (4:node@c-3.me) Start | Succ 
+> [ 268.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 268.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 268.000000] (4:node@c-3.me)  1319742  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 268.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 268.000000] (4:node@c-3.me) Predecessor: 366680
+> [ 269.000000] (10:node@c-9.me) My finger table:
+> [ 269.000000] (10:node@c-9.me) Start | Succ 
+> [ 269.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 269.000000] (10:node@c-9.me)  2015255  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015257  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015261  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 269.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 269.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 274.000000] (10:node@c-9.me) My finger table:
+> [ 274.000000] (10:node@c-9.me) Start | Succ 
+> [ 274.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 274.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 274.000000] (10:node@c-9.me)  2015257  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015261  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 274.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 274.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 274.000000] (9:node@c-8.me) My finger table:
+> [ 274.000000] (9:node@c-8.me) Start | Succ 
+> [ 274.000000] (9:node@c-8.me)  6518809  | 16728096 
+> [ 274.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 274.000000] (9:node@c-8.me)  6518812  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 274.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 274.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 275.000000] (7:node@c-6.me) My finger table:
+> [ 275.000000] (7:node@c-6.me) Start | Succ 
+> [ 275.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 275.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 275.000000] (7:node@c-6.me)  16728100  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 275.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 275.000000] (7:node@c-6.me) Predecessor: 6518808
+> [ 288.000000] (7:node@c-6.me) My finger table:
+> [ 288.000000] (7:node@c-6.me) Start | Succ 
+> [ 288.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 288.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 288.000000] (7:node@c-6.me)  16728100  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 288.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 288.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 361.000000] (8:node@c-7.me) My finger table:
+> [ 361.000000] (8:node@c-7.me) Start | Succ 
+> [ 361.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 361.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 361.000000] (8:node@c-7.me)  10004764  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 361.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 361.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 364.000000] (6:node@c-5.me) My finger table:
+> [ 364.000000] (6:node@c-5.me) Start | Succ 
+> [ 364.000000] (6:node@c-5.me)  10874877  | 533744 
+> [ 364.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 364.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 364.000000] (6:node@c-5.me)  10874884  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10874892  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 364.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 364.000000] (6:node@c-5.me) Predecessor: -1
+> [ 371.000000] (3:node@c-2.me) My finger table:
+> [ 371.000000] (3:node@c-2.me) Start | Succ 
+> [ 371.000000] (3:node@c-2.me)  533745  | 10004760 
+> [ 371.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 371.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 371.000000] (3:node@c-2.me)  533752  | 533744 
+> [ 371.000000] (3:node@c-2.me)  533760  | 533744 
+> [ 371.000000] (3:node@c-2.me)  533776  | 533744 
+> [ 371.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 371.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 371.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 371.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 371.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 371.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 371.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 371.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 371.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 371.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 371.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 371.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 371.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 371.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 371.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 371.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 371.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 371.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 371.000000] (3:node@c-2.me) Predecessor: 10874876
+> [ 372.000000] (1:node@c-0.me) My finger table:
+> [ 372.000000] (1:node@c-0.me) Start | Succ 
+> [ 372.000000] (1:node@c-0.me)   43  | 366680 
+> [ 372.000000] (1:node@c-0.me)   44  | 366680 
+> [ 372.000000] (1:node@c-0.me)   46  | 366680 
+> [ 372.000000] (1:node@c-0.me)   50  |  42 
+> [ 372.000000] (1:node@c-0.me)   58  |  42 
+> [ 372.000000] (1:node@c-0.me)   74  |  42 
+> [ 372.000000] (1:node@c-0.me)  106  |  42 
+> [ 372.000000] (1:node@c-0.me)  170  |  42 
+> [ 372.000000] (1:node@c-0.me)  298  |  42 
+> [ 372.000000] (1:node@c-0.me)  554  |  42 
+> [ 372.000000] (1:node@c-0.me)  1066  |  42 
+> [ 372.000000] (1:node@c-0.me)  2090  |  42 
+> [ 372.000000] (1:node@c-0.me)  4138  |  42 
+> [ 372.000000] (1:node@c-0.me)  8234  |  42 
+> [ 372.000000] (1:node@c-0.me)  16426  |  42 
+> [ 372.000000] (1:node@c-0.me)  32810  |  42 
+> [ 372.000000] (1:node@c-0.me)  65578  |  42 
+> [ 372.000000] (1:node@c-0.me)  131114  |  42 
+> [ 372.000000] (1:node@c-0.me)  262186  |  42 
+> [ 372.000000] (1:node@c-0.me)  524330  |  42 
+> [ 372.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 372.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 372.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 372.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 372.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 374.000000] (8:node@c-7.me) My finger table:
+> [ 374.000000] (8:node@c-7.me) Start | Succ 
+> [ 374.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 374.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 374.000000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 374.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 374.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 374.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 375.000000] (5:node@c-4.me) My finger table:
+> [ 375.000000] (5:node@c-4.me) Start | Succ 
+> [ 375.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 375.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 375.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 375.000000] (5:node@c-4.me)  16509413  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 375.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 375.000000] (5:node@c-4.me) Predecessor: 10004760
+> [ 395.000000] (9:node@c-8.me) My finger table:
+> [ 395.000000] (9:node@c-8.me) Start | Succ 
+> [ 395.000000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 395.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 395.000000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 395.000000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 395.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 395.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 398.000000] (7:node@c-6.me) My finger table:
+> [ 398.000000] (7:node@c-6.me) Start | Succ 
+> [ 398.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 398.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 398.000000] (7:node@c-6.me)  16728100  |  42 
+> [ 398.000000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 398.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 398.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 405.000000] (4:node@c-3.me) My finger table:
+> [ 405.000000] (4:node@c-3.me) Start | Succ 
+> [ 405.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 405.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 405.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 405.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 405.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 405.000000] (4:node@c-3.me) Predecessor: 366680
+> [ 411.000000] (2:node@c-1.me) My finger table:
+> [ 411.000000] (2:node@c-1.me) Start | Succ 
+> [ 411.000000] (2:node@c-1.me)  366681  | 1319738 
+> [ 411.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 411.000000] (2:node@c-1.me)  366684  | 1319738 
+> [ 411.000000] (2:node@c-1.me)  366688  | 366680 
+> [ 411.000000] (2:node@c-1.me)  366696  | 366680 
+> [ 411.000000] (2:node@c-1.me)  366712  | 366680 
+> [ 411.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 411.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 411.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 411.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 411.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 411.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 411.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 411.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 411.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 411.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 411.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 411.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 411.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 411.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 411.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 411.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 411.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 411.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 411.000000] (2:node@c-1.me) Predecessor: 42
+> [ 426.000000] (10:node@c-9.me) My finger table:
+> [ 426.000000] (10:node@c-9.me) Start | Succ 
+> [ 426.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 426.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 426.000000] (10:node@c-9.me)  2015257  | 6518808 
+> [ 426.000000] (10:node@c-9.me)  2015261  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 426.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 426.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 486.000000] (6:node@c-5.me) My finger table:
+> [ 486.000000] (6:node@c-5.me) Start | Succ 
+> [ 486.000000] (6:node@c-5.me)  10874877  | 533744 
+> [ 486.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 486.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 486.000000] (6:node@c-5.me)  10874884  | 533744 
+> [ 486.000000] (6:node@c-5.me)  10874892  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 486.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 486.000000] (6:node@c-5.me) Predecessor: -1
+> [ 491.000000] (4:node@c-3.me) My finger table:
+> [ 491.000000] (4:node@c-3.me) Start | Succ 
+> [ 491.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 491.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 491.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 491.000000] (4:node@c-3.me)  1319746  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 491.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 491.000000] (4:node@c-3.me) Predecessor: 533744
+> [ 492.000000] (1:node@c-0.me) My finger table:
+> [ 492.000000] (1:node@c-0.me) Start | Succ 
+> [ 492.000000] (1:node@c-0.me)   43  | 366680 
+> [ 492.000000] (1:node@c-0.me)   44  | 366680 
+> [ 492.000000] (1:node@c-0.me)   46  | 366680 
+> [ 492.000000] (1:node@c-0.me)   50  | 366680 
+> [ 492.000000] (1:node@c-0.me)   58  |  42 
+> [ 492.000000] (1:node@c-0.me)   74  |  42 
+> [ 492.000000] (1:node@c-0.me)  106  |  42 
+> [ 492.000000] (1:node@c-0.me)  170  |  42 
+> [ 492.000000] (1:node@c-0.me)  298  |  42 
+> [ 492.000000] (1:node@c-0.me)  554  |  42 
+> [ 492.000000] (1:node@c-0.me)  1066  |  42 
+> [ 492.000000] (1:node@c-0.me)  2090  |  42 
+> [ 492.000000] (1:node@c-0.me)  4138  |  42 
+> [ 492.000000] (1:node@c-0.me)  8234  |  42 
+> [ 492.000000] (1:node@c-0.me)  16426  |  42 
+> [ 492.000000] (1:node@c-0.me)  32810  |  42 
+> [ 492.000000] (1:node@c-0.me)  65578  |  42 
+> [ 492.000000] (1:node@c-0.me)  131114  |  42 
+> [ 492.000000] (1:node@c-0.me)  262186  |  42 
+> [ 492.000000] (1:node@c-0.me)  524330  |  42 
+> [ 492.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 492.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 492.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 492.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 492.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 495.000000] (3:node@c-2.me) My finger table:
+> [ 495.000000] (3:node@c-2.me) Start | Succ 
+> [ 495.000000] (3:node@c-2.me)  533745  | 1319738 
+> [ 495.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 495.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 495.000000] (3:node@c-2.me)  533752  | 1319738 
+> [ 495.000000] (3:node@c-2.me)  533760  | 533744 
+> [ 495.000000] (3:node@c-2.me)  533776  | 533744 
+> [ 495.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 495.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 495.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 495.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 495.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 495.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 495.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 495.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 495.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 495.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 495.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 495.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 495.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 495.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 495.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 495.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 495.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 495.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 495.000000] (3:node@c-2.me) Predecessor: 10874876
+> [ 502.000000] (8:node@c-7.me) My finger table:
+> [ 502.000000] (8:node@c-7.me) Start | Succ 
+> [ 502.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 502.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 502.000000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 502.000000] (8:node@c-7.me)  10004768  | 16509405 
+> [ 502.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 502.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 502.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 505.000000] (5:node@c-4.me) My finger table:
+> [ 505.000000] (5:node@c-4.me) Start | Succ 
+> [ 505.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 505.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 505.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 505.000000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 505.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 505.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 505.000000] (5:node@c-4.me) Predecessor: 10004760
+> [ 521.000000] (7:node@c-6.me) My finger table:
+> [ 521.000000] (7:node@c-6.me) Start | Succ 
+> [ 521.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 521.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 521.000000] (7:node@c-6.me)  16728100  |  42 
+> [ 521.000000] (7:node@c-6.me)  16728104  |  42 
+> [ 521.000000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 521.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 521.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 535.000000] (9:node@c-8.me) My finger table:
+> [ 535.000000] (9:node@c-8.me) Start | Succ 
+> [ 535.000000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 535.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 535.000000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 535.000000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 535.000000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 535.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 535.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 537.000000] (4:node@c-3.me) My finger table:
+> [ 537.000000] (4:node@c-3.me) Start | Succ 
+> [ 537.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 537.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 537.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 537.000000] (4:node@c-3.me)  1319746  | 2015253 
+> [ 537.000000] (4:node@c-3.me)  1319754  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 537.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 537.000000] (4:node@c-3.me) Predecessor: 533744
+> [ 539.000000] (2:node@c-1.me) My finger table:
+> [ 539.000000] (2:node@c-1.me) Start | Succ 
+> [ 539.000000] (2:node@c-1.me)  366681  | 533744 
+> [ 539.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 539.000000] (2:node@c-1.me)  366684  | 1319738 
+> [ 539.000000] (2:node@c-1.me)  366688  | 533744 
+> [ 539.000000] (2:node@c-1.me)  366696  | 366680 
+> [ 539.000000] (2:node@c-1.me)  366712  | 366680 
+> [ 539.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 539.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 539.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 539.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 539.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 539.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 539.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 539.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 539.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 539.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 539.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 539.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 539.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 539.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 539.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 539.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 539.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 539.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 539.000000] (2:node@c-1.me) Predecessor: 42
+> [ 540.000000] (3:node@c-2.me) My finger table:
+> [ 540.000000] (3:node@c-2.me) Start | Succ 
+> [ 540.000000] (3:node@c-2.me)  533745  | 1319738 
+> [ 540.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 540.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 540.000000] (3:node@c-2.me)  533752  | 1319738 
+> [ 540.000000] (3:node@c-2.me)  533760  | 533744 
+> [ 540.000000] (3:node@c-2.me)  533776  | 533744 
+> [ 540.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 540.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 540.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 540.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 540.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 540.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 540.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 540.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 540.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 540.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 540.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 540.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 540.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 540.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 540.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 540.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 540.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 540.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 540.000000] (3:node@c-2.me) Predecessor: 366680
+> [ 567.000000] (10:node@c-9.me) My finger table:
+> [ 567.000000] (10:node@c-9.me) Start | Succ 
+> [ 567.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 567.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 567.000000] (10:node@c-9.me)  2015257  | 6518808 
+> [ 567.000000] (10:node@c-9.me)  2015261  | 6518808 
+> [ 567.000000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 567.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 567.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 613.000000] (1:node@c-0.me) My finger table:
+> [ 613.000000] (1:node@c-0.me) Start | Succ 
+> [ 613.000000] (1:node@c-0.me)   43  | 366680 
+> [ 613.000000] (1:node@c-0.me)   44  | 366680 
+> [ 613.000000] (1:node@c-0.me)   46  | 366680 
+> [ 613.000000] (1:node@c-0.me)   50  | 366680 
+> [ 613.000000] (1:node@c-0.me)   58  | 366680 
+> [ 613.000000] (1:node@c-0.me)   74  |  42 
+> [ 613.000000] (1:node@c-0.me)  106  |  42 
+> [ 613.000000] (1:node@c-0.me)  170  |  42 
+> [ 613.000000] (1:node@c-0.me)  298  |  42 
+> [ 613.000000] (1:node@c-0.me)  554  |  42 
+> [ 613.000000] (1:node@c-0.me)  1066  |  42 
+> [ 613.000000] (1:node@c-0.me)  2090  |  42 
+> [ 613.000000] (1:node@c-0.me)  4138  |  42 
+> [ 613.000000] (1:node@c-0.me)  8234  |  42 
+> [ 613.000000] (1:node@c-0.me)  16426  |  42 
+> [ 613.000000] (1:node@c-0.me)  32810  |  42 
+> [ 613.000000] (1:node@c-0.me)  65578  |  42 
+> [ 613.000000] (1:node@c-0.me)  131114  |  42 
+> [ 613.000000] (1:node@c-0.me)  262186  |  42 
+> [ 613.000000] (1:node@c-0.me)  524330  |  42 
+> [ 613.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 613.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 613.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 613.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 613.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 616.000000] (3:node@c-2.me) My finger table:
+> [ 616.000000] (3:node@c-2.me) Start | Succ 
+> [ 616.000000] (3:node@c-2.me)  533745  | 1319738 
+> [ 616.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 616.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 616.000000] (3:node@c-2.me)  533752  | 1319738 
+> [ 616.000000] (3:node@c-2.me)  533760  | 1319738 
+> [ 616.000000] (3:node@c-2.me)  533776  | 533744 
+> [ 616.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 616.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 616.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 616.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 616.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 616.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 616.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 616.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 616.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 616.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 616.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 616.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 616.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 616.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 616.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 616.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 616.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 616.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 616.000000] (3:node@c-2.me) Predecessor: 366680
+> [ 620.000000] (6:node@c-5.me) My finger table:
+> [ 620.000000] (6:node@c-5.me) Start | Succ 
+> [ 620.000000] (6:node@c-5.me)  10874877  | 16728096 
+> [ 620.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 620.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 620.000000] (6:node@c-5.me)  10874884  | 533744 
+> [ 620.000000] (6:node@c-5.me)  10874892  | 16728096 
+> [ 620.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 620.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 620.000000] (6:node@c-5.me) Predecessor: -1
+> [ 629.000000] (8:node@c-7.me) My finger table:
+> [ 629.000000] (8:node@c-7.me) Start | Succ 
+> [ 629.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 629.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 629.000000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 629.000000] (8:node@c-7.me)  10004768  | 16509405 
+> [ 629.000000] (8:node@c-7.me)  10004776  | 16509405 
+> [ 629.000000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 629.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 629.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 630.000000] (5:node@c-4.me) My finger table:
+> [ 630.000000] (5:node@c-4.me) Start | Succ 
+> [ 630.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 630.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 630.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 630.000000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 630.000000] (5:node@c-4.me)  16509421  | 16728096 
+> [ 630.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 630.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 630.000000] (5:node@c-4.me) Predecessor: 10004760
+> [ 653.000000] (7:node@c-6.me) My finger table:
+> [ 653.000000] (7:node@c-6.me) Start | Succ 
+> [ 653.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 653.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 653.000000] (7:node@c-6.me)  16728100  |  42 
+> [ 653.000000] (7:node@c-6.me)  16728104  |  42 
+> [ 653.000000] (7:node@c-6.me)  16728112  |  42 
+> [ 653.000000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 653.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 653.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 663.000000] (2:node@c-1.me) My finger table:
+> [ 663.000000] (2:node@c-1.me) Start | Succ 
+> [ 663.000000] (2:node@c-1.me)  366681  | 533744 
+> [ 663.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 663.000000] (2:node@c-1.me)  366684  | 1319738 
+> [ 663.000000] (2:node@c-1.me)  366688  | 533744 
+> [ 663.000000] (2:node@c-1.me)  366696  | 533744 
+> [ 663.000000] (2:node@c-1.me)  366712  | 366680 
+> [ 663.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 663.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 663.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 663.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 663.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 663.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 663.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 663.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 663.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 663.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 663.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 663.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 663.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 663.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 663.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 663.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 663.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 663.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 663.000000] (2:node@c-1.me) Predecessor: 42
+> [ 668.000000] (4:node@c-3.me) My finger table:
+> [ 668.000000] (4:node@c-3.me) Start | Succ 
+> [ 668.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 668.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 668.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 668.000000] (4:node@c-3.me)  1319746  | 2015253 
+> [ 668.000000] (4:node@c-3.me)  1319754  | 2015253 
+> [ 668.000000] (4:node@c-3.me)  1319770  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 668.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 668.000000] (4:node@c-3.me) Predecessor: 533744
+> [ 683.000000] (5:node@c-4.me) My finger table:
+> [ 683.000000] (5:node@c-4.me) Start | Succ 
+> [ 683.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 683.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 683.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 683.000000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 683.000000] (5:node@c-4.me)  16509421  | 16728096 
+> [ 683.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 683.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 683.000000] (5:node@c-4.me) Predecessor: 10874876
+> [ 688.000000] (9:node@c-8.me) My finger table:
+> [ 688.000000] (9:node@c-8.me) Start | Succ 
+> [ 688.000000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 688.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 688.000000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 688.000000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 688.000000] (9:node@c-8.me)  6518824  | 10004760 
+> [ 688.000000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 688.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 688.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 699.000000] (10:node@c-9.me) My finger table:
+> [ 699.000000] (10:node@c-9.me) Start | Succ 
+> [ 699.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 699.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 699.000000] (10:node@c-9.me)  2015257  | 6518808 
+> [ 699.000000] (10:node@c-9.me)  2015261  | 6518808 
+> [ 699.000000] (10:node@c-9.me)  2015269  | 6518808 
+> [ 699.000000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 699.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 699.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 733.000000] (6:node@c-5.me) My finger table:
+> [ 733.000000] (6:node@c-5.me) Start | Succ 
+> [ 733.000000] (6:node@c-5.me)  10874877  | 16509405 
+> [ 733.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 733.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 733.000000] (6:node@c-5.me)  10874884  | 533744 
+> [ 733.000000] (6:node@c-5.me)  10874892  | 16728096 
+> [ 733.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 733.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 733.000000] (6:node@c-5.me) Predecessor: 10004760
+> [ 735.000000] (1:node@c-0.me) My finger table:
+> [ 735.000000] (1:node@c-0.me) Start | Succ 
+> [ 735.000000] (1:node@c-0.me)   43  | 366680 
+> [ 735.000000] (1:node@c-0.me)   44  | 366680 
+> [ 735.000000] (1:node@c-0.me)   46  | 366680 
+> [ 735.000000] (1:node@c-0.me)   50  | 366680 
+> [ 735.000000] (1:node@c-0.me)   58  | 366680 
+> [ 735.000000] (1:node@c-0.me)   74  | 366680 
+> [ 735.000000] (1:node@c-0.me)  106  |  42 
+> [ 735.000000] (1:node@c-0.me)  170  |  42 
+> [ 735.000000] (1:node@c-0.me)  298  |  42 
+> [ 735.000000] (1:node@c-0.me)  554  |  42 
+> [ 735.000000] (1:node@c-0.me)  1066  |  42 
+> [ 735.000000] (1:node@c-0.me)  2090  |  42 
+> [ 735.000000] (1:node@c-0.me)  4138  |  42 
+> [ 735.000000] (1:node@c-0.me)  8234  |  42 
+> [ 735.000000] (1:node@c-0.me)  16426  |  42 
+> [ 735.000000] (1:node@c-0.me)  32810  |  42 
+> [ 735.000000] (1:node@c-0.me)  65578  |  42 
+> [ 735.000000] (1:node@c-0.me)  131114  |  42 
+> [ 735.000000] (1:node@c-0.me)  262186  |  42 
+> [ 735.000000] (1:node@c-0.me)  524330  |  42 
+> [ 735.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 735.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 735.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 735.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 735.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 743.000000] (3:node@c-2.me) My finger table:
+> [ 743.000000] (3:node@c-2.me) Start | Succ 
+> [ 743.000000] (3:node@c-2.me)  533745  | 1319738 
+> [ 743.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 743.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 743.000000] (3:node@c-2.me)  533752  | 1319738 
+> [ 743.000000] (3:node@c-2.me)  533760  | 1319738 
+> [ 743.000000] (3:node@c-2.me)  533776  | 1319738 
+> [ 743.000000] (3:node@c-2.me)  533808  | 533744 
+> [ 743.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 743.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 743.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 743.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 743.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 743.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 743.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 743.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 743.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 743.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 743.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 743.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 743.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 743.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 743.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 743.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 743.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 743.000000] (3:node@c-2.me) Predecessor: 366680
+> [ 752.000000] (5:node@c-4.me) My finger table:
+> [ 752.000000] (5:node@c-4.me) Start | Succ 
+> [ 752.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509421  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509437  | 16728096 
+> [ 752.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 752.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 752.000000] (5:node@c-4.me) Predecessor: 10874876
+> [ 753.000000] (6:node@c-5.me) My finger table:
+> [ 753.000000] (6:node@c-5.me) Start | Succ 
+> [ 753.000000] (6:node@c-5.me)  10874877  | 16509405 
+> [ 753.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 753.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 753.000000] (6:node@c-5.me)  10874884  | 533744 
+> [ 753.000000] (6:node@c-5.me)  10874892  | 16728096 
+> [ 753.000000] (6:node@c-5.me)  10874908  | 16509405 
+> [ 753.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 753.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 753.000000] (6:node@c-5.me) Predecessor: 10004760
+> [ 765.000000] (8:node@c-7.me) My finger table:
+> [ 765.000000] (8:node@c-7.me) Start | Succ 
+> [ 765.000000] (8:node@c-7.me)  10004761  | 10874876 
+> [ 765.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 765.000000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 765.000000] (8:node@c-7.me)  10004768  | 16509405 
+> [ 765.000000] (8:node@c-7.me)  10004776  | 16509405 
+> [ 765.000000] (8:node@c-7.me)  10004792  | 10874876 
+> [ 765.000000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 765.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 765.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 774.000000] (7:node@c-6.me) My finger table:
+> [ 774.000000] (7:node@c-6.me) Start | Succ 
+> [ 774.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728100  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728104  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728112  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728128  |  42 
+> [ 774.000000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 774.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 774.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 796.000000] (2:node@c-1.me) My finger table:
+> [ 796.000000] (2:node@c-1.me) Start | Succ 
+> [ 796.000000] (2:node@c-1.me)  366681  | 533744 
+> [ 796.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 796.000000] (2:node@c-1.me)  366684  | 1319738 
+> [ 796.000000] (2:node@c-1.me)  366688  | 533744 
+> [ 796.000000] (2:node@c-1.me)  366696  | 533744 
+> [ 796.000000] (2:node@c-1.me)  366712  | 533744 
+> [ 796.000000] (2:node@c-1.me)  366744  | 366680 
+> [ 796.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 796.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 796.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 796.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 796.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 796.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 796.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 796.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 796.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 796.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 796.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 796.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 796.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 796.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 796.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 796.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 796.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 796.000000] (2:node@c-1.me) Predecessor: 42
+> [ 808.000000] (9:node@c-8.me) My finger table:
+> [ 808.000000] (9:node@c-8.me) Start | Succ 
+> [ 808.000000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 808.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 808.000000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 808.000000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 808.000000] (9:node@c-8.me)  6518824  | 10004760 
+> [ 808.000000] (9:node@c-8.me)  6518840  | 10004760 
+> [ 808.000000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 808.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 808.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 810.000000] (4:node@c-3.me) My finger table:
+> [ 810.000000] (4:node@c-3.me) Start | Succ 
+> [ 810.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319746  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319754  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319770  | 2015253 
+> [ 810.000000] (4:node@c-3.me)  1319802  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 810.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 810.000000] (4:node@c-3.me) Predecessor: 533744
+> [ 831.000000] (10:node@c-9.me) My finger table:
+> [ 831.000000] (10:node@c-9.me) Start | Succ 
+> [ 831.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015257  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015261  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015269  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015285  | 6518808 
+> [ 831.000000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 831.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 831.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 859.000000] (1:node@c-0.me) My finger table:
+> [ 859.000000] (1:node@c-0.me) Start | Succ 
+> [ 859.000000] (1:node@c-0.me)   43  | 366680 
+> [ 859.000000] (1:node@c-0.me)   44  | 366680 
+> [ 859.000000] (1:node@c-0.me)   46  | 366680 
+> [ 859.000000] (1:node@c-0.me)   50  | 366680 
+> [ 859.000000] (1:node@c-0.me)   58  | 366680 
+> [ 859.000000] (1:node@c-0.me)   74  | 366680 
+> [ 859.000000] (1:node@c-0.me)  106  | 366680 
+> [ 859.000000] (1:node@c-0.me)  170  |  42 
+> [ 859.000000] (1:node@c-0.me)  298  |  42 
+> [ 859.000000] (1:node@c-0.me)  554  |  42 
+> [ 859.000000] (1:node@c-0.me)  1066  |  42 
+> [ 859.000000] (1:node@c-0.me)  2090  |  42 
+> [ 859.000000] (1:node@c-0.me)  4138  |  42 
+> [ 859.000000] (1:node@c-0.me)  8234  |  42 
+> [ 859.000000] (1:node@c-0.me)  16426  |  42 
+> [ 859.000000] (1:node@c-0.me)  32810  |  42 
+> [ 859.000000] (1:node@c-0.me)  65578  |  42 
+> [ 859.000000] (1:node@c-0.me)  131114  |  42 
+> [ 859.000000] (1:node@c-0.me)  262186  |  42 
+> [ 859.000000] (1:node@c-0.me)  524330  |  42 
+> [ 859.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 859.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 859.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 859.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 859.000000] (1:node@c-0.me) Predecessor: 16728096
+> [ 873.000000] (5:node@c-4.me) My finger table:
+> [ 873.000000] (5:node@c-4.me) Start | Succ 
+> [ 873.000000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509407  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509421  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509437  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509469  | 16728096 
+> [ 873.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  256477  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  780765  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 873.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 873.000000] (5:node@c-4.me) Predecessor: 10874876
+> [ 893.000000] (3:node@c-2.me) My finger table:
+> [ 893.000000] (3:node@c-2.me) Start | Succ 
+> [ 893.000000] (3:node@c-2.me)  533745  | 1319738 
+> [ 893.000000] (3:node@c-2.me)  533746  | 10004760 
+> [ 893.000000] (3:node@c-2.me)  533748  | 10004760 
+> [ 893.000000] (3:node@c-2.me)  533752  | 1319738 
+> [ 893.000000] (3:node@c-2.me)  533760  | 1319738 
+> [ 893.000000] (3:node@c-2.me)  533776  | 1319738 
+> [ 893.000000] (3:node@c-2.me)  533808  | 1319738 
+> [ 893.000000] (3:node@c-2.me)  533872  | 533744 
+> [ 893.000000] (3:node@c-2.me)  534000  | 533744 
+> [ 893.000000] (3:node@c-2.me)  534256  | 533744 
+> [ 893.000000] (3:node@c-2.me)  534768  | 533744 
+> [ 893.000000] (3:node@c-2.me)  535792  | 533744 
+> [ 893.000000] (3:node@c-2.me)  537840  | 533744 
+> [ 893.000000] (3:node@c-2.me)  541936  | 533744 
+> [ 893.000000] (3:node@c-2.me)  550128  | 533744 
+> [ 893.000000] (3:node@c-2.me)  566512  | 533744 
+> [ 893.000000] (3:node@c-2.me)  599280  | 533744 
+> [ 893.000000] (3:node@c-2.me)  664816  | 533744 
+> [ 893.000000] (3:node@c-2.me)  795888  | 533744 
+> [ 893.000000] (3:node@c-2.me)  1058032  | 533744 
+> [ 893.000000] (3:node@c-2.me)  1582320  | 533744 
+> [ 893.000000] (3:node@c-2.me)  2630896  | 533744 
+> [ 893.000000] (3:node@c-2.me)  4728048  | 533744 
+> [ 893.000000] (3:node@c-2.me)  8922352  | 533744 
+> [ 893.000000] (3:node@c-2.me) Predecessor: 366680
+> [ 896.000000] (7:node@c-6.me) My finger table:
+> [ 896.000000] (7:node@c-6.me) Start | Succ 
+> [ 896.000000] (7:node@c-6.me)  16728097  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728098  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728100  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728104  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728112  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728128  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728160  |  42 
+> [ 896.000000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  16416  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  81952  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  213024  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  475168  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  999456  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 896.000000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 896.000000] (7:node@c-6.me) Predecessor: 16509405
+> [ 899.000000] (6:node@c-5.me) My finger table:
+> [ 899.000000] (6:node@c-5.me) Start | Succ 
+> [ 899.000000] (6:node@c-5.me)  10874877  | 16509405 
+> [ 899.000000] (6:node@c-5.me)  10874878  | 533744 
+> [ 899.000000] (6:node@c-5.me)  10874880  | 533744 
+> [ 899.000000] (6:node@c-5.me)  10874884  | 533744 
+> [ 899.000000] (6:node@c-5.me)  10874892  | 16728096 
+> [ 899.000000] (6:node@c-5.me)  10874908  | 16509405 
+> [ 899.000000] (6:node@c-5.me)  10874940  | 16509405 
+> [ 899.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 899.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 899.000000] (6:node@c-5.me) Predecessor: 10004760
+> [ 899.000000] (8:node@c-7.me) My finger table:
+> [ 899.000000] (8:node@c-7.me) Start | Succ 
+> [ 899.000000] (8:node@c-7.me)  10004761  | 10874876 
+> [ 899.000000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 899.000000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 899.000000] (8:node@c-7.me)  10004768  | 16509405 
+> [ 899.000000] (8:node@c-7.me)  10004776  | 16509405 
+> [ 899.000000] (8:node@c-7.me)  10004792  | 10874876 
+> [ 899.000000] (8:node@c-7.me)  10004824  | 10874876 
+> [ 899.000000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 899.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 899.000000] (8:node@c-7.me) Predecessor: 6518808
+> [ 921.000000] (2:node@c-1.me) My finger table:
+> [ 921.000000] (2:node@c-1.me) Start | Succ 
+> [ 921.000000] (2:node@c-1.me)  366681  | 533744 
+> [ 921.000000] (2:node@c-1.me)  366682  | 1319738 
+> [ 921.000000] (2:node@c-1.me)  366684  | 1319738 
+> [ 921.000000] (2:node@c-1.me)  366688  | 533744 
+> [ 921.000000] (2:node@c-1.me)  366696  | 533744 
+> [ 921.000000] (2:node@c-1.me)  366712  | 533744 
+> [ 921.000000] (2:node@c-1.me)  366744  | 533744 
+> [ 921.000000] (2:node@c-1.me)  366808  | 366680 
+> [ 921.000000] (2:node@c-1.me)  366936  | 366680 
+> [ 921.000000] (2:node@c-1.me)  367192  | 366680 
+> [ 921.000000] (2:node@c-1.me)  367704  | 366680 
+> [ 921.000000] (2:node@c-1.me)  368728  | 366680 
+> [ 921.000000] (2:node@c-1.me)  370776  | 366680 
+> [ 921.000000] (2:node@c-1.me)  374872  | 366680 
+> [ 921.000000] (2:node@c-1.me)  383064  | 366680 
+> [ 921.000000] (2:node@c-1.me)  399448  | 366680 
+> [ 921.000000] (2:node@c-1.me)  432216  | 366680 
+> [ 921.000000] (2:node@c-1.me)  497752  | 366680 
+> [ 921.000000] (2:node@c-1.me)  628824  | 366680 
+> [ 921.000000] (2:node@c-1.me)  890968  | 366680 
+> [ 921.000000] (2:node@c-1.me)  1415256  | 366680 
+> [ 921.000000] (2:node@c-1.me)  2463832  | 366680 
+> [ 921.000000] (2:node@c-1.me)  4560984  | 366680 
+> [ 921.000000] (2:node@c-1.me)  8755288  | 366680 
+> [ 921.000000] (2:node@c-1.me) Predecessor: 42
+> [ 928.000000] (9:node@c-8.me) My finger table:
+> [ 928.000000] (9:node@c-8.me) Start | Succ 
+> [ 928.000000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518810  | 16728096 
+> [ 928.000000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518824  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518840  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518872  | 10004760 
+> [ 928.000000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 928.000000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 928.000000] (9:node@c-8.me) Predecessor: 2015253
+> [ 930.000000] (4:node@c-3.me) My finger table:
+> [ 930.000000] (4:node@c-3.me) Start | Succ 
+> [ 930.000000] (4:node@c-3.me)  1319739  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319740  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319742  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319746  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319754  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319770  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319802  | 2015253 
+> [ 930.000000] (4:node@c-3.me)  1319866  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1319994  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1320250  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1320762  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1321786  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1323834  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1327930  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1336122  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1352506  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1385274  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1450810  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1581882  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  1844026  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  2368314  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  3416890  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  5514042  | 1319738 
+> [ 930.000000] (4:node@c-3.me)  9708346  | 1319738 
+> [ 930.000000] (4:node@c-3.me) Predecessor: 533744
+> [ 962.000000] (10:node@c-9.me) My finger table:
+> [ 962.000000] (10:node@c-9.me) Start | Succ 
+> [ 962.000000] (10:node@c-9.me)  2015254  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015255  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015257  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015261  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015269  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015285  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015317  | 6518808 
+> [ 962.000000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 962.000000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 962.000000] (10:node@c-9.me) Predecessor: 1319738
+> [ 982.000000] (1:node@c-0.me) My finger table:
+> [ 982.000000] (1:node@c-0.me) Start | Succ 
+> [ 982.000000] (1:node@c-0.me)   43  | 366680 
+> [ 982.000000] (1:node@c-0.me)   44  | 366680 
+> [ 982.000000] (1:node@c-0.me)   46  | 366680 
+> [ 982.000000] (1:node@c-0.me)   50  | 366680 
+> [ 982.000000] (1:node@c-0.me)   58  | 366680 
+> [ 982.000000] (1:node@c-0.me)   74  | 366680 
+> [ 982.000000] (1:node@c-0.me)  106  | 366680 
+> [ 982.000000] (1:node@c-0.me)  170  | 366680 
+> [ 982.000000] (1:node@c-0.me)  298  |  42 
+> [ 982.000000] (1:node@c-0.me)  554  |  42 
+> [ 982.000000] (1:node@c-0.me)  1066  |  42 
+> [ 982.000000] (1:node@c-0.me)  2090  |  42 
+> [ 982.000000] (1:node@c-0.me)  4138  |  42 
+> [ 982.000000] (1:node@c-0.me)  8234  |  42 
+> [ 982.000000] (1:node@c-0.me)  16426  |  42 
+> [ 982.000000] (1:node@c-0.me)  32810  |  42 
+> [ 982.000000] (1:node@c-0.me)  65578  |  42 
+> [ 982.000000] (1:node@c-0.me)  131114  |  42 
+> [ 982.000000] (1:node@c-0.me)  262186  |  42 
+> [ 982.000000] (1:node@c-0.me)  524330  |  42 
+> [ 982.000000] (1:node@c-0.me)  1048618  |  42 
+> [ 982.000000] (1:node@c-0.me)  2097194  |  42 
+> [ 982.000000] (1:node@c-0.me)  4194346  |  42 
+> [ 982.000000] (1:node@c-0.me)  8388650  |  42 
+> [ 982.000000] (1:node@c-0.me) Predecessor: 16728096
+> [1154.000000] (0:@) Messages created: 2049
+> [1154.000000] (0:@) Simulated time: 1154
index ba8a65c..ee45fec 100644 (file)
@@ -271,7 +271,7 @@ static void task_cleanup(void *arg){
 int main(int argc, char *argv[])
 {
 #ifdef BENCH_THIS_CODE
-  xbt_os_timer_t timer = xbt_os_timer_new();
+  xbt_os_cputimer_t timer = xbt_os_timer_new();
 #endif
 
   MSG_init(&argc, argv);
@@ -286,11 +286,11 @@ int main(int argc, char *argv[])
   MSG_launch_application(application_file);
 
 #ifdef BENCH_THIS_CODE
-  xbt_os_timer_start(timer);
+  xbt_os_cputimer_start(timer);
 #endif
   msg_error_t res = MSG_main();
 #ifdef BENCH_THIS_CODE
-  xbt_os_timer_stop(timer);
+  xbt_os_cputimer_stop(timer);
 #endif
   XBT_CRITICAL("Simulated time: %g", MSG_get_clock());
 
index bb284a6..6cced3c 100644 (file)
@@ -31,7 +31,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Property test");
 int alice(int argc, char *argv[]);
 int bob(int argc, char *argv[]);
 int carole(int argc, char *argv[]);
-int forwarder(int argc, char *argv[]);
 msg_error_t test_all(const char *platform_file,
                      const char *application_file);
 
diff --git a/examples/msg/semaphores/CMakeLists.txt b/examples/msg/semaphores/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d8b48dd
--- /dev/null
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 2.6)
+
+set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+
+add_executable(synchro synchro.c)
+
+### Add definitions for compile
+target_link_libraries(synchro simgrid)
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/synchro.c
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/examples/msg/semaphores/synchro.c b/examples/msg/semaphores/synchro.c
new file mode 100644 (file)
index 0000000..b66b1d3
--- /dev/null
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "msg/msg.h"
+#include "xbt/log.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_semaphore_example,
+                             "Messages specific for this msg example");
+
+msg_sem_t sem;
+
+static int peer(int argc, char* argv[]){
+
+  int i = 0; 
+  
+  while(i < argc) {
+    double wait_time = atof(argv[i++]);
+    MSG_process_sleep(wait_time);
+    XBT_INFO("Trying to acquire %d", i);
+    MSG_sem_acquire(sem);
+    XBT_INFO("Acquired %d", i);
+
+    wait_time = atof(argv[i++]);
+    MSG_process_sleep(wait_time);
+    XBT_INFO("Releasing %d", i);
+    MSG_sem_release(sem);
+    XBT_INFO("Released %d", i);
+  }
+  MSG_process_sleep(50);
+  XBT_INFO("Done");
+
+  return 0;
+}
+
+int main(int argc, char* argv[]) {
+
+  MSG_init(&argc, argv);
+  MSG_create_environment(argv[1]);
+  
+  xbt_dynar_t hosts = MSG_hosts_as_dynar();
+  msg_host_t h = xbt_dynar_get_as(hosts,0,msg_host_t);
+
+  sem = MSG_sem_init(1);
+  char** aliceTimes = xbt_new(char*, 9);
+  int nbAlice = 0;
+  aliceTimes[nbAlice++] = xbt_strdup("0"); 
+  aliceTimes[nbAlice++] = xbt_strdup("1");
+  aliceTimes[nbAlice++] = xbt_strdup("3");
+  aliceTimes[nbAlice++] = xbt_strdup("5");
+  aliceTimes[nbAlice++] = xbt_strdup("1");
+  aliceTimes[nbAlice++] = xbt_strdup("2");
+  aliceTimes[nbAlice++] = xbt_strdup("5");
+  aliceTimes[nbAlice++] = xbt_strdup("0");
+  aliceTimes[nbAlice++] = NULL;
+
+  char** bobTimes = xbt_new(char*, 9);
+  int nbBob = 0;
+  bobTimes[nbBob++] = xbt_strdup("0.9"); 
+  bobTimes[nbBob++] = xbt_strdup("1");
+  bobTimes[nbBob++] = xbt_strdup("1");
+  bobTimes[nbBob++] = xbt_strdup("2");
+  bobTimes[nbBob++] = xbt_strdup("2");
+  bobTimes[nbBob++] = xbt_strdup("0");
+  bobTimes[nbBob++] = xbt_strdup("0");
+  bobTimes[nbBob++] = xbt_strdup("5");
+  bobTimes[nbBob++] = NULL;
+
+  MSG_process_create_with_arguments(xbt_strdup("Alice"), peer, NULL, 
+                                   h, 8, aliceTimes);
+  MSG_process_create_with_arguments(xbt_strdup("Bob"), peer, NULL, 
+                                   h, 8, bobTimes);
+
+  msg_error_t res = MSG_main();
+  printf("Finished\n");
+  return (res != MSG_OK);
+}
index fad5a1f..5b444d1 100644 (file)
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx
--rw-r--r-- 1 user user 1262 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml
--rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Main.cxx
--rw-r--r-- 1 user user 870 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx
--rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx
--rw-r--r-- 1 user user 1891 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Master.cxx
--rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml
--rw-r--r-- 1 user user 1137 2011-10-05 16:04 ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx
--rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Main.cxx
--rw-r--r-- 1 user user 693 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Slave.cxx
--rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/BasicTask.cxx
--rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/basic_platform.xml
--rw-r--r-- 1 user user 2148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Master.cxx
--rw-r--r-- 1 user user 1188 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/basic_deployment.xml
--rw-r--r-- 1 user user 1244 2011-10-05 16:04 ./doc/simgrid/examples/cxx/basic/Forwarder.cxx
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx
--rw-r--r-- 1 user user 148 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Main.cxx
--rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml
--rw-r--r-- 1 user user 913 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx
--rw-r--r-- 1 user user 65 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx
--rw-r--r-- 1 user user 1188 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml
--rw-r--r-- 1 user user 1896 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Master.cxx
--rw-r--r-- 1 user user 1181 2011-10-05 16:04 ./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx
--rw-r--r-- 1 user user 149 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Main.cxx
--rw-r--r-- 1 user user 1073 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Sender.cxx
--rw-r--r-- 1 user user 275 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml
--rw-r--r-- 1 user user 4718 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml
--rw-r--r-- 1 user user 957 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx
--rw-r--r-- 1 user user 146 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Main.cxx
--rw-r--r-- 1 user user 71 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx
--rw-r--r-- 1 user user 889 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Slave.cxx
--rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml
--rw-r--r-- 1 user user 1730 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/Master.cxx
--rw-r--r-- 1 user user 1884 2011-10-05 16:04 ./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml
--rw-r--r-- 1 user user 150 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/Main.cxx
--rw-r--r-- 1 user user 2133932 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/suspend_platform.xml
--rw-r--r-- 1 user user 187 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml
--rw-r--r-- 1 user user 826 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx
--rw-r--r-- 1 user user 429 2011-10-05 16:04 ./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx
--rw-r--r-- 1 user user 1387 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mc_bugged2.c
--rw-r--r-- 1 user user 3496 2011-10-05 16:04 ./doc/simgrid/examples/smpi/scatter.c
--rw-r--r-- 1 user user 1411 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mc_bugged1.c
--rw-r--r-- 1 user user 649 2011-10-05 16:04 ./doc/simgrid/examples/smpi/get_processor_name.c
--rw-r--r-- 1 user user 1857 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/README
--rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/README
--rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c
--rw-r--r-- 1 user user 13723 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c
--rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/README
--rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c
--rw-r--r-- 1 user user 13850 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c
--rw-r--r-- 1 user user 394 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README
--rw-r--r-- 1 user user 38276 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c
--rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/README
--rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c
--rw-r--r-- 1 user user 23031 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c
--rw-r--r-- 1 user user 38077 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/IS/is.c
--rw-r--r-- 1 user user 2406 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/README
--rw-r--r-- 1 user user 5660 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c
--rw-r--r-- 1 user user 1700 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c
--rw-r--r-- 1 user user 228 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c
--rw-r--r-- 1 user user 1441 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/randdp.c
--rw-r--r-- 1 user user 1159 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/c_timers.c
--rw-r--r-- 1 user user 3086 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/common/c_print_results.c
--rw-r--r-- 1 user user 1461 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/sys/README
--rw-r--r-- 1 user user 38805 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/sys/setparams.c
--rw-r--r-- 1 user user 926 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/SP/README
--rw-r--r-- 1 user user 276 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/FT/README
--rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/README
--rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/DGraph.c
--rw-r--r-- 1 user user 22620 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT/dt.c
--rw-r--r-- 1 user user 347 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/README
--rw-r--r-- 1 user user 3300 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/randlc.c
--rw-r--r-- 1 user user 13688 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/EP/ep.c
--rw-r--r-- 1 user user 999 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/README
--rw-r--r-- 1 user user 5451 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c
--rw-r--r-- 1 user user 22704 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c
--rw-r--r-- 1 user user 5465 2011-10-05 16:04 ./doc/simgrid/examples/smpi/NAS/MG/README
--rw-r--r-- 1 user user 983 2011-10-05 16:04 ./doc/simgrid/examples/smpi/bcast.c
--rw-r--r-- 1 user user 628 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute2.c
--rw-r--r-- 1 user user 1652 2011-10-05 16:04 ./doc/simgrid/examples/smpi/sendrecv.c
--rw-r--r-- 1 user user 2135 2011-10-05 16:04 ./doc/simgrid/examples/smpi/allreduce.c
--rw-r--r-- 1 user user 7069 2011-10-05 16:04 ./doc/simgrid/examples/smpi/mvmul.c
--rw-r--r-- 1 user user 4441 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoallv.c
--rw-r--r-- 1 user user 8529 2011-10-05 16:04 ./doc/simgrid/examples/smpi/smpi_traced.c
--rw-r--r-- 1 user user 816 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute3.c
--rw-r--r-- 1 user user 3545 2011-10-05 16:04 ./doc/simgrid/examples/smpi/reduce.c
--rw-r--r-- 1 user user 2466 2011-10-05 16:04 ./doc/simgrid/examples/smpi/bcbench.c
--rw-r--r-- 1 user user 1273 2011-10-05 16:04 ./doc/simgrid/examples/smpi/ttest01.c
--rw-r--r-- 1 user user 622 2011-10-05 16:04 ./doc/simgrid/examples/smpi/compute.c
--rw-r--r-- 1 user user 766 2011-10-05 16:04 ./doc/simgrid/examples/smpi/barrier.c
--rw-r--r-- 1 user user 1453 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoall_basic.c
--rw-r--r-- 1 user user 2286 2011-10-05 16:04 ./doc/simgrid/examples/smpi/pingpong.c
--rw-r--r-- 1 user user 2799 2011-10-05 16:04 ./doc/simgrid/examples/smpi/alltoall2.c
--rw-r--r-- 1 user user 705 2011-10-05 16:04 ./doc/simgrid/examples/smpi/split.c
--rw-r--r-- 1 user user 1970 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_basic.c
--rw-r--r-- 1 user user 7207 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_sched.c
--rw-r--r-- 1 user user 4582 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform.xml
--rw-r--r-- 1 user user 4805 2011-10-05 16:04 ./doc/simgrid/examples/msg/README
--rw-r--r-- 1 user user 272 2011-10-05 16:04 ./doc/simgrid/examples/msg/properties/deployment_properties.xml
--rw-r--r-- 1 user user 3853 2011-10-05 16:04 ./doc/simgrid/examples/msg/properties/msg_prop.c
--rw-r--r-- 1 user user 856 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-p.xml
--rw-r--r-- 1 user user 582 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/dogbone-d.xml
--rw-r--r-- 1 user user 1817 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/Two_clusters.xml
--rw-r--r-- 1 user user 927 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-d.xml
--rw-r--r-- 1 user user 1280 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3links-d-timer.xml
--rw-r--r-- 1 user user 5177 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/ns3.c
--rw-r--r-- 1 user user 369 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml
--rw-r--r-- 1 user user 367 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/One_cluster-d.xml
--rw-r--r-- 1 user user 1497 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/dogbone-p.xml
--rw-r--r-- 1 user user 566 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml
--rw-r--r-- 1 user user 352 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml
--rw-r--r-- 1 user user 658 2011-10-05 16:04 ./doc/simgrid/examples/msg/ns3/One_cluster.xml
--rw-r--r-- 1 user user 2922 2011-10-05 16:04 ./doc/simgrid/examples/msg/migration/migration.c
--rw-r--r-- 1 user user 4746 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform_with_failures.xml
--rw-r--r-- 1 user user 972 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/small_platform.xml
--rw-r--r-- 1 user user 678 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer.xml
--rw-r--r-- 1 user user 891 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer05.xml
--rw-r--r-- 1 user user 855 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer02.xml
--rw-r--r-- 1 user user 4276 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer2.c
--rw-r--r-- 1 user user 851 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer03.xml
--rw-r--r-- 1 user user 852 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer04.xml
--rw-r--r-- 1 user user 5102 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer.c
--rw-r--r-- 1 user user 855 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/deployment_peer01.xml
--rw-r--r-- 1 user user 5258 2011-10-05 16:04 ./doc/simgrid/examples/msg/icomms/peer3.c
--rw-r--r-- 1 user user 654 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml
--rw-r--r-- 1 user user 5423 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask.c
--rw-r--r-- 1 user user 2380 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml
--rw-r--r-- 1 user user 2708 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_task/parallel_task.c
--rw-r--r-- 1 user user 6217 2011-10-05 16:04 ./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c
--rw-r--r-- 1 user user 598 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test9.xml
--rw-r--r-- 1 user user 372 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test3.xml
--rw-r--r-- 1 user user 206 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test_trace_integration.xml
--rw-r--r-- 1 user user 370 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test2.xml
--rw-r--r-- 1 user user 501 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test7.xml
--rw-r--r-- 1 user user 683 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test11.xml
--rw-r--r-- 1 user user 371 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test4.xml
--rw-r--r-- 1 user user 598 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test10.xml
--rw-r--r-- 1 user user 372 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test6.xml
--rw-r--r-- 1 user user 498 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test8.xml
--rw-r--r-- 1 user user 371 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test5.xml
--rw-r--r-- 1 user user 1960 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test_trace_integration.c
--rw-r--r-- 1 user user 366 2011-10-05 16:04 ./doc/simgrid/examples/msg/trace/test1.xml
--rw-r--r-- 1 user user 1002 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml
--rw-r--r-- 1 user user 467 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml
--rw-r--r-- 1 user user 2236 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c
--rw-r--r-- 1 user user 242 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml
--rw-r--r-- 1 user user 353 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml
--rw-r--r-- 1 user user 1752 2011-10-05 16:04 ./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c
--rw-r--r-- 1 user user 800 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/deployment.xml
--rw-r--r-- 1 user user 4374 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/ms.c
--rw-r--r-- 1 user user 3930 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/platform.xml
--rw-r--r-- 1 user user 3594 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/tasks.c
--rw-r--r-- 1 user user 223 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/procmig-deploy.xml
--rw-r--r-- 1 user user 3282 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/procmig.c
--rw-r--r-- 1 user user 3358 2011-10-05 16:04 ./doc/simgrid/examples/msg/tracing/categories.c
--rw-r--r-- 1 user user 689 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/README
--rw-r--r-- 1 user user 321 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml
--rw-r--r-- 1 user user 5098 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/sendrecv.c
--rw-r--r-- 1 user user 528 2011-10-05 16:04 ./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml
--rw-r--r-- 1 user user 439 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/onelink-p.xml
--rw-r--r-- 1 user user 575 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml
--rw-r--r-- 1 user user 576 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/dogbone-d.xml
--rw-r--r-- 1 user user 46642 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/waxman-d.xml
--rw-r--r-- 1 user user 4964600 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/waxman-p.xml
--rw-r--r-- 1 user user 1029 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml
--rw-r--r-- 1 user user 356 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/onelink-d.xml
--rw-r--r-- 1 user user 6172 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/gtnets.c
--rw-r--r-- 1 user user 1482 2011-10-05 16:04 ./doc/simgrid/examples/msg/gtnets/dogbone-p.xml
--rw-r--r-- 1 user user 9688 2011-10-05 16:04 ./doc/simgrid/examples/msg/pmm/msg_pmm.c
--rw-r--r-- 1 user user 786 2011-10-05 16:04 ./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml
--rw-r--r-- 1 user user 1378 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged1.c
--rw-r--r-- 1 user user 377 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged3.xml
--rw-r--r-- 1 user user 925 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_mutex.xml
--rw-r--r-- 1 user user 876 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/platform.xml
--rw-r--r-- 1 user user 377 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged2.xml
--rw-r--r-- 1 user user 563 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/random_test.c
--rw-r--r-- 1 user user 459 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_bugged1.xml
--rw-r--r-- 1 user user 1827 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged3.c
--rw-r--r-- 1 user user 468 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/deploy_random_test.xml
--rw-r--r-- 1 user user 1957 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/bugged2.c
--rw-r--r-- 1 user user 3375 2011-10-05 16:04 ./doc/simgrid/examples/msg/mc/centralized_mutex.c
--rw-r--r-- 1 user user 1007 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/two_clusters.xml
--rw-r--r-- 1 user user 4205 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/ring_call.c
--rw-r--r-- 1 user user 556 2011-10-05 16:04 ./doc/simgrid/examples/msg/token_ring/two_peers.xml
--rw-r--r-- 1 user user 2261806 2011-10-05 16:04 ./doc/simgrid/examples/msg/msg_platform.xml
--rw-r--r-- 1 user user 406 2011-10-05 16:04 ./doc/simgrid/examples/msg/priority/deployment_priority.xml
--rw-r--r-- 1 user user 2394 2011-10-05 16:04 ./doc/simgrid/examples/msg/priority/priority.c
--rw-r--r-- 1 user user 19339 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/actions.c
--rw-r--r-- 1 user user 249 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/deployment.xml
--rw-r--r-- 1 user user 6805 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml
--rw-r--r-- 1 user user 387 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml
--rw-r--r-- 1 user user 605 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml
--rw-r--r-- 1 user user 1066 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml
--rw-r--r-- 1 user user 1066 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml
--rw-r--r-- 1 user user 525 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/deployment_split.xml
--rw-r--r-- 1 user user 906 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml
--rw-r--r-- 1 user user 224 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/bcast_deployment.xml
--rw-r--r-- 1 user user 501 2011-10-05 16:04 ./doc/simgrid/examples/msg/actions/actions_deployment_split.xml
--rw-r--r-- 1 user user 9082 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c
--rw-r--r-- 1 user user 990 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml
--rw-r--r-- 1 user user 6773 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c
--rw-r--r-- 1 user user 3952 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_console.c
--rw-r--r-- 1 user user 930 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/platform_clusters.xml
--rw-r--r-- 1 user user 1078 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml
--rw-r--r-- 1 user user 7120 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_failure.c
--rw-r--r-- 1 user user 4170 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml
--rw-r--r-- 1 user user 1382 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml
--rw-r--r-- 1 user user 6438 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c
--rw-r--r-- 1 user user 2535 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/platform_script.lua
--rw-r--r-- 1 user user 998 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml
--rw-r--r-- 1 user user 6805 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml
--rw-r--r-- 1 user user 878 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml
--rw-r--r-- 1 user user 4118 2011-10-05 16:04 ./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c
--rw-r--r-- 1 user user 2692 2011-10-05 16:04 ./doc/simgrid/examples/msg/suspend/suspend.c
--rw-r--r-- 1 user user 183 2011-10-05 16:04 ./doc/simgrid/examples/msg/suspend/deployment_suspend.xml
--rw-r--r-- 1 user user 5295 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform_with_routers.xml
--rw-r--r-- 1 user user 13992 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord90.xml
--rw-r--r-- 1 user user 2236 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord.xml
--rw-r--r-- 1 user user 1624671 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord10k.xml
--rw-r--r-- 1 user user 28995 2011-10-05 16:04 ./doc/simgrid/examples/msg/chord/chord.c
--rw-r--r-- 1 user user 4628 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml
--rw-r--r-- 1 user user 227 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua
--rw-r--r-- 1 user user 1199 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/receiver.lua
--rw-r--r-- 1 user user 524 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml
--rw-r--r-- 1 user user 748 2011-10-05 16:04 ./doc/simgrid/examples/lua/multi_matrix/sender.lua
--rw-r--r-- 1 user user 2196 2011-10-05 16:04 ./doc/simgrid/examples/lua/mult_matrix.lua
--rw-r--r-- 1 user user 1416 2011-10-05 16:04 ./doc/simgrid/examples/lua/README
--rw-r--r-- 1 user user 879 2011-10-05 16:04 ./doc/simgrid/examples/lua/deploy.xml
--rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/master.lua
--rw-r--r-- 1 user user 729 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/slave.lua
--rw-r--r-- 1 user user 1950 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_platform.lua
--rw-r--r-- 1 user user 304 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua
--rw-r--r-- 1 user user 487 2011-10-05 16:04 ./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua
--rw-r--r-- 1 user user 1390 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/master.lua
--rw-r--r-- 1 user user 713 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/slave.lua
--rw-r--r-- 1 user user 491 2011-10-05 16:04 ./doc/simgrid/examples/lua/tracing/master_slave_trace.lua
--rw-r--r-- 1 user user 2298 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/sim_splay.lua
--rw-r--r-- 1 user user 402 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/splay_school.lua
--rw-r--r-- 1 user user 1906 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/chord.lua
--rw-r--r-- 1 user user 1706 2011-10-05 16:04 ./doc/simgrid/examples/lua/SimSplay/platform_script.lua
--rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/master.lua
--rw-r--r-- 1 user user 480 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/deploy.lua
--rw-r--r-- 1 user user 730 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/slave.lua
--rw-r--r-- 1 user user 2424 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/platform.lua
--rw-r--r-- 1 user user 158 2011-10-05 16:04 ./doc/simgrid/examples/lua/console/master_slave_bypass.lua
--rw-r--r-- 1 user user 1125 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/master.lua
--rw-r--r-- 1 user user 730 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/slave.lua
--rw-r--r-- 1 user user 2424 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/platform.lua
--rw-r--r-- 1 user user 378 2011-10-05 16:04 ./doc/simgrid/examples/lua/masterslave/master_slave.lua
--rw-r--r-- 1 user user 3012 2011-10-05 16:04 ./doc/simgrid/examples/simdag/properties/sd_prop.c
--rw-r--r-- 1 user user 9663 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Strassen.xml
--rw-r--r-- 1 user user 23087 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Montage_25.xml
--rw-r--r-- 1 user user 267014 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Sipht_30.xml
--rw-r--r-- 1 user user 4346 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/dax_test.c
--rw-r--r-- 1 user user 48868 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Montage_50.xml
--rw-r--r-- 1 user user 28774 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/Inspiral_30.xml
--rw-r--r-- 1 user user 289 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dax/sagittaire.xml
--rw-r--r-- 1 user user 11328 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/minmin_test.c
--rw-r--r-- 1 user user 23087 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/Montage_25.xml
--rw-r--r-- 1 user user 5670 2011-10-05 16:04 ./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml
--rw-r--r-- 1 user user 4153 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_seq_access.c
--rw-r--r-- 1 user user 6976 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test_console.c
--rw-r--r-- 1 user user 2207 2011-10-05 16:04 ./doc/simgrid/examples/simdag/metaxml/sd_meta.c
--rw-r--r-- 1 user user 14326 2011-10-05 16:04 ./doc/simgrid/examples/simdag/2clusters.xml
--rw-r--r-- 1 user user 7538 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test2.c
--rw-r--r-- 1 user user 1864 2011-10-05 16:04 ./doc/simgrid/examples/simdag/platform_script.lua
--rw-r--r-- 1 user user 4354 2011-10-05 16:04 ./doc/simgrid/examples/simdag/simdag_trace.c
--rw-r--r-- 1 user user 6964 2011-10-05 16:04 ./doc/simgrid/examples/simdag/sd_test.c
--rw-r--r-- 1 user user 1622 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/dot_test2.c
--rw-r--r-- 1 user user 3590 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/simulate_dot.c
--rw-r--r-- 1 user user 4002 2011-10-05 16:04 ./doc/simgrid/examples/simdag/dot/dot_test.c
--rw-r--r-- 1 user user 17028 2011-10-05 16:04 ./doc/simgrid/examples/platforms/g5k.xml
--rw-r--r-- 1 user user 482 2011-10-05 16:04 ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
--rw-r--r-- 1 user user 22645 2011-10-05 16:04 ./doc/simgrid/examples/platforms/g5k_cabinets.xml
--rw-r--r-- 1 user user 4028 2011-10-05 16:04 ./doc/simgrid/examples/platforms/nancy.xml
--rw-r--r-- 1 user user 15970 2011-10-05 16:04 ./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml
--rw-r--r-- 1 user user 930 2011-10-05 16:04 ./doc/simgrid/examples/platforms/Two_clusters.xml
--rw-r--r-- 1 user user 3274 2011-10-05 16:04 ./doc/simgrid/examples/platforms/vivaldi.xml
--rw-r--r-- 1 user user 6096 2011-10-05 16:04 ./doc/simgrid/examples/platforms/gridpp_grid_2004.xml
--rw-r--r-- 1 user user 1879 2011-10-05 16:04 ./doc/simgrid/examples/platforms/griffon.xml
--rw-r--r-- 1 user user 28125 2011-10-05 16:04 ./doc/simgrid/examples/platforms/median_harvard.xml
--rw-r--r-- 1 user user 1273 2011-10-05 16:04 ./doc/simgrid/examples/platforms/prop.xml
--rw-r--r-- 1 user user 661 2011-10-05 16:04 ./doc/simgrid/examples/platforms/One_cluster.xml
--rw-r--r-- 1 user user 2323 2011-10-05 16:04 ./doc/simgrid/examples/platforms/gdx.xml
--rw-r--r-- 1 user user 222 2011-10-05 16:04 ./doc/simgrid/examples/platforms/multicore_machine.xml
--rw-r--r-- 1 user user 36192 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__str.html
--rw-r--r-- 1 user user 14505 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__decl.html
--rw-r--r-- 1 user user 2130 2011-10-05 16:04 ./doc/simgrid/html/bug.html
--rw-r--r-- 1 user user 10658 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__C.html
--rw-r--r-- 1 user user 2512 2011-10-05 16:04 ./doc/simgrid/html/structs__xbt__strbuff__t.html
--rw-r--r-- 1 user user 4803 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html
--rw-r--r-- 1 user user 11932 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules2.png
--rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html
--rw-r--r-- 1 user user 13562 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__actions.html
--rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_intra.html
--rw-r--r-- 1 user user 8326 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo_small.png
--rw-r--r-- 1 user user 4203 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__resources.html
--rw-r--r-- 1 user user 2751 2011-10-05 16:04 ./doc/simgrid/html/structsurf__cpu__model__extension__public.html
--rw-r--r-- 1 user user 1095 2011-10-05 16:04 ./doc/simgrid/html/tabs.css
--rw-r--r-- 1 user user 6991 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set.html
--rw-r--r-- 1 user user 9653 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__curs.html
--rw-r--r-- 1 user user 10014 2011-10-05 16:04 ./doc/simgrid/html/structxbt__ex__t.html
--rw-r--r-- 1 user user 5794 2011-10-05 16:04 ./doc/simgrid/html/pages.html
--rw-r--r-- 1 user user 30160 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html
--rw-r--r-- 1 user user 6276 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__API.html
--rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html
--rw-r--r-- 1 user user 3202 2011-10-05 16:04 ./doc/simgrid/html/todo.html
--rw-r--r-- 1 user user 159 2011-10-05 16:04 ./doc/simgrid/html/nav_f.png
--rw-r--r-- 1 user user 23050 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__queue.html
--rw-r--r-- 1 user user 9876 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__cons.html
--rw-r--r-- 1 user user 17707 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model.html
--rw-r--r-- 1 user user 43212 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_asynchronous_communications.html
--rw-r--r-- 1 user user 30326 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg
--rw-r--r-- 1 user user 2783 2011-10-05 16:04 ./doc/simgrid/html/structsurf__network__model__extension__public.html
--rw-r--r-- 1 user user 2621 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model__description.html
--rw-r--r-- 1 user user 19042 2011-10-05 16:04 ./doc/simgrid/html/group__m__host__management.html
--rw-r--r-- 1 user user 14045 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__perl.html
--rw-r--r-- 1 user user 12734 2011-10-05 16:04 ./doc/simgrid/html/modules.html
--rw-r--r-- 1 user user 7707 2011-10-05 16:04 ./doc/simgrid/html/annotated.html
--rw-r--r-- 1 user user 6191 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo.html
--rw-r--r-- 1 user user 3765 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__parmap.html
--rw-r--r-- 1 user user 58483 2011-10-05 16:04 ./doc/simgrid/html/tracing.html
--rw-r--r-- 1 user user 2523 2011-10-05 16:04 ./doc/simgrid/html/structs__surf__metric__t.html
--rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html
--rw-r--r-- 1 user user 5923 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag.html
--rw-r--r-- 1 user user 11436 2011-10-05 16:04 ./doc/simgrid/html/functions_vars.html
--rw-r--r-- 1 user user 8194 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__type.html
--rw-r--r-- 1 user user 60084 2011-10-05 16:04 ./doc/simgrid/html/win_install_02.png
--rw-r--r-- 1 user user 8309 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules.png
--rw-r--r-- 1 user user 8348 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__error.html
--rw-r--r-- 1 user user 15743 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cons.html
--rw-r--r-- 1 user user 21536 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo.png
--rw-r--r-- 1 user user 7717 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__misc.html
--rw-r--r-- 1 user user 3460 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__context.html
--rw-r--r-- 1 user user 8963 2011-10-05 16:04 ./doc/simgrid/html/group__m__channel__management.html
--rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__task.html
--rw-r--r-- 1 user user 8561 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__curs.html
--rw-r--r-- 1 user user 60965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log.html
--rw-r--r-- 1 user user 118 2011-10-05 16:04 ./doc/simgrid/html/open.png
--rw-r--r-- 1 user user 9008 2011-10-05 16:04 ./doc/simgrid/html/group__msg__simulation.html
--rw-r--r-- 1 user user 11976 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cursor.html
--rw-r--r-- 1 user user 5102 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log__cats.html
--rw-r--r-- 1 user user 55802 2011-10-05 16:04 ./doc/simgrid/html/win_install_03.png
--rw-r--r-- 1 user user 3249 2011-10-05 16:04 ./doc/simgrid/html/poster_thumbnail.png
--rw-r--r-- 1 user user 7557 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management__details.html
--rw-r--r-- 1 user user 24314 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__basic.html
--rw-r--r-- 1 user user 61053 2011-10-05 16:04 ./doc/simgrid/html/win_install_01.png
--rw-r--r-- 1 user user 126 2011-10-05 16:04 ./doc/simgrid/html/closed.png
--rw-r--r-- 1 user user 6958 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__adt.html
--rw-r--r-- 1 user user 9659 2011-10-05 16:04 ./doc/simgrid/html/index.html
--rw-r--r-- 1 user user 17867 2011-10-05 16:04 ./doc/simgrid/html/group__SD__link__management.html
--rw-r--r-- 1 user user 5443 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__JAVA.html
--rw-r--r-- 1 user user 10385 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__simulation.html
--rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__host.html
--rw-r--r-- 1 user user 22436 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__array.html
--rw-r--r-- 1 user user 386 2011-10-05 16:04 ./doc/simgrid/html/simgrid.css
--rw-r--r-- 1 user user 15389 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__dependency__management.html
--rw-r--r-- 1 user user 7225 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__grounding.html
--rw-r--r-- 1 user user 11863 2011-10-05 16:04 ./doc/simgrid/html/pls.html
--rw-r--r-- 1 user user 12693 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__ctn.html
--rw-r--r-- 1 user user 11564 2011-10-05 16:04 ./doc/simgrid/html/functions.html
--rw-r--r-- 1 user user 9616 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__speed.html
--rw-r--r-- 1 user user 24837 2011-10-05 16:04 ./doc/simgrid/html/installSimgrid.html
--rw-r--r-- 1 user user 59769 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_configuration.png
--rw-r--r-- 1 user user 55335 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_visualization.png
--rw-r--r-- 1 user user 51294 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave.html
--rw-r--r-- 1 user user 3942 2011-10-05 16:04 ./doc/simgrid/html/doxygen.png
--rw-r--r-- 1 user user 10757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__cons.html
--rw-r--r-- 1 user user 125324 2011-10-05 16:04 ./doc/simgrid/html/group__API__index.html
--rw-r--r-- 1 user user 9746 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__cons.html
--rw-r--r-- 1 user user 19885 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__func.html
--rw-r--r-- 1 user user 4674 2011-10-05 16:04 ./doc/simgrid/html/group__SimGrid__API.html
--rw-r--r-- 1 user user 9591 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__misc.html
--rw-r--r-- 1 user user 5121 2011-10-05 16:04 ./doc/simgrid/html/structxbt__set__elm__.html
--rw-r--r-- 1 user user 19320 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__get.html
--rw-r--r-- 1 user user 23685 2011-10-05 16:04 ./doc/simgrid/html/bindings.html
--rw-r--r-- 1 user user 6916 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict.html
--rw-r--r-- 1 user user 3904 2011-10-05 16:04 ./doc/simgrid/html/use.html
--rw-r--r-- 1 user user 20935 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__basic.html
--rw-r--r-- 1 user user 23682 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__graph.html
--rw-r--r-- 1 user user 6444 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator.html
--rw-r--r-- 1 user user 11076 2011-10-05 16:04 ./doc/simgrid/html/structsurf__workstation__model__extension__public.html
--rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis.html
--rw-r--r-- 1 user user 4663 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__misc.html
--rw-r--r-- 1 user user 226 2011-10-05 16:04 ./doc/simgrid/html/simdag.html
--rw-r--r-- 1 user user 340759 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot.jpg
--rw-r--r-- 1 user user 65293 2011-10-05 16:04 ./doc/simgrid/html/group__msg__gos__functions.html
--rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html
--rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_extern.html
--rw-r--r-- 1 user user 5094 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__LUA.html
--rw-r--r-- 1 user user 14081 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar.html
--rw-r--r-- 1 user user 2480 2011-10-05 16:04 ./doc/simgrid/html/structs__model__type.html
--rw-r--r-- 1 user user 19296 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__synchro.html
--rw-r--r-- 1 user user 677 2011-10-05 16:04 ./doc/simgrid/html/bc_s.png
--rw-r--r-- 1 user user 6934 2011-10-05 16:04 ./doc/simgrid/html/classes.html
--rw-r--r-- 1 user user 29778 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__direct.html
--rw-r--r-- 1 user user 37757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__use.html
--rw-r--r-- 1 user user 9306 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__objects.html
--rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html
--rw-r--r-- 1 user user 18525 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__multi.html
--rw-r--r-- 1 user user 16459 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management.html
--rw-r--r-- 1 user user 178 2011-10-05 16:04 ./doc/simgrid/html/tab_b.png
--rw-r--r-- 1 user user 45009 2011-10-05 16:04 ./doc/simgrid/html/group__SD__simulation.html
--rw-r--r-- 1 user user 50885 2011-10-05 16:04 ./doc/simgrid/html/group__msg__easier__life.html
--rw-r--r-- 1 user user 35307 2011-10-05 16:04 ./doc/simgrid/html/group__m__task__management.html
--rw-r--r-- 1 user user 140 2011-10-05 16:04 ./doc/simgrid/html/tab_a.png
--rw-r--r-- 1 user user 16354 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__config.html
--rw-r--r-- 1 user user 7629 2011-10-05 16:04 ./doc/simgrid/html/options.html
--rw-r--r-- 1 user user 18891 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__nnul.html
--rw-r--r-- 1 user user 52033 2011-10-05 16:04 ./doc/simgrid/html/win_install_04.png
--rw-r--r-- 1 user user 8353 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action.html
--rw-r--r-- 1 user user 32537 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__ex.html
--rw-r--r-- 1 user user 6659 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__API.html
--rw-r--r-- 1 user user 12350 2011-10-05 16:04 ./doc/simgrid/html/doxygen.css
--rw-r--r-- 1 user user 7965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__cons.html
--rw-r--r-- 1 user user 7821 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__build__api.html
--rw-r--r-- 1 user user 47169 2011-10-05 16:04 ./doc/simgrid/html/group__m__process__management.html
--rw-r--r-- 1 user user 19747 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__curs.html
--rw-r--r-- 1 user user 20816 2011-10-05 16:04 ./doc/simgrid/html/group__SD__datatypes__management.html
--rw-r--r-- 1 user user 8379 2011-10-05 16:04 ./doc/simgrid/html/group__SD__API.html
--rw-r--r-- 1 user user 4776 2011-10-05 16:04 ./doc/simgrid/html/group__SMPI__API.html
--rw-r--r-- 1 user user 12131 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__perl.html
--rw-r--r-- 1 user user 15874 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__register.html
--rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_core.html
--rw-r--r-- 1 user user 46397 2011-10-05 16:04 ./doc/simgrid/html/group__SD__workstation__management.html
--rw-r--r-- 1 user user 4794 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua.html
--rw-r--r-- 1 user user 6026 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__API.html
--rw-r--r-- 1 user user 227 2011-10-05 16:04 ./doc/simgrid/html/msg.html
--rw-r--r-- 1 user user 60347 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__management.html
--rw-r--r-- 1 user user 10095 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__syscall.html
--rw-r--r-- 1 user user 18482 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__heap.html
--rw-r--r-- 1 user user 7301 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action__state.html
--rw-r--r-- 1 user user 189 2011-10-05 16:04 ./doc/simgrid/html/tab_s.png
--rw-r--r-- 1 user user 192 2011-10-05 16:04 ./doc/simgrid/html/tab_h.png
--rw-r--r-- 1 user user 97 2011-10-05 16:04 ./doc/simgrid/html/nav_h.png
--rw-r--r-- 1 user user 4826 2011-10-05 16:04 ./include/smpi/mpif.h
--rw-r--r-- 1 user user 1139 2012-03-13 14:44 ./include/smpi/smpif.h
--rw-r--r-- 1 user user 510 2011-10-05 16:04 ./include/smpi/mpi.h
--rw-r--r-- 1 user user 3187 2011-10-05 16:04 ./include/smpi/smpi_cocci.h
--rw-r--r-- 1 user user 24101 2011-10-05 16:04 ./include/smpi/smpi.h
--rw-r--r-- 1 user user 3626 2011-10-05 16:04 ./include/xbt/fifo.h
--rw-r--r-- 1 user user 7459 2011-10-05 16:04 ./include/xbt/dict.h
--rw-r--r-- 1 user user 2111 2011-10-05 16:04 ./include/xbt/str.h
--rw-r--r-- 1 user user 25433 2011-10-05 16:04 ./include/xbt/log.h
--rw-r--r-- 1 user user 8031 2011-10-05 16:04 ./include/xbt/misc.h
--rw-r--r-- 1 user user 4477 2011-10-05 16:04 ./include/xbt/synchro_core.h
--rw-r--r-- 1 user user 1976 2011-10-05 16:04 ./include/xbt/mmalloc.h
--rw-r--r-- 1 user user 917 2011-10-05 16:04 ./include/xbt/replay_trace_reader.h
--rw-r--r-- 1 user user 1111 2011-10-05 16:04 ./include/xbt/function_types.h
--rw-r--r-- 1 user user 1281 2011-10-05 16:04 ./include/xbt/strbuff.h
--rw-r--r-- 1 user user 684 2011-10-05 16:04 ./include/xbt/virtu.h
--rw-r--r-- 1 user user 1871 2011-10-05 16:04 ./include/xbt/asserts.h
--rw-r--r-- 1 user user 23255 2011-10-05 16:04 ./include/xbt/ex.h
--rw-r--r-- 1 user user 5668 2011-10-05 16:04 ./include/xbt/graph.h
--rw-r--r-- 1 user user 5474 2011-10-05 16:04 ./include/xbt/graphxml.h
--rw-r--r-- 1 user user 2252 2011-10-05 16:04 ./include/xbt/queue.h
--rw-r--r-- 1 user user 3027 2011-10-05 16:04 ./include/xbt/matrix.h
--rw-r--r-- 1 user user 2422 2011-10-05 16:04 ./include/xbt/setset.h
--rw-r--r-- 1 user user 743 2011-10-05 16:04 ./include/xbt/time.h
--rw-r--r-- 1 user user 2014 2011-10-05 16:04 ./include/xbt/lib.h
--rw-r--r-- 1 user user 1064 2011-10-05 16:04 ./include/xbt/hash.h
--rw-r--r-- 1 user user 4383 2011-10-05 16:04 ./include/xbt/set.h
--rw-r--r-- 1 user user 9224 2011-10-05 16:04 ./include/xbt/config.h
--rw-r--r-- 1 user user 4941 2011-10-05 16:04 ./include/xbt/sysdep.h
--rw-r--r-- 1 user user 5352 2011-10-05 16:04 ./include/xbt/swag.h
--rw-r--r-- 1 user user 1926 2011-10-05 16:04 ./include/xbt/graphxml_parse.h
--rw-r--r-- 1 user user 870 2011-10-05 16:04 ./include/xbt/peer.h
--rw-r--r-- 1 user user 648 2011-10-05 16:04 ./include/xbt/module.h
--rw-r--r-- 1 user user 5523 2011-10-05 16:04 ./include/xbt/cunit.h
--rw-r--r-- 1 user user 1166 2011-10-05 16:04 ./include/xbt/parmap.h
--rw-r--r-- 1 user user 2296 2011-10-05 16:04 ./include/xbt/mallocator.h
--rw-r--r-- 1 user user 9553 2011-10-05 16:04 ./include/xbt/dynar.h
--rw-r--r-- 1 user user 1444 2011-10-05 16:04 ./include/xbt/heap.h
--rw-r--r-- 1 user user 876 2011-10-05 16:04 ./include/xbt.h
--rw-r--r-- 1 user user 4635 2011-10-05 16:04 ./include/msg/datatypes.h
--rw-r--r-- 1 user user 12038 2011-10-05 16:04 ./include/msg/msg.h
--rw-r--r-- 1 user user 3641 2012-03-13 14:44 ./include/simgrid_config.h
--rw-r--r-- 1 user user 96 2011-10-05 16:04 ./include/mc/modelchecker.h
--rw-r--r-- 1 user user 23583 2011-10-05 16:04 ./include/surf/simgrid_dtd.h
--rw-r--r-- 1 user user 1167 2011-10-05 16:04 ./include/surf/surf_routing.h
--rw-r--r-- 1 user user 5343 2011-10-05 16:04 ./include/surf/surfxml_parse.h
--rw-r--r-- 1 user user 5750 2011-10-05 16:04 ./include/instr/instr.h
--rw-r--r-- 1 user user 10325 2011-10-05 16:04 ./include/simdag/simdag.h
--rw-r--r-- 1 user user 3715 2011-10-05 16:04 ./include/simdag/datatypes.h
--rw-r--r-- 1 user user 13003 2011-10-05 16:04 ./include/simix/simix.h
--rw-r--r-- 1 user user 3346 2011-10-05 16:04 ./include/simix/datatypes.h
--rw-r--r-- 1 user user 4040 2011-10-05 16:04 ./include/simix/context.h
--rw-r--r-- 1 user user 12710497 2012-03-13 14:44 ./lib/libsimgrid.so.3.6.2
--rwxr-xr-x 1 user user 918 2012-03-13 14:44 ./bin/smpicc
--rwxr-xr-x 1 user user 7292 2012-03-13 14:44 ./bin/smpirun
--rwxr-xr-x 1 user user 1990 2012-03-13 14:44 ./bin/smpif2c
--rwxr-xr-x 1 user user 5018 2011-10-05 16:04 ./bin/simgrid_update_xml
--rwxr-xr-x 1 user user 66986 2012-03-13 14:44 ./bin/graphicator
--rwxr-xr-x 1 user user 2993 2011-10-05 16:04 ./bin/simgrid-colorizer
--rwxr-xr-x 1 user user 820 2012-03-13 14:44 ./bin/smpiff
--rwxr-xr-x 1 user user 356434 2012-03-13 14:44 ./bin/tesh
+./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx                                                 71            
+./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml                                   1262          
+./doc/simgrid/examples/cxx/autoDestination/Main.cxx                                                         148           
+./doc/simgrid/examples/cxx/autoDestination/Slave.cxx                                                        870           
+./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx                                                    65            
+./doc/simgrid/examples/cxx/autoDestination/Master.cxx                                                       1891          
+./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml                             2133932   
+./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx                                                    1137          
+./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx                                                           71            
+./doc/simgrid/examples/cxx/basic/Main.cxx                                                                   148           
+./doc/simgrid/examples/cxx/basic/Slave.cxx                                                                  693           
+./doc/simgrid/examples/cxx/basic/BasicTask.cxx                                                              65            
+./doc/simgrid/examples/cxx/basic/basic_platform.xml                                                 2133932   
+./doc/simgrid/examples/cxx/basic/Master.cxx                                                                 2148          
+./doc/simgrid/examples/cxx/basic/basic_deployment.xml                                                       1188          
+./doc/simgrid/examples/cxx/basic/Forwarder.cxx                                                              1244          
+./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx                                             71            
+./doc/simgrid/examples/cxx/explicitDestination/Main.cxx                                                     148           
+./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml                     2133932   
+./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx                                                    913           
+./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx                                                65            
+./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml                           1188          
+./doc/simgrid/examples/cxx/explicitDestination/Master.cxx                                                   1896          
+./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx                                                1181          
+./doc/simgrid/examples/cxx/ping_pong/Main.cxx                                                               149           
+./doc/simgrid/examples/cxx/ping_pong/Sender.cxx                                                             1073          
+./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml                                               275           
+./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml                                                 4718          
+./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx                                                           957           
+./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx                                                       71            
+./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx                                                       71            
+./doc/simgrid/examples/cxx/comm_time/Main.cxx                                                               146           
+./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx                                                       71            
+./doc/simgrid/examples/cxx/comm_time/Slave.cxx                                                              889           
+./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml                                         2133932   
+./doc/simgrid/examples/cxx/comm_time/Master.cxx                                                             1730          
+./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml                                               1884          
+./doc/simgrid/examples/cxx/suspend/Main.cxx                                                                 150           
+./doc/simgrid/examples/cxx/suspend/suspend_platform.xml                                             2133932   
+./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml                                                   187           
+./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx                                                          826           
+./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx                                                              429           
+./doc/simgrid/examples/smpi/mc_bugged2.c                                                                    1387          
+./doc/simgrid/examples/smpi/scatter.c                                                                       3496          
+./doc/simgrid/examples/smpi/mc_bugged1.c                                                                    1411          
+./doc/simgrid/examples/smpi/get_processor_name.c                                                            649           
+./doc/simgrid/examples/smpi/NAS/README                                                                      1857          
+./doc/simgrid/examples/smpi/NAS/EP-sampling/README                                                          347           
+./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c                                                        3300          
+./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c                                                            13723         
+./doc/simgrid/examples/smpi/NAS/EP-trace/README                                                             347           
+./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c                                                           3300          
+./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c                                                         13850         
+./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README                                                   394           
+./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c                                                         38276         
+./doc/simgrid/examples/smpi/NAS/DT-trace/README                                                             999           
+./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c                                                           5451          
+./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c                                                               23031         
+./doc/simgrid/examples/smpi/NAS/IS/is.c                                                                     38077         
+./doc/simgrid/examples/smpi/NAS/MPI_dummy/README                                                            2406          
+./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c                                                       5660          
+./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c                                                     1700          
+./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c                                                           228           
+./doc/simgrid/examples/smpi/NAS/common/randdp.c                                                             1441          
+./doc/simgrid/examples/smpi/NAS/common/c_timers.c                                                           1159          
+./doc/simgrid/examples/smpi/NAS/common/c_print_results.c                                                    3086          
+./doc/simgrid/examples/smpi/NAS/sys/README                                                                  1461          
+./doc/simgrid/examples/smpi/NAS/sys/setparams.c                                                             38805         
+./doc/simgrid/examples/smpi/NAS/SP/README                                                                   926           
+./doc/simgrid/examples/smpi/NAS/FT/README                                                                   276           
+./doc/simgrid/examples/smpi/NAS/DT/README                                                                   999           
+./doc/simgrid/examples/smpi/NAS/DT/DGraph.c                                                                 5451          
+./doc/simgrid/examples/smpi/NAS/DT/dt.c                                                                     22620         
+./doc/simgrid/examples/smpi/NAS/EP/README                                                                   347           
+./doc/simgrid/examples/smpi/NAS/EP/randlc.c                                                                 3300          
+./doc/simgrid/examples/smpi/NAS/EP/ep.c                                                                     13688         
+./doc/simgrid/examples/smpi/NAS/DT-folding/README                                                           999           
+./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c                                                         5451          
+./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c                                                             22704         
+./doc/simgrid/examples/smpi/NAS/MG/README                                                                   5465          
+./doc/simgrid/examples/smpi/bcast.c                                                                         983           
+./doc/simgrid/examples/smpi/compute2.c                                                                      628           
+./doc/simgrid/examples/smpi/sendrecv.c                                                                      1652          
+./doc/simgrid/examples/smpi/allreduce.c                                                                     2135          
+./doc/simgrid/examples/smpi/mvmul.c                                                                         7069          
+./doc/simgrid/examples/smpi/alltoallv.c                                                                     4441          
+./doc/simgrid/examples/smpi/smpi_traced.c                                                                   8529          
+./doc/simgrid/examples/smpi/compute3.c                                                                      816           
+./doc/simgrid/examples/smpi/reduce.c                                                                        3545          
+./doc/simgrid/examples/smpi/bcbench.c                                                                       2466          
+./doc/simgrid/examples/smpi/ttest01.c                                                                       1273          
+./doc/simgrid/examples/smpi/compute.c                                                                       622           
+./doc/simgrid/examples/smpi/barrier.c                                                                       766           
+./doc/simgrid/examples/smpi/alltoall_basic.c                                                                1453          
+./doc/simgrid/examples/smpi/pingpong.c                                                                      2286          
+./doc/simgrid/examples/smpi/alltoall2.c                                                                     2799          
+./doc/simgrid/examples/smpi/split.c                                                                         705           
+./doc/simgrid/examples/xbt/sem_basic.c                                                                      1970          
+./doc/simgrid/examples/xbt/sem_sched.c                                                                      7207          
+./doc/simgrid/examples/msg/small_platform.xml                                                               4582          
+./doc/simgrid/examples/msg/README                                                                           4805          
+./doc/simgrid/examples/msg/properties/deployment_properties.xml                                             272           
+./doc/simgrid/examples/msg/properties/msg_prop.c                                                            3853          
+./doc/simgrid/examples/msg/ns3/3links-p.xml                                                                 856           
+./doc/simgrid/examples/msg/ns3/dogbone-d.xml                                                                582           
+./doc/simgrid/examples/msg/ns3/Two_clusters.xml                                                             1817          
+./doc/simgrid/examples/msg/ns3/3links-d.xml                                                                 927           
+./doc/simgrid/examples/msg/ns3/3links-d-timer.xml                                                           1280          
+./doc/simgrid/examples/msg/ns3/ns3.c                                                                        5177          
+./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml                                                           369           
+./doc/simgrid/examples/msg/ns3/One_cluster-d.xml                                                            367           
+./doc/simgrid/examples/msg/ns3/dogbone-p.xml                                                                1497          
+./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml                                                          566           
+./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml                                                          352           
+./doc/simgrid/examples/msg/ns3/One_cluster.xml                                                              658           
+./doc/simgrid/examples/msg/migration/migration.c                                                            2922          
+./doc/simgrid/examples/msg/small_platform_with_failures.xml                                                 4746          
+./doc/simgrid/examples/msg/icomms/small_platform.xml                                                        972           
+./doc/simgrid/examples/msg/icomms/deployment_peer.xml                                                       678           
+./doc/simgrid/examples/msg/icomms/deployment_peer05.xml                                                     891           
+./doc/simgrid/examples/msg/icomms/deployment_peer02.xml                                                     855           
+./doc/simgrid/examples/msg/icomms/peer2.c                                                                   4276          
+./doc/simgrid/examples/msg/icomms/deployment_peer03.xml                                                     851           
+./doc/simgrid/examples/msg/icomms/deployment_peer04.xml                                                     852           
+./doc/simgrid/examples/msg/icomms/peer.c                                                                    5102          
+./doc/simgrid/examples/msg/icomms/deployment_peer01.xml                                                     855           
+./doc/simgrid/examples/msg/icomms/peer3.c                                                                   5258          
+./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml                                          654           
+./doc/simgrid/examples/msg/parallel_task/test_ptask.c                                                       5423          
+./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml                                            2380          
+./doc/simgrid/examples/msg/parallel_task/parallel_task.c                                                    2708          
+./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c                                         6217          
+./doc/simgrid/examples/msg/trace/test9.xml                                                                  598           
+./doc/simgrid/examples/msg/trace/test3.xml                                                                  372           
+./doc/simgrid/examples/msg/trace/test_trace_integration.xml                                                 206           
+./doc/simgrid/examples/msg/trace/test2.xml                                                                  370           
+./doc/simgrid/examples/msg/trace/test7.xml                                                                  501           
+./doc/simgrid/examples/msg/trace/test11.xml                                                                 683           
+./doc/simgrid/examples/msg/trace/test4.xml                                                                  371           
+./doc/simgrid/examples/msg/trace/test10.xml                                                                 598           
+./doc/simgrid/examples/msg/trace/test6.xml                                                                  372           
+./doc/simgrid/examples/msg/trace/test8.xml                                                                  498           
+./doc/simgrid/examples/msg/trace/test5.xml                                                                  371           
+./doc/simgrid/examples/msg/trace/test_trace_integration.c                                                   1960          
+./doc/simgrid/examples/msg/trace/test1.xml                                                                  366           
+./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml                                         1002          
+./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml                                    467           
+./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c                                                   2236          
+./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml                                     242           
+./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml                                     353           
+./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c                                                    1752          
+./doc/simgrid/examples/msg/tracing/deployment.xml                                                           800           
+./doc/simgrid/examples/msg/tracing/ms.c                                                                     4374          
+./doc/simgrid/examples/msg/tracing/platform.xml                                                             3930          
+./doc/simgrid/examples/msg/tracing/tasks.c                                                                  3594          
+./doc/simgrid/examples/msg/tracing/procmig-deploy.xml                                                       223           
+./doc/simgrid/examples/msg/tracing/procmig.c                                                                3282          
+./doc/simgrid/examples/msg/tracing/categories.c                                                             3358          
+./doc/simgrid/examples/msg/sendrecv/README                                                                  689           
+./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml                                                 321           
+./doc/simgrid/examples/msg/sendrecv/sendrecv.c                                                              5098          
+./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml                                                   528           
+./doc/simgrid/examples/msg/gtnets/onelink-p.xml                                                             439           
+./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml                                                          575           
+./doc/simgrid/examples/msg/gtnets/dogbone-d.xml                                                             576           
+./doc/simgrid/examples/msg/gtnets/waxman-d.xml                                                              46642         
+./doc/simgrid/examples/msg/gtnets/waxman-p.xml                                                      4964600   
+./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml                                                          1029          
+./doc/simgrid/examples/msg/gtnets/onelink-d.xml                                                             356           
+./doc/simgrid/examples/msg/gtnets/gtnets.c                                                                  6172          
+./doc/simgrid/examples/msg/gtnets/dogbone-p.xml                                                             1482          
+./doc/simgrid/examples/msg/pmm/msg_pmm.c                                                                    9688          
+./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml                                                             786           
+./doc/simgrid/examples/msg/mc/bugged1.c                                                                     1378          
+./doc/simgrid/examples/msg/mc/deploy_bugged3.xml                                                            377           
+./doc/simgrid/examples/msg/mc/deploy_mutex.xml                                                              925           
+./doc/simgrid/examples/msg/mc/platform.xml                                                                  876           
+./doc/simgrid/examples/msg/mc/deploy_bugged2.xml                                                            377           
+./doc/simgrid/examples/msg/mc/random_test.c                                                                 563           
+./doc/simgrid/examples/msg/mc/deploy_bugged1.xml                                                            459           
+./doc/simgrid/examples/msg/mc/bugged3.c                                                                     1827          
+./doc/simgrid/examples/msg/mc/deploy_random_test.xml                                                        468           
+./doc/simgrid/examples/msg/mc/bugged2.c                                                                     1957          
+./doc/simgrid/examples/msg/mc/centralized_mutex.c                                                           3375          
+./doc/simgrid/examples/msg/token_ring/two_clusters.xml                                                      1007          
+./doc/simgrid/examples/msg/token_ring/ring_call.c                                                           4205          
+./doc/simgrid/examples/msg/token_ring/two_peers.xml                                                         556           
+./doc/simgrid/examples/msg/msg_platform.xml                                                         2261806   
+./doc/simgrid/examples/msg/priority/deployment_priority.xml                                                 406           
+./doc/simgrid/examples/msg/priority/priority.c                                                              2394          
+./doc/simgrid/examples/msg/actions/actions.c                                                                19339         
+./doc/simgrid/examples/msg/actions/deployment.xml                                                           249           
+./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml                                             6805          
+./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml                                                  387           
+./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml                                              605           
+./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml                                          1066          
+./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml                                          1066          
+./doc/simgrid/examples/msg/actions/deployment_split.xml                                                     525           
+./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml                                                  906           
+./doc/simgrid/examples/msg/actions/bcast_deployment.xml                                                     224           
+./doc/simgrid/examples/msg/actions/actions_deployment_split.xml                                             501           
+./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c                                                 9082          
+./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml                                   990           
+./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c                                                6773          
+./doc/simgrid/examples/msg/masterslave/masterslave_console.c                                                3952          
+./doc/simgrid/examples/msg/masterslave/platform_clusters.xml                                                930           
+./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml                         1078          
+./doc/simgrid/examples/msg/masterslave/masterslave_failure.c                                                7120          
+./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml                                   4170          
+./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml                                 1382          
+./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c                                              6438          
+./doc/simgrid/examples/msg/masterslave/platform_script.lua                                                  2535          
+./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml                                           998           
+./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml                                                 6805          
+./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml                             878           
+./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c                                                4118          
+./doc/simgrid/examples/msg/suspend/suspend.c                                                                2692          
+./doc/simgrid/examples/msg/suspend/deployment_suspend.xml                                                   183           
+./doc/simgrid/examples/msg/small_platform_with_routers.xml                                                  5295          
+./doc/simgrid/examples/msg/chord/chord90.xml                                                                13992         
+./doc/simgrid/examples/msg/chord/chord.xml                                                                  2236          
+./doc/simgrid/examples/msg/chord/chord10k.xml                                                       1624671   
+./doc/simgrid/examples/msg/chord/chord.c                                                                    28995         
+./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml                                              4628          
+./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua                                                     227           
+./doc/simgrid/examples/lua/multi_matrix/receiver.lua                                                        1199          
+./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml                                            524           
+./doc/simgrid/examples/lua/multi_matrix/sender.lua                                                          748           
+./doc/simgrid/examples/lua/mult_matrix.lua                                                                  2196          
+./doc/simgrid/examples/lua/README                                                                           1416          
+./doc/simgrid/examples/lua/deploy.xml                                                                       879           
+./doc/simgrid/examples/lua/splaySim/master.lua                                                              1125          
+./doc/simgrid/examples/lua/splaySim/slave.lua                                                               729           
+./doc/simgrid/examples/lua/splaySim/splay_platform.lua                                                      1950          
+./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua                                                          304           
+./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua                                            487           
+./doc/simgrid/examples/lua/tracing/master.lua                                                               1390          
+./doc/simgrid/examples/lua/tracing/slave.lua                                                                713           
+./doc/simgrid/examples/lua/tracing/master_slave_trace.lua                                                   491           
+./doc/simgrid/examples/lua/SimSplay/sim_splay.lua                                                           2298          
+./doc/simgrid/examples/lua/SimSplay/splay_school.lua                                                        402           
+./doc/simgrid/examples/lua/SimSplay/chord.lua                                                               1906          
+./doc/simgrid/examples/lua/SimSplay/platform_script.lua                                                     1706          
+./doc/simgrid/examples/lua/console/master.lua                                                               1125          
+./doc/simgrid/examples/lua/console/deploy.lua                                                               480           
+./doc/simgrid/examples/lua/console/slave.lua                                                                730           
+./doc/simgrid/examples/lua/console/platform.lua                                                             2424          
+./doc/simgrid/examples/lua/console/master_slave_bypass.lua                                                  158           
+./doc/simgrid/examples/lua/masterslave/master.lua                                                           1125          
+./doc/simgrid/examples/lua/masterslave/slave.lua                                                            730           
+./doc/simgrid/examples/lua/masterslave/platform.lua                                                         2424          
+./doc/simgrid/examples/lua/masterslave/master_slave.lua                                                     378           
+./doc/simgrid/examples/simdag/properties/sd_prop.c                                                          3012          
+./doc/simgrid/examples/simdag/dax/Strassen.xml                                                              9663          
+./doc/simgrid/examples/simdag/dax/Montage_25.xml                                                            23087         
+./doc/simgrid/examples/simdag/dax/Sipht_30.xml                                                      267014    
+./doc/simgrid/examples/simdag/dax/dax_test.c                                                                4346          
+./doc/simgrid/examples/simdag/dax/Montage_50.xml                                                            48868         
+./doc/simgrid/examples/simdag/dax/Inspiral_30.xml                                                           28774         
+./doc/simgrid/examples/simdag/dax/sagittaire.xml                                                            289           
+./doc/simgrid/examples/simdag/scheduling/minmin_test.c                                                      11328         
+./doc/simgrid/examples/simdag/scheduling/Montage_25.xml                                                     23087         
+./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml                                             5670          
+./doc/simgrid/examples/simdag/sd_seq_access.c                                                               4153          
+./doc/simgrid/examples/simdag/sd_test_console.c                                                             6976          
+./doc/simgrid/examples/simdag/metaxml/sd_meta.c                                                             2207          
+./doc/simgrid/examples/simdag/2clusters.xml                                                                 14326         
+./doc/simgrid/examples/simdag/sd_test2.c                                                                    7538          
+./doc/simgrid/examples/simdag/platform_script.lua                                                           1864          
+./doc/simgrid/examples/simdag/simdag_trace.c                                                                4354          
+./doc/simgrid/examples/simdag/sd_test.c                                                                     6964          
+./doc/simgrid/examples/simdag/dot/dot_test2.c                                                               1622          
+./doc/simgrid/examples/simdag/dot/simulate_dot.c                                                            3590          
+./doc/simgrid/examples/simdag/dot/dot_test.c                                                                4002          
+./doc/simgrid/examples/platforms/g5k.xml                                                                    17028         
+./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml                                                482           
+./doc/simgrid/examples/platforms/g5k_cabinets.xml                                                           22645         
+./doc/simgrid/examples/platforms/nancy.xml                                                                  4028          
+./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml                                                      15970         
+./doc/simgrid/examples/platforms/Two_clusters.xml                                                           930           
+./doc/simgrid/examples/platforms/vivaldi.xml                                                                3274          
+./doc/simgrid/examples/platforms/gridpp_grid_2004.xml                                                       6096          
+./doc/simgrid/examples/platforms/griffon.xml                                                                1879          
+./doc/simgrid/examples/platforms/median_harvard.xml                                                         28125         
+./doc/simgrid/examples/platforms/prop.xml                                                                   1273          
+./doc/simgrid/examples/platforms/One_cluster.xml                                                            661           
+./doc/simgrid/examples/platforms/gdx.xml                                                                    2323          
+./doc/simgrid/examples/platforms/multicore_machine.xml                                                      222           
+./doc/simgrid/html/group__XBT__str.html                                                                     36192         
+./doc/simgrid/html/group__XBT__cfg__decl.html                                                               14505         
+./doc/simgrid/html/bug.html                                                                                 2130          
+./doc/simgrid/html/group__MSG__C.html                                                                       10658         
+./doc/simgrid/html/structs__xbt__strbuff__t.html                                                            2512          
+./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html                                                      4803          
+./doc/simgrid/html/simgrid_modules2.png                                                                     11932         
+./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html                                                          1519          
+./doc/simgrid/html/group__SURF__actions.html                                                                13562         
+./doc/simgrid/html/publis_intra.html                                                                        435           
+./doc/simgrid/html/simgrid_logo_small.png                                                                   8326          
+./doc/simgrid/html/group__SURF__resources.html                                                              4203          
+./doc/simgrid/html/structsurf__cpu__model__extension__public.html                                           2751          
+./doc/simgrid/html/tabs.css                                                                                 1095          
+./doc/simgrid/html/group__XBT__set.html                                                                     6991          
+./doc/simgrid/html/group__XBT__set__curs.html                                                               9653          
+./doc/simgrid/html/structxbt__ex__t.html                                                                    10014         
+./doc/simgrid/html/pages.html                                                                               5794          
+./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html                                                       30160         
+./doc/simgrid/html/group__XBT__API.html                                                                     6276          
+./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html                                                 1519          
+./doc/simgrid/html/todo.html                                                                                3202          
+./doc/simgrid/html/nav_f.png                                                                                159           
+./doc/simgrid/html/group__XBT__queue.html                                                                   23050         
+./doc/simgrid/html/group__XBT__fifo__cons.html                                                              9876          
+./doc/simgrid/html/structsurf__model.html                                                                   17707         
+./doc/simgrid/html/MSG_ex_asynchronous_communications.html                                                  43212         
+./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg                                                              30326         
+./doc/simgrid/html/structsurf__network__model__extension__public.html                                       2783          
+./doc/simgrid/html/structsurf__model__description.html                                                      2621          
+./doc/simgrid/html/group__m__host__management.html                                                          19042         
+./doc/simgrid/html/group__XBT__fifo__perl.html                                                              14045         
+./doc/simgrid/html/modules.html                                                                             12734         
+./doc/simgrid/html/annotated.html                                                                           7707          
+./doc/simgrid/html/group__XBT__fifo.html                                                                    6191          
+./doc/simgrid/html/group__XBT__parmap.html                                                                  3765          
+./doc/simgrid/html/tracing.html                                                                             58483         
+./doc/simgrid/html/structs__surf__metric__t.html                                                            2523          
+./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html                                                         1519          
+./doc/simgrid/html/group__XBT__swag.html                                                                    5923          
+./doc/simgrid/html/functions_vars.html                                                                      11436         
+./doc/simgrid/html/group__XBT__swag__type.html                                                              8194          
+./doc/simgrid/html/win_install_02.png                                                                       60084         
+./doc/simgrid/html/simgrid_modules.png                                                                      8309          
+./doc/simgrid/html/group__XBT__error.html                                                                   8348          
+./doc/simgrid/html/group__XBT__dynar__cons.html                                                             15743         
+./doc/simgrid/html/simgrid_logo.png                                                                         21536         
+./doc/simgrid/html/group__XBT__fifo__misc.html                                                              7717          
+./doc/simgrid/html/group__XBT__context.html                                                                 3460          
+./doc/simgrid/html/group__m__channel__management.html                                                       8963          
+./doc/simgrid/html/structm__task.html                                                                       4188          
+./doc/simgrid/html/group__XBT__swag__curs.html                                                              8561          
+./doc/simgrid/html/group__XBT__log.html                                                                     60965         
+./doc/simgrid/html/open.png                                                                                 118           
+./doc/simgrid/html/group__msg__simulation.html                                                              9008          
+./doc/simgrid/html/group__XBT__dynar__cursor.html                                                           11976         
+./doc/simgrid/html/group__XBT__log__cats.html                                                               5102          
+./doc/simgrid/html/win_install_03.png                                                                       55802         
+./doc/simgrid/html/poster_thumbnail.png                                                                     3249          
+./doc/simgrid/html/group__m__datatypes__management__details.html                                            7557          
+./doc/simgrid/html/group__XBT__set__basic.html                                                              24314         
+./doc/simgrid/html/win_install_01.png                                                                       61053         
+./doc/simgrid/html/closed.png                                                                               126           
+./doc/simgrid/html/group__XBT__adt.html                                                                     6958          
+./doc/simgrid/html/index.html                                                                               9659          
+./doc/simgrid/html/group__SD__link__management.html                                                         17867         
+./doc/simgrid/html/group__MSG__JAVA.html                                                                    5443          
+./doc/simgrid/html/group__SURF__simulation.html                                                             10385         
+./doc/simgrid/html/structm__host.html                                                                       4188          
+./doc/simgrid/html/group__XBT__dynar__array.html                                                            22436         
+./doc/simgrid/html/simgrid.css                                                                              386           
+./doc/simgrid/html/group__SD__task__dependency__management.html                                             15389         
+./doc/simgrid/html/group__XBT__grounding.html                                                               7225          
+./doc/simgrid/html/pls.html                                                                                 11863         
+./doc/simgrid/html/group__XBT__dynar__ctn.html                                                              12693         
+./doc/simgrid/html/functions.html                                                                           11564         
+./doc/simgrid/html/group__XBT__dynar__speed.html                                                            9616          
+./doc/simgrid/html/installSimgrid.html                                                                      24837         
+./doc/simgrid/html/triva-graph_configuration.png                                                            59769         
+./doc/simgrid/html/triva-graph_visualization.png                                                            55335         
+./doc/simgrid/html/MSG_ex_master_slave.html                                                                 51294         
+./doc/simgrid/html/doxygen.png                                                                              3942          
+./doc/simgrid/html/group__XBT__mallocator__cons.html                                                        10757         
+./doc/simgrid/html/group__API__index.html                                                           125324    
+./doc/simgrid/html/group__XBT__dict__cons.html                                                              9746          
+./doc/simgrid/html/group__XBT__swag__func.html                                                              19885         
+./doc/simgrid/html/group__SimGrid__API.html                                                                 4674          
+./doc/simgrid/html/group__XBT__dynar__misc.html                                                             9591          
+./doc/simgrid/html/structxbt__set__elm__.html                                                               5121          
+./doc/simgrid/html/group__XBT__cfg__get.html                                                                19320         
+./doc/simgrid/html/bindings.html                                                                            23685         
+./doc/simgrid/html/group__XBT__dict.html                                                                    6916          
+./doc/simgrid/html/use.html                                                                                 3904          
+./doc/simgrid/html/group__XBT__dict__basic.html                                                             20935         
+./doc/simgrid/html/group__XBT__graph.html                                                                   23682         
+./doc/simgrid/html/group__XBT__mallocator.html                                                              6444          
+./doc/simgrid/html/structsurf__workstation__model__extension__public.html                                   11076         
+./doc/simgrid/html/publis.html                                                                              435           
+./doc/simgrid/html/group__XBT__misc.html                                                                    4663          
+./doc/simgrid/html/simdag.html                                                                              226           
+./doc/simgrid/html/Paje_MSG_screenshot.jpg                                                          340759    
+./doc/simgrid/html/group__msg__gos__functions.html                                                          65293         
+./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html                                                         1519          
+./doc/simgrid/html/publis_extern.html                                                                       435           
+./doc/simgrid/html/group__MSG__LUA.html                                                                     5094          
+./doc/simgrid/html/group__XBT__dynar.html                                                                   14081         
+./doc/simgrid/html/structs__model__type.html                                                                2480          
+./doc/simgrid/html/group__XBT__synchro.html                                                                 19296         
+./doc/simgrid/html/bc_s.png                                                                                 677           
+./doc/simgrid/html/classes.html                                                                             6934          
+./doc/simgrid/html/group__XBT__fifo__direct.html                                                            29778         
+./doc/simgrid/html/group__XBT__cfg__use.html                                                                37757         
+./doc/simgrid/html/group__XBT__mallocator__objects.html                                                     9306          
+./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html                                                      1519          
+./doc/simgrid/html/group__XBT__dict__multi.html                                                             18525         
+./doc/simgrid/html/group__m__datatypes__management.html                                                     16459         
+./doc/simgrid/html/tab_b.png                                                                                178           
+./doc/simgrid/html/group__SD__simulation.html                                                               45009         
+./doc/simgrid/html/group__msg__easier__life.html                                                            50885         
+./doc/simgrid/html/group__m__task__management.html                                                          35307         
+./doc/simgrid/html/tab_a.png                                                                                140           
+./doc/simgrid/html/group__XBT__config.html                                                                  16354         
+./doc/simgrid/html/options.html                                                                             7629          
+./doc/simgrid/html/group__XBT__dict__nnul.html                                                              18891         
+./doc/simgrid/html/win_install_04.png                                                                       52033         
+./doc/simgrid/html/structsurf__action.html                                                                  8353          
+./doc/simgrid/html/group__XBT__ex.html                                                                      32537         
+./doc/simgrid/html/group__SURF__API.html                                                                    6659          
+./doc/simgrid/html/doxygen.css                                                                              12350         
+./doc/simgrid/html/group__XBT__set__cons.html                                                               7965          
+./doc/simgrid/html/group__SURF__build__api.html                                                             7821          
+./doc/simgrid/html/group__m__process__management.html                                                       47169         
+./doc/simgrid/html/group__XBT__dict__curs.html                                                              19747         
+./doc/simgrid/html/group__SD__datatypes__management.html                                                    20816         
+./doc/simgrid/html/group__SD__API.html                                                                      8379          
+./doc/simgrid/html/group__SMPI__API.html                                                                    4776          
+./doc/simgrid/html/group__XBT__dynar__perl.html                                                             12131         
+./doc/simgrid/html/group__XBT__cfg__register.html                                                           15874         
+./doc/simgrid/html/publis_core.html                                                                         435           
+./doc/simgrid/html/group__SD__workstation__management.html                                                  46397         
+./doc/simgrid/html/MSG_ex_master_slave_lua.html                                                             4794          
+./doc/simgrid/html/group__MSG__API.html                                                                     6026          
+./doc/simgrid/html/msg.html                                                                                 227           
+./doc/simgrid/html/group__SD__task__management.html                                                         60347         
+./doc/simgrid/html/group__XBT__syscall.html                                                                 10095         
+./doc/simgrid/html/group__XBT__heap.html                                                                    18482         
+./doc/simgrid/html/structsurf__action__state.html                                                           7301          
+./doc/simgrid/html/tab_s.png                                                                                189           
+./doc/simgrid/html/tab_h.png                                                                                192           
+./doc/simgrid/html/nav_h.png                                                                        97    
+./include/smpi/mpif.h                                                                                       4826          
+./include/smpi/smpif.h                                                                                      1139          
+./include/smpi/mpi.h                                                                                        510           
+./include/smpi/smpi_cocci.h                                                                                 3187          
+./include/smpi/smpi.h                                                                                       24101         
+./include/xbt/fifo.h                                                                                        3626          
+./include/xbt/dict.h                                                                                        7459          
+./include/xbt/str.h                                                                                         2111          
+./include/xbt/log.h                                                                                         25433         
+./include/xbt/misc.h                                                                                        8031          
+./include/xbt/synchro_core.h                                                                                4477          
+./include/xbt/mmalloc.h                                                                                     1976          
+./include/xbt/replay_trace_reader.h                                                                         917           
+./include/xbt/function_types.h                                                                              1111          
+./include/xbt/strbuff.h                                                                                     1281          
+./include/xbt/virtu.h                                                                                       684           
+./include/xbt/asserts.h                                                                                     1871          
+./include/xbt/ex.h                                                                                          23255         
+./include/xbt/graph.h                                                                                       5668          
+./include/xbt/graphxml.h                                                                                    5474          
+./include/xbt/queue.h                                                                                       2252          
+./include/xbt/matrix.h                                                                                      3027          
+./include/xbt/setset.h                                                                                      2422          
+./include/xbt/time.h                                                                                        743           
+./include/xbt/lib.h                                                                                         2014          
+./include/xbt/hash.h                                                                                        1064          
+./include/xbt/set.h                                                                                         4383          
+./include/xbt/config.h                                                                                      9224          
+./include/xbt/sysdep.h                                                                                      4941          
+./include/xbt/swag.h                                                                                        5352          
+./include/xbt/graphxml_parse.h                                                                              1926          
+./include/xbt/peer.h                                                                                        870           
+./include/xbt/module.h                                                                                      648           
+./include/xbt/cunit.h                                                                                       5523          
+./include/xbt/parmap.h                                                                                      1166          
+./include/xbt/mallocator.h                                                                                  2296          
+./include/xbt/dynar.h                                                                                       9553          
+./include/xbt/heap.h                                                                                        1444          
+./include/xbt.h                                                                                             876           
+./include/msg/datatypes.h                                                                                   4635          
+./include/msg/msg.h                                                                                         12038         
+./include/simgrid_config.h                                                                                  3641          
+./include/mc/modelchecker.h                                                                         96    
+./include/surf/simgrid_dtd.h                                                                                23583         
+./include/surf/surf_routing.h                                                                               1167          
+./include/surf/surfxml_parse.h                                                                              5343          
+./include/instr/instr.h                                                                                     5750          
+./include/simdag/simdag.h                                                                                   10325         
+./include/simdag/datatypes.h                                                                                3715          
+./include/simix/simix.h                                                                                     13003         
+./include/simix/datatypes.h                                                                                 3346          
+./include/simix/context.h                                                                                   4040          
+./lib/libsimgrid.so.3.6.2                                                                                   12710497  
+./bin/smpicc                                                                                       918    
+./bin/smpirun                                                                                              7292           
+./bin/smpif2c                                                                                              1990           
+./bin/simgrid_update_xml                                                                                   5018           
+./bin/graphicator                                                                                          66986          
+./bin/simgrid-colorizer                                                                                    2993           
+./bin/smpiff                                                                                       820    
+./bin/tesh                                                                                                 356434         
index 69516b8..cb7c846 100644 (file)
@@ -4,33 +4,29 @@
 <platform version="3">
 
 <config>
-       <prop id="path" value="../examples/platforms/"/>
+  <prop id="path" value="../examples/platforms/"/>
 </config>
 
-       <AS id="AS0" routing="Full">
+  <AS id="AS0" routing="Full">
 
-               <storage_type id="samsung" model="RAID5" content="content/storage_content.txt" size="500">
-                       <prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
-                       <prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
-                       <prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
-               </storage_type>
-
-               <storage_type id="crucial" model="SSD" content="content/storage_content.txt" size="500">
-                       <prop id="Bwrite" value="30000000" />
-                       <prop id="Bread" value="100000000" />
-                       <prop id="Bconnection" value="150000000" />
-               </storage_type>
+   <storage_type id="single_HDD" model="linear_no_lat" 
+                 content="content/storage_content.txt" size="500GiB">
+                       <prop id="Bwrite" value="30MBps" />
+                       <prop id="Bread" value="100MBps" />
+                       <prop id="Bconnection" value="150MBps" />
+   </storage_type>
 
-               <storage_type id="wdigital" model="RAID0" content="content/storage_content.txt" size="500">
-                       <prop id="Bwrite" value="30000000" />
-                       <prop id="Bread" value="100000000" />
-                       <prop id="Bconnection" value="150000000" />
+   <storage_type id="single_SSD" model="linear_no_lat"
+                 content="content/storage_content.txt" size="500GiB">
+                       <prop id="Bwrite" value="30MBps" />
+                       <prop id="Bread" value="100MBps" />
+                       <prop id="Bconnection" value="150MBps" />
                </storage_type>
 
-               <storage id="Disk1" typeId="crucial"/>
-               <storage id="Disk2" typeId="samsung"/>
-               <storage id="Disk3" typeId="wdigital"/>
-               <storage id="Disk4" typeId="wdigital"/>
+               <storage id="Disk1" typeId="single_HDD"/>
+               <storage id="Disk2" typeId="single_SSD"/>
+               <storage id="Disk3" typeId="single_HDD"/>
+               <storage id="Disk4" typeId="single_SSD"/>
 
                <host id="bob" power="1Gf">
                        <mount id="Disk1" name="/home"/>                        
index be7b99e..299c0b5 100644 (file)
@@ -71,7 +71,7 @@ int main(int argc, char **argv) {
   reclaimed = xbt_dynar_new(sizeof(bcast_task_t),xbt_free_ref);
   xbt_dynar_t done = NULL;
 
-  xbt_os_timer_start(timer);
+  xbt_os_cputimer_start(timer);
   send_one(0,SD_workstation_get_number());
   do {
     if (done != NULL && !xbt_dynar_is_empty(done)) {
@@ -97,7 +97,7 @@ int main(int argc, char **argv) {
     }
     done=SD_simulate(-1);
   } while(!xbt_dynar_is_empty(done));
-  xbt_os_timer_stop(timer);
+  xbt_os_cputimer_stop(timer);
   printf("exec_time:%lf\n", xbt_os_timer_elapsed(timer) );
 
   xbt_dynar_free(&done);
index 58d9040..669d3e3 100644 (file)
@@ -62,11 +62,14 @@ set(txt_files
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions0.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions1.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_allReduce.txt
+  ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_allgatherv.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_alltoall.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_alltoallv.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_barrier.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_bcast.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_bcast_reduce_datatypes.txt
+  ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_gather.txt
+  ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_reducescatter.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_waitall.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_with_isend.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces
diff --git a/examples/smpi/replay/actions_allgatherv.txt b/examples/smpi/replay/actions_allgatherv.txt
new file mode 100644 (file)
index 0000000..f0c0e58
--- /dev/null
@@ -0,0 +1,14 @@
+0 init
+1 init
+2 init
+3 init
+
+0 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0
+1 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0
+2 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 0 0
+3 allGatherV 204020 275427 275427 275427 204020 0 275427 550854 826281 0 0
+
+0 finalize
+1 finalize
+2 finalize
+3 finalize
diff --git a/examples/smpi/replay/actions_gather.txt b/examples/smpi/replay/actions_gather.txt
new file mode 100644 (file)
index 0000000..33f7d0a
--- /dev/null
@@ -0,0 +1,14 @@
+0 init
+1 init
+2 init
+3 init
+
+0 gather 68 68 0 0 0
+1 gather 68 68 0 0 0
+2 gather 68 68 0 0 0
+3 gather 68 68 0 0 0
+
+0 finalize
+1 finalize
+2 finalize
+3 finalize
diff --git a/examples/smpi/replay/actions_reducescatter.txt b/examples/smpi/replay/actions_reducescatter.txt
new file mode 100644 (file)
index 0000000..6580e06
--- /dev/null
@@ -0,0 +1,14 @@
+0 init
+1 init
+2 init
+3 init
+
+0 reduceScatter 275427 275427 275427 204020 11349173 0
+1 reduceScatter 275427 275427 275427 204020 12396024 0
+2 reduceScatter 275427 275427 275427 204020 12501522 0
+3 reduceScatter 275427 275427 275427 204020 12403123 0
+~                                                                    
+0 finalize
+1 finalize
+2 finalize
+3 finalize
index 8bbb07c..ca209a9 100644 (file)
@@ -6,6 +6,7 @@ p Test of trace replay with SMPI (one trace for all processes)
 
 < replay/actions_bcast.txt
 $ mkfile replay/one_trace
+! timeout 30
 
 $ ../../bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
index 46281fe..c79248f 100644 (file)
@@ -6,7 +6,6 @@
 #ifndef MSG_DATATYPE_H
 #define MSG_DATATYPE_H
 #include "xbt/misc.h"
-#include "xbt/file_stat.h"
 #include "xbt/lib.h"
 #include "simgrid/simix.h"
 #include "simgrid_config.h"     // for HAVE_TRACING
@@ -27,6 +26,8 @@ SG_BEGIN_DECL()
  * want to send your task, but only the name of this mailbox. */
 typedef struct s_smx_rvpoint *msg_mailbox_t;
 
+/* ******************************** Environment ************************************ */
+typedef struct s_as *msg_as_t;
 
 /* ******************************** Host ************************************ */
 
@@ -114,15 +115,6 @@ typedef struct msg_file {
  */
 typedef struct msg_file *msg_file_t;
 
-
-/** @brief File datatype.
-    @ingroup msg_file_management
-
-    You should consider this as an opaque object.
- */
-typedef s_file_stat_t s_msg_stat_t, *msg_stat_t;
-
-
 /*************** Begin GPU ***************/
 typedef struct simdata_gpu_task *simdata_gpu_task_t;
 
index d7a1351..79035dc 100644 (file)
@@ -69,14 +69,20 @@ XBT_PUBLIC(void) MSG_set_function(const char *host_id,
 XBT_PUBLIC(double) MSG_get_clock(void);
 XBT_PUBLIC(unsigned long int) MSG_get_sent_msg(void);
 
+/************************** Environment ***********************************/
+XBT_PUBLIC(msg_as_t) MSG_environment_get_routing_root(void);
+XBT_PUBLIC(const char *) MSG_environment_as_get_name(msg_as_t as);
+XBT_PUBLIC(xbt_dict_t) MSG_environment_as_get_routing_sons(msg_as_t as);
+XBT_PUBLIC(const char *) MSG_environment_as_get_property_value(msg_as_t as, const char *name);
+XBT_PUBLIC(const char *) MSG_environment_as_get_model(msg_as_t as);
+XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_as_t as);
 
 /************************** File handling ***********************************/
-XBT_PUBLIC(double) MSG_file_read(void* ptr, size_t size, size_t nmemb, msg_file_t stream);
-XBT_PUBLIC(size_t) MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t stream);
-XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path, const char* mode);
-XBT_PUBLIC(int) MSG_file_close(msg_file_t fp);
-XBT_PUBLIC(int) MSG_file_stat(msg_file_t fd, s_msg_stat_t *buf);
-XBT_PUBLIC(void) MSG_file_free_stat(s_msg_stat_t *stat);
+XBT_PUBLIC(size_t) MSG_file_read(size_t size, msg_file_t fd);
+XBT_PUBLIC(size_t) MSG_file_write(size_t size, msg_file_t fd);
+XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path);
+XBT_PUBLIC(int) MSG_file_close(msg_file_t fd);
+XBT_PUBLIC(size_t) MSG_file_get_size(msg_file_t fd);
 
 XBT_PUBLIC(int) MSG_file_unlink(msg_file_t fd);
 XBT_PUBLIC(xbt_dict_t) MSG_file_ls(const char *mount, const char *path);
@@ -94,6 +100,7 @@ XBT_PUBLIC(msg_host_t) MSG_host_self(void);
 XBT_PUBLIC(int) MSG_get_host_msgload(msg_host_t host);
 /* int MSG_get_msgload(void); This function lacks specification; discard it */
 XBT_PUBLIC(double) MSG_get_host_speed(msg_host_t h);
+XBT_PUBLIC(int) MSG_host_get_core_number(msg_host_t h);
 XBT_PUBLIC(int) MSG_host_is_avail(msg_host_t h);
 XBT_PUBLIC(void) __MSG_host_destroy(msg_host_priv_t host);
 
@@ -359,6 +366,19 @@ XBT_PUBLIC(msg_error_t) MSG_set_channel_number(int number);
 XBT_PUBLIC(int) MSG_get_channel_number(void);
 #endif
 
+/** @brief Opaque type representing a semaphore
+ *  @ingroup msg_synchro
+ *  @hideinitializer
+ */
+typedef struct s_smx_sem *msg_sem_t; // Yeah that's a rename of the smx_sem_t which doesnt require smx_sem_t to be declared here
+XBT_PUBLIC(msg_sem_t) MSG_sem_init(int initial_value);
+XBT_PUBLIC(void) MSG_sem_acquire(msg_sem_t sem);
+XBT_PUBLIC(msg_error_t) MSG_sem_acquire_timeout(msg_sem_t sem, double timeout);
+XBT_PUBLIC(void) MSG_sem_release(msg_sem_t sem);
+XBT_PUBLIC(void) MSG_sem_get_capacity(msg_sem_t sem);
+XBT_PUBLIC(void) MSG_sem_destroy(msg_sem_t sem);
+XBT_PUBLIC(int) MSG_sem_would_block(msg_sem_t sem);
+
 /** @brief Opaque type describing a Virtual Machine.
  *  @ingroup msg_VMs
  *
index 4111c0b..c449f44 100644 (file)
@@ -191,6 +191,7 @@ typedef struct s_sg_platf_cluster_cbarg {
   double loopback_bw;
   double loopback_lat;
   double limiter_link;
+  xbt_dict_t properties;
   const char* router_id;
   e_surf_link_sharing_policy_t sharing_policy;
   e_surf_link_sharing_policy_t bb_sharing_policy;
@@ -199,7 +200,7 @@ typedef struct s_sg_platf_cluster_cbarg {
 } s_sg_platf_cluster_cbarg_t;
 
 #define SG_PLATF_CLUSTER_INITIALIZER {NULL,NULL,NULL,NULL,NULL,NULL \
-  ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}
+  ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}
 
 typedef struct s_sg_platf_cabinet_cbarg *sg_platf_cabinet_cbarg_t;
 typedef struct s_sg_platf_cabinet_cbarg {
index 5a42ee2..909c0de 100644 (file)
@@ -10,7 +10,6 @@
 #include "xbt/misc.h"
 #include "xbt/fifo.h"
 #include "xbt/dict.h"
-#include "xbt/file_stat.h"
 #include "xbt/function_types.h"
 #include "xbt/parmap.h"
 #include "xbt/swag.h"
@@ -70,7 +69,6 @@ typedef struct s_smx_sem *smx_sem_t;
 
 /********************************** File *************************************/
 typedef struct s_smx_file *smx_file_t;
-typedef struct s_smx_stat *smx_stat_t;
 
 /********************************** Action *************************************/
 typedef struct s_smx_action *smx_action_t; /* FIXME: replace by specialized action handlers */
@@ -296,6 +294,7 @@ XBT_PUBLIC(void) SIMIX_comm_finish(smx_action_t action);
 XBT_PUBLIC(smx_host_t) simcall_host_get_by_name(const char *name);
 XBT_PUBLIC(const char *) simcall_host_get_name(smx_host_t host);
 XBT_PUBLIC(xbt_dict_t) simcall_host_get_properties(smx_host_t host);
+XBT_PUBLIC(int) simcall_host_get_core(smx_host_t host);
 XBT_PUBLIC(double) simcall_host_get_speed(smx_host_t host);
 XBT_PUBLIC(double) simcall_host_get_available_speed(smx_host_t host);
 /* Two possible states, 1 - CPU ON and 0 CPU OFF */
@@ -466,16 +465,16 @@ XBT_PUBLIC(void) simcall_sem_release(smx_sem_t sem);
 XBT_PUBLIC(int) simcall_sem_would_block(smx_sem_t sem);
 XBT_PUBLIC(void) simcall_sem_acquire(smx_sem_t sem);
 XBT_PUBLIC(void) simcall_sem_acquire_timeout(smx_sem_t sem,
-                                           double max_duration);
+                                             double max_duration);
 XBT_PUBLIC(int) simcall_sem_get_capacity(smx_sem_t sem);
 
-XBT_PUBLIC(double) simcall_file_read(void* ptr, size_t size, size_t nmemb, smx_file_t stream);
-XBT_PUBLIC(size_t) simcall_file_write(const void* ptr, size_t size, size_t nmemb, smx_file_t stream);
-XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path, const char* mode);
-XBT_PUBLIC(int) simcall_file_close(smx_file_t fp);
-XBT_PUBLIC(int) simcall_file_stat(smx_file_t fd, s_file_stat_t *buf);
+XBT_PUBLIC(size_t) simcall_file_read(size_t size, smx_file_t fd);
+XBT_PUBLIC(size_t) simcall_file_write(size_t size, smx_file_t fd);
+XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path);
+XBT_PUBLIC(int) simcall_file_close(smx_file_t fd);
 XBT_PUBLIC(int) simcall_file_unlink(smx_file_t fd);
 XBT_PUBLIC(xbt_dict_t) simcall_file_ls(const char* mount, const char* path);
+XBT_PUBLIC(size_t) simcall_file_get_size(smx_file_t fd);
 
 /************************** AS router   **********************************/
 XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name);
index 632e77d..aabde41 100644 (file)
@@ -18,7 +18,7 @@
       integer MPI_MAX_DATAREP_STRIN, MPI_MAX_INFO_KEY
       integer MPI_MAX_INFO_VAL, MPI_MAX_OBJECT_NAME, MPI_MAX_PORT_NAME
       integer MPI_ANY_SOURCE, MPI_PROC_NULL, MPI_ANY_TAG, MPI_UNDEFINED
-      integer MPI_TAG_UB, MPI_TAG_LB
+      integer MPI_IN_PLACE, MPI_TAG_UB, MPI_TAG_LB
       parameter(MPI_MAX_PROCESSOR_NAME=100)
       parameter(MPI_MAX_ERROR_STRING=100)
       parameter(MPI_MAX_DATAREP_STRIN =100)
       parameter(MPI_MAX_INFO_VAL=100)
       parameter(MPI_MAX_OBJECT_NAME=100)
       parameter(MPI_MAX_PORT_NAME=100)
-      parameter(MPI_ANY_SOURCE=-1)
-      parameter(MPI_PROC_NULL=-2)
-      parameter(MPI_ANY_TAG=-1)
-      parameter(MPI_UNDEFINED=-1)
+      parameter(MPI_ANY_SOURCE=-555)
+      parameter(MPI_PROC_NULL=-666)
+      parameter(MPI_ANY_TAG=-444)
+      parameter(MPI_UNDEFINED=-333)
+      parameter(MPI_IN_PLACE=-222)
       parameter(MPI_TAG_UB=0)
       parameter(MPI_TAG_LB=0)
 
index b3cfb99..eea0032 100644 (file)
@@ -37,12 +37,14 @@ SG_BEGIN_DECL()
 #define MPI_MAX_INFO_VAL       100
 #define MPI_MAX_OBJECT_NAME    100
 #define MPI_MAX_PORT_NAME      100
+#define MPI_MAX_LIBRARY_VERSION_STRING 100
 #define SMPI_RAND_SEED 5
-#define MPI_ANY_SOURCE -1
+#define MPI_ANY_SOURCE -555
 #define MPI_BOTTOM (void *)0
-#define MPI_PROC_NULL -2
-#define MPI_ANY_TAG -1
-#define MPI_UNDEFINED -3
+#define MPI_PROC_NULL -666
+#define MPI_ANY_TAG -444
+#define MPI_UNDEFINED -333
+#define MPI_IN_PLACE (void *)-222
 // errorcodes
 #define MPI_SUCCESS       0
 #define MPI_ERR_COMM      1
@@ -54,11 +56,14 @@ SG_BEGIN_DECL()
 #define MPI_ERR_RANK      7
 #define MPI_ERR_TAG       8
 #define MPI_ERR_TRUNCATE  9
-#define MPI_ERR_GROUP    10
-#define MPI_ERR_OP       11
-#define MPI_ERR_OTHER    12
+#define MPI_ERR_GROUP     10
+#define MPI_ERR_OP        11
+#define MPI_ERR_OTHER     12
 #define MPI_ERR_IN_STATUS 13
 #define MPI_ERR_PENDING   14
+#define MPI_ERR_BUFFER    15
+#define MPI_ERR_NAME      16
+#define MPI_ERRCODES_IGNORE (int *)0
 #define MPI_IDENT     0
 #define MPI_SIMILAR   1
 #define MPI_UNEQUAL   2
@@ -69,6 +74,75 @@ SG_BEGIN_DECL()
 #define MPI_IO               0
 #define MPI_BSEND_OVERHEAD   0
 
+#define MPI_KEYVAL_INVALID 0
+#define MPI_NULL_COPY_FN NULL
+#define MPI_NULL_DELETE_FN NULL
+#define MPI_APPNUM 0
+#define MPI_LASTUSEDCODE MPI_SUCCESS
+#define MPI_ERR_LASTCODE MPI_SUCCESS
+
+#define MPI_CXX_BOOL MPI_DATATYPE_NULL
+#define MPI_CXX_FLOAT_COMPLEX MPI_DATATYPE_NULL
+#define MPI_CXX_DOUBLE_COMPLEX MPI_DATATYPE_NULL
+#define MPI_CXX_LONG_DOUBLE_COMPLEX MPI_DATATYPE_NULL
+
+#define MPI_REAL4 MPI_DATATYPE_NULL
+#define MPI_REAL8 MPI_DATATYPE_NULL
+#define MPI_REAL16 MPI_DATATYPE_NULL
+#define MPI_COMPLEX8 MPI_DATATYPE_NULL
+#define MPI_COMPLEX16 MPI_DATATYPE_NULL
+#define MPI_COMPLEX32 MPI_DATATYPE_NULL
+#define MPI_INTEGER1 MPI_DATATYPE_NULL
+#define MPI_INTEGER2 MPI_DATATYPE_NULL
+#define MPI_INTEGER4 MPI_DATATYPE_NULL
+#define MPI_INTEGER8 MPI_DATATYPE_NULL
+#define MPI_COMPLEX MPI_DATATYPE_NULL
+#define MPI_DOUBLE_COMPLEX MPI_DATATYPE_NULL
+
+#define MPI_DISTRIBUTE_BLOCK 0
+#define MPI_DISTRIBUTE_NONE 1
+#define MPI_DISTRIBUTE_CYCLIC 2
+#define MPI_DISTRIBUTE_DFLT_DARG 0
+#define MPI_ORDER_C 1
+#define MPI_ORDER_FORTRAN 0
+
+#define MPI_TYPECLASS_REAL 0
+#define MPI_TYPECLASS_INTEGER 1
+#define MPI_TYPECLASS_COMPLEX 2
+#define MPI_ROOT 0
+#define MPI_INFO_NULL -1
+#define MPI_COMM_TYPE_SHARED    1
+
+#define MPI_VERSION 1
+#define MPI_SUBVERSION 1
+#define MPI_UNWEIGHTED      (int *)0
+#define MPI_ARGV_NULL (char **)0
+#define MPI_ARGVS_NULL (char ***)0
+#define MPI_LOCK_EXCLUSIVE           1
+#define MPI_LOCK_SHARED              2
+
+typedef enum MPIR_Combiner_enum{
+  MPI_COMBINER_NAMED,
+  MPI_COMBINER_DUP,
+  MPI_COMBINER_CONTIGUOUS,
+  MPI_COMBINER_VECTOR,
+  MPI_COMBINER_HVECTOR_INTEGER,
+  MPI_COMBINER_HVECTOR,
+  MPI_COMBINER_INDEXED,
+  MPI_COMBINER_HINDEXED_INTEGER,
+  MPI_COMBINER_HINDEXED,
+  MPI_COMBINER_INDEXED_BLOCK,
+  MPI_COMBINER_STRUCT_INTEGER,
+  MPI_COMBINER_STRUCT,
+  MPI_COMBINER_SUBARRAY,
+  MPI_COMBINER_DARRAY,
+  MPI_COMBINER_F90_REAL,
+  MPI_COMBINER_F90_COMPLEX,
+  MPI_COMBINER_F90_INTEGER,
+  MPI_COMBINER_RESIZED,
+  MPI_COMBINER_HINDEXED_BLOCK
+}MPIR_Combiner_enum;
+
 typedef enum MPIR_Topo_type {
   MPI_GRAPH=1,
   MPI_CART=2,
@@ -135,7 +209,9 @@ XBT_PUBLIC_DATA(MPI_Datatype) MPI_2INT;
 XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_DOUBLE_INT;
 XBT_PUBLIC_DATA(MPI_Datatype) MPI_2FLOAT;
 XBT_PUBLIC_DATA(MPI_Datatype) MPI_2DOUBLE;
-
+//for now we only send int values at max
+#define MPI_Count int
+#define MPI_COUNT MPI_INT
 typedef void MPI_User_function(void *invec, void *inoutvec, int *len,
                                MPI_Datatype * datatype);
 struct s_smpi_mpi_op;
@@ -167,6 +243,7 @@ typedef struct s_smpi_mpi_communicator *MPI_Comm;
 
 #define MPI_COMM_NULL NULL
 XBT_PUBLIC_DATA( MPI_Comm ) MPI_COMM_WORLD;
+#define MPI_UNIVERSE_SIZE smpi_comm_size(MPI_COMM_WORLD)
 #define MPI_COMM_SELF smpi_process_comm_self()
 
 struct s_smpi_mpi_request;
@@ -176,6 +253,7 @@ typedef struct s_smpi_mpi_request *MPI_Request;
 
 MPI_CALL(XBT_PUBLIC(int), MPI_Init, (int *argc, char ***argv));
 MPI_CALL(XBT_PUBLIC(int), MPI_Finalize, (void));
+MPI_CALL(XBT_PUBLIC(int), MPI_Finalized, (int* flag));
 MPI_CALL(XBT_PUBLIC(int), MPI_Init_thread,
                             (int *argc, char ***argv, int required,
                              int *provided));
@@ -185,12 +263,15 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Abort, (MPI_Comm comm, int errorcode));
 MPI_CALL(XBT_PUBLIC(double), MPI_Wtime, (void));
 MPI_CALL(XBT_PUBLIC(double), MPI_Wtick,(void));
 MPI_CALL(XBT_PUBLIC(int), MPI_Address, (void *location, MPI_Aint * address));
-
+MPI_CALL(XBT_PUBLIC(int), MPI_Get_address, (void *location, MPI_Aint * address));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_free, (MPI_Datatype * datatype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_size, (MPI_Datatype datatype, int *size));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_extent,
                             (MPI_Datatype datatype, MPI_Aint * lb,
                              MPI_Aint * extent));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_true_extent,
+                            (MPI_Datatype datatype, MPI_Aint * lb,
+                             MPI_Aint * extent));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_extent, (MPI_Datatype datatype, MPI_Aint * extent));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_lb, (MPI_Datatype datatype, MPI_Aint * disp));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_ub, (MPI_Datatype datatype, MPI_Aint * disp));
@@ -198,15 +279,27 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Type_commit, (MPI_Datatype* datatype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_hindexed,
                             (int count, int* blocklens, MPI_Aint* indices,
                             MPI_Datatype old_type, MPI_Datatype* newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_hindexed_block,
+                            (int count, int blocklength, MPI_Aint* indices,
+                            MPI_Datatype old_type, MPI_Datatype* newtype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_hvector,
                             (int count, int blocklen, MPI_Aint stride,
                              MPI_Datatype old_type, MPI_Datatype* newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_hvector,
+                            (int count, int blocklen, MPI_Aint stride,
+                             MPI_Datatype old_type, MPI_Datatype* newtype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_indexed,
                             (int count, int* blocklens, int* indices,
                              MPI_Datatype old_type, MPI_Datatype* newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_indexed_block,
+                            (int count, int blocklength, int* indices,
+                             MPI_Datatype old_type, MPI_Datatype* newtype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_struct,
                             (int count, int* blocklens, MPI_Aint* indices,
                              MPI_Datatype* old_types, MPI_Datatype* newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_struct,
+                            (int count, int* blocklens, MPI_Aint* indices,
+                             MPI_Datatype* old_types, MPI_Datatype* newtype));
 MPI_CALL(XBT_PUBLIC(int), MPI_Type_vector,
                             (int count, int blocklen, int stride,
                              MPI_Datatype old_type, MPI_Datatype* newtype));
@@ -264,7 +357,7 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Get_count,
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_group, (MPI_Comm comm, MPI_Group * group));
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_compare,
                             (MPI_Comm comm1, MPI_Comm comm2, int *result));
-MPI_CALL(XBT_PUBLIC(int), MPI_Comm_dup, (MPI_Comm comm, MPI_Comm * newcomm));
+
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create,
                             (MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm));
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_free, (MPI_Comm * comm));
@@ -379,6 +472,10 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Reduce_scatter,
                             (void *sendbuf, void *recvbuf,
                              int *recvcounts, MPI_Datatype datatype,
                              MPI_Op op, MPI_Comm comm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Reduce_scatter_block,
+                            (void *sendbuf, void *recvbuf,
+                             int recvcount, MPI_Datatype datatype,
+                             MPI_Op op, MPI_Comm comm));
 MPI_CALL(XBT_PUBLIC(int), MPI_Alltoall,
                             (void *sendbuf, int sendcount,
                              MPI_Datatype sendtype, void *recvbuf,
@@ -396,7 +493,12 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Iprobe,
 MPI_CALL(XBT_PUBLIC(int), MPI_Probe,
                             (int source, int tag, MPI_Comm comm,
                              MPI_Status* status));
-
+MPI_CALL(XBT_PUBLIC(int), MPI_Get_version,
+                             (int *version,int *subversion));
+MPI_CALL(XBT_PUBLIC(int), MPI_Get_library_version,
+                             (char *version,int *len));
+MPI_CALL(XBT_PUBLIC(int), MPI_Reduce_local,(void *inbuf, void *inoutbuf, int count,
+    MPI_Datatype datatype, MPI_Op op));
 
 //FIXME: these are not yet implemented
 
@@ -404,10 +506,30 @@ typedef void MPI_Handler_function(MPI_Comm*, int*, ...);
 typedef int MPI_Win;
 typedef int MPI_Info;
 typedef void* MPI_Errhandler;
+
 typedef int MPI_Copy_function(MPI_Comm oldcomm, int keyval, void* extra_state, void* attribute_val_in,
                               void* attribute_val_out, int* flag);
 typedef int MPI_Delete_function(MPI_Comm comm, int keyval, void* attribute_val, void* extra_state);
-
+typedef int MPI_Comm_copy_attr_function(MPI_Comm oldcomm, int keyval, void* extra_state, void* attribute_val_in,
+                              void* attribute_val_out, int* flag);
+typedef int MPI_Comm_delete_attr_function(MPI_Comm comm, int keyval, void* attribute_val, void* extra_state);
+typedef int MPI_Type_copy_attr_function(MPI_Datatype type, int keyval, void* extra_state, void* attribute_val_in,
+                              void* attribute_val_out, int* flag);
+typedef int MPI_Type_delete_attr_function(MPI_Datatype type, int keyval, void* attribute_val, void* extra_state);
+typedef void MPI_Comm_errhandler_function(MPI_Comm *, int *, ...);
+typedef int MPI_Grequest_query_function(void *extra_state, MPI_Status *status); 
+typedef int MPI_Grequest_free_function(void *extra_state); 
+typedef int MPI_Grequest_cancel_function(void *extra_state, int complete); 
+#define MPI_DUP_FN MPI_Comm_dup
+#define MPI_COMM_NULL_COPY_FN ((MPI_Comm_copy_attr_function*)0)
+#define MPI_COMM_NULL_DELETE_FN ((MPI_Comm_delete_attr_function*)0)
+#define MPI_COMM_DUP_FN  ((MPI_Comm_copy_attr_function *)MPI_DUP_FN)
+#define MPI_TYPE_NULL_COPY_FN ((MPI_Type_copy_attr_function*)0)
+#define MPI_TYPE_NULL_DELETE_FN ((MPI_Type_delete_attr_function*)0)
+#define MPI_TYPE_DUP_FN ((MPI_Type_copy_attr_function*)MPI_DUP_FN)
+
+typedef MPI_Comm_errhandler_function MPI_Comm_errhandler_fn;
+#define MPI_INFO_ENV 1
 XBT_PUBLIC_DATA(MPI_Datatype)  MPI_PACKED;
 XBT_PUBLIC_DATA(MPI_Errhandler*)  MPI_ERRORS_RETURN;
 XBT_PUBLIC_DATA(MPI_Errhandler*)  MPI_ERRORS_ARE_FATAL;
@@ -436,11 +558,29 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Errhandler_free, (MPI_Errhandler* errhandler));
 MPI_CALL(XBT_PUBLIC(int), MPI_Errhandler_get, (MPI_Comm comm, MPI_Errhandler* errhandler));
 MPI_CALL(XBT_PUBLIC(int), MPI_Error_string, (int errorcode, char* string, int* resultlen));
 MPI_CALL(XBT_PUBLIC(int), MPI_Errhandler_set, (MPI_Comm comm, MPI_Errhandler errhandler));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_set_errhandler, (MPI_Comm comm, MPI_Errhandler errhandler));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create_errhandler,( MPI_Comm_errhandler_fn *function, MPI_Errhandler *errhandler));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_call_errhandler,(MPI_Comm comm,int errorcode));
+MPI_CALL(XBT_PUBLIC(int), MPI_Add_error_class,( int *errorclass));
+MPI_CALL(XBT_PUBLIC(int), MPI_Add_error_code,(  int errorclass, int *errorcode));
+MPI_CALL(XBT_PUBLIC(int), MPI_Add_error_string,( int errorcode, char *string));
 MPI_CALL(XBT_PUBLIC(int), MPI_Cancel, (MPI_Request* request));
 MPI_CALL(XBT_PUBLIC(int), MPI_Buffer_attach, (void* buffer, int size));
 MPI_CALL(XBT_PUBLIC(int), MPI_Buffer_detach, (void* buffer, int* size));
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_test_inter, (MPI_Comm comm, int* flag));
 MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_attr, (MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_set_attr, (MPI_Comm comm, int comm_keyval, void *attribute_val));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_delete_attr, (MPI_Comm comm, int comm_keyval));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create_keyval,(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_free_keyval,(int* keyval));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_attr, (MPI_Datatype type, int type_keyval, void *attribute_val, int* flag));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_set_attr, (MPI_Datatype type, int type_keyval, void *att));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_delete_attr, (MPI_Datatype type, int comm_keyval));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_keyval,(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_free_keyval,(int* keyval));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_dup,(MPI_Datatype datatype,MPI_Datatype *newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_set_name,(MPI_Datatype  datatype, char * name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_name,(MPI_Datatype  datatype, char * name, int* len));
 MPI_CALL(XBT_PUBLIC(int), MPI_Unpack, (void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm));
 MPI_CALL(XBT_PUBLIC(int), MPI_Ssend, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm));
 MPI_CALL(XBT_PUBLIC(int), MPI_Ssend_init, (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request));
@@ -470,10 +610,55 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Win_fence,( int assert,  MPI_Win win));
 MPI_CALL(XBT_PUBLIC(int), MPI_Win_free,( MPI_Win* win));
 MPI_CALL(XBT_PUBLIC(int), MPI_Win_create,( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win));
 MPI_CALL(XBT_PUBLIC(int), MPI_Info_create,( MPI_Info *info));
-MPI_CALL(XBT_PUBLIC(int), MPI_Info_set,( MPI_Info *info, char *key, char *value));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_set,( MPI_Info info, char *key, char *value));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_get,(MPI_Info info,char *key,int valuelen, char *value, int *flag));
 MPI_CALL(XBT_PUBLIC(int), MPI_Info_free,( MPI_Info *info));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_delete,( MPI_Info info,  char *key));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_dup,(MPI_Info info, MPI_Info *newinfo));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_get_nkeys,( MPI_Info info, int *nkeys));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_get_nthkey,( MPI_Info info, int n, char *key));
+MPI_CALL(XBT_PUBLIC(int), MPI_Info_get_valuelen,( MPI_Info info, char *key, int *valuelen, int *flag));
+
 MPI_CALL(XBT_PUBLIC(int), MPI_Get,( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
     MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_envelope,(MPI_Datatype datatype,int *num_integers,int *num_addresses,int *num_datatypes, int *combiner));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_contents,(MPI_Datatype datatype, int max_integers, int max_addresses,
+                            int max_datatypes, int* array_of_integers, MPI_Aint* array_of_addresses, 
+                            MPI_Datatype *array_of_datatypes));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_darray,(int size, int rank, int ndims, int* array_of_gsizes,
+                            int* array_of_distribs, int* array_of_dargs, int* array_of_psizes,
+                            int order, MPI_Datatype oldtype, MPI_Datatype *newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Pack_external_size, (char *datarep, int incount, MPI_Datatype datatype, MPI_Aint *size));
+MPI_CALL(XBT_PUBLIC(int), MPI_Pack_external, (char *datarep, void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, MPI_Aint outcount, MPI_Aint *position));
+MPI_CALL(XBT_PUBLIC(int), MPI_Unpack_external, ( char *datarep, void *inbuf, MPI_Aint insize, MPI_Aint *position, void *outbuf, int outcount, MPI_Datatype datatype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_resized ,(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_create_subarray,(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Type_match_size,(int typeclass,int size,MPI_Datatype *datatype));
+MPI_CALL(XBT_PUBLIC(int), MPI_Alltoallw, ( void *sendbuf, int *sendcnts, int *sdispls, MPI_Datatype *sendtypes, void *recvbuf, int *recvcnts, int *rdispls, MPI_Datatype *recvtypes, MPI_Comm comm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Exscan,(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_set_name, (MPI_Comm comm, char* name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_set_info, (MPI_Comm comm, MPI_Info info));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_info, (MPI_Comm comm, MPI_Info* info));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_dup, (MPI_Comm comm, MPI_Comm * newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_dup_with_info,(MPI_Comm comm, MPI_Info info, MPI_Comm * newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_split_type,(MPI_Comm comm, int split_type, int key, MPI_Info info, MPI_Comm *newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_connect,( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Request_get_status,( MPI_Request request, int *flag, MPI_Status *status));
+MPI_CALL(XBT_PUBLIC(int), MPI_Grequest_start,( MPI_Grequest_query_function *query_fn, MPI_Grequest_free_function *free_fn, MPI_Grequest_cancel_function *cancel_fn, void *extra_state, MPI_Request *request));
+MPI_CALL(XBT_PUBLIC(int), MPI_Grequest_complete,( MPI_Request request));
+MPI_CALL(XBT_PUBLIC(int), MPI_Status_set_cancelled,(MPI_Status *status,int flag));
+MPI_CALL(XBT_PUBLIC(int), MPI_Status_set_elements,( MPI_Status *status, MPI_Datatype datatype, int count));
+MPI_CALL(XBT_PUBLIC(int), MPI_Unpublish_name,( char *service_name, MPI_Info info, char *port_name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Publish_name,( char *service_name, MPI_Info info, char *port_name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Lookup_name,( char *service_name, MPI_Info info, char *port_name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_join,( int fd, MPI_Comm *intercomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Open_port,( MPI_Info info, char *port_name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Close_port,( char *port_name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_accept,( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_spawn,( char *command, char **argv, int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_spawn_multiple,( int count, char **array_of_commands, char*** array_of_argv, int* array_of_maxprocs, MPI_Info* array_of_info, 
+                                                    int root, MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes));
+MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_parent,( MPI_Comm *parent));
 
 //FIXME: End of all the not yet implemented stuff
 
@@ -515,14 +700,14 @@ XBT_PUBLIC(void*) smpi_shared_get_call(const char* func, const char* input);
 XBT_PUBLIC(void*) smpi_shared_set_call(const char* func, const char* input, void* data);
 #define SMPI_SHARED_CALL(func, input, ...) \
    (smpi_shared_known_call(#func, input) ? smpi_shared_get_call(#func, input) \
-                                         : smpi_shared_set_call(#func, input, func(__VA_ARGS__)))
+                                         : smpi_shared_set_call(#func, input, (func(__VA_ARGS__))))
 
 /* Fortran specific stuff */
+
 XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main_(int argc, char** argv);
 XBT_PUBLIC(int) __attribute__((weak)) MAIN__(void);
 XBT_PUBLIC(int) smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]);
 XBT_PUBLIC(void) __attribute__((weak)) user_main_(void);
-
 XBT_PUBLIC(int) smpi_process_index(void);
 
 /* Trace replay specific stuff */
index ee4b4d9..c2a8577 100644 (file)
@@ -25,6 +25,7 @@ XBT_PUBLIC(void) surf_parse_warn(const char *msg,...) _XBT_GNUC_PRINTF(1,2);
 XBT_PUBLIC(double) surf_parse_get_double(const char *string);
 XBT_PUBLIC(int) surf_parse_get_int(const char *string);
 XBT_PUBLIC(double) surf_parse_get_time(const char *string);
+XBT_PUBLIC(double) surf_parse_get_size(const char *string);
 XBT_PUBLIC(double) surf_parse_get_bandwidth(const char *string);
 XBT_PUBLIC(double) surf_parse_get_power(const char *string);
 
diff --git a/include/xbt/file_stat.h b/include/xbt/file_stat.h
deleted file mode 100644 (file)
index 4e323dc..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * file_stat.h
- *
- *  Created on: 3 avr. 2012
- *      Author: navarro
- */
-
-#ifndef _FILE_STAT_H
-#define _FILE_STAT_H
-
-#include "xbt/sysdep.h"
-
-/** \ingroup msg_file_management
-  \brief Strucure containing information on file like stat on POSIX
- */
-typedef struct file_stat {
-  char *user_rights;
-  char *user;
-  char *group;
-  char *date; /* FIXME: update to time_t or double */
-  char *time; /* FIXME: update to time_t or double */
-  double size;
-} s_file_stat_t, *file_stat_t;
-
-static XBT_INLINE void file_stat_copy(s_file_stat_t *src, s_file_stat_t *dst)
-{
-    dst->date = xbt_strdup(src->date);
-    dst->group = xbt_strdup(src->group);
-    dst->size = src->size;
-    dst->time = xbt_strdup(src->time);
-    dst->user = xbt_strdup(src->user);
-    dst->user_rights = xbt_strdup(src->user_rights);
-}
-
-#endif /* _FILE_STAT_H */
index 29428b3..64b5ef5 100644 (file)
@@ -16,6 +16,8 @@
 
 #include "jmsg_process.h"
 
+#include "jmsg_as.h"
+
 #include "jmsg_host.h"
 #include "jmsg_task.h"
 #include "jxbt_utilities.h"
@@ -170,6 +172,26 @@ Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls,
 
   (*env)->ReleaseStringUTFChars(env, jplatformFile, platformFile);
 }
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls)
+{
+  msg_as_t as = MSG_environment_get_routing_root();
+  jobject jas = jas_new_instance(env);
+  if (!jas) {
+    jxbt_throw_jni(env, "java As instantiation failed");
+    return NULL;
+  }
+  jas = jas_ref(env, jas);
+  if (!jas) {
+    jxbt_throw_jni(env, "new global ref allocation failed");
+    return NULL;
+  }
+  jas_bind(jas, as, env);
+
+  return (jobject) jas;
+}
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Msg_debug(JNIEnv * env, jclass cls, jstring js)
 {
index 73e9ad9..4d9a5d4 100644 (file)
@@ -56,6 +56,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_critical(JNIEnv *, jclass,
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls,
                                        jstring jplatformFile);
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls);
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls,
                                        jstring jdeploymentFile);
diff --git a/src/bindings/java/jmsg_as.c b/src/bindings/java/jmsg_as.c
new file mode 100644 (file)
index 0000000..30f8b0e
--- /dev/null
@@ -0,0 +1,174 @@
+/* Functions related to the java host instances.                            */
+
+/* Copyright (c) 2007-2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+  * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "xbt/str.h"
+#include "xbt/dict.h"
+#include "msg/msg.h"
+#include "jmsg_as.h"
+#include "jxbt_utilities.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
+
+static jmethodID jas_method_As_constructor;
+static jfieldID jas_field_As_bind;
+
+jobject jas_new_instance(JNIEnv * env) {
+  jclass cls = jxbt_get_class(env, "org/simgrid/msg/As");
+  return (*env)->NewObject(env, cls, jas_method_As_constructor);
+}
+
+jobject jas_ref(JNIEnv * env, jobject jas) {
+  return (*env)->NewGlobalRef(env, jas);
+}
+
+void jas_unref(JNIEnv * env, jobject jas) {
+  (*env)->DeleteGlobalRef(env, jas);
+}
+
+void jas_bind(jobject jas, msg_as_t as, JNIEnv * env) {
+  (*env)->SetLongField(env, jas, jas_field_As_bind, (jlong) (long) (as));
+}
+
+msg_as_t jas_get_native(JNIEnv * env, jobject jas) {
+  return (msg_as_t) (long) (*env)->GetLongField(env, jas, jas_field_As_bind);
+}
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_As_nativeInit(JNIEnv *env, jclass cls) {
+  jclass class_As = (*env)->FindClass(env, "org/simgrid/msg/As");
+  jas_method_As_constructor = (*env)->GetMethodID(env, class_As, "<init>", "()V");
+  jas_field_As_bind = jxbt_get_jfield(env,class_As, "bind", "J");
+  if (!class_As || !jas_method_As_constructor || !jas_field_As_bind) {
+    jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug."));
+  }
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getName(JNIEnv * env, jobject jas) {
+  msg_as_t as = jas_get_native(env, jas);
+  return (*env)->NewStringUTF(env, MSG_environment_as_get_name(as));
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_simgrid_msg_As_getSons(JNIEnv * env, jobject jas) {
+  int index = 0;
+  jobjectArray jtable;
+  jobject tmp_jas;
+  msg_as_t tmp_as;
+  msg_as_t self_as = jas_get_native(env, jas);
+  
+  xbt_dict_t dict = MSG_environment_as_get_routing_sons(self_as);
+  int count = xbt_dict_length(dict);
+  jclass cls = (*env)->FindClass(env, "org/simgrid/msg/As");
+
+  if (!cls) {
+    return NULL;
+  }
+
+  jtable = (*env)->NewObjectArray(env, (jsize) count, cls, NULL);
+
+  if (!jtable) {
+    jxbt_throw_jni(env, "Hosts table allocation failed");
+    return NULL;
+  }
+
+  xbt_dict_cursor_t cursor=NULL;
+  char *key;
+
+  xbt_dict_foreach(dict,cursor,key,tmp_as) {
+    tmp_jas = jas_new_instance(env);
+    if (!tmp_jas) {
+      jxbt_throw_jni(env, "java As instantiation failed");
+      return NULL;
+    }
+    tmp_jas = jas_ref(env, tmp_jas);
+    if (!tmp_jas) {
+      jxbt_throw_jni(env, "new global ref allocation failed");
+      return NULL;
+    }
+    jas_bind(tmp_jas, tmp_as, env);
+
+    (*env)->SetObjectArrayElement(env, jtable, index, tmp_jas);
+    index++;
+
+  }
+  return jtable;
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobject jas, jobject jname) {
+  msg_as_t as = jas_get_native(env, jas);
+
+  if (!as) {
+    jxbt_throw_notbound(env, "as", jas);
+    return NULL;
+  }
+  const char *name = (*env)->GetStringUTFChars(env, jname, 0);
+
+  const char *property = MSG_environment_as_get_property_value(as, name);
+  if (!property) {
+    return NULL;
+  }
+
+  jobject jproperty = (*env)->NewStringUTF(env, property);
+
+  (*env)->ReleaseStringUTFChars(env, jname, name);
+
+  return jproperty;
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getModel(JNIEnv * env, jobject jas) {
+  msg_as_t as = jas_get_native(env, jas);
+  return (*env)->NewStringUTF(env, MSG_environment_as_get_model(as));
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jobject jas)
+{
+  int index;
+  jobjectArray jtable;
+  jobject jhost;
+  jstring jname;
+  msg_host_t host;
+  msg_as_t as = jas_get_native(env, jas);
+
+  xbt_dynar_t table =  MSG_environment_as_get_hosts(as);
+  int count = xbt_dynar_length(table);
+
+  jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host");
+
+  if (!cls) {
+    return NULL;
+  }
+  
+  jtable = (*env)->NewObjectArray(env, (jsize) count, cls, NULL);
+
+  if (!jtable) {
+    jxbt_throw_jni(env, "Hosts table allocation failed");
+    return NULL;
+  }
+
+  for (index = 0; index < count; index++) {
+
+    host = xbt_dynar_get_as(table,index,msg_host_t);
+
+    jhost = (jobject) (MSG_host_get_data(host));
+    if (!jhost) {
+      jname = (*env)->NewStringUTF(env, MSG_host_get_name(host));
+
+      jhost = Java_org_simgrid_msg_Host_getByName(env, cls, jname);
+
+      /* FIXME: leak of jname ? */
+    }
+
+    (*env)->SetObjectArrayElement(env, jtable, index, jhost);
+  }
+  xbt_dynar_free(&table);
+  return jtable;
+}
diff --git a/src/bindings/java/jmsg_as.h b/src/bindings/java/jmsg_as.h
new file mode 100644 (file)
index 0000000..00b21fc
--- /dev/null
@@ -0,0 +1,51 @@
+/* Functions related to the java As instances.                            */
+
+/* Copyright (c) 2007-2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+  * under the terms of the license (GNU LGPL) which comes with this package. */
+
+
+#ifndef MSG_JAS_H
+#define MSG_JAS_H
+#include <jni.h>
+#include "msg/msg.h"
+
+/* Functions related to the java host instances.                            */
+
+/* Copyright (c) 2007-2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+  * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "msg/msg.h"
+#include "jmsg.h"
+#include "jmsg_host.h"
+
+jobject jas_new_instance(JNIEnv * env);
+jobject jas_ref(JNIEnv * env, jobject jas);
+void jas_unref(JNIEnv * env, jobject jas);
+void jas_bind(jobject jas, msg_as_t as, JNIEnv * env);
+msg_as_t jas_get_native(JNIEnv * env, jobject jas);
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_As_nativeInit(JNIEnv *env, jclass cls);
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getName(JNIEnv * env, jobject jas);
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_simgrid_msg_As_getSons(JNIEnv * env, jobject jas);
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobject jhost, jobject jname);
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_As_getModel(JNIEnv * env, jobject jas);
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jobject jas);
+
+#endif                          /*!MSG_JAS_H */
index 9266483..7e77c72 100644 (file)
@@ -7,8 +7,8 @@
 #include "jmsg_file.h"
 #include "jxbt_utilities.h"
 
-void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t stream) {
-  (*env)->SetLongField(env, jfile, jfile_field_bind, (intptr_t)stream);
+void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t fd) {
+  (*env)->SetLongField(env, jfile, jfile_field_bind, (intptr_t)fd);
 }
 
 msg_file_t jfile_get_native(JNIEnv *env, jobject jfile) {
@@ -24,32 +24,30 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv *env, jclass cls) {
   xbt_assert((jfile_field_bind != NULL), "Can't find \"bind\" field in File class.");
 }
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, jobject jpath, jobject jmode) {
+Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, jobject jpath) {
   const char *storage = (*env)->GetStringUTFChars(env, jstorage, 0);
   const char *path = (*env)->GetStringUTFChars(env, jpath, 0);
-  const char *mode = (*env)->GetStringUTFChars(env, jmode, 0);
   msg_file_t file;
 
-  file = MSG_file_open(storage, path, mode);
+  file = MSG_file_open(storage, path);
   jfile_bind(env, jfile, file);
 
   (*env)->ReleaseStringUTFChars(env, jstorage, storage);
   (*env)->ReleaseStringUTFChars(env, jpath, path);
-  (*env)->ReleaseStringUTFChars(env, jmode, mode);
 }
 JNIEXPORT jlong JNICALL
-Java_org_simgrid_msg_File_read(JNIEnv *env, jobject jfile, jlong jsize, jlong jnmemb) {
+Java_org_simgrid_msg_File_read(JNIEnv *env, jobject jfile, jlong jsize) {
   msg_file_t file = jfile_get_native(env, jfile);
   size_t n;
-  n = MSG_file_read(NULL,(size_t)jsize, (size_t)jnmemb, file);
+  n = MSG_file_read((size_t)jsize, file);
   return (jlong)n;
 }
 
 JNIEXPORT jlong JNICALL
-Java_org_simgrid_msg_File_write(JNIEnv *env, jobject jfile, jlong jsize, jlong jnmemb) {
+Java_org_simgrid_msg_File_write(JNIEnv *env, jobject jfile, jlong jsize) {
   msg_file_t file = jfile_get_native(env, jfile);
   size_t n;
-  n = MSG_file_write(NULL, (size_t)jsize, (size_t)jnmemb, file);
+  n = MSG_file_write((size_t)jsize, file);
   return (jlong)n;
 }
 JNIEXPORT void JNICALL
index 2f554f6..182bef1 100644 (file)
@@ -12,7 +12,7 @@
 
 jfieldID jfile_field_bind;
 
-void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t stream);
+void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t fd);
 msg_file_t jfile_get_native(JNIEnv *env, jobject jfile);
 /**
  * Class                       org_simgrid_msg_File
@@ -27,19 +27,19 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv*, jclass);
  * Signature   (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject, jobject);
+Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject);
 /**
  * Class                       org_simgrid_msg_File
  * Method                      read
  */
 JNIEXPORT jlong JNICALL
-Java_org_simgrid_msg_File_read(JNIEnv*, jobject, jlong, jlong);
+Java_org_simgrid_msg_File_read(JNIEnv*, jobject, jlong);
 /**
  * Class                       org_simgrid_msg_File
  * Method                      write
  */
 JNIEXPORT jlong JNICALL
-Java_org_simgrid_msg_File_write(JNIEnv*, jobject, jlong, jlong);
+Java_org_simgrid_msg_File_write(JNIEnv*, jobject, jlong);
 /**
  * Class                       org_simgrid_msg_File
  * Method                      close
index 8cd7da1..21cfc8a 100644 (file)
@@ -174,6 +174,20 @@ Java_org_simgrid_msg_Host_getSpeed(JNIEnv * env,
 
   return (jdouble) MSG_get_host_speed(host);
 }
+
+JNIEXPORT jdouble JNICALL
+Java_org_simgrid_msg_Host_getCoreNumber(JNIEnv * env,
+                                        jobject jhost) {
+  msg_host_t host = jhost_get_native(env, jhost);
+
+  if (!host) {
+    jxbt_throw_notbound(env, "host", jhost);
+    return -1;
+  }
+
+  return (jdouble) MSG_host_get_core_number(host);
+}
+
 JNIEXPORT jint JNICALL
 Java_org_simgrid_msg_Host_getLoad(JNIEnv * env, jobject jhost) {
   msg_host_t host = jhost_get_native(env, jhost);
@@ -206,6 +220,7 @@ Java_org_simgrid_msg_Host_getProperty(JNIEnv *env, jobject jhost, jobject jname)
 
   return jproperty;
 }
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Host_setProperty(JNIEnv *env, jobject jhost, jobject jname, jobject jvalue) {
   msg_host_t host = jhost_get_native(env, jhost);
@@ -278,3 +293,12 @@ Java_org_simgrid_msg_Host_all(JNIEnv * env, jclass cls_arg)
   xbt_dynar_free(&table);
   return jtable;
 }
+
+JNIEXPORT void JNICALL 
+Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname){
+
+  const char *name = (*env)->GetStringUTFChars(env, jname, 0);
+  MSG_mailbox_set_async(name);
+  (*env)->ReleaseStringUTFChars(env, jname, name);
+
+}
index 0dc01c2..47aef69 100644 (file)
@@ -134,6 +134,13 @@ JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getCount
  */
 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getSpeed
     (JNIEnv *, jobject);
+/*
+ * Class               org_simgrid_msg_Host
+ * Method              getCoreNumber
+ * Signature   ()D
+ */
+JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getCoreNumber
+    (JNIEnv *, jobject);
 /*
  * Class               org_simgrid_msg_Host
  * Method              getLoad
@@ -171,4 +178,10 @@ JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Host_isAvail
 JNIEXPORT jobjectArray JNICALL
 Java_org_simgrid_msg_Host_all(JNIEnv *, jclass);
 
+JNIEXPORT void JNICALL 
+Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname);
+
+
+
 #endif                          /*!MSG_JHOST_H */
+
index cbccf4c..cea6030 100644 (file)
@@ -5,6 +5,7 @@
 /* This program is free software; you can redistribute it and/or modify it
   * under the terms of the license (GNU LGPL) which comes with this package.    */
 
+#include "jmsg.h"
 #include "xbt/synchro_core.h"
 #include "jmsg_synchro.h"
 #include "jxbt_utilities.h"
@@ -56,3 +57,55 @@ Java_org_simgrid_msg_Mutex_exit(JNIEnv * env, jobject obj) {
   mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Mutex_bind);
   xbt_mutex_destroy(mutex);
 }
+
+static jfieldID jsyncro_field_Semaphore_bind;
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_nativeInit(JNIEnv *env, jclass cls) {
+  jsyncro_field_Semaphore_bind = jxbt_get_sfield(env, "org/simgrid/msg/Semaphore", "bind", "J");
+  if (!jsyncro_field_Semaphore_bind) {
+    jxbt_throw_native(env,bprintf("Can't find some fields in Semaphore Java class. You should report this bug."));
+  }
+}
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_init(JNIEnv * env, jobject obj, jint capacity) {
+  msg_sem_t sem = MSG_sem_init((int) capacity);
+
+  (*env)->SetLongField(env, obj, jsyncro_field_Semaphore_bind, (jlong) (long) (sem));
+}
+
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_acquire(JNIEnv * env, jobject obj, jdouble timeout) {
+  msg_sem_t sem;
+
+  sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind);
+  msg_error_t res = MSG_sem_acquire_timeout(sem, (double) timeout);
+  if (res != MSG_OK) {
+    jmsg_throw_status(env, res);
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_release(JNIEnv * env, jobject obj) {
+  msg_sem_t sem;
+
+  sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind);
+  MSG_sem_release(sem);
+}
+JNIEXPORT jboolean JNICALL
+Java_org_simgrid_msg_Semaphore_wouldBlock(JNIEnv * env, jobject obj) {
+  msg_sem_t sem;
+
+  sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind);
+  int res = MSG_sem_would_block(sem);
+  return (jboolean) res;
+}
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Mutex_destroy(JNIEnv * env, jobject obj) {
+  msg_sem_t sem;
+
+  sem = (msg_sem_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Semaphore_bind);
+  MSG_sem_destroy(sem);
+}
index 5c3e41f..1eb5a1d 100644 (file)
@@ -28,4 +28,16 @@ Java_org_simgrid_msg_Mutex_release(JNIEnv * env, jobject obj);
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Mutex_exit(JNIEnv * env, jobject obj);
 
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_nativeInit(JNIEnv *env, jclass cls);
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_init(JNIEnv * env, jobject obj, jint capacity);
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_acquire(JNIEnv * env, jobject obj, jdouble timeout);
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Semaphore_release(JNIEnv * env, jobject obj);
+JNIEXPORT jboolean JNICALL
+Java_org_simgrid_msg_Semaphore_wouldBlock(JNIEnv * env, jobject obj);
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Mutex_destroy(JNIEnv * env, jobject obj);
 #endif                          /* !MSG_JPROCESS_H */
index b0146de..49d54b2 100644 (file)
@@ -100,4 +100,6 @@ Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm);
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_reboot(JNIEnv *env, jobject jvm);
 
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_VM_get_pm(JNIEnv *env, jobject jvm);
 #endif
diff --git a/src/bindings/java/org/simgrid/msg/As.java b/src/bindings/java/org/simgrid/msg/As.java
new file mode 100644 (file)
index 0000000..f895e1a
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Bindings to the MSG hosts
+ *
+ * Copyright 2006-2012 The SimGrid Team           
+ * All right reserved. 
+ *
+ * This program is free software; you can redistribute 
+ * it and/or modify it under the terms of the license 
+ *(GNU LGPL) which comes with this package. 
+ *
+ */  
+package org.simgrid.msg;
+
+public class As {
+
+    private long bind;
+    
+    protected As() {
+       };
+
+    public String toString (){
+       return this.getName(); 
+    }
+    public native String getName();
+
+    public native As[] getSons();
+
+    public native String getProperty(String name);
+
+    public native String getModel();
+
+    public native Host[] getHosts();
+
+    /**
+      * Class initializer, to initialize various JNI stuff
+      */
+    public static native void nativeInit();
+    static {
+       nativeInit();
+    }
+}
index 032a6bb..426ea07 100644 (file)
@@ -18,24 +18,22 @@ public class File {
        private long bind = 0;
        /**
         * Constructor, opens the file.
-        * @param storage is the name where you can find the stream 
+        * @param storage is the name where you can find the file descriptor 
         * @param path is the file location on the storage 
-        * @param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): r Open text file for reading. The stream is positioned at the beginning of the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file. a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.
         */
-       public File(String storage, String path, String mode) {
+       public File(String storage, String path) {
                this.storage = storage;
-               open(storage, path, mode);
+               open(storage, path);
        }
        protected void finalize() {
 
        }
        /**
         * Opens the file whose name is the string pointed to by path. 
-        * @param storage is the name where you can find the stream 
+        * @param storage is the name where you can find the file descriptor 
         * @param path is the file location on the storage
-        * @param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): r Open text file for reading. The stream is positioned at the beginning of the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file. w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file. a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file. a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.
         */
-       protected native void open(String storage, String path, String mode);
+       protected native void open(String storage, String path);
        /**
         * Read elements of a file. 
         * @param size of each element
index c00dd54..cc90166 100644 (file)
@@ -101,6 +101,20 @@ public class Host {
         */ 
        public native static Host[] all();
 
+    /** 
+     * This static method sets a mailbox to receive in asynchronous mode.
+     * 
+     * All messages sent to this mailbox will be transferred to 
+     * the receiver without waiting for the receive call. 
+     * The receive call will still be necessary to use the received data.
+     * If there is a need to receive some messages asynchronously, and some not, 
+     * two different mailboxes should be used.
+     *
+     * @param mailboxName The name of the mailbox
+     */
+    public static native void setAsyncMailbox(String mailboxName);
+
+
        /**
         * This method returns the name of a host.
         * @return                      The name of the host.
@@ -150,6 +164,15 @@ public class Host {
         *
         */ 
        public native double getSpeed();
+
+       /**
+        * This method returns the number of core of a host.
+        *
+        * @return                      The speed of the processor of the host in flops.
+        *
+        */ 
+       public native double getCoreNumber();
+
        /**
         * Returns the value of a given host property. 
         */
index c06adb3..5a08809 100644 (file)
@@ -192,6 +192,8 @@ public final class Msg {
         */
        public final static native void createEnvironment(String platformFile);
 
+       public final static native As environmentGetRoutingRoot();
+
        /**
         * The method to deploy the simulation.
         *
diff --git a/src/bindings/java/org/simgrid/msg/Semaphore.java b/src/bindings/java/org/simgrid/msg/Semaphore.java
new file mode 100644 (file)
index 0000000..f1a276b
--- /dev/null
@@ -0,0 +1,86 @@
+/* 
+ * Copyright 2012 The SimGrid team. All right reserved. 
+ *
+ * This program is free software; you can redistribute 
+ * it and/or modify it under the terms of the license 
+ * (GNU LGPL) which comes with this package.
+ *
+ */
+package org.simgrid.msg;
+/** A semaphore implemented on top of SimGrid synchronization mechanisms. 
+ * You can use it exactly the same way that you use classical semaphores
+ * but to handle the interactions between the processes within the simulation.   
+ *
+ */
+
+public class Semaphore {
+    private long bind; // The C object -- don't touch it
+    /**
+     * Semaphore capacity, defined when the semaphore is created. At most capacity 
+     * process can acquire this semaphore at the same time.
+     */
+    protected final int capacity;
+    /**
+     * Creates a new semaphore with the given capacity. At most capacity 
+     * process can acquire this semaphore at the same time.
+     */
+    public Semaphore(int capacity) {
+       init(capacity);
+       this.capacity = capacity;
+    }
+    /** The native implementation of semaphore initialization
+     */
+    private native void init(int capacity);
+
+
+    /** Locks on the semaphore object until the provided timeout expires
+     * @exception TimeoutException if the timeout expired before 
+     *            the semaphore could be acquired.
+     */
+    public native void acquire(double timeout) throws TimeoutException;
+    /** Locks on the semaphore object with no timeout
+     */
+    public void acquire() {
+       try {
+           acquire(-1);
+       } catch (TimeoutException e) {
+           // This should not happen.
+           assert(false);
+       }
+    }
+    /** Releases the semaphore object
+     */
+    public native void release();
+    /** returns a boolean indicating it this semaphore would block at this very specific time
+     *
+     * Note that the returned value may be wrong right after the
+     * function call, when you try to use it...  But that's a
+     * classical semaphore issue, and SimGrid's semaphores are not
+     * different to usual ones here.
+     */
+    public native boolean wouldBlock();
+
+    /** Returns the semaphore capacity
+     */
+    public int getCapacity(){
+       return this.capacity;
+    }
+
+
+    /** Deletes this semaphore 
+     */
+    protected void finalize() {
+       destroy();
+    }
+    /** The native implementation for destroying a semaphore
+     */
+    private native void destroy();
+    /**
+     * Class initializer, to initialize various JNI stuff
+     */
+    public static native void nativeInit();
+    static {
+       Msg.nativeInit();
+       nativeInit();
+    }
+}
\ No newline at end of file
index d172618..04fc1da 100644 (file)
@@ -22,6 +22,15 @@ typedef struct mpi_coll_description {
   void *coll;
 } s_mpi_coll_description_t, *mpi_coll_description_t;
 
+
+/** \ingroup MPI gather
+ *  \brief The list of all available allgather collectives
+ */
+XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_gather_description[];
+XBT_PUBLIC_DATA(int (*mpi_coll_gather_fun)
+                (void *, int, MPI_Datatype, void *, int, MPI_Datatype,
+                 int, MPI_Comm));
+                 
 /** \ingroup MPI allgather
  *  \brief The list of all available allgather collectives
  */
@@ -82,11 +91,33 @@ XBT_PUBLIC_DATA(int (*mpi_coll_reduce_fun)
                 (void *buf, void *rbuf, int count, MPI_Datatype datatype,
                  MPI_Op op, int root, MPI_Comm comm));
 
+/** \ingroup MPI reduce_scatter
+ *  \brief The list of all available allgather collectives
+ */
+XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_reduce_scatter_description[];
+XBT_PUBLIC_DATA(int (*mpi_coll_reduce_scatter_fun)
+                (void *sbuf, void *rbuf, int *rcounts,
+                 MPI_Datatype dtype, MPI_Op op,MPI_Comm comm));
+
+/** \ingroup MPI scatter
+ *  \brief The list of all available allgather collectives
+ */
+XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_scatter_description[];
+XBT_PUBLIC_DATA(int (*mpi_coll_scatter_fun)
+                (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+                void *recvbuf, int recvcount, MPI_Datatype recvtype,
+                int root, MPI_Comm comm));
+
+/** \ingroup MPI barrier
+ *  \brief The list of all available allgather collectives
+ */
+XBT_PUBLIC_DATA(s_mpi_coll_description_t) mpi_coll_barrier_description[];
+XBT_PUBLIC_DATA(int (*mpi_coll_barrier_fun)
+                (MPI_Comm comm));
+
 
 XBT_PUBLIC(void) coll_help(const char *category,
                            s_mpi_coll_description_t * table);
 XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t * table,
-                                      const char *name);
-
-
+                                      char *name);
 #endif                          /* _SMPI_INTERFAC_H */
index a9d5330..e6fd6ff 100644 (file)
@@ -12,7 +12,6 @@
 #include "xbt/dict.h"
 #include "xbt/graph.h"
 #include "xbt/misc.h"
-#include "xbt/file_stat.h"
 #include "portable.h"
 #include "xbt/config.h"
 #include "surf/datatypes.h"
@@ -111,7 +110,6 @@ typedef struct surf_action {
   char *category;               /**< tracing category for categorized resource utilization monitoring */
 #endif
   surf_file_t file;        /**< surf_file_t for storage model */
-  s_file_stat_t stat;        /**< surf_file_t for storage model */
   xbt_dict_t ls_dict;
 } s_surf_action_t;
 
@@ -195,6 +193,7 @@ typedef struct surf_cpu_model_extension_public {
   surf_action_t(*execute) (void *cpu, double size);
   surf_action_t(*sleep) (void *cpu, double duration);
   e_surf_resource_state_t(*get_state) (void *cpu);
+  int (*get_core) (void *cpu);
   double (*get_speed) (void *cpu, double load);
   double (*get_available_speed) (void *cpu);
   double (*get_current_power_peak) (void *cpu);
@@ -232,12 +231,11 @@ typedef struct surf_network_model_extension_public {
  */
 
 typedef struct surf_storage_model_extension_public {
-  surf_action_t(*open) (void *storage, const char* mount, const char* path, const char* mode);
-  surf_action_t(*close) (void *storage, surf_file_t fp);
-  surf_action_t(*read) (void *storage, void* ptr, double size, size_t nmemb, surf_file_t stream);
-  surf_action_t(*write) (void *storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream);
-  surf_action_t(*stat) (void *storage, surf_file_t stream);
-  surf_action_t(*unlink) (void *storage, surf_file_t stream);
+  surf_action_t(*open) (void *storage, const char* mount, const char* path);
+  surf_action_t(*close) (void *storage, surf_file_t fd);
+  surf_action_t(*read) (void *storage, size_t size, surf_file_t fd);
+  surf_action_t(*write) (void *storage, size_t size, surf_file_t fd);
+  surf_action_t(*stat) (void *storage, surf_file_t fd);
   surf_action_t(*ls) (void *storage, const char *path);
 } s_surf_model_extension_storage_t;
 
@@ -251,14 +249,18 @@ typedef struct surf_workstation_model_extension_public {
                                       and create the corresponding action */
   surf_action_t(*sleep) (void *workstation, double duration);                              /**< Make a workstation sleep during a given duration */
   e_surf_resource_state_t(*get_state) (void *workstation);                                      /**< Return the CPU state of a workstation */
-  double (*get_speed) (void *workstation, double load); /**< Return the speed of a workstation */
 
-  double (*get_current_power_peak) (void *workstation);
-  double (*get_power_peak_at) (void *workstation, int pstate_index);
-  int (*get_nb_pstates) (void *workstation);
-  void (*set_power_peak_at) (void *workstation, int pstate_index);
-  double (*get_consumed_energy) (void *workstation);
+  int (*get_core) (void *workstation); 
+  double (*get_speed) (void *workstation, double load);                                    /**< Return the speed of a workstation */
   double (*get_available_speed) (void *workstation);                                       /**< Return tha available speed of a workstation */
+
+  double (*get_current_power_peak) (void *workstation);                                          /**< Return the current CPU speed of a workstation */
+  double (*get_power_peak_at) (void *workstation, int pstate_index);                     /**< Return the speed of a workstation for a specific pstate,
+                                                                                                (where higher pstate values represent lower processor speeds) */
+  int (*get_nb_pstates) (void *workstation);                                             /**< Return the number of pstates defined for a workstation (default is 1) */
+  void (*set_power_peak_at) (void *workstation, int pstate_index);                       /**< Set the processor speed of a workstation to the speed associated with the pstate_index pstate */
+  double (*get_consumed_energy) (void *workstation);                                     /**< Return the total energy consumed by a workstation */
+
    surf_action_t(*communicate) (void *workstation_src,                                     /**< Execute a communication amount between two workstations */
                                 void *workstation_dst, double size,
                                 double max_rate);
@@ -272,13 +274,15 @@ typedef struct surf_workstation_model_extension_public {
                                           double rate);
   double (*get_link_bandwidth) (const void *link);                                         /**< Return the current bandwidth of a network link */
   double (*get_link_latency) (const void *link);                                           /**< Return the current latency of a network link */
-  surf_action_t(*open) (void *workstation, const char* storage, const char* path, const char* mode);
-  surf_action_t(*close) (void *workstation, surf_file_t fp);
-  surf_action_t(*read) (void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream);
-  surf_action_t(*write) (void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream);
-  surf_action_t(*stat) (void *workstation, surf_file_t stream);
-  surf_action_t(*unlink) (void *workstation, surf_file_t stream);
+  surf_action_t(*open) (void *workstation, const char* storage,
+                        const char* path);
+  surf_action_t(*close) (void *workstation, surf_file_t fd);
+  surf_action_t(*read) (void *workstation, size_t size, surf_file_t fd);
+  surf_action_t(*write) (void *workstation, size_t size, surf_file_t fd);
+  surf_action_t(*stat) (void *workstation, surf_file_t fd);
+  int(*unlink) (void *workstation, surf_file_t fd);
   surf_action_t(*ls) (void *workstation, const char* mount, const char *path);
+  size_t (*get_size) (void *workstation, surf_file_t fd);
 
   int (*link_shared) (const void *link);
    xbt_dict_t(*get_properties) (const void *resource);
@@ -634,6 +638,17 @@ XBT_PUBLIC_DATA(s_surf_model_description_t) surf_new_model_description[];
  */
 XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
 
+/*******************************************/
+/*** SURF Platform *************************/
+/*******************************************/
+typedef struct s_as *AS_t;
+
+XBT_PUBLIC_DATA(AS_t) surf_AS_get_routing_root(void); 
+XBT_PUBLIC_DATA(const char *) surf_AS_get_name(AS_t as);
+XBT_PUBLIC_DATA(xbt_dict_t) surf_AS_get_routing_sons(AS_t as);
+XBT_PUBLIC_DATA(const char *) surf_AS_get_model(AS_t as);
+XBT_PUBLIC_DATA(xbt_dynar_t) surf_AS_get_hosts(AS_t as);
+
 /*******************************************/
 /*** SURF Globals **************************/
 /*******************************************/
index a86bcdd..a6d848d 100644 (file)
@@ -22,9 +22,18 @@ XBT_PUBLIC(void) xbt_os_sleep(double sec);
 typedef struct s_xbt_os_timer *xbt_os_timer_t;
 XBT_PUBLIC(xbt_os_timer_t) xbt_os_timer_new(void);
 XBT_PUBLIC(void) xbt_os_timer_free(xbt_os_timer_t timer);
-XBT_PUBLIC(void) xbt_os_timer_start(xbt_os_timer_t timer);
-XBT_PUBLIC(void) xbt_os_timer_resume(xbt_os_timer_t timer);
-XBT_PUBLIC(void) xbt_os_timer_stop(xbt_os_timer_t timer);
 XBT_PUBLIC(double) xbt_os_timer_elapsed(xbt_os_timer_t timer);
 
+
+XBT_PUBLIC(void) xbt_os_walltimer_start(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_walltimer_resume(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_walltimer_stop(xbt_os_timer_t timer);
+
+XBT_PUBLIC(void) xbt_os_cputimer_start(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_cputimer_resume(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_cputimer_stop(xbt_os_timer_t timer);
+
+XBT_PUBLIC(void) xbt_os_threadtimer_start(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_threadtimer_resume(xbt_os_timer_t timer);
+XBT_PUBLIC(void) xbt_os_threadtimer_stop(xbt_os_timer_t timer);
 #endif
index da1efaa..b51f045 100644 (file)
@@ -173,16 +173,16 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   xbt_os_timer_t global_timer = xbt_os_timer_new();
   xbt_os_timer_t timer = xbt_os_timer_new();
 
-  xbt_os_timer_start(global_timer);
+  xbt_os_walltimer_start(global_timer);
 
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare number of processes */
   if(s1->nb_processes != s2->nb_processes){
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
       mc_comp_times->nb_processes_comparison_time =  xbt_os_timer_elapsed(timer);
       XBT_DEBUG("Different number of processes : %d - %d", s1->nb_processes, s2->nb_processes);
       errors++;
@@ -192,7 +192,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
       #endif
 
       xbt_os_timer_free(timer);
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
 
@@ -204,13 +204,13 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   }
 
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare number of bytes used in each heap */
   if(s1->heap_bytes_used != s2->heap_bytes_used){
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
       mc_comp_times->bytes_used_comparison_time = xbt_os_timer_elapsed(timer);
       XBT_DEBUG("Different number of bytes used in each heap : %zu - %zu", s1->heap_bytes_used, s2->heap_bytes_used);
       errors++;
@@ -220,7 +220,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
       #endif
 
       xbt_os_timer_free(timer);
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
 
@@ -231,12 +231,12 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     #endif
   }else{
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
     #endif
   }
   
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
   
   /* Compare size of stacks */
@@ -249,7 +249,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     if(size_used1 != size_used2){
     #ifdef MC_DEBUG
       if(is_diff == 0){
-        xbt_os_timer_stop(timer);
+        xbt_os_walltimer_stop(timer);
         mc_comp_times->stacks_sizes_comparison_time = xbt_os_timer_elapsed(timer);
       }
       XBT_DEBUG("Different size used in stacks : %zu - %zu", size_used1, size_used2);
@@ -261,7 +261,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
       #endif
 
       xbt_os_timer_free(timer);
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
 
@@ -276,15 +276,15 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
 
   #ifdef MC_DEBUG
     if(is_diff == 0)
-      xbt_os_timer_stop(timer);
-    xbt_os_timer_start(timer);
+      xbt_os_walltimer_stop(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare hash of global variables */
   if(s1->hash_global != NULL && s2->hash_global != NULL){
     if(strcmp(s1->hash_global, s2->hash_global) != 0){
       #ifdef MC_DEBUG
-        xbt_os_timer_stop(timer);
+        xbt_os_walltimer_stop(timer);
         mc_comp_times->hash_global_variables_comparison_time = xbt_os_timer_elapsed(timer);
         XBT_DEBUG("Different hash of global variables : %s - %s", s1->hash_global, s2->hash_global); 
         errors++; 
@@ -294,7 +294,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
         #endif
 
         xbt_os_timer_free(timer);
-        xbt_os_timer_stop(global_timer);
+        xbt_os_walltimer_stop(global_timer);
         mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
         xbt_os_timer_free(global_timer);
     
@@ -307,14 +307,14 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   }
 
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare hash of local variables */
   if(s1->hash_local != NULL && s2->hash_local != NULL){
     if(strcmp(s1->hash_local, s2->hash_local) != 0){
       #ifdef MC_DEBUG
-        xbt_os_timer_stop(timer);
+        xbt_os_walltimer_stop(timer);
         mc_comp_times->hash_local_variables_comparison_time = xbt_os_timer_elapsed(timer);
         XBT_DEBUG("Different hash of local variables : %s - %s", s1->hash_local, s2->hash_local); 
         errors++; 
@@ -324,7 +324,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
         #endif
 
         xbt_os_timer_free(timer);
-        xbt_os_timer_stop(global_timer);
+        xbt_os_walltimer_stop(global_timer);
         mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
         xbt_os_timer_free(global_timer);
         
@@ -337,7 +337,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   }
 
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Init heap information used in heap comparison algorithm */
@@ -347,7 +347,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   is_diff = compare_global_variables(2, s1->regions[2]->data, s2->regions[2]->data);
   if(is_diff != 0){
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
       mc_comp_times->binary_global_variables_comparison_time = xbt_os_timer_elapsed(timer);
       XBT_DEBUG("Different global variables in binary"); 
       errors++; 
@@ -358,7 +358,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
 
       reset_heap_information();
       xbt_os_timer_free(timer);
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
     
@@ -371,15 +371,15 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
 
   #ifdef MC_DEBUG
     if(is_diff == 0)
-      xbt_os_timer_stop(timer);
-    xbt_os_timer_start(timer);
+      xbt_os_walltimer_stop(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare libsimgrid global variables */
   is_diff = compare_global_variables(1, s1->regions[1]->data, s2->regions[1]->data);
   if(is_diff != 0){
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
       mc_comp_times->libsimgrid_global_variables_comparison_time = xbt_os_timer_elapsed(timer); 
       XBT_DEBUG("Different global variables in libsimgrid"); 
       errors++; 
@@ -390,7 +390,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
         
       reset_heap_information();
       xbt_os_timer_free(timer);
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
     
@@ -403,8 +403,8 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
 
   #ifdef MC_DEBUG
     if(is_diff == 0)
-      xbt_os_timer_stop(timer);
-    xbt_os_timer_start(timer);
+      xbt_os_walltimer_stop(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Stacks comparison */
@@ -417,7 +417,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     if(diff_local > 0){
       #ifdef MC_DEBUG
         if(is_diff == 0){
-          xbt_os_timer_stop(timer);
+          xbt_os_walltimer_stop(timer);
           mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer); 
         }
         XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
@@ -431,7 +431,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
           
         reset_heap_information();
         xbt_os_timer_free(timer);
-        xbt_os_timer_stop(global_timer);
+        xbt_os_walltimer_stop(global_timer);
         mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
         xbt_os_timer_free(global_timer);
         
@@ -445,14 +445,14 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   }
     
   #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
+    xbt_os_walltimer_start(timer);
   #endif
 
   /* Compare heap */
   if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data)){
 
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
       mc_comp_times->heap_comparison_time = xbt_os_timer_elapsed(timer); 
       XBT_DEBUG("Different heap (mmalloc_compare)");
       errors++;
@@ -465,7 +465,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
       #endif
        
       reset_heap_information();
-      xbt_os_timer_stop(global_timer);
+      xbt_os_walltimer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
 
@@ -476,7 +476,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     #endif
   }else{
     #ifdef MC_DEBUG
-      xbt_os_timer_stop(timer);
+      xbt_os_walltimer_stop(timer);
     #endif
   }
 
@@ -485,7 +485,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   xbt_os_timer_free(timer);
 
   #ifdef MC_VERBOSE
-    xbt_os_timer_stop(global_timer);
+    xbt_os_walltimer_stop(global_timer);
     mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
   #endif
 
index ebb65ea..08990a5 100644 (file)
@@ -395,8 +395,9 @@ void MC_dpor(void)
         MC_SET_RAW_MEM;
         xbt_fifo_shift(mc_stack_safety);
         MC_state_delete(state);
+        XBT_DEBUG("Delete state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1);
         MC_UNSET_RAW_MEM;
-
+        
         max_depth_reached = 0;
       }
       
@@ -427,11 +428,11 @@ void MC_dpor(void)
                 XBT_DEBUG("Dependent Transitions:");
                 prev_req = MC_state_get_executed_request(prev_state, &value);
                 req_str = MC_request_to_string(prev_req, value);
-                XBT_DEBUG("%s (state=%p)", req_str, prev_state);
+                XBT_DEBUG("%s (state=%d)", req_str, prev_state->num);
                 xbt_free(req_str);
                 prev_req = MC_state_get_executed_request(state, &value);
                 req_str = MC_request_to_string(prev_req, value);
-                XBT_DEBUG("%s (state=%p)", req_str, state);
+                XBT_DEBUG("%s (state=%d)", req_str, state->num);
                 xbt_free(req_str);              
               }
 
@@ -447,13 +448,17 @@ void MC_dpor(void)
               XBT_DEBUG("Simcall %d and %d with same issuer", req->call, MC_state_get_internal_request(prev_state)->call);
               break;
 
+            }else{
+
+              XBT_DEBUG("Simcall %d, process %lu (state %d) and simcall %d, process %lu (state %d) are independant", req->call, req->issuer->pid, state->num, MC_state_get_internal_request(prev_state)->call, MC_state_get_internal_request(prev_state)->issuer->pid, prev_state->num);
+
             }
           }
         }
              
         if (MC_state_interleave_size(state) && xbt_fifo_size(mc_stack_safety) < _sg_mc_max_depth) {
           /* We found a back-tracking point, let's loop */
-          XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety) + 1);
+          XBT_DEBUG("Back-tracking to state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1);
           if(_sg_mc_checkpoint){
             if(state->system_state != NULL){
               MC_restore_snapshot(state->system_state);
@@ -481,10 +486,10 @@ void MC_dpor(void)
             MC_UNSET_RAW_MEM;
             MC_replay(mc_stack_safety, -1);
           }
-          XBT_DEBUG("Back-tracking to depth %d", xbt_fifo_size(mc_stack_safety));
+          XBT_DEBUG("Back-tracking to state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety));
           break;
         } else {
-          XBT_DEBUG("Delete state at depth %d",xbt_fifo_size(mc_stack_safety) + 1); 
+          XBT_DEBUG("Delete state %d at depth %d", state->num, xbt_fifo_size(mc_stack_safety) + 1); 
           MC_state_delete(state);
         }
       }
index 9805ce2..7469068 100644 (file)
@@ -120,7 +120,7 @@ extern xbt_dynar_t mc_heap_comparison_ignore;
 extern xbt_dynar_t stacks_areas;
 
 FILE *dot_output = NULL;
-const char* colors[10];
+const char* colors[13];
 
 xbt_automaton_t _mc_property_automaton = NULL;
 
@@ -222,17 +222,22 @@ void MC_init(){
 
 }
 
-void MC_init_dot_output(){
+void MC_init_dot_output(){ /* FIXME : more colors */
 
   colors[0] = "blue";
   colors[1] = "red";
-  colors[2] = "green";
-  colors[3] = "pink";
+  colors[2] = "green3";
+  colors[3] = "goldenrod";
   colors[4] = "brown";
   colors[5] = "purple";
-  colors[6] = "yellow";
-  colors[7] = "orange";
-  
+  colors[6] = "magenta";
+  colors[7] = "turquoise4";
+  colors[8] = "gray25";
+  colors[9] = "forestgreen";
+  colors[10] = "hotpink";
+  colors[11] = "lightblue";
+  colors[12] = "tan";
+
   dot_output = fopen(_sg_mc_dot_output_file, "w");
   
   if(dot_output == NULL){
@@ -654,6 +659,11 @@ void MC_dump_stack_safety(xbt_fifo_t stack)
 
 void MC_show_stack_safety(xbt_fifo_t stack)
 {
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+
   int value;
   mc_state_t state;
   xbt_fifo_item_t item;
@@ -670,6 +680,9 @@ void MC_show_stack_safety(xbt_fifo_t stack)
       xbt_free(req_str);
     }
   }
+
+  if(!raw_mem_set)
+    MC_UNSET_RAW_MEM;
 }
 
 void MC_show_deadlock(smx_simcall_t req)
@@ -684,6 +697,7 @@ void MC_show_deadlock(smx_simcall_t req)
     xbt_free(req_str);*/
   XBT_INFO("Counter-example execution trace:");
   MC_dump_stack_safety(mc_stack_safety);
+  MC_print_statistics(mc_stats);
 }
 
 
index 05336af..a348722 100644 (file)
@@ -68,7 +68,7 @@ int is_stack_ignore_variable(char *frame, char *var_name);
 
 extern double *mc_time;
 extern FILE *dot_output;
-extern const char* colors[10];
+extern const char* colors[13];
 
 int MC_deadlock_check(void);
 void MC_replay(xbt_fifo_t stack, int start);
index 95b4b9e..9ce5f61 100644 (file)
@@ -24,39 +24,43 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) {
   if(r1->call == SIMCALL_COMM_IRECV && r2->call == SIMCALL_COMM_ISEND)
     return FALSE;
 
-  if(   (r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV)
-        &&  r2->call == SIMCALL_COMM_WAIT){
-
-    if(simcall_comm_wait__get__comm(r2)->comm.rdv == NULL)
-      return FALSE;
+  if((r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV)
+     &&  r2->call == SIMCALL_COMM_WAIT){
 
     smx_rdv_t rdv = r1->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r1) : simcall_comm_irecv__get__rdv(r1);
 
-    if((simcall_comm_wait__get__comm(r2)->comm.rdv != rdv) && (simcall_comm_wait__get__timeout(r2) <= 0))
+    if(rdv != simcall_comm_wait__get__comm(r2)->comm.rdv_cpy && simcall_comm_wait__get__timeout(r2) <= 0)
       return FALSE;
 
-    if((simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_SEND) && (r1->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__timeout(r2) <= 0))
+    if((r1->issuer != simcall_comm_wait__get__comm(r2)->comm.src_proc) && (r1->issuer != simcall_comm_wait__get__comm(r2)->comm.dst_proc))
       return FALSE;
 
-    if((simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_RECEIVE) && (r1->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__timeout(r2) <= 0))
+    if((r1->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_SEND) 
+       && (simcall_comm_wait__get__comm(r2)->comm.src_buff != simcall_comm_isend__get__src_buff(r1)))
+      return FALSE;
+
+    if((r1->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_RECEIVE) 
+       && (simcall_comm_wait__get__comm(r2)->comm.dst_buff != simcall_comm_irecv__get__dst_buff(r1)))
       return FALSE;
   }
 
-  if(   (r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV)
+  if((r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV)
         &&  r1->call == SIMCALL_COMM_WAIT){
 
-    if(simcall_comm_wait__get__comm(r1)->comm.rdv != NULL)
-      return FALSE;
-
     smx_rdv_t rdv = r2->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r2) : simcall_comm_irecv__get__rdv(r2);
 
-    if((simcall_comm_wait__get__comm(r1)->comm.rdv != rdv) && (simcall_comm_wait__get__timeout(r1) <= 0))
+    if(rdv != simcall_comm_wait__get__comm(r1)->comm.rdv_cpy && simcall_comm_wait__get__timeout(r1) <= 0)
       return FALSE;
 
-    if((simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_SEND) && (r2->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__timeout(r1) <= 0))
+    if((r2->issuer != simcall_comm_wait__get__comm(r1)->comm.src_proc) && (r2->issuer != simcall_comm_wait__get__comm(r1)->comm.dst_proc))
+        return FALSE;  
+
+    if((r2->call == SIMCALL_COMM_ISEND) && (simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_SEND) 
+       && (simcall_comm_wait__get__comm(r1)->comm.src_buff != simcall_comm_isend__get__src_buff(r2)))
       return FALSE;
 
-    if((simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_RECEIVE) && (r2->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__timeout(r1) <= 0))
+    if((r2->call == SIMCALL_COMM_IRECV) && (simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_RECEIVE) 
+       && (simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_irecv__get__dst_buff(r2)))
       return FALSE;
   }
 
@@ -181,14 +185,20 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     type = xbt_strdup("iSend");
     p = pointer_to_string(simcall_comm_isend__get__src_buff(req));
     bs = buff_size_to_string(simcall_comm_isend__get__src_buff_size(req));
-    args = bprintf("src=%s, buff=%s, size=%s", req->issuer->name, p, bs);
+    if(req->issuer->smx_host)
+      args = bprintf("src=(%lu)%s (%s), buff=%s, size=%s", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), req->issuer->name, p, bs);
+    else
+      args = bprintf("src=(%lu)%s, buff=%s, size=%s", req->issuer->pid, req->issuer->name, p, bs);
     break;
   case SIMCALL_COMM_IRECV:
     size = simcall_comm_irecv__get__dst_buff_size(req) ? *simcall_comm_irecv__get__dst_buff_size(req) : 0;
     type = xbt_strdup("iRecv");
     p = pointer_to_string(simcall_comm_irecv__get__dst_buff(req)); 
     bs = buff_size_to_string(size);
-    args = bprintf("dst=%s, buff=%s, size=%s", req->issuer->name, p, bs);
+    if(req->issuer->smx_host)
+      args = bprintf("dst=(%lu)%s (%s), buff=%s, size=%s", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), req->issuer->name, p, bs);
+    else
+      args = bprintf("dst=(%lu)%s, buff=%s, size=%s", req->issuer->pid, req->issuer->name, p, bs);
     break;
   case SIMCALL_COMM_WAIT:
     act = simcall_comm_wait__get__comm(req);
@@ -199,10 +209,12 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     }else{
       type = xbt_strdup("Wait");
       p = pointer_to_string(act);
-      args  = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p,
+      args  = bprintf("comm=%s [(%lu)%s (%s)-> (%lu)%s (%s)]", p,
                       act->comm.src_proc ? act->comm.src_proc->pid : 0,
+                      act->comm.src_proc ? MSG_host_get_name(act->comm.src_proc->smx_host) : "",
                       act->comm.src_proc ? act->comm.src_proc->name : "",
                       act->comm.dst_proc ? act->comm.dst_proc->pid : 0,
+                      act->comm.dst_proc ? MSG_host_get_name(act->comm.dst_proc->smx_host) : "",
                       act->comm.dst_proc ? act->comm.dst_proc->name : "");
     }
     break;
@@ -215,17 +227,21 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     }else{
       type = xbt_strdup("Test TRUE");
       p = pointer_to_string(act);
-      args  = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p,
-                      act->comm.src_proc->pid, act->comm.src_proc->name,
-                      act->comm.dst_proc->pid, act->comm.dst_proc->name);
+      args  = bprintf("comm=%s [(%lu)%s (%s) -> (%lu)%s (%s)]", p,
+                      act->comm.src_proc->pid, act->comm.src_proc->name, MSG_host_get_name(act->comm.src_proc->smx_host),
+                      act->comm.dst_proc->pid, act->comm.dst_proc->name, MSG_host_get_name(act->comm.dst_proc->smx_host));
     }
     break;
 
   case SIMCALL_COMM_WAITANY:
     type = xbt_strdup("WaitAny");
-    p = pointer_to_string(xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t));
-    args = bprintf("comm=%s (%d of %lu)", p,
-                   value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req)));
+    if(!xbt_dynar_is_empty(simcall_comm_waitany__get__comms(req))){
+      p = pointer_to_string(xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t));
+      args = bprintf("comm=%s (%d of %lu)", p, 
+                     value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req)));
+    }else{
+      args = bprintf("comm at idx %d", value);
+    }
     break;
 
   case SIMCALL_COMM_TESTANY:
@@ -258,11 +274,12 @@ char *MC_request_to_string(smx_simcall_t req, int value)
   }
 
   if(args != NULL){
-    str = bprintf("[(%lu)%s] %s (%s)", req->issuer->pid ,req->issuer->name, type, args);
-    xbt_free(args);
+    str = bprintf("[(%lu)%s (%s)] %s (%s)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args);
   }else{
-    str = bprintf("[(%lu)%s] %s ", req->issuer->pid ,req->issuer->name, type);
+    str = bprintf("[(%lu)%s (%s)] %s ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type);
   }
+
+  xbt_free(args);
   xbt_free(type);
   xbt_free(p);
   xbt_free(bs);
@@ -379,48 +396,103 @@ char *MC_request_get_dot_output(smx_simcall_t req, int value){
 
   switch(req->call){
   case SIMCALL_COMM_ISEND:
-    label = xbt_strdup("iSend");
+    if(req->issuer->smx_host)
+      label = bprintf("[(%lu)%s] iSend", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+    else
+      label = bprintf("[(%lu)] iSend", req->issuer->pid);
     break;
     
   case SIMCALL_COMM_IRECV:
-    label = xbt_strdup("iRecv");
-    break;
- case SIMCALL_COMM_WAIT:
-    if(value == -1)
-      label = xbt_strdup("WaitTimeout");
+    if(req->issuer->smx_host)
+      label = bprintf("[(%lu)%s] iRecv", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
     else
-      label = xbt_strdup("Wait");
+      label = bprintf("[(%lu)] iRecv", req->issuer->pid);
     break;
-
+    
+  case SIMCALL_COMM_WAIT:
+    act = simcall_comm_wait__get__comm(req);
+    if(value == -1){
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] WaitTimeout", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] WaitTimeout", req->issuer->pid);
+    }else{
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] Wait [(%lu)->(%lu)]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), act->comm.src_proc ? act->comm.src_proc->pid : 0, act->comm.dst_proc ? act->comm.dst_proc->pid : 0);
+      else
+        label = bprintf("[(%lu)] Wait [(%lu)->(%lu)]", req->issuer->pid, act->comm.src_proc ? act->comm.src_proc->pid : 0, act->comm.dst_proc ? act->comm.dst_proc->pid : 0);
+    }
+    break;
+    
   case SIMCALL_COMM_TEST:
     act = simcall_comm_test__get__comm(req);
-    if(act->comm.src_proc == NULL || act->comm.dst_proc == NULL)
-      label = xbt_strdup("Test FALSE");
+    if(act->comm.src_proc == NULL || act->comm.dst_proc == NULL){
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] Test FALSE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] Test FALSE", req->issuer->pid);
+    }else{
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] Test TRUE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] Test TRUE", req->issuer->pid);
+    }
+    break;
+
+  case SIMCALL_COMM_WAITANY:
+    if(req->issuer->smx_host)
+      label = bprintf("[(%lu)%s] WaitAny [%d of %lu]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req)));
     else
-      label = xbt_strdup("Test TRUE");
+      label = bprintf("[(%lu)] WaitAny [%d of %lu]", req->issuer->pid, value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req)));
+    break;
+    
+  case SIMCALL_COMM_TESTANY:
+    if(value == -1){
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] TestAny FALSE", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] TestAny FALSE", req->issuer->pid);
+    }else{
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] TestAny TRUE [%d of %lu]", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host), value+1, xbt_dynar_length(simcall_comm_testany__get__comms(req)));
+      else
+        label = bprintf("[(%lu)] TestAny TRUE [%d of %lu]", req->issuer->pid, value+1, xbt_dynar_length(simcall_comm_testany__get__comms(req)));
+    }
     break;
 
   case SIMCALL_MC_RANDOM:
-    if(value == 0)
-      label = xbt_strdup("MC_RANDOM (0)");
-    else
-      label = xbt_strdup("MC_RANDOM (1)");
+    if(value == 0){
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] MC_RANDOM (0)", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] MC_RANDOM (0)", req->issuer->pid);
+    }else{
+      if(req->issuer->smx_host)
+        label = bprintf("[(%lu)%s] MC_RANDOM (1)", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+      else
+        label = bprintf("[(%lu)] MC_RANDOM (1)", req->issuer->pid);
+    }
     break;
 
   case SIMCALL_MC_SNAPSHOT:
-    label = xbt_strdup("MC_SNAPSHOT");
+    if(req->issuer->smx_host)
+      label = bprintf("[(%lu)%s] MC_SNAPSHOT", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+    else
+      label = bprintf("[(%lu)] MC_SNAPSHOT", req->issuer->pid);
     break;
 
   case SIMCALL_MC_COMPARE_SNAPSHOTS:
-    label = xbt_strdup("MC_COMPARE_SNAPSHOTS");
+    if(req->issuer->smx_host)
+      label = bprintf("[(%lu)%s] MC_COMPARE_SNAPSHOTS", req->issuer->pid, MSG_host_get_name(req->issuer->smx_host));
+    else
+      label = bprintf("[(%lu)] MC_COMPARE_SNAPSHOTS", req->issuer->pid);
     break;
 
   default:
     THROW_UNIMPLEMENTED;
   }
 
-  str = bprintf("label = \"%s\", color = %s", label, colors[req->issuer->pid-1]);
+  str = bprintf("label = \"%s\", color = %s, fontcolor = %s", label, colors[req->issuer->pid-1], colors[req->issuer->pid-1]);
   xbt_free(label);
   return str;
 
index 497b254..77c8761 100644 (file)
@@ -48,3 +48,32 @@ void MSG_post_create_environment(void) {
       __MSG_host_create(xbt_dict_cursor_get_elm(cursor));
   }
 }
+
+msg_as_t MSG_environment_get_routing_root() {
+  return surf_AS_get_routing_root();
+}
+
+const char *MSG_environment_as_get_name(msg_as_t as) {
+  return surf_AS_get_name(as);
+}
+
+xbt_dict_t MSG_environment_as_get_routing_sons(msg_as_t as) {
+  xbt_dict_t res = surf_AS_get_routing_sons(as);
+  return res;
+}
+
+const char *MSG_environment_as_get_property_value(msg_as_t as, const char *name)
+{
+  xbt_dict_t dict = xbt_lib_get_or_null(as_router_lib, MSG_environment_as_get_name(as), ROUTING_PROP_ASR_LEVEL);
+  if (dict==NULL)
+    return NULL;
+  return xbt_dict_get_or_null(dict, name);
+}
+
+const char *MSG_environment_as_get_model(msg_as_t as) {
+  return surf_AS_get_model(as);
+}
+
+xbt_dynar_t MSG_environment_as_get_hosts(msg_as_t as) {
+  return surf_AS_get_hosts(as);
+}
index 2a15c45..76df233 100644 (file)
@@ -202,6 +202,17 @@ double MSG_get_host_speed(msg_host_t h)
   return (simcall_host_get_speed(h));
 }
 
+
+/** \ingroup m_host_management
+ * \brief Return the number of core.
+ */
+int MSG_host_get_core_number(msg_host_t h)
+{
+  xbt_assert((h != NULL), "Invalid parameters");
+
+  return (simcall_host_get_core(h));
+}
+
 /** \ingroup m_host_management
  * \brief Returns the value of a given host property
  *
index 1932908..575347b 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. The SimGrid Team.
- * All rights reserved.                                                                  */
+/* Copyright (c) 2004 - 2013. The SimGrid Team.
+ * All rights reserved.                                                       */
 
 /* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package.              */
+ * under the terms of the license (GNU LGPL) which comes with this package.   */
 
 #include "msg_private.h"
 #include "xbt/log.h"
@@ -20,31 +20,27 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
 /********************************* File **************************************/
 
 /** \ingroup msg_file_management
- * \brief Read elements of a file
+ * \brief Read a file
  *
- * \param ptr buffer to where the data is copied
- * \param size of each element
- * \param nmemb is the number of elements of data to read
- * \param stream to read
- * \return the number of items successfully read
+ * \param size of the file to read
+ * \param fd is a the file descriptor
+ * \return the number of bytes successfully read
  */
-double MSG_file_read(void* ptr, size_t size, size_t nmemb,  msg_file_t stream)
+size_t MSG_file_read(size_t size, msg_file_t fd)
 {
-  return simcall_file_read(ptr, size, nmemb, stream->simdata->smx_file);
+  return simcall_file_read(size, fd->simdata->smx_file);
 }
 
 /** \ingroup msg_file_management
- * \brief Write elements into a file
+ * \brief Write into a file
  *
- * \param ptr buffer from where the data is copied
- * \param size of each element
- * \param nmemb is the number of elements of data to write
- * \param stream to write
- * \return the number of items successfully write
+ * \param size of the file to write
+ * \param fd is a the file descriptor
+ * \return the number of bytes successfully write
  */
-size_t MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t stream)
+size_t MSG_file_write(size_t size, msg_file_t fd)
 {
-  return simcall_file_write(ptr, size, nmemb, stream->simdata->smx_file);
+  return simcall_file_write(size, fd->simdata->smx_file);
 }
 
 /** \ingroup msg_file_management
@@ -52,83 +48,53 @@ size_t MSG_file_write(const void* ptr, size_t size, size_t nmemb, msg_file_t str
  *
  * \param mount is the mount point where find the file is located
  * \param path is the file location on the storage
- * \param mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.):
- *      r      Open text file for reading.  The stream is positioned at the beginning of the file.
- *      r+     Open for reading and writing.  The stream is positioned at the beginning of the file.
- *      w      Truncate file to zero length or create text file for writing.  The stream is positioned at the beginning of the file.
- *      w+     Open for reading and writing.  The file is created if it does not exist, otherwise it is truncated.  The stream is positioned at the
- *             beginning of the file.
- *      a      Open for appending (writing at end of file).  The file is created if it does not exist.  The stream is positioned at the end of the file.
- *      a+     Open for reading and appending (writing at end of file).  The file is created if it does not exist.  The initial file position for  reading
- *             is at the beginning of the file, but output is always appended to the end of the file.
  *
  * \return An #msg_file_t associated to the file
  */
-msg_file_t MSG_file_open(const char* mount, const char* path, const char* mode)
+msg_file_t MSG_file_open(const char* mount, const char* path)
 {
   msg_file_t file = xbt_new(s_msg_file_t,1);
-  file->name = strdup(path);
+  file->name = xbt_strdup(path);
   file->simdata = xbt_new0(s_simdata_file_t,1);
-  file->simdata->smx_file = simcall_file_open(mount, path, mode);
+  file->simdata->smx_file = simcall_file_open(mount, path);
   return file;
 }
 
 /** \ingroup msg_file_management
  * \brief Close the file
  *
- * \param fp is the file to close
+ * \param fd is the file to close
  * \return 0 on success or 1 on error
  */
-int MSG_file_close(msg_file_t fp)
+int MSG_file_close(msg_file_t fd)
 {
-  int res = simcall_file_close(fp->simdata->smx_file);
-  free(fp->name);
-  xbt_free(fp->simdata);
-  xbt_free(fp);
+  int res = simcall_file_close(fd->simdata->smx_file);
+  free(fd->name);
+  xbt_free(fd->simdata);
+  xbt_free(fd);
   return res;
 }
 
 /** \ingroup msg_file_management
- * \brief Stats the file pointed by fd
+ * \brief Unlink the file pointed by fd
  *
  * \param fd is the file descriptor (#msg_file_t)
- * \param buf is the return structure with informations
  * \return 0 on success or 1 on error
  */
-int MSG_file_stat(msg_file_t fd, s_msg_stat_t *buf)
-{
-  int res;
-  res = simcall_file_stat(fd->simdata->smx_file, buf);
-  return res;
-}
-
-/** \ingroup msg_file_management
- * \brief Free the stat structure
- *
- * \param stat the #s_msg_stat_t to free
- */
-void MSG_file_free_stat(s_msg_stat_t *stat)
+int MSG_file_unlink(msg_file_t fd)
 {
-  free(stat->date);
-  free(stat->group);
-  free(stat->time);
-  free(stat->user);
-  free(stat->user_rights);
+  return simcall_file_unlink(fd->simdata->smx_file);
 }
 
 /** \ingroup msg_file_management
- * \brief Unlink the file pointed by fd
+ * \brief Return the size of a file
  *
  * \param fd is the file descriptor (#msg_file_t)
- * \return 0 on success or 1 on error
+ * \return the size of the file (as a size_t)
  */
-int MSG_file_unlink(msg_file_t fd)
-{
-  int res = simcall_file_unlink(fd->simdata->smx_file);
-  free(fd->name);
-  xbt_free(fd->simdata);
-  xbt_free(fd);
-  return res;
+
+size_t MSG_file_get_size(msg_file_t fd){
+  return simcall_file_get_size(fd->simdata->smx_file);
 }
 
 /** \ingroup msg_file_management
index 097cfaa..be51825 100644 (file)
@@ -146,7 +146,7 @@ msg_process_t MSG_process_create_with_arguments(const char *name,
    be retrieved with the function \ref MSG_process_get_data.
  * \param host the location where the new process is executed.
  * \param argc first argument passed to \a code
- * \param argv second argument passed to \a code
+ * \param argv second argument passed to \a code. WARNING, these strings are freed by the SimGrid kernel when the process exits, so they cannot be static nor shared between several processes.
  * \param properties list a properties defined for this process
  * \see msg_process_t
  * \return The new corresponding object.
diff --git a/src/msg/msg_synchro.c b/src/msg/msg_synchro.c
new file mode 100644 (file)
index 0000000..f06e6bb
--- /dev/null
@@ -0,0 +1,66 @@
+/* Copyright (c) 2013 Da SimGrid Team. All rights reserved.                 */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "msg_private.h"
+#include "xbt/sysdep.h"
+#include "xbt/log.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_synchro, msg,
+                                "Logging specific to MSG (synchro)");
+
+
+/** @addtogroup msg_synchro
+ *
+ *  @{
+ */
+
+/********************************* Host **************************************/
+
+/** @brief creates a semaphore object of the given initial capacity */
+msg_sem_t MSG_sem_init(int initial_value) {
+  return simcall_sem_init(initial_value);
+}
+
+/** @brief locks on a semaphore object */
+void MSG_sem_acquire(msg_sem_t sem) {
+  simcall_sem_acquire(sem);
+}
+/** @brief locks on a semaphore object up until the provided timeout expires */
+msg_error_t MSG_sem_acquire_timeout(msg_sem_t sem, double timeout) {
+  xbt_ex_t e;
+  msg_error_t res = MSG_OK;
+  TRY {
+    simcall_sem_acquire_timeout(sem,timeout);
+  } CATCH(e) {
+    if (e.category == timeout_error) {
+      res = MSG_TIMEOUT;
+      xbt_ex_free(e);
+    } else {
+      RETHROW;
+    }
+  }
+  return res;
+}
+/** @brief releases the semaphore object */
+void MSG_sem_release(msg_sem_t sem) {
+  simcall_sem_release(sem);
+}
+void MSG_sem_get_capacity(msg_sem_t sem) {
+  simcall_sem_get_capacity(sem);
+}
+
+void MSG_sem_destroy(msg_sem_t sem) {
+  simcall_sem_destroy(sem);
+}
+/** @brief returns a boolean indicating it this semaphore would block at this very specific time
+ *
+ * Note that the returned value may be wrong right after the function call, when you try to use it...
+ * But that's a classical semaphore issue, and SimGrid's semaphore are not different to usual ones here.
+ */
+int MSG_sem_would_block(msg_sem_t sem) {
+  return simcall_sem_would_block(sem);
+}
+
+/**@}*/
index 29803e9..1ef9172 100644 (file)
@@ -361,6 +361,16 @@ xbt_dynar_t SD_daxload(const char *filename)
   xbt_dynar_foreach(result, cpt, file) {
     if (SD_task_get_kind(file) == SD_TASK_COMM_E2E) {
       uniq_transfer_task_name(file);
+    } else if (SD_task_get_kind(file) == SD_TASK_COMP_SEQ){
+      /* If some tasks do not take files as input, connect them to the root, if
+       * they don't produce files, connect them to the end node.
+       */
+      if ((file != root_task) && xbt_dynar_is_empty(file->tasks_before)) {
+        SD_task_dependency_add(NULL, NULL, root_task, file);
+      }
+      if ((file != end_task) && xbt_dynar_is_empty(file->tasks_after)) {
+        SD_task_dependency_add(NULL, NULL, file, end_task);
+      }
     }
   }
 
index 27390bb..4dfa5d3 100644 (file)
@@ -247,6 +247,9 @@ static void _sg_cfg_cb__coll(const char *category,
   /* New Module missing */
   find_coll_description(table, val);
 }
+static void _sg_cfg_cb__coll_gather(const char *name, int pos){
+  _sg_cfg_cb__coll("gather", mpi_coll_gather_description, name, pos);
+}
 static void _sg_cfg_cb__coll_allgather(const char *name, int pos){
   _sg_cfg_cb__coll("allgather", mpi_coll_allgather_description, name, pos);
 }
@@ -273,6 +276,15 @@ static void _sg_cfg_cb__coll_reduce(const char *name, int pos)
 {
   _sg_cfg_cb__coll("reduce", mpi_coll_reduce_description, name, pos);  
 }
+static void _sg_cfg_cb__coll_reduce_scatter(const char *name, int pos){
+  _sg_cfg_cb__coll("reduce_scatter", mpi_coll_reduce_scatter_description, name, pos);
+}
+static void _sg_cfg_cb__coll_scatter(const char *name, int pos){
+  _sg_cfg_cb__coll("scatter", mpi_coll_scatter_description, name, pos);
+}
+static void _sg_cfg_cb__coll_barrier(const char *name, int pos){
+  _sg_cfg_cb__coll("barrier", mpi_coll_barrier_description, name, pos);
+}
 #endif
 
 /* callback of the inclusion path */
@@ -696,6 +708,13 @@ void sg_config_init(int *argc, char **argv)
                      NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/display_timing", default_value);
 
+    default_value = xbt_strdup("yes");
+    xbt_cfg_register(&_sg_cfg_set, "smpi/use_shared_malloc",
+                     "Boolean indicating whether we should use shared memory when using SMPI_SHARED_MALLOC. Allows user to disable it for debug purposes.",
+                     xbt_cfgelm_boolean, &default_value, 1, 1, NULL,
+                     NULL);
+    xbt_cfg_setdefault_boolean(_sg_cfg_set, "smpi/use_shared_malloc", default_value);
+    
     double default_threshold = 1e-6;
     xbt_cfg_register(&_sg_cfg_set, "smpi/cpu_threshold",
                      "Minimal computation time (in seconds) not discarded.",
@@ -754,46 +773,64 @@ void sg_config_init(int *argc, char **argv)
                      xbt_cfgelm_double, &default_iprobe_time, 1, 1, NULL,
                      NULL);
     default_value = xbt_strdup("default");
+    xbt_cfg_register(&_sg_cfg_set, "smpi/coll_selector",
+                    "Which collective selector to use",
+                    xbt_cfgelm_string, &default_value, 1, 1, NULL,
+                    NULL);
+                    
+               xbt_cfg_register(&_sg_cfg_set, "smpi/gather",
+                    "Which collective to use for gather",
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_gather,
+                    NULL);
+                    
     xbt_cfg_register(&_sg_cfg_set, "smpi/allgather",
                     "Which collective to use for allgather",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_allgather,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allgather,
+                    NULL);
+
+    xbt_cfg_register(&_sg_cfg_set, "smpi/barrier",
+                    "Which collective to use for barrier",
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_barrier,
+                    NULL);
+
+    xbt_cfg_register(&_sg_cfg_set, "smpi/reduce_scatter",
+                    "Which collective to use for reduce_scatter",
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_reduce_scatter,
+                    NULL);
+
+    xbt_cfg_register(&_sg_cfg_set, "smpi/scatter",
+                    "Which collective to use for scatter",
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_scatter,
                     NULL);
 
-    default_value = xbt_strdup("default");
     xbt_cfg_register(&_sg_cfg_set, "smpi/allgatherv",
                     "Which collective to use for allgatherv",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_allgatherv,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allgatherv,
                     NULL);
 
-    default_value = xbt_strdup("default");
     xbt_cfg_register(&_sg_cfg_set, "smpi/allreduce",
                     "Which collective to use for allreduce",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_allreduce,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_allreduce,
                     NULL);
 
-    default_value = xbt_strdup("ompi");
     xbt_cfg_register(&_sg_cfg_set, "smpi/alltoall",
                     "Which collective to use for alltoall",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_alltoall,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_alltoall,
                     NULL);
 
-    default_value = xbt_strdup("default");
     xbt_cfg_register(&_sg_cfg_set, "smpi/alltoallv",
                     "Which collective to use for alltoallv",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_alltoallv,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_alltoallv,
                     NULL);
 
-    default_value = xbt_strdup("default");
     xbt_cfg_register(&_sg_cfg_set, "smpi/bcast",
                     "Which collective to use for bcast",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_bcast,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_bcast,
                     NULL);
 
-
-    default_value = xbt_strdup("default");
     xbt_cfg_register(&_sg_cfg_set, "smpi/reduce",
                     "Which collective to use for reduce",
-                    xbt_cfgelm_string, &default_value, 1, 1, &_sg_cfg_cb__coll_reduce,
+                    xbt_cfgelm_string, NULL, 1, 1, &_sg_cfg_cb__coll_reduce,
                     NULL);
 #endif // HAVE_SMPI
 
index f2f0544..59533e9 100644 (file)
@@ -447,9 +447,9 @@ static void smx_ctx_raw_runall_serial(xbt_dynar_t processes)
       time_thread_sr[t] = 0;
     }
 
-    xbt_os_timer_start(timer);
+    xbt_os_cputimer_start(timer);
     smx_ctx_raw_resume(process);
-    xbt_os_timer_stop(timer);
+    xbt_os_cputimer_stop(timer);
     elapsed = xbt_os_timer_elapsed(timer);
     time_thread_ssr[t] += elapsed;
     time_thread_sr[((smx_ctx_raw_t)process->context)->thread] += elapsed;
@@ -524,8 +524,10 @@ static void smx_ctx_raw_suspend_parallel(smx_context_t context)
   else {
     /* all processes were run, go to the barrier */
     XBT_DEBUG("No more processes to run");
+
     unsigned long worker_id =
         (unsigned long) xbt_os_thread_get_specific(raw_worker_id_key);
+
     next_context = (smx_context_t)raw_workers_context[worker_id];
     XBT_DEBUG("Restoring worker stack %lu (working threads = %lu)",
         worker_id, raw_threads_working);
index 3799230..c578d51 100644 (file)
@@ -64,7 +64,7 @@ void SIMIX_global_init(int *argc, char **argv)
 #ifdef TIME_BENCH_AMDAHL
     simix_global->timer_seq = xbt_os_timer_new();
     simix_global->timer_par = xbt_os_timer_new();
-    xbt_os_timer_start(simix_global->timer_seq);
+    xbt_os_cputimer_start(simix_global->timer_seq);
 #endif
     simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL);
     simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL);
@@ -156,7 +156,7 @@ static void SIMIX_clean(void)
   surf_exit();
 
 #ifdef TIME_BENCH_AMDAHL
-  xbt_os_timer_stop(simix_global->timer_seq);
+  xbt_os_cputimer_stop(simix_global->timer_seq);
   XBT_INFO("Amdhal timing informations. Sequential time: %lf; Parallel time: %lf",
            xbt_os_timer_elapsed(simix_global->timer_seq),
            xbt_os_timer_elapsed(simix_global->timer_par));
@@ -226,13 +226,13 @@ void SIMIX_run(void)
 
       /* Run all processes that are ready to run, possibly in parallel */
 #ifdef TIME_BENCH_AMDAHL
-      xbt_os_timer_stop(simix_global->timer_seq);
-      xbt_os_timer_resume(simix_global->timer_par);
+      xbt_os_cputimer_stop(simix_global->timer_seq);
+      xbt_os_cputimer_resume(simix_global->timer_par);
 #endif
       SIMIX_process_runall();
 #ifdef TIME_BENCH_AMDAHL
-      xbt_os_timer_stop(simix_global->timer_par);
-      xbt_os_timer_resume(simix_global->timer_seq);
+      xbt_os_cputimer_stop(simix_global->timer_par);
+      xbt_os_cputimer_resume(simix_global->timer_seq);
 #endif
 
       /* Move all killing processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */
index f22b289..4b67596 100644 (file)
@@ -148,6 +148,18 @@ double SIMIX_host_get_speed(smx_host_t host){
       get_speed(host, 1.0);
 }
 
+int SIMIX_pre_host_get_core(smx_simcall_t simcall, smx_host_t host){
+  return SIMIX_host_get_core(host);
+}
+int SIMIX_host_get_core(smx_host_t host){
+  xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
+
+  return surf_workstation_model->extension.workstation.
+      get_core(host);
+}
+
+
+
 double SIMIX_pre_host_get_available_speed(smx_simcall_t simcall, smx_host_t host){
   return SIMIX_host_get_available_speed(host);
 }
index 1f5ef45..78abd02 100644 (file)
@@ -38,6 +38,7 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host,
 void SIMIX_host_restart_processes(smx_host_t host);
 void SIMIX_host_autorestart(smx_host_t host);
 xbt_dict_t SIMIX_host_get_properties(smx_host_t host);
+int SIMIX_host_get_core(smx_host_t host);
 double SIMIX_host_get_speed(smx_host_t host);
 double SIMIX_host_get_available_speed(smx_host_t host);
 int SIMIX_host_get_state(smx_host_t host);
@@ -64,6 +65,7 @@ smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*);
 const char* SIMIX_pre_host_self_get_name(smx_simcall_t);
 const char* SIMIX_pre_host_get_name(smx_simcall_t, smx_host_t);
 xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t, smx_host_t);
+int SIMIX_pre_host_get_core(smx_simcall_t, smx_host_t);
 double SIMIX_pre_host_get_speed(smx_simcall_t, smx_host_t);
 double SIMIX_pre_host_get_available_speed(smx_simcall_t, smx_host_t);
 int SIMIX_pre_host_get_state(smx_simcall_t, smx_host_t);
index f261620..fa32593 100644 (file)
@@ -5,6 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "smx_private.h"
+#include "surf/storage_private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/dict.h"
@@ -15,15 +16,16 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix,
 
 
 //SIMIX FILE READ
-void SIMIX_pre_file_read(smx_simcall_t simcall, void *ptr, size_t size,
-                        size_t nmemb, smx_file_t stream)
+void SIMIX_pre_file_read(smx_simcall_t simcall, size_t size,
+                       smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_read(simcall->issuer, ptr, size, nmemb, stream);
+  smx_action_t action = SIMIX_file_read(simcall->issuer, size, fd);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+smx_action_t SIMIX_file_read(smx_process_t process, size_t size,
+                             smx_file_t fd)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
@@ -43,7 +45,9 @@ smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.read(host, ptr, size, nmemb, stream->surf_file);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.read(host, size,
+                                                         fd->surf_file);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -52,15 +56,16 @@ smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size
 }
 
 //SIMIX FILE WRITE
-void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size,
-                         size_t nmemb, smx_file_t stream)
+void SIMIX_pre_file_write(smx_simcall_t simcall, size_t size,
+                         smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_write(simcall->issuer, ptr, size, nmemb, stream);
+  smx_action_t action = SIMIX_file_write(simcall->issuer, size, fd);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+smx_action_t SIMIX_file_write(smx_process_t process,
+                              size_t size, smx_file_t fd)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
@@ -80,7 +85,9 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.write(host, ptr, size, nmemb, stream->surf_file);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.write(host, size,
+                                                          fd->surf_file);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -90,14 +97,15 @@ smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t siz
 
 //SIMIX FILE OPEN
 void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
-                        const char* path, const char* mode)
+                         const char* path)
 {
-  smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path, mode);
+  smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const char* path, const char* mode)
+smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
+                             const char* path)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
@@ -117,7 +125,8 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.open(host, mount, path, mode);
+  action->io.surf_io =
+      surf_workstation_model->extension.workstation.open(host, mount, path);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -126,14 +135,14 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, const cha
 }
 
 //SIMIX FILE CLOSE
-void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp)
+void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_close(simcall->issuer, fp);
+  smx_action_t action = SIMIX_file_close(simcall->issuer, fd);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
+smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
@@ -153,7 +162,7 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fp->surf_file);
+  action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fd->surf_file);
 
   surf_workstation_model->action_data_set(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -161,52 +170,15 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp)
   return action;
 }
 
-//SIMIX FILE STAT
-void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf)
-{
-  smx_action_t action = SIMIX_file_stat(simcall->issuer, fd, *buf);
-  xbt_fifo_push(action->simcalls, simcall);
-  simcall->issuer->waiting_action = action;
-}
-
-smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t buf)
-{
-  smx_action_t action;
-  smx_host_t host = process->smx_host;
-  /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
-    THROWF(host_error, 0, "Host %s failed, you cannot call this function",
-           sg_host_name(host));
-  }
-
-  action = xbt_mallocator_get(simix_global->action_mallocator);
-  action->type = SIMIX_ACTION_IO;
-  action->name = NULL;
-#ifdef HAVE_TRACING
-  action->category = NULL;
-#endif
-
-  action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.stat(host, fd->surf_file);
-
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
-  XBT_DEBUG("Create io action %p", action);
-
-  return action;
-}
 
 //SIMIX FILE UNLINK
-void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd)
+int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd)
 {
-  smx_action_t action = SIMIX_file_unlink(simcall->issuer, fd);
-  xbt_fifo_push(action->simcalls, simcall);
-  simcall->issuer->waiting_action = action;
+  return SIMIX_file_unlink(simcall->issuer, fd);
 }
 
-smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
+int SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
 {
-  smx_action_t action;
   smx_host_t host = process->smx_host;
   /* check if the host is active */
   if (surf_workstation_model->extension.
@@ -215,20 +187,11 @@ smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
            sg_host_name(host));
   }
 
-  action = xbt_mallocator_get(simix_global->action_mallocator);
-  action->type = SIMIX_ACTION_IO;
-  action->name = NULL;
-#ifdef HAVE_TRACING
-  action->category = NULL;
-#endif
-
-  action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.unlink(host, fd->surf_file);
-
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
-  XBT_DEBUG("Create io action %p", action);
-
-  return action;
+  if (surf_workstation_model->extension.workstation.unlink(host, fd->surf_file)){
+    fd->surf_file = NULL;
+    return 1;
+  } else
+    return 0;
 }
 
 //SIMIX FILE LS
@@ -264,25 +227,27 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char
   return action;
 }
 
-static void free_file_stat(void *p)
+size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
 {
-  file_stat_t fs = p;
-  xbt_free(fs->date);
-  xbt_free(fs->group);
-  xbt_free(fs->time);
-  xbt_free(fs->user);
-  xbt_free(fs->user_rights);
-  xbt_free(fs);
+  return SIMIX_file_get_size(simcall->issuer, fd);
+}
+
+size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_model->extension.workstation.get_size(host,
+      fd->surf_file);
 }
 
+
 void SIMIX_post_io(smx_action_t action)
 {
   xbt_fifo_item_t i;
   smx_simcall_t simcall;
-  char* key;
-  xbt_dict_cursor_t cursor = NULL;
-  s_file_stat_t *dst = NULL;
-  s_file_stat_t *src = NULL;
+//  char* key;
+//  xbt_dict_cursor_t cursor = NULL;
+//  s_file_stat_t *dst = NULL;
+//  s_file_stat_t *src = NULL;
 
   xbt_fifo_foreach(action->simcalls,i,simcall,smx_simcall_t) {
     switch (simcall->call) {
@@ -293,7 +258,7 @@ void SIMIX_post_io(smx_action_t action)
       break;
 
     case SIMCALL_FILE_CLOSE:
-      xbt_free(simcall_file_close__get__fp(simcall));
+      xbt_free(simcall_file_close__get__fd(simcall));
       simcall_file_close__set__result(simcall, 0);
       break;
 
@@ -305,30 +270,17 @@ void SIMIX_post_io(smx_action_t action)
       simcall_file_read__set__result(simcall, (action->io.surf_io)->cost);
       break;
 
-    case SIMCALL_FILE_STAT:
-      simcall_file_stat__set__result(simcall, 0);
-      dst = simcall_file_stat__get__buf(simcall);
-      src = &((action->io.surf_io)->stat);
-      file_stat_copy(src,dst);
-      break;
-
-    case SIMCALL_FILE_UNLINK:
-      xbt_free(simcall_file_unlink__get__fd(simcall));
-      simcall_file_unlink__set__result(simcall, 0);
-      break;
-
     case SIMCALL_FILE_LS:
-      xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){
-        // if there is a stat we have to duplicate it
-        if(src){
-          dst = xbt_new0(s_file_stat_t,1);
-          file_stat_copy(src, dst);
-          xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,free_file_stat);
-        }
-      }
+//      xbt_dict_foreach((action->io.surf_io)->ls_dict,cursor,key, src){
+//        // if there is a stat we have to duplicate it
+//        if(src){
+//          dst = xbt_new0(s_file_stat_t,1);
+//          file_stat_copy(src, dst);
+//          xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,xbt_free);
+//        }
+//      }
       simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict);
       break;
-
     default:
       break;
     }
index c158322..fbd377a 100644 (file)
 #include "simgrid/simix.h"
 #include "smx_smurf_private.h"
 
-void SIMIX_pre_file_read(smx_simcall_t simcall, void *ptr, size_t size,
-                        size_t nmemb, smx_file_t stream);
-void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size,
-                         size_t nmemb, smx_file_t strea);
+void SIMIX_pre_file_read(smx_simcall_t simcall, size_t size, smx_file_t fd);
+void SIMIX_pre_file_write(smx_simcall_t simcall, size_t size, smx_file_t fd);
 void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
-                        const char* path, const char* mode);
-void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp);
-void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf);
-void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd);
+                        const char* path);
+void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd);
+int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd);
 void SIMIX_pre_file_ls(smx_simcall_t simcall,
                        const char* mount, const char* path);
-
-smx_action_t SIMIX_file_read(smx_process_t process, void* ptr, size_t size, size_t nmemb, smx_file_t stream);
-smx_action_t SIMIX_file_write(smx_process_t process, const void* ptr, size_t size, size_t nmemb, smx_file_t stream);
-smx_action_t SIMIX_file_open(smx_process_t process, const char* storage, const char* path, const char* mode);
-smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp);
-smx_action_t SIMIX_file_stat(smx_process_t process, smx_file_t fd, s_file_stat_t buf);
-smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd);
-smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount, const char *path);
+size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
+
+smx_action_t SIMIX_file_read(smx_process_t process, size_t size,
+                             smx_file_t fd);
+smx_action_t SIMIX_file_write(smx_process_t process, size_t size, 
+                             smx_file_t fd);
+smx_action_t SIMIX_file_open(smx_process_t process, const char* storage,
+                             const char* path);
+smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd);
+int SIMIX_file_unlink(smx_process_t process, smx_file_t fd);
+smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount,
+                           const char *path);
+size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
 
 void SIMIX_post_io(smx_action_t action);
 void SIMIX_io_destroy(smx_action_t action);
index d399b46..3be4eb5 100644 (file)
@@ -199,6 +199,9 @@ smx_action_t SIMIX_fifo_get_comm(xbt_fifo_t fifo, e_smx_comm_type_t type,
       xbt_fifo_remove_item(fifo, item);
       xbt_fifo_free_item(item);
       action->comm.refcount++;
+#ifdef HAVE_MC
+      action->comm.rdv_cpy = action->comm.rdv;
+#endif
       action->comm.rdv = NULL;
       return action;
     }
@@ -400,7 +403,6 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv,
       other_action->state = SIMIX_READY;
       other_action->comm.dst_proc=rdv->permanent_receiver;
       other_action->comm.refcount++;
-      other_action->comm.rdv = rdv;
       xbt_fifo_push(rdv->done_comm_fifo,other_action);
       other_action->comm.rdv=rdv;
       XBT_DEBUG("pushing a message into the permanent receive fifo %p, comm %p \n", rdv, &(other_action->comm));
index 257ea0e..1130ff9 100644 (file)
@@ -75,10 +75,6 @@ typedef struct s_smx_file {
   surf_file_t surf_file;
 } s_smx_file_t;
 
-typedef struct s_smx_stat {
-  s_file_stat_t surf_stat;
-} s_smx_stat_t;
-
 /*********************************** Time ************************************/
 
 /** @brief Timer datatype */
@@ -136,6 +132,12 @@ typedef struct s_smx_action {
     struct {
       e_smx_comm_type_t type;         /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */
       smx_rdv_t rdv;                  /* Rendez-vous where the comm is queued */
+
+#ifdef HAVE_MC
+      smx_rdv_t rdv_cpy;              /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR 
+                                         (comm.rdv set to NULL when the communication is removed from the mailbox 
+                                         (used as garbage collector)) */
+#endif
       int refcount;                   /* Number of processes involved in the cond */
       int detached;                   /* If detached or not */
 
index 542c755..9ae909c 100644 (file)
 ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
 ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \
 ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
+ACTION(SIMCALL_HOST_GET_CORE, host_get_core, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
 ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
 ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
 ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
@@ -344,13 +345,13 @@ ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPE
 ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
 ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \
 ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TDOUBLE(result), TPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path), TSTRING(mode)) sep \
-ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fp, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_STAT, file_stat, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t), TSPEC(buf, s_file_stat_t*)) sep \
-ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TSIZE(result), TSIZE(size), TSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TSIZE(size), TSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path)) sep \
+ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
+ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITH_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
 ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \
+ACTION(SIMCALL_FILE_GET_SIZE, file_get_size, WITH_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t)) sep \
 ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep 
 
 /* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated
index 414b927..aee4eeb 100644 (file)
@@ -456,7 +456,6 @@ void SIMIX_sem_release(smx_sem_t sem)
 
   XBT_DEBUG("Sem release semaphore %p", sem);
   if ((proc = xbt_swag_extract(sem->sleeping))) {
-    proc = xbt_swag_extract(sem->sleeping);
     SIMIX_synchro_destroy(proc->waiting_action);
     proc->waiting_action = NULL;
     SIMIX_simcall_answer(&proc->simcall);
index 448eace..598047b 100644 (file)
@@ -82,6 +82,20 @@ double simcall_host_get_speed(smx_host_t host)
   return simcall_BODY_host_get_speed(host);
 }
 
+/**
+ * \ingroup simix_host_management
+ * \brief Returns the number of core of the processor.
+ *
+ * \param host A SIMIX host
+ * \return The number of core
+ */
+int simcall_host_get_core(smx_host_t host)
+{
+  return simcall_BODY_host_get_core(host);
+}
+
+
+
 /**
  * \ingroup simix_host_management
  * \brief Returns the available speed of the processor.
@@ -1152,63 +1166,61 @@ int simcall_sem_get_capacity(smx_sem_t sem)
  * \ingroup simix_file_management
  *
  */
-double simcall_file_read(void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+size_t simcall_file_read(size_t size, smx_file_t fd)
 {
-  return simcall_BODY_file_read(ptr, size, nmemb, stream);
+  return simcall_BODY_file_read(size, fd);
 }
 
 /**
  * \ingroup simix_file_management
  *
  */
-size_t simcall_file_write(const void* ptr, size_t size, size_t nmemb, smx_file_t stream)
+size_t simcall_file_write(size_t size, smx_file_t fd)
 {
-  return simcall_BODY_file_write(ptr, size, nmemb, stream);
+  return simcall_BODY_file_write(size, fd);
 }
 
 /**
  * \ingroup simix_file_management
  * \brief
  */
-smx_file_t simcall_file_open(const char* mount, const char* path, const char* mode)
+smx_file_t simcall_file_open(const char* mount, const char* path)
 {
-  return simcall_BODY_file_open(mount, path, mode);
+  return simcall_BODY_file_open(mount, path);
 }
 
 /**
  * \ingroup simix_file_management
  *
  */
-int simcall_file_close(smx_file_t fp)
+int simcall_file_close(smx_file_t fd)
 {
-  return simcall_BODY_file_close(fp);  
+  return simcall_BODY_file_close(fd);
 }
 
 /**
  * \ingroup simix_file_management
  *
  */
-int simcall_file_stat(smx_file_t fd, s_file_stat_t *buf)
+int simcall_file_unlink(smx_file_t fd)
 {
-  return simcall_BODY_file_stat(fd, buf);
+  return simcall_BODY_file_unlink(fd);
 }
 
 /**
  * \ingroup simix_file_management
  *
  */
-int simcall_file_unlink(smx_file_t fd)
+xbt_dict_t simcall_file_ls(const char* mount, const char* path)
 {
-  return simcall_BODY_file_unlink(fd);
+  return simcall_BODY_file_ls(mount, path);
 }
-
 /**
  * \ingroup simix_file_management
  *
  */
-xbt_dict_t simcall_file_ls(const char* mount, const char* path)
-{
-  return simcall_BODY_file_ls(mount, path);
+size_t simcall_file_get_size (smx_file_t fd){
+  return simcall_BODY_file_get_size(fd);
 }
 
 #ifdef HAVE_MC
diff --git a/src/smpi/colls/allgather-ompi-neighborexchange.c b/src/smpi/colls/allgather-ompi-neighborexchange.c
new file mode 100644 (file)
index 0000000..238163e
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * ompi_coll_tuned_allgather_intra_neighborexchange
+ *
+ * Function:     allgather using N/2 steps (O(N))
+ * Accepts:      Same arguments as MPI_Allgather
+ * Returns:      MPI_SUCCESS or error code
+ *
+ * Description:  Neighbor Exchange algorithm for allgather.
+ *               Described by Chen et.al. in 
+ *               "Performance Evaluation of Allgather Algorithms on 
+ *                Terascale Linux Cluster with Fast Ethernet",
+ *               Proceedings of the Eighth International Conference on 
+ *               High-Performance Computing inn Asia-Pacific Region
+ *               (HPCASIA'05), 2005
+ * 
+ *               Rank r exchanges message with one of its neighbors and
+ *               forwards the data further in the next step.
+ *
+ *               No additional memory requirements.
+ * 
+ * Limitations:  Algorithm works only on even number of processes.
+ *               For odd number of processes we switch to ring algorithm.
+ * 
+ * Example on 6 nodes:
+ *  Initial state
+ *    #     0      1      2      3      4      5
+ *         [0]    [ ]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [1]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [2]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [3]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [4]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [ ]    [5]
+ *   Step 0:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [ ]    [ ]    [ ]    [ ]
+ *         [1]    [1]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [2]    [2]    [ ]    [ ]
+ *         [ ]    [ ]    [3]    [3]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [4]    [4]
+ *         [ ]    [ ]    [ ]    [ ]    [5]    [5]
+ *   Step 1:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [0]    [ ]    [ ]    [0]
+ *         [1]    [1]    [1]    [ ]    [ ]    [1]
+ *         [ ]    [2]    [2]    [2]    [2]    [ ]
+ *         [ ]    [3]    [3]    [3]    [3]    [ ]
+ *         [4]    [ ]    [ ]    [4]    [4]    [4]
+ *         [5]    [ ]    [ ]    [5]    [5]    [5]
+ *   Step 2:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [0]    [0]    [0]    [0]
+ *         [1]    [1]    [1]    [1]    [1]    [1]
+ *         [2]    [2]    [2]    [2]    [2]    [2]
+ *         [3]    [3]    [3]    [3]    [3]    [3]
+ *         [4]    [4]    [4]    [4]    [4]    [4]
+ *         [5]    [5]    [5]    [5]    [5]    [5]
+ */
+ #include "colls_private.h"
+ #define MCA_COLL_BASE_TAG_ALLGATHER 555
+int 
+smpi_coll_tuned_allgather_ompi_neighborexchange(void *sbuf, int scount,
+                                                 MPI_Datatype sdtype,
+                                                 void* rbuf, int rcount,
+                                                 MPI_Datatype rdtype,
+                                                 MPI_Comm comm
+)
+{
+   int line = -1;
+   int rank, size;
+   int neighbor[2], offset_at_step[2], recv_data_from[2], send_data_from;
+   int i, even_rank;
+   int err = 0;
+   ptrdiff_t slb, rlb, sext, rext;
+   char *tmpsend = NULL, *tmprecv = NULL;
+
+   size = smpi_comm_size(comm);
+   rank = smpi_comm_rank(comm);
+
+   if (size % 2) {
+      XBT_DEBUG(
+                   "coll:tuned:allgather_intra_neighborexchange WARNING: odd size %d, switching to ring algorithm", 
+                   size);
+      return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype,
+                                                  rbuf, rcount, rdtype,
+                                                  comm);
+   }
+
+   XBT_DEBUG(
+                "coll:tuned:allgather_intra_neighborexchange rank %d", rank);
+
+   err = smpi_datatype_extent (sdtype, &slb, &sext);
+   if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+   err = smpi_datatype_extent (rdtype, &rlb, &rext);
+   if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+   /* Initialization step:
+      - if send buffer is not MPI_IN_PLACE, copy send buffer to appropriate block
+        of receive buffer
+   */
+   tmprecv = (char*) rbuf + rank * rcount * rext;
+   if (MPI_IN_PLACE != sbuf) {
+      tmpsend = (char*) sbuf;
+      smpi_datatype_copy (tmpsend, scount, sdtype, tmprecv, rcount, rdtype);
+   } 
+
+   /* Determine neighbors, order in which blocks will arrive, etc. */
+   even_rank = !(rank % 2);
+   if (even_rank) {
+      neighbor[0] = (rank + 1) % size;
+      neighbor[1] = (rank - 1 + size) % size;
+      recv_data_from[0] = rank;
+      recv_data_from[1] = rank;
+      offset_at_step[0] = (+2);
+      offset_at_step[1] = (-2);
+   } else {
+      neighbor[0] = (rank - 1 + size) % size;
+      neighbor[1] = (rank + 1) % size;
+      recv_data_from[0] = neighbor[0];
+      recv_data_from[1] = neighbor[0];
+      offset_at_step[0] = (-2);
+      offset_at_step[1] = (+2);
+   }
+
+   /* Communication loop:
+      - First step is special: exchange a single block with neighbor[0].
+      - Rest of the steps: 
+        update recv_data_from according to offset, and 
+        exchange two blocks with appropriate neighbor.
+        the send location becomes previous receve location.
+   */
+   tmprecv = (char*)rbuf + neighbor[0] * rcount * rext;
+   tmpsend = (char*)rbuf + rank * rcount * rext;
+   /* Sendreceive */
+   smpi_mpi_sendrecv(tmpsend, rcount, rdtype, neighbor[0],
+                                  MCA_COLL_BASE_TAG_ALLGATHER,
+                                  tmprecv, rcount, rdtype, neighbor[0],
+                                  MCA_COLL_BASE_TAG_ALLGATHER,
+                                  comm, MPI_STATUS_IGNORE);
+
+   /* Determine initial sending location */
+   if (even_rank) {
+      send_data_from = rank;
+   } else {
+      send_data_from = recv_data_from[0];
+   }
+
+   for (i = 1; i < (size / 2); i++) {
+      const int i_parity = i % 2;
+      recv_data_from[i_parity] = 
+         (recv_data_from[i_parity] + offset_at_step[i_parity] + size) % size;
+
+      tmprecv = (char*)rbuf + recv_data_from[i_parity] * rcount * rext;
+      tmpsend = (char*)rbuf + send_data_from * rcount * rext;
+      
+      /* Sendreceive */
+      smpi_mpi_sendrecv(tmpsend, 2 * rcount, rdtype, 
+                                     neighbor[i_parity], 
+                                     MCA_COLL_BASE_TAG_ALLGATHER,
+                                     tmprecv, 2 * rcount, rdtype,
+                                     neighbor[i_parity],
+                                     MCA_COLL_BASE_TAG_ALLGATHER,
+                                     comm, MPI_STATUS_IGNORE);
+
+      send_data_from = recv_data_from[i_parity];
+   }
+
+   return MPI_SUCCESS;
+
+ err_hndl:
+   XBT_DEBUG( "%s:%4d\tError occurred %d, rank %2d",
+                __FILE__, line, err, rank);
+   return err;
+}
diff --git a/src/smpi/colls/allgatherv-mpich-rdb.c b/src/smpi/colls/allgatherv-mpich-rdb.c
new file mode 100644 (file)
index 0000000..3a65b30
--- /dev/null
@@ -0,0 +1,211 @@
+        /* Short or medium size message and power-of-two no. of processes. Use
+         * recursive doubling algorithm */   
+#include "colls_private.h"
+#define MPIR_ALLGATHERV_TAG 222
+int smpi_coll_tuned_allgatherv_mpich_rdb ( 
+    void *sendbuf,
+    int sendcount,
+    MPI_Datatype sendtype,
+    void *recvbuf,
+    int *recvcounts,
+    int *displs,
+    MPI_Datatype recvtype,
+    MPI_Comm comm)
+{
+    int        comm_size, rank, j, i;
+    MPI_Status status;
+    MPI_Aint  recvtype_extent, recvtype_true_extent, recvtype_true_lb;
+    int curr_cnt, dst, total_count; 
+    void *tmp_buf;
+    int mask, dst_tree_root, my_tree_root, is_homogeneous, position,  
+        send_offset, recv_offset, last_recv_cnt=0, nprocs_completed, k,
+        offset, tmp_mask, tree_root;
+
+    comm_size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+    
+    total_count = 0;
+    for (i=0; i<comm_size; i++)
+        total_count += recvcounts[i];
+
+    if (total_count == 0) return MPI_ERR_COUNT;
+    
+    recvtype_extent=smpi_datatype_get_extent( recvtype);
+
+        is_homogeneous = 1;
+        
+        if (is_homogeneous) {
+            /* need to receive contiguously into tmp_buf because
+               displs could make the recvbuf noncontiguous */
+
+            smpi_datatype_extent(recvtype, &recvtype_true_lb, &recvtype_true_extent);
+
+            tmp_buf= (void*)xbt_malloc(total_count*(max(recvtype_true_extent,recvtype_extent)));
+
+            /* adjust for potential negative lower bound in datatype */
+            tmp_buf = (void *)((char*)tmp_buf - recvtype_true_lb);
+
+            /* copy local data into right location in tmp_buf */ 
+            position = 0;
+            for (i=0; i<rank; i++) position += recvcounts[i];
+            if (sendbuf != MPI_IN_PLACE)
+           {
+                smpi_datatype_copy(sendbuf, sendcount, sendtype,
+                                           ((char *)tmp_buf + position*
+                                            recvtype_extent), 
+                                           recvcounts[rank], recvtype);
+           }
+            else
+           {
+                /* if in_place specified, local data is found in recvbuf */ 
+                smpi_datatype_copy(((char *)recvbuf +
+                                            displs[rank]*recvtype_extent), 
+                                           recvcounts[rank], recvtype,
+                                           ((char *)tmp_buf + position*
+                                            recvtype_extent), 
+                                           recvcounts[rank], recvtype);
+    }
+            curr_cnt = recvcounts[rank];
+            
+            mask = 0x1;
+            i = 0;
+            while (mask < comm_size) {
+                dst = rank ^ mask;
+                
+                /* find offset into send and recv buffers. zero out 
+                   the least significant "i" bits of rank and dst to 
+                   find root of src and dst subtrees. Use ranks of 
+                   roots as index to send from and recv into buffer */ 
+                
+                dst_tree_root = dst >> i;
+                dst_tree_root <<= i;
+                
+                my_tree_root = rank >> i;
+                my_tree_root <<= i;
+                
+                if (dst < comm_size) {
+                    send_offset = 0;
+                    for (j=0; j<my_tree_root; j++)
+                        send_offset += recvcounts[j];
+                    
+                    recv_offset = 0;
+                    for (j=0; j<dst_tree_root; j++)
+                        recv_offset += recvcounts[j];
+
+                    smpi_mpi_sendrecv(((char *)tmp_buf + send_offset * recvtype_extent),
+                                                 curr_cnt, recvtype, dst,
+                                                 MPIR_ALLGATHERV_TAG,  
+                                                 ((char *)tmp_buf + recv_offset * recvtype_extent),
+                                                 total_count - recv_offset, recvtype, dst,
+                                                 MPIR_ALLGATHERV_TAG,
+                                                 comm, &status);
+                        /* for convenience, recv is posted for a bigger amount
+                           than will be sent */
+                        last_recv_cnt=smpi_mpi_get_count(&status, recvtype);
+                    curr_cnt += last_recv_cnt;
+                }
+                
+                /* if some processes in this process's subtree in this step
+                   did not have any destination process to communicate with
+                   because of non-power-of-two, we need to send them the
+                   data that they would normally have received from those
+                   processes. That is, the haves in this subtree must send to
+                   the havenots. We use a logarithmic
+                   recursive-halfing algorithm for this. */
+                
+                /* This part of the code will not currently be
+                 executed because we are not using recursive
+                 doubling for non power of two. Mark it as experimental
+                 so that it doesn't show up as red in the coverage
+                 tests. */  
+
+               /* --BEGIN EXPERIMENTAL-- */
+                if (dst_tree_root + mask > comm_size) {
+                    nprocs_completed = comm_size - my_tree_root - mask;
+                    /* nprocs_completed is the number of processes in this
+                       subtree that have all the data. Send data to others
+                       in a tree fashion. First find root of current tree
+                       that is being divided into two. k is the number of
+                       least-significant bits in this process's rank that
+                       must be zeroed out to find the rank of the root */ 
+                    j = mask;
+                    k = 0;
+                    while (j) {
+                        j >>= 1;
+                        k++;
+                    }
+                    k--;
+                    
+                    tmp_mask = mask >> 1;
+                    
+                    while (tmp_mask) {
+                        dst = rank ^ tmp_mask;
+                        
+                        tree_root = rank >> k;
+                        tree_root <<= k;
+                        
+                        /* send only if this proc has data and destination
+                           doesn't have data. at any step, multiple processes
+                           can send if they have the data */
+                        if ((dst > rank) && 
+                            (rank < tree_root + nprocs_completed)
+                            && (dst >= tree_root + nprocs_completed)) {
+
+                            offset = 0;
+                            for (j=0; j<(my_tree_root+mask); j++)
+                                offset += recvcounts[j];
+                            offset *= recvtype_extent;
+
+                            smpi_mpi_send(((char *)tmp_buf + offset),
+                                                     last_recv_cnt,
+                                                     recvtype, dst,
+                                                     MPIR_ALLGATHERV_TAG, comm);
+                            /* last_recv_cnt was set in the previous
+                               receive. that's the amount of data to be
+                               sent now. */
+                        }
+                        /* recv only if this proc. doesn't have data and sender
+                           has data */
+                        else if ((dst < rank) && 
+                                 (dst < tree_root + nprocs_completed) &&
+                                 (rank >= tree_root + nprocs_completed)) {
+
+                            offset = 0;
+                            for (j=0; j<(my_tree_root+mask); j++)
+                                offset += recvcounts[j];
+
+                            smpi_mpi_recv(((char *)tmp_buf + offset * recvtype_extent),
+                                                     total_count - offset, recvtype,
+                                                     dst, MPIR_ALLGATHERV_TAG,
+                                                     comm, &status);
+                                /* for convenience, recv is posted for a
+                                   bigger amount than will be sent */
+                                last_recv_cnt=smpi_mpi_get_count(&status, recvtype);
+                            curr_cnt += last_recv_cnt;
+                        }
+                        tmp_mask >>= 1;
+                        k--;
+                    }
+                }
+               /* --END EXPERIMENTAL-- */
+                
+                mask <<= 1;
+                i++;
+            }
+
+            /* copy data from tmp_buf to recvbuf */
+            position = 0;
+            for (j=0; j<comm_size; j++) {
+                if ((sendbuf != MPI_IN_PLACE) || (j != rank)) {
+                    /* not necessary to copy if in_place and
+                       j==rank. otherwise copy. */
+                    smpi_datatype_copy(((char *)tmp_buf + position*recvtype_extent),
+                                               recvcounts[j], recvtype,
+                                               ((char *)recvbuf + displs[j]*recvtype_extent),
+                                               recvcounts[j], recvtype);
+                }
+                position += recvcounts[j];
+            }
+        }
+return MPI_SUCCESS;
+}
diff --git a/src/smpi/colls/allgatherv-ompi-bruck.c b/src/smpi/colls/allgatherv-ompi-bruck.c
new file mode 100644 (file)
index 0000000..420f430
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2009 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2009      University of Houston. All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#define  MCA_COLL_BASE_TAG_ALLGATHERV 444
+/*
+ * ompi_coll_tuned_allgatherv_intra_bruck
+ *
+ * Function:     allgather using O(log(N)) steps.
+ * Accepts:      Same arguments as MPI_Allgather
+ * Returns:      MPI_SUCCESS or error code
+ *
+ * Description:  Variation to All-to-all algorithm described by Bruck et al.in
+ *               "Efficient Algorithms for All-to-all Communications
+ *                in Multiport Message-Passing Systems"
+ * Note:         Unlike in case of allgather implementation, we relay on
+ *               indexed datatype to select buffers appropriately.
+ *               The only additional memory requirement is for creation of 
+ *               temporary datatypes.
+ * Example on 7 nodes (memory lay out need not be in-order)
+ *   Initial set up:
+ *    #     0      1      2      3      4      5      6
+ *         [0]    [ ]    [ ]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [1]    [ ]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [2]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [3]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [4]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [ ]    [5]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [ ]    [ ]    [6]
+ *   Step 0: send message to (rank - 2^0), receive message from (rank + 2^0)
+ *    #     0      1      2      3      4      5      6
+ *         [0]    [ ]    [ ]    [ ]    [ ]    [ ]    [0]
+ *         [1]    [1]    [ ]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [2]    [2]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [3]    [3]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [4]    [4]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [5]    [5]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [ ]    [6]    [6]
+ *   Step 1: send message to (rank - 2^1), receive message from (rank + 2^1).
+ *           message contains all blocks from (rank) .. (rank + 2^2) with 
+ *           wrap around.
+ *    #     0      1      2      3      4      5      6
+ *         [0]    [ ]    [ ]    [ ]    [0]    [0]    [0]
+ *         [1]    [1]    [ ]    [ ]    [ ]    [1]    [1]
+ *         [2]    [2]    [2]    [ ]    [ ]    [ ]    [2]
+ *         [3]    [3]    [3]    [3]    [ ]    [ ]    [ ]
+ *         [ ]    [4]    [4]    [4]    [4]    [ ]    [ ]
+ *         [ ]    [ ]    [5]    [5]    [5]    [5]    [ ]
+ *         [ ]    [ ]    [ ]    [6]    [6]    [6]    [6]
+ *   Step 2: send message to (rank - 2^2), receive message from (rank + 2^2).
+ *           message size is "all remaining blocks" 
+ *    #     0      1      2      3      4      5      6
+ *         [0]    [0]    [0]    [0]    [0]    [0]    [0]
+ *         [1]    [1]    [1]    [1]    [1]    [1]    [1]
+ *         [2]    [2]    [2]    [2]    [2]    [2]    [2]
+ *         [3]    [3]    [3]    [3]    [3]    [3]    [3]
+ *         [4]    [4]    [4]    [4]    [4]    [4]    [4]
+ *         [5]    [5]    [5]    [5]    [5]    [5]    [5]
+ *         [6]    [6]    [6]    [6]    [6]    [6]    [6]
+ */
+int smpi_coll_tuned_allgatherv_ompi_bruck(void *sbuf, int scount,
+                                           MPI_Datatype sdtype,
+                                           void *rbuf, int *rcounts,
+                                           int *rdispls, 
+                                           MPI_Datatype rdtype,
+                                           MPI_Comm comm)
+{
+   int rank, size;
+   int sendto, recvfrom, distance, blockcount, i;
+   int *new_rcounts = NULL, *new_rdispls = NULL;
+   int *new_scounts = NULL, *new_sdispls = NULL;
+   ptrdiff_t slb, rlb, sext, rext;
+   char *tmpsend = NULL, *tmprecv = NULL;
+   MPI_Datatype new_rdtype, new_sdtype;
+
+   size = smpi_comm_size(comm);
+   rank = smpi_comm_rank(comm);
+
+   XBT_DEBUG(
+                "coll:tuned:allgather_ompi_bruck rank %d", rank);
+   
+   smpi_datatype_extent (sdtype, &slb, &sext);
+
+   smpi_datatype_extent (rdtype, &rlb, &rext);
+
+   /* Initialization step:
+      - if send buffer is not MPI_IN_PLACE, copy send buffer to block rank of 
+        the receive buffer.
+   */
+   tmprecv = (char*) rbuf + rdispls[rank] * rext;
+   if (MPI_IN_PLACE != sbuf) {
+      tmpsend = (char*) sbuf;
+      smpi_datatype_copy(tmpsend, scount, sdtype, 
+                            tmprecv, rcounts[rank], rdtype);
+   }
+   
+   /* Communication step:
+      At every step i, rank r:
+      - doubles the distance
+      - sends message with blockcount blocks, (rbuf[rank] .. rbuf[rank + 2^i])
+        to rank (r - distance)
+      - receives message of blockcount blocks, 
+        (rbuf[r + distance] ... rbuf[(r+distance) + 2^i]) from 
+        rank (r + distance)
+      - blockcount doubles until the last step when only the remaining data is 
+      exchanged.
+   */
+   blockcount = 1;
+   tmpsend = (char*) rbuf;
+
+   new_rcounts = (int*) calloc(4*size, sizeof(int));
+   new_rdispls = new_rcounts + size;
+   new_scounts = new_rdispls + size;
+   new_sdispls = new_scounts + size;
+
+   for (distance = 1; distance < size; distance<<=1) {
+
+      recvfrom = (rank + distance) % size;
+      sendto = (rank - distance + size) % size;
+
+      if (distance <= (size >> 1)) {
+         blockcount = distance;
+      } else { 
+         blockcount = size - distance;
+      }
+
+      /* create send and receive datatypes */
+      for (i = 0; i < blockcount; i++) {
+          const int tmp_srank = (rank + i) % size;
+          const int tmp_rrank = (recvfrom + i) % size;
+          new_scounts[i] = rcounts[tmp_srank];
+          new_sdispls[i] = rdispls[tmp_srank];
+          new_rcounts[i] = rcounts[tmp_rrank];
+          new_rdispls[i] = rdispls[tmp_rrank];
+      }
+      smpi_datatype_indexed(blockcount, new_scounts, new_sdispls, 
+                                    rdtype, &new_sdtype);
+      smpi_datatype_indexed(blockcount, new_rcounts, new_rdispls,
+                                    rdtype, &new_rdtype);
+
+      smpi_datatype_commit(&new_sdtype);
+      smpi_datatype_commit(&new_rdtype);
+
+      /* Sendreceive */
+      smpi_mpi_sendrecv(rbuf, 1, new_sdtype, sendto,
+                                     MCA_COLL_BASE_TAG_ALLGATHERV,
+                                     rbuf, 1, new_rdtype, recvfrom,
+                                     MCA_COLL_BASE_TAG_ALLGATHERV,
+                                     comm, MPI_STATUS_IGNORE);
+      smpi_datatype_free(&new_sdtype);
+      smpi_datatype_free(&new_rdtype);
+
+   }
+
+   free(new_rcounts);
+
+   return MPI_SUCCESS;
+
+}
+
diff --git a/src/smpi/colls/allgatherv-ompi-neighborexchange.c b/src/smpi/colls/allgatherv-ompi-neighborexchange.c
new file mode 100644 (file)
index 0000000..f80e681
--- /dev/null
@@ -0,0 +1,214 @@
+
+/*
+ * ompi_coll_tuned_allgatherv_intra_neighborexchange
+ *
+ * Function:     allgatherv using N/2 steps (O(N))
+ * Accepts:      Same arguments as MPI_Allgatherv
+ * Returns:      MPI_SUCCESS or error code
+ *
+ * Description:  Neighbor Exchange algorithm for allgather adapted for 
+ *               allgatherv.
+ *               Described by Chen et.al. in 
+ *               "Performance Evaluation of Allgather Algorithms on 
+ *                Terascale Linux Cluster with Fast Ethernet",
+ *               Proceedings of the Eighth International Conference on 
+ *               High-Performance Computing inn Asia-Pacific Region
+ *               (HPCASIA'05), 2005
+ * 
+ *               Rank r exchanges message with one of its neighbors and
+ *               forwards the data further in the next step.
+ *
+ *               No additional memory requirements.
+ * 
+ * Limitations:  Algorithm works only on even number of processes.
+ *               For odd number of processes we switch to ring algorithm.
+ * 
+ * Example on 6 nodes:
+ *  Initial state
+ *    #     0      1      2      3      4      5
+ *         [0]    [ ]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [1]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [2]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [3]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [4]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [ ]    [5]
+ *   Step 0:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [ ]    [ ]    [ ]    [ ]
+ *         [1]    [1]    [ ]    [ ]    [ ]    [ ]
+ *         [ ]    [ ]    [2]    [2]    [ ]    [ ]
+ *         [ ]    [ ]    [3]    [3]    [ ]    [ ]
+ *         [ ]    [ ]    [ ]    [ ]    [4]    [4]
+ *         [ ]    [ ]    [ ]    [ ]    [5]    [5]
+ *   Step 1:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [0]    [ ]    [ ]    [0]
+ *         [1]    [1]    [1]    [ ]    [ ]    [1]
+ *         [ ]    [2]    [2]    [2]    [2]    [ ]
+ *         [ ]    [3]    [3]    [3]    [3]    [ ]
+ *         [4]    [ ]    [ ]    [4]    [4]    [4]
+ *         [5]    [ ]    [ ]    [5]    [5]    [5]
+ *   Step 2:
+ *    #     0      1      2      3      4      5
+ *         [0]    [0]    [0]    [0]    [0]    [0]
+ *         [1]    [1]    [1]    [1]    [1]    [1]
+ *         [2]    [2]    [2]    [2]    [2]    [2]
+ *         [3]    [3]    [3]    [3]    [3]    [3]
+ *         [4]    [4]    [4]    [4]    [4]    [4]
+ *         [5]    [5]    [5]    [5]    [5]    [5]
+ */
+ #include "colls_private.h"
+ #define  MCA_COLL_BASE_TAG_ALLGATHERV 444
+int 
+smpi_coll_tuned_allgatherv_ompi_neighborexchange(void *sbuf, int scount,
+                                                  MPI_Datatype sdtype,
+                                                  void* rbuf, int *rcounts, int *rdispls,
+                                                  MPI_Datatype rdtype,
+                                                  MPI_Comm comm)
+{
+    int line = -1;
+    int rank, size;
+    int neighbor[2], offset_at_step[2], recv_data_from[2], send_data_from;
+  
+    int i, even_rank;
+    int err = 0;
+    ptrdiff_t slb, rlb, sext, rext;
+    char *tmpsend = NULL, *tmprecv = NULL;
+
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    if (size % 2) {
+        XBT_DEBUG(
+                     "coll:tuned:allgatherv_ompi_neighborexchange WARNING: odd size %d, switching to ring algorithm", 
+                     size);
+        return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype,
+                                                     rbuf, rcounts, 
+                                                     rdispls, rdtype,
+                                                     comm);
+    }
+
+    XBT_DEBUG(
+                 "coll:tuned:allgatherv_ompi_neighborexchange rank %d", rank);
+
+    err = smpi_datatype_extent (sdtype, &slb, &sext);
+    if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+    err = smpi_datatype_extent (rdtype, &rlb, &rext);
+    if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+    /* Initialization step:
+       - if send buffer is not MPI_IN_PLACE, copy send buffer to 
+       the appropriate block of receive buffer
+    */
+    tmprecv = (char*) rbuf + rdispls[rank] * rext;
+    if (MPI_IN_PLACE != sbuf) {
+        tmpsend = (char*) sbuf;
+        err = smpi_datatype_copy(tmpsend, scount, sdtype, 
+                              tmprecv, rcounts[rank], rdtype);
+        if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl;  }
+    } 
+
+    /* Determine neighbors, order in which blocks will arrive, etc. */
+    even_rank = !(rank % 2);
+    if (even_rank) {
+        neighbor[0] = (rank + 1) % size;
+        neighbor[1] = (rank - 1 + size) % size;
+        recv_data_from[0] = rank;
+        recv_data_from[1] = rank;
+        offset_at_step[0] = (+2);
+        offset_at_step[1] = (-2);
+    } else {
+        neighbor[0] = (rank - 1 + size) % size;
+        neighbor[1] = (rank + 1) % size;
+        recv_data_from[0] = neighbor[0];
+        recv_data_from[1] = neighbor[0];
+        offset_at_step[0] = (-2);
+        offset_at_step[1] = (+2);
+    }
+
+    /* Communication loop:
+       - First step is special: exchange a single block with neighbor[0].
+       - Rest of the steps: 
+       update recv_data_from according to offset, and 
+       exchange two blocks with appropriate neighbor.
+       the send location becomes previous receve location.
+       Note, we need to create indexed datatype to send and receive these
+       blocks properly.
+    */
+    tmprecv = (char*)rbuf + rdispls[neighbor[0]] * rext;
+    tmpsend = (char*)rbuf + rdispls[rank] * rext;
+    smpi_mpi_sendrecv(tmpsend, rcounts[rank], rdtype, 
+                                   neighbor[0], MCA_COLL_BASE_TAG_ALLGATHERV,
+                                   tmprecv, rcounts[neighbor[0]], rdtype, 
+                                   neighbor[0], MCA_COLL_BASE_TAG_ALLGATHERV,
+                                   comm, MPI_STATUS_IGNORE);
+
+
+
+  
+   
+    /* Determine initial sending counts and displacements*/
+    if (even_rank) {
+        send_data_from = rank;
+    } else {
+        send_data_from = recv_data_from[0];
+    }
+
+    for (i = 1; i < (size / 2); i++) {
+        MPI_Datatype new_rdtype, new_sdtype;
+        int new_scounts[2], new_sdispls[2], new_rcounts[2], new_rdispls[2];
+        const int i_parity = i % 2;
+        recv_data_from[i_parity] = 
+            (recv_data_from[i_parity] + offset_at_step[i_parity] + size) % size;
+
+        /* Create new indexed types for sending and receiving.
+           We are sending data from ranks (send_data_from) and (send_data_from+1)
+           We are receiving data from ranks (recv_data_from[i_parity]) and
+           (recv_data_from[i_parity]+1).
+        */
+        
+        new_scounts[0] = rcounts[send_data_from];
+        new_scounts[1] = rcounts[(send_data_from + 1)];
+        new_sdispls[0] = rdispls[send_data_from];
+        new_sdispls[1] = rdispls[(send_data_from + 1)];
+        err = smpi_datatype_indexed(2, new_scounts, new_sdispls, rdtype, 
+                                      &new_sdtype);
+        if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+        smpi_datatype_commit(&new_sdtype);
+
+        new_rcounts[0] = rcounts[recv_data_from[i_parity]];
+        new_rcounts[1] = rcounts[(recv_data_from[i_parity] + 1)];
+        new_rdispls[0] = rdispls[recv_data_from[i_parity]];
+        new_rdispls[1] = rdispls[(recv_data_from[i_parity] + 1)];
+        err = smpi_datatype_indexed(2, new_rcounts, new_rdispls, rdtype, 
+                                      &new_rdtype);
+        if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+        smpi_datatype_commit(&new_rdtype);
+      
+        tmprecv = (char*)rbuf;
+        tmpsend = (char*)rbuf;
+      
+        /* Sendreceive */
+        smpi_mpi_sendrecv(tmpsend, 1, new_sdtype, neighbor[i_parity],
+                                       MCA_COLL_BASE_TAG_ALLGATHERV,
+                                       tmprecv, 1, new_rdtype, neighbor[i_parity],
+                                       MCA_COLL_BASE_TAG_ALLGATHERV,
+                                       comm, MPI_STATUS_IGNORE);
+
+        send_data_from = recv_data_from[i_parity];
+      
+        smpi_datatype_free(&new_sdtype);
+        smpi_datatype_free(&new_rdtype);
+    }
+
+    return MPI_SUCCESS;
+
+ err_hndl:
+    XBT_DEBUG(  "%s:%4d\tError occurred %d, rank %2d",
+                 __FILE__, line, err, rank);
+    return err;
+}
diff --git a/src/smpi/colls/allreduce-ompi-ring-segmented.c b/src/smpi/colls/allreduce-ompi-ring-segmented.c
new file mode 100644 (file)
index 0000000..4034388
--- /dev/null
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2009 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2009      University of Houston. All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ *  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 listed
+ *   in this license in the documentation and/or other materials
+ *   provided with the distribution.
+
+ * - Neither the name of the copyright holders nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+
+ * The copyright holders provide no reassurances that the source code
+ * provided does not infringe any patent, copyright, or any other
+ * intellectual property rights of third parties.  The copyright holders
+ * disclaim any liability to any recipient for claims brought against
+ * recipient by any third party for infringement of that parties
+ * intellectual property rights.
+
+ * 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.
+
+ */
+
+
+
+/*
+ *  ompi_coll_tuned_allreduce_intra_ring_segmented
+ *
+ *   Function:       Pipelined ring algorithm for allreduce operation
+ *   Accepts:        Same as MPI_Allreduce(), segment size
+ *   Returns:        MPI_SUCCESS or error code
+ *
+ *   Description:    Implements pipelined ring algorithm for allreduce: 
+ *                   user supplies suggested segment size for the pipelining of
+ *                   reduce operation.
+ *                   The segment size determines the number of phases, np, for 
+ *                   the algorithm execution.  
+ *                   The message is automatically divided into blocks of 
+ *                   approximately  (count / (np * segcount)) elements.
+ *                   At the end of reduction phase, allgather like step is 
+ *                   executed.
+ *                   Algorithm requires (np + 1)*(N - 1) steps.
+ *
+ *   Limitations:    The algorithm DOES NOT preserve order of operations so it 
+ *                   can be used only for commutative operations.
+ *                   In addition, algorithm cannot work if the total size is 
+ *                   less than size * segment size.
+ *         Example on 3 nodes with 2 phases
+ *         Initial state
+ *   #      0              1             2 
+ *        [00a]          [10a]         [20a]
+ *        [00b]          [10b]         [20b]
+ *        [01a]          [11a]         [21a]
+ *        [01b]          [11b]         [21b]
+ *        [02a]          [12a]         [22a]
+ *        [02b]          [12b]         [22b]
+ *
+ *        COMPUTATION PHASE 0 (a)
+ *         Step 0: rank r sends block ra to rank (r+1) and receives bloc (r-1)a 
+ *                 from rank (r-1) [with wraparound].
+ *    #     0              1             2  
+ *        [00a]        [00a+10a]       [20a]
+ *        [00b]          [10b]         [20b]
+ *        [01a]          [11a]       [11a+21a]
+ *        [01b]          [11b]         [21b]
+ *      [22a+02a]        [12a]         [22a]
+ *        [02b]          [12b]         [22b]
+ *
+ *         Step 1: rank r sends block (r-1)a to rank (r+1) and receives bloc 
+ *                 (r-2)a from rank (r-1) [with wraparound].
+ *    #     0              1             2  
+ *        [00a]        [00a+10a]   [00a+10a+20a]
+ *        [00b]          [10b]         [20b]
+ *    [11a+21a+01a]      [11a]       [11a+21a]
+ *        [01b]          [11b]         [21b]
+ *      [22a+02a]    [22a+02a+12a]     [22a]
+ *        [02b]          [12b]         [22b] 
+ *
+ *        COMPUTATION PHASE 1 (b)
+ *         Step 0: rank r sends block rb to rank (r+1) and receives bloc (r-1)b 
+ *                 from rank (r-1) [with wraparound].
+ *    #     0              1             2  
+ *        [00a]        [00a+10a]       [20a]
+ *        [00b]        [00b+10b]       [20b]
+ *        [01a]          [11a]       [11a+21a]
+ *        [01b]          [11b]       [11b+21b]
+ *      [22a+02a]        [12a]         [22a]
+ *      [22b+02b]        [12b]         [22b]
+ *
+ *         Step 1: rank r sends block (r-1)b to rank (r+1) and receives bloc 
+ *                 (r-2)b from rank (r-1) [with wraparound].
+ *    #     0              1             2  
+ *        [00a]        [00a+10a]   [00a+10a+20a]
+ *        [00b]          [10b]     [0bb+10b+20b]
+ *    [11a+21a+01a]      [11a]       [11a+21a]
+ *    [11b+21b+01b]      [11b]         [21b]
+ *      [22a+02a]    [22a+02a+12a]     [22a]
+ *        [02b]      [22b+01b+12b]     [22b] 
+ *
+ *         
+ *        DISTRIBUTION PHASE: ring ALLGATHER with ranks shifted by 1 (same as
+ *         in regular ring algorithm.
+ *
+ */
+ #define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT)        \
+    if( ((SEGSIZE) >= (TYPELNG)) &&                                     \
+        ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT))) ) {                      \
+        size_t residual;                                                \
+        (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG));                      \
+        residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG);                  \
+        if( residual > ((TYPELNG) >> 1) )                               \
+            (SEGCOUNT)++;                                               \
+    }                                                                   \
+    
+#define COLL_TUNED_COMPUTE_BLOCKCOUNT( COUNT, NUM_BLOCKS, SPLIT_INDEX,       \
+                                       EARLY_BLOCK_COUNT, LATE_BLOCK_COUNT ) \
+    EARLY_BLOCK_COUNT = LATE_BLOCK_COUNT = COUNT / NUM_BLOCKS;               \
+    SPLIT_INDEX = COUNT % NUM_BLOCKS;                                        \
+    if (0 != SPLIT_INDEX) {                                                  \
+        EARLY_BLOCK_COUNT = EARLY_BLOCK_COUNT + 1;                           \
+    }                                                                        \
+ #include "colls_private.h"
+int 
+smpi_coll_tuned_allreduce_ompi_ring_segmented(void *sbuf, void *rbuf, int count,
+                                               MPI_Datatype dtype,
+                                               MPI_Op op,
+                                               MPI_Comm comm) 
+{
+   int ret = MPI_SUCCESS;
+   int line;
+   int rank, size, k, recv_from, send_to;
+   int early_blockcount, late_blockcount, split_rank; 
+   int segcount, max_segcount;
+   int num_phases, phase;
+   int block_count, inbi;
+   size_t typelng;
+   char *tmpsend = NULL, *tmprecv = NULL;
+   char *inbuf[2] = {NULL, NULL};
+   ptrdiff_t true_extent, extent;
+   ptrdiff_t block_offset, max_real_segsize;
+   MPI_Request reqs[2] = {NULL, NULL};
+   const size_t segsize = 1 << 20; /* 1 MB */
+   size = smpi_comm_size(comm);
+   rank = smpi_comm_rank(comm);
+
+   XBT_DEBUG("coll:tuned:allreduce_intra_ring_segmented rank %d, count %d", rank, count);
+
+   /* Special case for size == 1 */
+   if (1 == size) {
+      if (MPI_IN_PLACE != sbuf) {
+      ret= smpi_datatype_copy(sbuf, count, dtype,rbuf, count, dtype);
+         if (ret < 0) { line = __LINE__; goto error_hndl; }
+      }
+      return MPI_SUCCESS;
+   }
+   
+   /* Determine segment count based on the suggested segment size */
+   extent = smpi_datatype_get_extent(dtype);
+   if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; }
+   true_extent = smpi_datatype_get_extent(dtype);
+   if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; }
+   typelng = smpi_datatype_size(dtype);
+   if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; }
+   segcount = count;
+   COLL_TUNED_COMPUTED_SEGCOUNT(segsize, typelng, segcount)
+
+   /* Special case for count less than size * segcount - use regular ring */
+   if (count < size * segcount) {
+      XBT_DEBUG( "coll:tuned:allreduce_ring_segmented rank %d/%d, count %d, switching to regular ring", rank, size, count);
+      return (smpi_coll_tuned_allreduce_lr(sbuf, rbuf, count, dtype, op, 
+                                                   comm));
+   }
+
+   /* Determine the number of phases of the algorithm */
+   num_phases = count / (size * segcount);
+   if ((count % (size * segcount) >= size) && 
+       (count % (size * segcount) > ((size * segcount) / 2))) {
+      num_phases++;
+   }
+
+   /* Determine the number of elements per block and corresponding 
+      block sizes.
+      The blocks are divided into "early" and "late" ones:
+      blocks 0 .. (split_rank - 1) are "early" and 
+      blocks (split_rank) .. (size - 1) are "late".
+      Early blocks are at most 1 element larger than the late ones.
+      Note, these blocks will be split into num_phases segments,
+      out of the largest one will have max_segcount elements.
+    */
+   COLL_TUNED_COMPUTE_BLOCKCOUNT( count, size, split_rank, 
+                                  early_blockcount, late_blockcount )
+   COLL_TUNED_COMPUTE_BLOCKCOUNT( early_blockcount, num_phases, inbi,
+                                  max_segcount, k)
+   max_real_segsize = true_extent + (max_segcount - 1) * extent;
+
+   /* Allocate and initialize temporary buffers */
+   inbuf[0] = (char*)malloc(max_real_segsize);
+   if (NULL == inbuf[0]) { ret = -1; line = __LINE__; goto error_hndl; }
+   if (size > 2) {
+      inbuf[1] = (char*)malloc(max_real_segsize);
+      if (NULL == inbuf[1]) { ret = -1; line = __LINE__; goto error_hndl; }
+   }
+
+   /* Handle MPI_IN_PLACE */
+   if (MPI_IN_PLACE != sbuf) {
+      ret= smpi_datatype_copy(sbuf, count, dtype,rbuf, count, dtype);
+      if (ret < 0) { line = __LINE__; goto error_hndl; }
+   }
+
+   /* Computation loop: for each phase, repeat ring allreduce computation loop */
+   for (phase = 0; phase < num_phases; phase ++) {
+      ptrdiff_t phase_offset;
+      int early_phase_segcount, late_phase_segcount, split_phase, phase_count;
+
+      /* 
+         For each of the remote nodes:
+         - post irecv for block (r-1)
+         - send block (r)
+           To do this, first compute block offset and count, and use block offset
+           to compute phase offset.
+         - in loop for every step k = 2 .. n
+           - post irecv for block (r + n - k) % n
+           - wait on block (r + n - k + 1) % n to arrive
+           - compute on block (r + n - k + 1) % n
+           - send block (r + n - k + 1) % n
+         - wait on block (r + 1)
+         - compute on block (r + 1)
+         - send block (r + 1) to rank (r + 1)
+         Note that we must be careful when computing the begining of buffers and
+         for send operations and computation we must compute the exact block size.
+      */
+      send_to = (rank + 1) % size;
+      recv_from = (rank + size - 1) % size;
+      
+      inbi = 0;
+      /* Initialize first receive from the neighbor on the left */
+      reqs[inbi] = smpi_mpi_irecv(inbuf[inbi], max_segcount, dtype, recv_from,
+                               666, comm);
+      /* Send first block (my block) to the neighbor on the right:
+         - compute my block and phase offset
+         - send data */
+      block_offset = ((rank < split_rank)? 
+                      (rank * early_blockcount) : 
+                      (rank * late_blockcount + split_rank));
+      block_count = ((rank < split_rank)? early_blockcount : late_blockcount);
+      COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase,
+                                    early_phase_segcount, late_phase_segcount)
+      phase_count = ((phase < split_phase)?
+                     (early_phase_segcount) : (late_phase_segcount));
+      phase_offset = ((phase < split_phase)?
+                      (phase * early_phase_segcount) : 
+                      (phase * late_phase_segcount + split_phase));
+      tmpsend = ((char*)rbuf) + (block_offset + phase_offset) * extent;
+      smpi_mpi_send(tmpsend, phase_count, dtype, send_to,
+                              666, comm);
+      
+      for (k = 2; k < size; k++) {
+         const int prevblock = (rank + size - k + 1) % size;
+         
+         inbi = inbi ^ 0x1;
+         
+         /* Post irecv for the current block */
+         reqs[inbi] = smpi_mpi_irecv(inbuf[inbi], max_segcount, dtype, recv_from,
+                               666, comm);
+         if (MPI_SUCCESS != ret) { line = __LINE__; goto error_hndl; }
+         
+         /* Wait on previous block to arrive */
+         smpi_mpi_wait(&reqs[inbi ^ 0x1], MPI_STATUS_IGNORE);
+         
+         /* Apply operation on previous block: result goes to rbuf
+            rbuf[prevblock] = inbuf[inbi ^ 0x1] (op) rbuf[prevblock]
+         */
+         block_offset = ((prevblock < split_rank)?
+                         (prevblock * early_blockcount) :
+                         (prevblock * late_blockcount + split_rank));
+         block_count = ((prevblock < split_rank)? 
+                        early_blockcount : late_blockcount);
+         COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase,
+                                       early_phase_segcount, late_phase_segcount)
+         phase_count = ((phase < split_phase)?
+                        (early_phase_segcount) : (late_phase_segcount));
+         phase_offset = ((phase < split_phase)?
+                         (phase * early_phase_segcount) : 
+                         (phase * late_phase_segcount + split_phase));
+         tmprecv = ((char*)rbuf) + (block_offset + phase_offset) * extent;
+         smpi_op_apply(op, inbuf[inbi ^ 0x1], tmprecv, &phase_count, &dtype);
+         /* send previous block to send_to */
+         smpi_mpi_send(tmprecv, phase_count, dtype, send_to,
+                              666, comm);
+      }
+      
+      /* Wait on the last block to arrive */
+      smpi_mpi_wait(&reqs[inbi], MPI_STATUS_IGNORE);
+
+      
+      /* Apply operation on the last block (from neighbor (rank + 1) 
+         rbuf[rank+1] = inbuf[inbi] (op) rbuf[rank + 1] */
+      recv_from = (rank + 1) % size;
+      block_offset = ((recv_from < split_rank)?
+                      (recv_from * early_blockcount) :
+                      (recv_from * late_blockcount + split_rank));
+      block_count = ((recv_from < split_rank)? 
+                     early_blockcount : late_blockcount);
+      COLL_TUNED_COMPUTE_BLOCKCOUNT(block_count, num_phases, split_phase,
+                                    early_phase_segcount, late_phase_segcount)
+      phase_count = ((phase < split_phase)?
+                     (early_phase_segcount) : (late_phase_segcount));
+      phase_offset = ((phase < split_phase)?
+                      (phase * early_phase_segcount) : 
+                      (phase * late_phase_segcount + split_phase));
+      tmprecv = ((char*)rbuf) + (block_offset + phase_offset) * extent;
+      smpi_op_apply(op, inbuf[inbi], tmprecv, &phase_count, &dtype);
+   }
+
+   /* Distribution loop - variation of ring allgather */
+   send_to = (rank + 1) % size;
+   recv_from = (rank + size - 1) % size;
+   for (k = 0; k < size - 1; k++) {
+      const int recv_data_from = (rank + size - k) % size;
+      const int send_data_from = (rank + 1 + size - k) % size;
+      const int send_block_offset = 
+         ((send_data_from < split_rank)?
+          (send_data_from * early_blockcount) :
+          (send_data_from * late_blockcount + split_rank));
+      const int recv_block_offset = 
+         ((recv_data_from < split_rank)?
+          (recv_data_from * early_blockcount) :
+          (recv_data_from * late_blockcount + split_rank));
+      block_count = ((send_data_from < split_rank)? 
+                     early_blockcount : late_blockcount);
+
+      tmprecv = (char*)rbuf + recv_block_offset * extent;
+      tmpsend = (char*)rbuf + send_block_offset * extent;
+
+      smpi_mpi_sendrecv(tmpsend, block_count, dtype, send_to,
+                                     666,
+                                     tmprecv, early_blockcount, dtype, recv_from,
+                                     666,
+                                     comm, MPI_STATUS_IGNORE);
+
+   }
+
+   if (NULL != inbuf[0]) free(inbuf[0]);
+   if (NULL != inbuf[1]) free(inbuf[1]);
+
+   return MPI_SUCCESS;
+
+ error_hndl:
+   XBT_DEBUG("%s:%4d\tRank %d Error occurred %d\n",
+                __FILE__, line, rank, ret);
+   if (NULL != inbuf[0]) free(inbuf[0]);
+   if (NULL != inbuf[1]) free(inbuf[1]);
+   return ret;
+}
diff --git a/src/smpi/colls/alltoall-ompi-pairwise.c b/src/smpi/colls/alltoall-ompi-pairwise.c
new file mode 100644 (file)
index 0000000..e23944f
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2006 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#define MCA_COLL_BASE_TAG_ALLTOALL 101
+
+int smpi_coll_tuned_alltoall_ompi_pairwise(void *sbuf, int scount, 
+                                            MPI_Datatype sdtype,
+                                            void* rbuf, int rcount,
+                                            MPI_Datatype rdtype,
+                                            MPI_Comm comm)
+{
+    int rank, size, step;
+    int sendto, recvfrom;
+    void * tmpsend, *tmprecv;
+    MPI_Aint lb, sext, rext;
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    XBT_VERB(
+                 "coll:tuned:alltoall_ompi_pairwise rank %d", rank);
+
+    smpi_datatype_extent (sdtype, &lb, &sext);
+    smpi_datatype_extent (rdtype, &lb, &rext);
+
+    
+    /* Perform pairwise exchange - starting from 1 so the local copy is last */
+    for (step = 1; step < size + 1; step++) {
+
+        /* Determine sender and receiver for this step. */
+        sendto  = (rank + step) % size;
+        recvfrom = (rank + size - step) % size;
+
+        /* Determine sending and receiving locations */
+        tmpsend = (char*)sbuf + sendto * sext * scount;
+        tmprecv = (char*)rbuf + recvfrom * rext * rcount;
+
+        /* send and receive */
+        smpi_mpi_sendrecv( tmpsend, scount, sdtype, sendto, 
+                                        MCA_COLL_BASE_TAG_ALLTOALL,
+                                        tmprecv, rcount, rdtype, recvfrom, 
+                                        MCA_COLL_BASE_TAG_ALLTOALL,
+                                        comm, MPI_STATUS_IGNORE);
+    }
+
+    return MPI_SUCCESS;
+}
diff --git a/src/smpi/colls/alltoallv-ompi-basic-linear.c b/src/smpi/colls/alltoallv-ompi-basic-linear.c
new file mode 100644 (file)
index 0000000..f90471d
--- /dev/null
@@ -0,0 +1,100 @@
+
+#include "colls_private.h"
+#define MCA_COLL_BASE_TAG_ALLTOALLV 111
+/*  
+ * Linear functions are copied from the basic coll module.  For
+ * some small number of nodes and/or small data sizes they are just as
+ * fast as tuned/tree based segmenting operations and as such may be
+ * selected by the decision functions.  These are copied into this module
+ * due to the way we select modules in V1. i.e. in V2 we will handle this
+ * differently and so will not have to duplicate code.  
+ * GEF Oct05 after asking Jeff.  
+ */
+int
+smpi_coll_tuned_alltoallv_ompi_basic_linear(void *sbuf, int *scounts, int *sdisps,
+                                            MPI_Datatype sdtype,
+                                            void *rbuf, int *rcounts, int *rdisps,
+                                            MPI_Datatype rdtype,
+                                            MPI_Comm comm)
+{
+    int i, size, rank;
+    char *psnd, *prcv;
+    int nreqs;
+    ptrdiff_t sext, rext;
+    MPI_Request *preq;
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+    MPI_Request *ireqs= xbt_malloc(sizeof(MPI_Request) * size * 2);
+    XBT_DEBUG(
+                 "coll:tuned:alltoallv_intra_basic_linear rank %d", rank);
+
+    sext=smpi_datatype_get_extent(sdtype);
+    rext=smpi_datatype_get_extent(rdtype);
+
+    /* Simple optimization - handle send to self first */
+    psnd = ((char *) sbuf) + (sdisps[rank] * sext);
+    prcv = ((char *) rbuf) + (rdisps[rank] * rext);
+    if (0 != scounts[rank]) {
+        smpi_datatype_copy(psnd, scounts[rank], sdtype,
+                              prcv, rcounts[rank], rdtype);
+    }
+
+    /* If only one process, we're done. */
+    if (1 == size) {
+        return MPI_SUCCESS;
+    }
+
+    /* Now, initiate all send/recv to/from others. */
+    nreqs = 0;
+    preq = ireqs;
+
+    /* Post all receives first */
+    for (i = 0; i < size; ++i) {
+        if (i == rank || 0 == rcounts[i]) {
+            continue;
+        }
+
+        prcv = ((char *) rbuf) + (rdisps[i] * rext);
+
+        *preq = smpi_irecv_init(prcv, rcounts[i], rdtype,
+                                      i, MCA_COLL_BASE_TAG_ALLTOALLV, comm
+                                      );
+        preq++;
+        ++nreqs;
+        
+    }
+
+    /* Now post all sends */
+    for (i = 0; i < size; ++i) {
+        if (i == rank || 0 == scounts[i]) {
+            continue;
+        }
+
+        psnd = ((char *) sbuf) + (sdisps[i] * sext);
+        *preq=smpi_isend_init(psnd, scounts[i], sdtype,
+                                      i, MCA_COLL_BASE_TAG_ALLTOALLV, comm
+                                      );
+        preq++;
+        ++nreqs;
+    }
+
+    /* Start your engines.  This will never return an error. */
+    smpi_mpi_startall(nreqs, ireqs);
+
+    /* Wait for them all.  If there's an error, note that we don't care
+     * what the error was -- just that there *was* an error.  The PML
+     * will finish all requests, even if one or more of them fail.
+     * i.e., by the end of this call, all the requests are free-able.
+     * So free them anyway -- even if there was an error, and return the
+     * error after we free everything. */
+    smpi_mpi_waitall(nreqs, ireqs,
+                                MPI_STATUSES_IGNORE);
+
+    /* Free the requests. */
+    for (i = 0; i < nreqs; ++i) {
+      if(ireqs[i]!=MPI_REQUEST_NULL)smpi_mpi_request_free(&ireqs[i]);
+    }
+
+    return MPI_SUCCESS;
+}
+
diff --git a/src/smpi/colls/barrier-ompi.c b/src/smpi/colls/barrier-ompi.c
new file mode 100644 (file)
index 0000000..39bdeb1
--- /dev/null
@@ -0,0 +1,344 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2006 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+
+
+#define MCA_COLL_BASE_TAG_BARRIER 100
+/*
+ * Barrier is ment to be a synchronous operation, as some BTLs can mark 
+ * a request done before its passed to the NIC and progress might not be made 
+ * elsewhere we cannot allow a process to exit the barrier until its last 
+ * [round of] sends are completed.
+ *
+ * It is last round of sends rather than 'last' individual send as each pair of 
+ * peers can use different channels/devices/btls and the receiver of one of 
+ * these sends might be forced to wait as the sender
+ * leaves the collective and does not make progress until the next mpi call 
+ *
+ */
+
+/*
+ * Simple double ring version of barrier
+ *
+ * synchronous gurantee made by last ring of sends are synchronous
+ *
+ */
+int smpi_coll_tuned_barrier_ompi_doublering(MPI_Comm comm
+                                            )
+{
+    int rank, size;
+    int left, right;
+
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+
+    XBT_DEBUG("ompi_coll_tuned_barrier_ompi_doublering rank %d", rank);
+
+    left = ((rank-1+size)%size);
+    right = ((rank+1)%size);
+
+    if (rank > 0) { /* receive message from the left */
+        smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, 
+                                MCA_COLL_BASE_TAG_BARRIER, comm, 
+                                MPI_STATUS_IGNORE);
+    }
+
+    /* Send message to the right */
+    smpi_mpi_send((void*)NULL, 0, MPI_BYTE, right, 
+                            MCA_COLL_BASE_TAG_BARRIER, 
+                             comm);
+
+    /* root needs to receive from the last node */
+    if (rank == 0) {
+        smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, 
+                                MCA_COLL_BASE_TAG_BARRIER, comm, 
+                                MPI_STATUS_IGNORE);
+    }
+
+    /* Allow nodes to exit */
+    if (rank > 0) { /* post Receive from left */
+        smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, 
+                                MCA_COLL_BASE_TAG_BARRIER, comm, 
+                                MPI_STATUS_IGNORE);
+    }
+
+    /* send message to the right one */
+    smpi_mpi_send((void*)NULL, 0, MPI_BYTE, right, 
+                            MCA_COLL_BASE_TAG_BARRIER, 
+                             comm);
+    /* rank 0 post receive from the last node */
+    if (rank == 0) {
+        smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, left, 
+                                MCA_COLL_BASE_TAG_BARRIER, comm, 
+                                MPI_STATUS_IGNORE);
+    }
+
+    return MPI_SUCCESS;
+
+}
+
+
+/*
+ * To make synchronous, uses sync sends and sync sendrecvs
+ */
+
+int smpi_coll_tuned_barrier_ompi_recursivedoubling(MPI_Comm comm
+                                                   )
+{
+    int rank, size, adjsize;
+    int mask, remote;
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+    XBT_DEBUG(
+                 "ompi_coll_tuned_barrier_ompi_recursivedoubling rank %d", 
+                 rank);
+
+    /* do nearest power of 2 less than size calc */
+    for( adjsize = 1; adjsize <= size; adjsize <<= 1 );
+    adjsize >>= 1;
+
+    /* if size is not exact power of two, perform an extra step */
+    if (adjsize != size) {
+        if (rank >= adjsize) {
+            /* send message to lower ranked node */
+            remote = rank - adjsize;
+            smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote,
+                                                  MCA_COLL_BASE_TAG_BARRIER,
+                                                  NULL, 0, MPI_BYTE, remote,
+                                                  MCA_COLL_BASE_TAG_BARRIER,
+                                                  comm, MPI_STATUS_IGNORE);
+
+        } else if (rank < (size - adjsize)) {
+
+            /* receive message from high level rank */
+            smpi_mpi_recv((void*)NULL, 0, MPI_BYTE, rank+adjsize,
+                                    MCA_COLL_BASE_TAG_BARRIER, comm, 
+                                    MPI_STATUS_IGNORE);
+
+        }
+    }
+
+    /* exchange messages */
+    if ( rank < adjsize ) {
+        mask = 0x1;
+        while ( mask < adjsize ) {
+            remote = rank ^ mask;
+            mask <<= 1;
+            if (remote >= adjsize) continue;
+
+            /* post receive from the remote node */
+            smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote,
+                                                  MCA_COLL_BASE_TAG_BARRIER,
+                                                  NULL, 0, MPI_BYTE, remote,
+                                                  MCA_COLL_BASE_TAG_BARRIER,
+                                                  comm, MPI_STATUS_IGNORE);
+        }
+    }
+
+    /* non-power of 2 case */
+    if (adjsize != size) {
+        if (rank < (size - adjsize)) {
+            /* send enter message to higher ranked node */
+            remote = rank + adjsize;
+            smpi_mpi_send((void*)NULL, 0, MPI_BYTE, remote, 
+                                    MCA_COLL_BASE_TAG_BARRIER, 
+                                     comm);
+
+        }
+    }
+
+    return MPI_SUCCESS;
+
+}
+
+
+/*
+ * To make synchronous, uses sync sends and sync sendrecvs
+ */
+
+int smpi_coll_tuned_barrier_ompi_bruck(MPI_Comm comm
+                                       )
+{
+    int rank, size;
+    int distance, to, from;
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+    XBT_DEBUG(
+                 "ompi_coll_tuned_barrier_ompi_bruck rank %d", rank);
+
+    /* exchange data with rank-2^k and rank+2^k */
+    for (distance = 1; distance < size; distance <<= 1) { 
+        from = (rank + size - distance) % size;
+        to   = (rank + distance) % size;
+
+        /* send message to lower ranked node */
+        smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, to, 
+                                              MCA_COLL_BASE_TAG_BARRIER,
+                                              NULL, 0, MPI_BYTE, from, 
+                                              MCA_COLL_BASE_TAG_BARRIER,
+                                              comm, MPI_STATUS_IGNORE);
+    }
+
+    return MPI_SUCCESS;
+
+}
+
+
+/*
+ * To make synchronous, uses sync sends and sync sendrecvs
+ */
+/* special case for two processes */
+int smpi_coll_tuned_barrier_ompi_two_procs(MPI_Comm comm
+                                           )
+{
+    int remote;
+
+    remote = smpi_comm_rank(comm);
+    XBT_DEBUG(
+                 "ompi_coll_tuned_barrier_ompi_two_procs rank %d", remote);
+    remote = (remote + 1) & 0x1;
+
+    smpi_mpi_sendrecv(NULL, 0, MPI_BYTE, remote, 
+                                          MCA_COLL_BASE_TAG_BARRIER, 
+                                          NULL, 0, MPI_BYTE, remote, 
+                                          MCA_COLL_BASE_TAG_BARRIER,
+                                          comm, MPI_STATUS_IGNORE);
+    return (MPI_SUCCESS);
+}
+
+
+/*
+ * Linear functions are copied from the BASIC coll module
+ * they do not segment the message and are simple implementations
+ * but for some small number of nodes and/or small data sizes they
+ * are just as fast as tuned/tree based segmenting operations
+ * and as such may be selected by the decision functions
+ * These are copied into this module due to the way we select modules
+ * in V1. i.e. in V2 we will handle this differently and so will not
+ * have to duplicate code.
+ * GEF Oct05 after asking Jeff.
+ */
+
+/* copied function (with appropriate renaming) starts here */
+
+int smpi_coll_tuned_barrier_ompi_basic_linear(MPI_Comm comm)
+{
+    int i;
+    int size = smpi_comm_size(comm);
+    int rank = smpi_comm_rank(comm);
+
+    /* All non-root send & receive zero-length message. */
+
+    if (rank > 0) {
+        smpi_mpi_send (NULL, 0, MPI_BYTE, 0, 
+                                 MCA_COLL_BASE_TAG_BARRIER,
+                                  comm);
+
+        smpi_mpi_recv (NULL, 0, MPI_BYTE, 0, 
+                                 MCA_COLL_BASE_TAG_BARRIER,
+                                 comm, MPI_STATUS_IGNORE);
+    }
+
+    /* The root collects and broadcasts the messages. */
+
+    else {
+        MPI_Request* requests;
+
+        requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) );
+        for (i = 1; i < size; ++i) {
+            requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
+                                     MCA_COLL_BASE_TAG_BARRIER, comm
+                                     );
+        }
+        smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+
+        for (i = 1; i < size; ++i) {
+            requests[i] = smpi_mpi_isend(NULL, 0, MPI_BYTE, i,
+                                     MCA_COLL_BASE_TAG_BARRIER, 
+                                      comm
+                                     );
+        }
+        smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+        free( requests );
+    }
+
+    /* All done */
+
+    return MPI_SUCCESS;
+
+}
+/* copied function (with appropriate renaming) ends here */
+
+/*
+ * Another recursive doubling type algorithm, but in this case
+ * we go up the tree and back down the tree.  
+ */
+int smpi_coll_tuned_barrier_ompi_tree(MPI_Comm comm)
+{
+    int rank, size, depth;
+    int jump, partner;
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+    XBT_DEBUG(
+                 "ompi_coll_tuned_barrier_ompi_tree %d", 
+                 rank);
+
+    /* Find the nearest power of 2 of the communicator size. */
+    for(depth = 1; depth < size; depth <<= 1 );
+
+    for (jump=1; jump<depth; jump<<=1) {
+        partner = rank ^ jump;
+        if (!(partner & (jump-1)) && partner < size) {
+            if (partner > rank) {
+                smpi_mpi_recv (NULL, 0, MPI_BYTE, partner, 
+                                         MCA_COLL_BASE_TAG_BARRIER, comm,
+                                         MPI_STATUS_IGNORE);
+            } else if (partner < rank) {
+                smpi_mpi_send (NULL, 0, MPI_BYTE, partner,
+                                         MCA_COLL_BASE_TAG_BARRIER, 
+                                          comm);
+            }
+        }
+    }
+    
+    depth>>=1;
+    for (jump = depth; jump>0; jump>>=1) {
+        partner = rank ^ jump;
+        if (!(partner & (jump-1)) && partner < size) {
+            if (partner > rank) {
+                smpi_mpi_send (NULL, 0, MPI_BYTE, partner,
+                                         MCA_COLL_BASE_TAG_BARRIER,
+                                          comm);
+            } else if (partner < rank) {
+                smpi_mpi_recv (NULL, 0, MPI_BYTE, partner, 
+                                         MCA_COLL_BASE_TAG_BARRIER, comm,
+                                         MPI_STATUS_IGNORE);
+            }
+        }
+    }
+
+    return MPI_SUCCESS;
+}
index 9ff27b4..be088ed 100644 (file)
@@ -27,7 +27,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count,
   int header_index;
   int flag_array[MAX_NODE];
   int already_sent[MAX_NODE];
-
+  int to_clean[MAX_NODE];
   int header_buf[HEADER_SIZE];
   char temp_buf[MAX_NODE];
 
@@ -70,6 +70,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count,
   /* value == 0 means root has not send data (or header) to the node yet */
   for (i = 0; i < MAX_NODE; i++) {
     already_sent[i] = 0;
+    to_clean[i]=0;
   }
   //  printf("YYY\n");
 
@@ -123,6 +124,7 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count,
               smpi_mpi_send(buf, count, datatype, i, tag, comm);
               already_sent[i] = 1;
               sent_count++;
+              to_clean[i]=0;
               break;
             }
           }
@@ -130,6 +132,9 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count,
 
 
       }                         /* while loop */
+      
+      for(i=0; i<size; i++)
+        if(to_clean[i]!=0)smpi_mpi_recv(temp_buf, 1, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status);
     }
 
     /* non-root */
@@ -366,6 +371,9 @@ int smpi_coll_tuned_bcast_arrival_nb(void *buf, int count,
                     header_buf[myordering + 1], tag, comm);
         }
         smpi_mpi_waitall((pipe_length), send_request_array, send_status_array);
+      }else{
+        for (i = 0; i < pipe_length; i++) 
+          smpi_mpi_wait(&recv_request_array[i], &recv_status_array[i]);
       }
 
     }
index f4a482c..a9df449 100644 (file)
@@ -27,7 +27,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count,
   int header_index;
   int flag_array[MAX_NODE];
   int already_sent[MAX_NODE];
-
+  int to_clean[MAX_NODE];
   int header_buf[HEADER_SIZE];
   char temp_buf[MAX_NODE];
 
@@ -70,6 +70,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count,
   /* value == 0 means root has not send data (or header) to the node yet */
   for (i = 0; i < MAX_NODE; i++) {
     already_sent[i] = 0;
+    to_clean[i] = 0;
   }
 
   /* when a message is smaller than a block size => no pipeline */
@@ -274,6 +275,7 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count,
 
 
               already_sent[i] = 1;
+              to_clean[i]=1;
               sent_count++;
               break;
             }
@@ -282,6 +284,9 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count,
 
       }                         /* while loop */
 
+      for(i=0; i<size; i++)
+        if(to_clean[i]!=0)smpi_mpi_recv(&temp_buf[i], 1, MPI_CHAR, i, tag, MPI_COMM_WORLD,
+                     &status);
       //total = MPI_Wtime() - start2;
       //total *= 1000;
       //printf("Node zero iter = %d time = %.2f\n",iteration,total);
@@ -331,8 +336,10 @@ int smpi_coll_tuned_bcast_arrival_pattern_aware(void *buf, int count,
                     header_buf[myordering + 1], tag, comm);
         }
         smpi_mpi_waitall((pipe_length), send_request_array, send_status_array);
-      }
-
+      }else{
+          smpi_mpi_waitall(pipe_length, recv_request_array, recv_status_array);
+          }
+    
     }
 
     free(send_request_array);
diff --git a/src/smpi/colls/bcast-ompi-pipeline.c b/src/smpi/colls/bcast-ompi-pipeline.c
new file mode 100644 (file)
index 0000000..63c2067
--- /dev/null
@@ -0,0 +1,204 @@
+ #include "colls_private.h"
+ #include "coll_tuned_topo.h"
+
+#define MAXTREEFANOUT 32
+
+
+int smpi_coll_tuned_bcast_ompi_pipeline( void* buffer,
+                                      int original_count, 
+                                      MPI_Datatype datatype, 
+                                      int root,
+                                      MPI_Comm comm)
+{
+    int count_by_segment = original_count;
+    size_t type_size;
+    int segsize =1024  << 7;
+    //mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module;
+    //mca_coll_tuned_comm_t *data = tuned_module->tuned_data;
+    
+//    return ompi_coll_tuned_bcast_intra_generic( buffer, count, datatype, root, comm, module,
+//                                                count_by_segment, data->cached_pipeline );
+    ompi_coll_tree_t * tree = ompi_coll_tuned_topo_build_chain( 1, comm, root );
+    int i;
+    int rank, size;
+    int segindex;
+    int num_segments; /* Number of segments */
+    int sendcount;    /* number of elements sent in this segment */ 
+    size_t realsegsize;
+    char *tmpbuf;
+    ptrdiff_t extent;
+    MPI_Request recv_reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL};
+    MPI_Request *send_reqs = NULL;
+    int req_index;
+    
+    /**
+     * Determine number of elements sent per operation.
+     */
+    type_size = smpi_datatype_size(datatype);
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+    xbt_assert( size > 1 );
+
+
+    const double a_p16  = 3.2118e-6; /* [1 / byte] */
+    const double b_p16  = 8.7936;   
+    const double a_p64  = 2.3679e-6; /* [1 / byte] */
+    const double b_p64  = 1.1787;     
+    const double a_p128 = 1.6134e-6; /* [1 / byte] */
+    const double b_p128 = 2.1102;
+    size_t message_size;
+
+    /* else we need data size for decision function */
+    message_size = type_size * (unsigned long)original_count;   /* needed for decision */
+
+    if (size < (a_p128 * message_size + b_p128)) {
+            //Pipeline with 128KB segments 
+            segsize = 1024  << 7;
+    }else if (size < (a_p64 * message_size + b_p64)) {
+            // Pipeline with 64KB segments 
+            segsize = 1024 << 6;
+    }else if (size < (a_p16 * message_size + b_p16)) {
+            //Pipeline with 16KB segments 
+            segsize = 1024 << 4;
+    }
+
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, type_size, count_by_segment );
+
+    XBT_DEBUG("coll:tuned:bcast_intra_pipeline rank %d ss %5d type_size %lu count_by_segment %d",
+                 smpi_comm_rank(comm), segsize, (unsigned long)type_size, count_by_segment);
+
+
+
+    extent = smpi_datatype_get_extent (datatype);
+    num_segments = (original_count + count_by_segment - 1) / count_by_segment;
+    realsegsize = count_by_segment * extent;
+    
+    /* Set the buffer pointers */
+    tmpbuf = (char *) buffer;
+
+    if( tree->tree_nextsize != 0 ) {
+        send_reqs = xbt_new(MPI_Request, tree->tree_nextsize  );
+    }
+
+    /* Root code */
+    if( rank == root ) {
+        /* 
+           For each segment:
+           - send segment to all children.
+             The last segment may have less elements than other segments.
+        */
+        sendcount = count_by_segment;
+        for( segindex = 0; segindex < num_segments; segindex++ ) {
+            if( segindex == (num_segments - 1) ) {
+                sendcount = original_count - segindex * count_by_segment;
+            }
+            for( i = 0; i < tree->tree_nextsize; i++ ) { 
+                send_reqs[i] = smpi_mpi_isend(tmpbuf, sendcount, datatype,
+                                         tree->tree_next[i], 
+                                         777, comm);
+           } 
+
+            /* complete the sends before starting the next sends */
+            smpi_mpi_waitall( tree->tree_nextsize, send_reqs, 
+                                         MPI_STATUSES_IGNORE );
+
+            /* update tmp buffer */
+            tmpbuf += realsegsize;
+
+        }
+    } 
+    
+    /* Intermediate nodes code */
+    else if( tree->tree_nextsize > 0 ) { 
+        /* 
+           Create the pipeline. 
+           1) Post the first receive
+           2) For segments 1 .. num_segments
+              - post new receive
+              - wait on the previous receive to complete
+              - send this data to children
+           3) Wait on the last segment
+           4) Compute number of elements in last segment.
+           5) Send the last segment to children
+         */
+        req_index = 0;
+        recv_reqs[req_index]=smpi_mpi_irecv(tmpbuf, count_by_segment, datatype,
+                           tree->tree_prev, 777,
+                           comm);
+        
+        for( segindex = 1; segindex < num_segments; segindex++ ) {
+            
+            req_index = req_index ^ 0x1;
+            
+            /* post new irecv */
+            recv_reqs[req_index]= smpi_mpi_irecv( tmpbuf + realsegsize, count_by_segment,
+                                datatype, tree->tree_prev, 
+                                777, 
+                                comm);
+            
+            /* wait for and forward the previous segment to children */
+            smpi_mpi_wait( &recv_reqs[req_index ^ 0x1], 
+                                     MPI_STATUSES_IGNORE );
+            
+            for( i = 0; i < tree->tree_nextsize; i++ ) { 
+                send_reqs[i]=smpi_mpi_isend(tmpbuf, count_by_segment, datatype,
+                                         tree->tree_next[i], 
+                                         777, comm );
+            } 
+            
+            /* complete the sends before starting the next iteration */
+            smpi_mpi_waitall( tree->tree_nextsize, send_reqs, 
+                                         MPI_STATUSES_IGNORE );
+            
+            /* Update the receive buffer */
+            tmpbuf += realsegsize;
+        }
+
+        /* Process the last segment */
+        smpi_mpi_wait( &recv_reqs[req_index], MPI_STATUSES_IGNORE );
+        sendcount = original_count - (num_segments - 1) * count_by_segment;
+        for( i = 0; i < tree->tree_nextsize; i++ ) {
+            send_reqs[i] = smpi_mpi_isend(tmpbuf, sendcount, datatype,
+                                     tree->tree_next[i], 
+                                     777, comm);
+        }
+        
+        smpi_mpi_waitall( tree->tree_nextsize, send_reqs, 
+                                     MPI_STATUSES_IGNORE );
+    }
+  
+    /* Leaf nodes */
+    else {
+        /* 
+           Receive all segments from parent in a loop:
+           1) post irecv for the first segment
+           2) for segments 1 .. num_segments
+              - post irecv for the next segment
+              - wait on the previous segment to arrive
+           3) wait for the last segment
+        */
+        req_index = 0;
+        recv_reqs[req_index] = smpi_mpi_irecv(tmpbuf, count_by_segment, datatype,
+                                 tree->tree_prev, 777,
+                                 comm);
+
+        for( segindex = 1; segindex < num_segments; segindex++ ) {
+            req_index = req_index ^ 0x1;
+            tmpbuf += realsegsize;
+            /* post receive for the next segment */
+            recv_reqs[req_index] = smpi_mpi_irecv(tmpbuf, count_by_segment, datatype, 
+                                     tree->tree_prev, 777, 
+                                     comm);
+            /* wait on the previous segment */
+            smpi_mpi_wait( &recv_reqs[req_index ^ 0x1], 
+                                     MPI_STATUS_IGNORE );
+        }
+
+        smpi_mpi_wait( &recv_reqs[req_index], MPI_STATUS_IGNORE );
+    }
+
+    if( NULL != send_reqs ) free(send_reqs);
+
+    return (MPI_SUCCESS);
+}
diff --git a/src/smpi/colls/bcast-ompi-split-bintree.c b/src/smpi/colls/bcast-ompi-split-bintree.c
new file mode 100644 (file)
index 0000000..f1201d1
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2009 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2009      University of Houston. All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ *  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 listed
+ *   in this license in the documentation and/or other materials
+ *   provided with the distribution.
+
+ * - Neither the name of the copyright holders nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+
+ * The copyright holders provide no reassurances that the source code
+ * provided does not infringe any patent, copyright, or any other
+ * intellectual property rights of third parties.  The copyright holders
+ * disclaim any liability to any recipient for claims brought against
+ * recipient by any third party for infringement of that parties
+ * intellectual property rights.
+
+ * 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 "colls_private.h"
+  #include "coll_tuned_topo.h"
+  #define MAXTREEFANOUT 32
+int
+smpi_coll_tuned_bcast_ompi_split_bintree ( void* buffer,
+                                            int count, 
+                                            MPI_Datatype datatype, 
+                                            int root,
+                                            MPI_Comm comm)
+{
+    int segsize ;
+    int rank, size;
+    int segindex, i, lr, pair;
+    int segcount[2];       /* Number ompi_request_wait_allof elements sent with each segment */
+    uint32_t counts[2];
+    int num_segments[2];   /* Number of segmenets */
+    int sendcount[2];      /* the same like segcount, except for the last segment */ 
+    size_t realsegsize[2];
+    char *tmpbuf[2];
+    size_t type_size;
+    ptrdiff_t type_extent;
+    
+    
+    MPI_Request base_req, new_req;
+    ompi_coll_tree_t *tree;
+//    mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module;
+//    mca_coll_tuned_comm_t *data = tuned_module->tuned_data;
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+
+    //compute again segsize
+    const size_t intermediate_message_size = 370728;
+    size_t message_size = smpi_datatype_size(datatype) * (unsigned long)count;
+    if(message_size < intermediate_message_size) 
+      segsize = 1024 ;
+    else
+      segsize = 1024 << 3;
+      
+    XBT_DEBUG("ompi_coll_tuned_bcast_intra_split_bintree rank %d root %d ss %5d", rank, root, segsize);
+
+    if (size == 1) {
+        return MPI_SUCCESS;
+    }
+
+    /* setup the binary tree topology. */
+    tree = ompi_coll_tuned_topo_build_tree(2,comm,root);
+
+    type_size = smpi_datatype_size( datatype );
+
+    /* Determine number of segments and number of elements per segment */
+    counts[0] = count/2;
+    if (count % 2 != 0) counts[0]++;
+    counts[1] = count - counts[0];
+    if ( segsize > 0 ) {
+        /* Note that ompi_datatype_type_size() will never return a negative
+           value in typelng; it returns an int [vs. an unsigned type]
+           because of the MPI spec. */
+       if (segsize < ((uint32_t) type_size)) {
+            segsize = type_size; /* push segsize up to hold one type */
+        }
+        segcount[0] = segcount[1] = segsize / type_size; 
+        num_segments[0] = counts[0]/segcount[0];
+        if ((counts[0] % segcount[0]) != 0) num_segments[0]++;
+        num_segments[1] = counts[1]/segcount[1];
+        if ((counts[1] % segcount[1]) != 0) num_segments[1]++;
+    } else {
+        segcount[0]     = counts[0];
+        segcount[1]     = counts[1];
+        num_segments[0] = num_segments[1] = 1;
+    }
+
+    /* if the message is too small to be split into segments */
+    if( (counts[0] == 0 || counts[1] == 0) ||
+        (segsize > counts[0] * type_size) ||
+        (segsize > counts[1] * type_size) ) {
+        /* call linear version here ! */
+        return (smpi_coll_tuned_bcast_SMP_linear ( buffer, count, datatype, 
+                                                    root, comm));
+    }
+    type_extent = smpi_datatype_get_extent(datatype);
+
+    
+    /* Determine real segment size */
+    realsegsize[0] = segcount[0] * type_extent;
+    realsegsize[1] = segcount[1] * type_extent;
+  
+    /* set the buffer pointers */
+    tmpbuf[0] = (char *) buffer;
+    tmpbuf[1] = (char *) buffer+counts[0] * type_extent;
+
+    /* Step 1:
+       Root splits the buffer in 2 and sends segmented message down the branches.
+       Left subtree of the tree receives first half of the buffer, while right
+       subtree receives the remaining message.
+    */
+
+    /* determine if I am left (0) or right (1), (root is right) */
+    lr = ((rank + size - root)%size + 1)%2;
+  
+    /* root code */
+    if( rank == root ) {
+        /* determine segment count */
+        sendcount[0] = segcount[0]; 
+        sendcount[1] = segcount[1];
+        /* for each segment */
+        for (segindex = 0; segindex < num_segments[0]; segindex++) {
+            /* for each child */
+            for( i = 0; i < tree->tree_nextsize && i < 2; i++ ) {
+                if (segindex >= num_segments[i]) { /* no more segments */
+                    continue;
+                }
+                /* determine how many elements are being sent in this round */
+                if(segindex == (num_segments[i] - 1)) 
+                    sendcount[i] = counts[i] - segindex*segcount[i];
+                /* send data */
+                smpi_mpi_send(tmpbuf[i], sendcount[i], datatype,
+                                  tree->tree_next[i], 777, comm);
+                /* update tmp buffer */
+                tmpbuf[i] += realsegsize[i];
+            }
+        }
+    } 
+    
+    /* intermediate nodes code */
+    else if( tree->tree_nextsize > 0 ) { 
+        /* Intermediate nodes:
+         * It will receive segments only from one half of the data.
+         * Which one is determined by whether the node belongs to the "left" or "right" 
+         * subtree. Topoloby building function builds binary tree such that
+         * odd "shifted ranks" ((rank + size - root)%size) are on the left subtree,
+         * and even on the right subtree.
+         *
+         * Create the pipeline. We first post the first receive, then in the loop we
+         * post the next receive and after that wait for the previous receive to complete 
+         * and we disseminating the data to all children.
+         */
+        sendcount[lr] = segcount[lr];
+        base_req=smpi_mpi_irecv(tmpbuf[lr], sendcount[lr], datatype,
+                           tree->tree_prev, 777,
+                           comm);
+
+        for( segindex = 1; segindex < num_segments[lr]; segindex++ ) {
+            /* determine how many elements to expect in this round */
+            if( segindex == (num_segments[lr] - 1)) 
+                sendcount[lr] = counts[lr] - segindex*segcount[lr];
+            /* post new irecv */
+            new_req = smpi_mpi_irecv( tmpbuf[lr] + realsegsize[lr], sendcount[lr],
+                                datatype, tree->tree_prev, 777, 
+                                comm);
+
+            /* wait for and forward current segment */
+            smpi_mpi_waitall( 1, &base_req, MPI_STATUSES_IGNORE );
+            for( i = 0; i < tree->tree_nextsize; i++ ) {  /* send data to children (segcount[lr]) */
+                smpi_mpi_send( tmpbuf[lr], segcount[lr], datatype,
+                                   tree->tree_next[i], 777,
+                                   comm);
+            } /* end of for each child */
+
+            /* upate the base request */
+            base_req = new_req;     
+            /* go to the next buffer (ie. the one corresponding to the next recv) */
+            tmpbuf[lr] += realsegsize[lr];
+        } /* end of for segindex */
+
+        /* wait for the last segment and forward current segment */
+        smpi_mpi_waitall( 1, &base_req, MPI_STATUSES_IGNORE );
+        for( i = 0; i < tree->tree_nextsize; i++ ) {  /* send data to children */
+            smpi_mpi_send(tmpbuf[lr], sendcount[lr], datatype,
+                              tree->tree_next[i], 777, comm);
+        } /* end of for each child */
+    } 
+  
+    /* leaf nodes */
+    else { 
+        /* Just consume segments as fast as possible */
+        sendcount[lr] = segcount[lr];
+        for (segindex = 0; segindex < num_segments[lr]; segindex++) {
+            /* determine how many elements to expect in this round */
+            if (segindex == (num_segments[lr] - 1)) sendcount[lr] = counts[lr] - segindex*segcount[lr];
+            /* receive segments */
+            smpi_mpi_recv(tmpbuf[lr], sendcount[lr], datatype,
+                              tree->tree_prev, 777,
+                              comm, MPI_STATUS_IGNORE);
+            /* update the initial pointer to the buffer */
+            tmpbuf[lr] += realsegsize[lr];
+        }
+    }
+
+    /* reset the buffer pointers */
+    tmpbuf[0] = (char *) buffer;
+    tmpbuf[1] = (char *) buffer+counts[0] * type_extent;
+
+    /* Step 2:
+       Find your immediate pair (identical node in opposite subtree) and SendRecv 
+       data buffer with them.
+       The tree building function ensures that 
+       if (we are not root)
+       if we are in the left subtree (lr == 0) our pair is (rank+1)%size.
+       if we are in the right subtree (lr == 1) our pair is (rank-1)%size
+       If we have even number of nodes the rank (size-1) will pair up with root.
+    */
+    if (lr == 0) {
+        pair = (rank+1)%size;
+    } else {
+        pair = (rank+size-1)%size;
+    }
+
+    if ( (size%2) != 0 && rank != root) { 
+
+        smpi_mpi_sendrecv( tmpbuf[lr], counts[lr], datatype,
+                                        pair, 777,
+                                        tmpbuf[(lr+1)%2], counts[(lr+1)%2], datatype,
+                                        pair, 777,
+                                        comm, MPI_STATUS_IGNORE);
+    } else if ( (size%2) == 0 ) {
+        /* root sends right buffer to the last node */
+        if( rank == root ) {
+            smpi_mpi_send(tmpbuf[1], counts[1], datatype,
+                              (root+size-1)%size, 777, comm);
+
+        } 
+        /* last node receives right buffer from the root */
+        else if (rank == (root+size-1)%size) {
+            smpi_mpi_recv(tmpbuf[1], counts[1], datatype,
+                              root, 777,
+                              comm, MPI_STATUS_IGNORE);
+        } 
+        /* everyone else exchanges buffers */
+        else {
+            smpi_mpi_sendrecv( tmpbuf[lr], counts[lr], datatype,
+                                            pair, 777,
+                                            tmpbuf[(lr+1)%2], counts[(lr+1)%2], datatype,
+                                            pair, 777,
+                                            comm, MPI_STATUS_IGNORE); 
+        }
+    }
+    return (MPI_SUCCESS);
+  
+
+}
+
diff --git a/src/smpi/colls/coll_tuned_topo.c b/src/smpi/colls/coll_tuned_topo.c
new file mode 100644 (file)
index 0000000..2fc8df4
--- /dev/null
@@ -0,0 +1,629 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2005 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ * 
+ * Additional copyrights may follow
+ * 
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+/*
+ * Some static helpers.
+ */
+static int pown( int fanout, int num )
+{
+    int j, p = 1;
+    if( num < 0 ) return 0;
+    if (1==num) return fanout;
+    if (2==fanout) {
+        return p<<num;
+    }
+    else {
+        for( j = 0; j < num; j++ ) { p*= fanout; }
+    }
+    return p;
+}
+
+static int calculate_level( int fanout, int rank )
+{
+    int level, num;
+    if( rank < 0 ) return -1;
+    for( level = 0, num = 0; num <= rank; level++ ) {
+        num += pown(fanout, level);
+    }
+    return level-1;
+}
+
+static int calculate_num_nodes_up_to_level( int fanout, int level )
+{
+    /* just use geometric progression formula for sum:
+       a^0+a^1+...a^(n-1) = (a^n-1)/(a-1) */
+    return ((pown(fanout,level) - 1)/(fanout - 1));
+}
+
+/*
+ * And now the building functions.
+ *
+ * An example for fanout = 2, comm_size = 7
+ *
+ *              0           <-- delta = 1 (fanout^0)
+ *            /   \
+ *           1     2        <-- delta = 2 (fanout^1)
+ *          / \   / \
+ *         3   5 4   6      <-- delta = 4 (fanout^2)
+ */
+
+ompi_coll_tree_t*
+ompi_coll_tuned_topo_build_tree( int fanout,
+                                 MPI_Comm comm,
+                                 int root )
+{
+    int rank, size;
+    int schild, sparent;
+    int level; /* location of my rank in the tree structure of size */
+    int delta; /* number of nodes on my level */
+    int slimit; /* total number of nodes on levels above me */ 
+    int shiftedrank;
+    int i;
+    ompi_coll_tree_t* tree;
+
+    XBT_DEBUG("coll:tuned:topo_build_tree Building fo %d rt %d", fanout, root);
+
+    if (fanout<1) {
+        XBT_DEBUG("coll:tuned:topo_build_tree invalid fanout %d", fanout);
+        return NULL;
+    }
+    if (fanout>MAXTREEFANOUT) {
+        XBT_DEBUG("coll:tuned:topo_build_tree invalid fanout %d bigger than max %d", fanout, MAXTREEFANOUT);
+        return NULL;
+    }
+
+    /* 
+     * Get size and rank of the process in this communicator 
+     */
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t));
+    if (!tree) {
+        XBT_DEBUG("coll:tuned:topo_build_tree PANIC::out of memory");
+        return NULL;
+    }
+
+    tree->tree_root     = MPI_UNDEFINED;
+    tree->tree_nextsize = MPI_UNDEFINED;
+
+    /*
+     * Set root
+     */
+    tree->tree_root = root;
+  
+    /* 
+     * Initialize tree
+     */
+    tree->tree_fanout   = fanout;
+    tree->tree_bmtree   = 0;
+    tree->tree_root     = root;
+    tree->tree_prev     = -1;
+    tree->tree_nextsize = 0;
+    for( i = 0; i < fanout; i++ ) {
+        tree->tree_next[i] = -1;
+    }
+
+    /* return if we have less than 2 processes */
+    if( size < 2 ) {
+        return tree;
+    }
+  
+    /*
+     * Shift all ranks by root, so that the algorithm can be 
+     * designed as if root would be always 0
+     * shiftedrank should be used in calculating distances 
+     * and position in tree
+     */
+    shiftedrank = rank - root;
+    if( shiftedrank < 0 ) {
+        shiftedrank += size;
+    }
+
+    /* calculate my level */
+    level = calculate_level( fanout, shiftedrank );
+    delta = pown( fanout, level );
+
+    /* find my children */
+    for( i = 0; i < fanout; i++ ) {
+        schild = shiftedrank + delta * (i+1);
+        if( schild < size ) {
+            tree->tree_next[i] = (schild+root)%size;
+            tree->tree_nextsize = tree->tree_nextsize + 1;
+        } else {
+            break;
+        }
+    }
+    
+    /* find my parent */
+    slimit = calculate_num_nodes_up_to_level( fanout, level );
+    sparent = shiftedrank;
+    if( sparent < fanout ) {
+        sparent = 0;
+    } else {
+        while( sparent >= slimit ) {
+            sparent -= delta/fanout;
+        }
+    }
+    tree->tree_prev = (sparent+root)%size;
+  
+    return tree;
+}
+
+/*
+ * Constructs in-order binary tree which can be used for non-commutative reduce 
+ * operations.
+ * Root of this tree is always rank (size-1) and fanout is 2.
+ * Here are some of the examples of this tree:
+ * size == 2     size == 3     size == 4                size == 9
+ *      1             2             3                        8
+ *     /             / \          /   \                    /   \
+ *    0             1  0         2     1                  7     3
+ *                                    /                 /  \   / \
+ *                                   0                 6    5 2   1
+ *                                                         /     /
+ *                                                        4     0
+ */
+ompi_coll_tree_t*
+ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm )
+{
+    int rank, size;
+    int myrank, rightsize, delta;
+    int parent, lchild, rchild;
+    ompi_coll_tree_t* tree;
+
+    /* 
+     * Get size and rank of the process in this communicator 
+     */
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    tree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t));
+    if (!tree) {
+        XBT_DEBUG(
+                     "coll:tuned:topo_build_tree PANIC::out of memory");
+        return NULL;
+    }
+
+    tree->tree_root     = MPI_UNDEFINED;
+    tree->tree_nextsize = MPI_UNDEFINED;
+
+    /* 
+     * Initialize tree
+     */
+    tree->tree_fanout   = 2;
+    tree->tree_bmtree   = 0;
+    tree->tree_root     = size - 1;
+    tree->tree_prev     = -1;
+    tree->tree_nextsize = 0;
+    tree->tree_next[0]  = -1;
+    tree->tree_next[1]  = -1;
+    XBT_DEBUG(
+                 "coll:tuned:topo_build_in_order_tree Building fo %d rt %d", 
+                 tree->tree_fanout, tree->tree_root);
+
+    /* 
+     * Build the tree
+     */
+    myrank = rank;
+    parent = size - 1;
+    delta = 0;
+
+    while ( 1 ) {
+        /* Compute the size of the right subtree */
+        rightsize = size >> 1;
+
+        /* Determine the left and right child of this parent  */
+        lchild = -1;
+        rchild = -1;
+        if (size - 1 > 0) {
+            lchild = parent - 1;
+            if (lchild > 0) { 
+                rchild = rightsize - 1;
+            }
+        }
+       
+        /* The following cases are possible: myrank can be 
+           - a parent,
+           - belong to the left subtree, or
+           - belong to the right subtee
+           Each of the cases need to be handled differently.
+        */
+          
+        if (myrank == parent) {
+            /* I am the parent:
+               - compute real ranks of my children, and exit the loop. */
+            if (lchild >= 0) tree->tree_next[0] = lchild + delta;
+            if (rchild >= 0) tree->tree_next[1] = rchild + delta;
+            break;
+        }
+        if (myrank > rchild) {
+            /* I belong to the left subtree:
+               - If I am the left child, compute real rank of my parent
+               - Iterate down through tree: 
+               compute new size, shift ranks down, and update delta.
+            */
+            if (myrank == lchild) {
+                tree->tree_prev = parent + delta;
+            }
+            size = size - rightsize - 1;
+            delta = delta + rightsize;
+            myrank = myrank - rightsize;
+            parent = size - 1;
+
+        } else {
+            /* I belong to the right subtree:
+               - If I am the right child, compute real rank of my parent
+               - Iterate down through tree:  
+               compute new size and parent, 
+               but the delta and rank do not need to change.
+            */
+            if (myrank == rchild) {
+                tree->tree_prev = parent + delta;
+            }
+            size = rightsize;
+            parent = rchild;
+        }
+    }
+    
+    if (tree->tree_next[0] >= 0) { tree->tree_nextsize = 1; }
+    if (tree->tree_next[1] >= 0) { tree->tree_nextsize += 1; }
+
+    return tree;
+}
+
+int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree )
+{
+    ompi_coll_tree_t *ptr;
+
+    if ((!tree)||(!*tree)) {
+        return MPI_SUCCESS;
+    }
+
+    ptr = *tree;
+
+    free (ptr);
+    *tree = NULL;   /* mark tree as gone */
+
+    return MPI_SUCCESS;
+}
+
+/*
+ * 
+ * Here are some of the examples of this tree:
+ * size == 2                   size = 4                 size = 8
+ *      0                           0                        0
+ *     /                            | \                    / | \
+ *    1                             2  1                  4  2  1
+ *                                     |                     |  |\
+ *                                     3                     6  5 3
+ *                                                                |
+ *                                                                7
+ */
+ompi_coll_tree_t*
+ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm,
+                                   int root )
+{
+    int childs = 0;
+    int rank;
+    int size;
+    int mask = 1;
+    int index;
+    int remote;
+    ompi_coll_tree_t *bmtree;
+    int i;
+
+    XBT_DEBUG("coll:tuned:topo:build_bmtree rt %d", root);
+
+    /* 
+     * Get size and rank of the process in this communicator 
+     */
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    index = rank -root;
+
+    bmtree = (ompi_coll_tree_t*)malloc(sizeof(ompi_coll_tree_t));
+    if (!bmtree) {
+        XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory");
+        return NULL;
+    }
+
+    bmtree->tree_bmtree   = 1;
+
+    bmtree->tree_root     = MPI_UNDEFINED;
+    bmtree->tree_nextsize = MPI_UNDEFINED;
+    for(i=0;i<MAXTREEFANOUT;i++) {
+        bmtree->tree_next[i] = -1;
+    }
+
+    if( index < 0 ) index += size;
+
+    while( mask <= index ) mask <<= 1;
+
+    /* Now I can compute my father rank */
+    if( root == rank ) {
+        bmtree->tree_prev = root;
+    } else {
+        remote = (index ^ (mask >> 1)) + root;
+        if( remote >= size ) remote -= size;
+        bmtree->tree_prev = remote;
+    }
+    /* And now let's fill my childs */
+    while( mask < size ) {
+        remote = (index ^ mask);
+        if( remote >= size ) break;
+        remote += root;
+        if( remote >= size ) remote -= size;
+        if (childs==MAXTREEFANOUT) {
+            XBT_DEBUG("coll:tuned:topo:build_bmtree max fanout incorrect %d needed %d", MAXTREEFANOUT, childs);
+            return NULL;
+        }
+        bmtree->tree_next[childs] = remote;
+        mask <<= 1;
+        childs++;
+    }
+    bmtree->tree_nextsize = childs;
+    bmtree->tree_root     = root;
+    return bmtree;
+}
+
+/*
+ * Constructs in-order binomial tree which can be used for gather/scatter
+ * operations.
+ * 
+ * Here are some of the examples of this tree:
+ * size == 2                   size = 4                 size = 8
+ *      0                           0                        0
+ *     /                          / |                      / | \
+ *    1                          1  2                     1  2  4
+ *                                  |                        |  | \
+ *                                  3                        3  5  6
+ *                                                                 |
+ *                                                                 7
+ */
+ompi_coll_tree_t*
+ompi_coll_tuned_topo_build_in_order_bmtree( MPI_Comm comm,
+                                           int root )
+{
+    int childs = 0;
+    int rank, vrank;
+    int size;
+    int mask = 1;
+    int remote;
+    ompi_coll_tree_t *bmtree;
+    int i;
+
+    XBT_DEBUG("coll:tuned:topo:build_in_order_bmtree rt %d", root);
+
+    /* 
+     * Get size and rank of the process in this communicator 
+     */
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    vrank = (rank - root + size) % size;
+
+    bmtree = (ompi_coll_tree_t*)xbt_malloc(sizeof(ompi_coll_tree_t));
+    if (!bmtree) {
+        XBT_DEBUG("coll:tuned:topo:build_bmtree PANIC out of memory");
+        return NULL;
+    }
+
+    bmtree->tree_bmtree   = 1;
+    bmtree->tree_root     = MPI_UNDEFINED;
+    bmtree->tree_nextsize = MPI_UNDEFINED;
+    for(i=0;i<MAXTREEFANOUT;i++) {
+        bmtree->tree_next[i] = -1;
+    }
+
+    if (root == rank) {
+       bmtree->tree_prev = root;
+    }
+
+    while (mask < size) {
+       remote = vrank ^ mask;
+       if (remote < vrank) {
+           bmtree->tree_prev = (remote + root) % size;
+           break;
+       } else if (remote < size) {
+           bmtree->tree_next[childs] = (remote + root) % size;
+           childs++;
+           if (childs==MAXTREEFANOUT) {
+               XBT_DEBUG(
+                            "coll:tuned:topo:build_bmtree max fanout incorrect %d needed %d",
+                            MAXTREEFANOUT, childs);
+               return NULL;
+           }
+       }
+       mask <<= 1;
+    }
+    bmtree->tree_nextsize = childs;
+    bmtree->tree_root     = root;
+
+    return bmtree;
+}
+
+
+ompi_coll_tree_t*
+ompi_coll_tuned_topo_build_chain( int fanout,
+                                  MPI_Comm comm,
+                                  int root )
+{
+    int rank, size;
+    int srank; /* shifted rank */
+    int i,maxchainlen;
+    int mark,head,len;
+    ompi_coll_tree_t *chain;
+
+    XBT_DEBUG("coll:tuned:topo:build_chain fo %d rt %d", fanout, root);
+
+    /* 
+     * Get size and rank of the process in this communicator 
+     */
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    if( fanout < 1 ) {
+        XBT_DEBUG("coll:tuned:topo:build_chain WARNING invalid fanout of ZERO, forcing to 1 (pipeline)!");
+        fanout = 1;
+    }
+    if (fanout>MAXTREEFANOUT) {
+        XBT_DEBUG("coll:tuned:topo:build_chain WARNING invalid fanout %d bigger than max %d, forcing to max!", fanout, MAXTREEFANOUT);
+        fanout = MAXTREEFANOUT;
+    }
+
+    /*
+     * Allocate space for topology arrays if needed 
+     */
+    chain = (ompi_coll_tree_t*)malloc( sizeof(ompi_coll_tree_t) );
+    if (!chain) {
+        XBT_DEBUG("coll:tuned:topo:build_chain PANIC out of memory");
+        fflush(stdout);
+        return NULL;
+    }
+    chain->tree_root     = MPI_UNDEFINED;
+    chain->tree_nextsize = -1;
+    for(i=0;i<fanout;i++) chain->tree_next[i] = -1;
+
+    /* 
+     * Set root & numchain
+     */
+    chain->tree_root = root;
+    if( (size - 1) < fanout ) { 
+        chain->tree_nextsize = size-1;
+        fanout = size-1;
+    } else {
+        chain->tree_nextsize = fanout;
+    }
+    
+    /*
+     * Shift ranks
+     */
+    srank = rank - root;
+    if (srank < 0) srank += size;
+
+    /*
+     * Special case - fanout == 1
+     */
+    if( fanout == 1 ) {
+        if( srank == 0 ) chain->tree_prev = -1;
+        else chain->tree_prev = (srank-1+root)%size;
+
+        if( (srank + 1) >= size) {
+            chain->tree_next[0] = -1;
+            chain->tree_nextsize = 0;
+        } else {
+            chain->tree_next[0] = (srank+1+root)%size;
+            chain->tree_nextsize = 1;
+        }
+        return chain;
+    }
+
+    /* Let's handle the case where there is just one node in the communicator */
+    if( size == 1 ) {
+        chain->tree_next[0] = -1;
+        chain->tree_nextsize = 0;
+        chain->tree_prev = -1;
+        return chain;
+    }
+    /*
+     * Calculate maximum chain length
+     */
+    maxchainlen = (size-1) / fanout;
+    if( (size-1) % fanout != 0 ) {
+        maxchainlen++;
+        mark = (size-1)%fanout;
+    } else {
+        mark = fanout+1;
+    }
+
+    /*
+     * Find your own place in the list of shifted ranks
+     */
+    if( srank != 0 ) {
+        int column;
+        if( srank-1 < (mark * maxchainlen) ) {
+            column = (srank-1)/maxchainlen;
+            head = 1+column*maxchainlen;
+            len = maxchainlen;
+        } else {
+            column = mark + (srank-1-mark*maxchainlen)/(maxchainlen-1);
+            head = mark*maxchainlen+1+(column-mark)*(maxchainlen-1);
+            len = maxchainlen-1;
+        }
+
+        if( srank == head ) {
+            chain->tree_prev = 0; /*root*/
+        } else {
+            chain->tree_prev = srank-1; /* rank -1 */
+        }
+        if( srank == (head + len - 1) ) {
+            chain->tree_next[0] = -1;
+            chain->tree_nextsize = 0;
+        } else {
+            if( (srank + 1) < size ) {
+                chain->tree_next[0] = srank+1;
+                chain->tree_nextsize = 1;
+            } else {
+                chain->tree_next[0] = -1;
+                chain->tree_nextsize = 0;    
+            }
+        }
+    }
+    
+    /*
+     * Unshift values 
+     */
+    if( rank == root ) {
+        chain->tree_prev = -1;
+        chain->tree_next[0] = (root+1)%size;
+        for( i = 1; i < fanout; i++ ) {
+            chain->tree_next[i] = chain->tree_next[i-1] + maxchainlen;
+            if( i > mark ) {
+                chain->tree_next[i]--;
+            }
+            chain->tree_next[i] %= size;
+        }
+        chain->tree_nextsize = fanout;
+    } else {
+        chain->tree_prev = (chain->tree_prev+root)%size;
+        if( chain->tree_next[0] != -1 ) {
+            chain->tree_next[0] = (chain->tree_next[0]+root)%size;
+        }
+    }
+
+    return chain;
+}
+
+int ompi_coll_tuned_topo_dump_tree (ompi_coll_tree_t* tree, int rank)
+{
+    int i;
+
+    XBT_DEBUG("coll:tuned:topo:topo_dump_tree %1d tree root %d"
+                 " fanout %d BM %1d nextsize %d prev %d",
+                 rank, tree->tree_root, tree->tree_bmtree, tree->tree_fanout,
+                 tree->tree_nextsize, tree->tree_prev);
+    if( tree->tree_nextsize ) {
+        for( i = 0; i < tree->tree_nextsize; i++ )
+            XBT_DEBUG("[%1d] %d", i, tree->tree_next[i]);
+    }
+    return (0);
+}
diff --git a/src/smpi/colls/coll_tuned_topo.h b/src/smpi/colls/coll_tuned_topo.h
new file mode 100644 (file)
index 0000000..73b0361
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2005 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ * 
+ * Additional copyrights may follow
+ * 
+ * $HEADER$
+ */
+
+#ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED
+#define MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED
+
+#include "colls_private.h"
+
+#define MAXTREEFANOUT 32
+
+#define COLL_TUNED_COMPUTED_SEGCOUNT(SEGSIZE, TYPELNG, SEGCOUNT)        \
+    if( ((SEGSIZE) >= (TYPELNG)) &&                                     \
+        ((SEGSIZE) < ((TYPELNG) * (SEGCOUNT))) ) {                      \
+        size_t residual;                                                \
+        (SEGCOUNT) = (int)((SEGSIZE) / (TYPELNG));                      \
+        residual = (SEGSIZE) - (SEGCOUNT) * (TYPELNG);                  \
+        if( residual > ((TYPELNG) >> 1) )                               \
+            (SEGCOUNT)++;                                               \
+    }                                                                   \
+
+
+    typedef struct ompi_coll_tree_t {
+        int32_t tree_root;
+        int32_t tree_fanout;
+        int32_t tree_bmtree;
+        int32_t tree_prev;
+        int32_t tree_next[MAXTREEFANOUT];
+        int32_t tree_nextsize;
+    } ompi_coll_tree_t;
+
+    ompi_coll_tree_t*
+    ompi_coll_tuned_topo_build_tree( int fanout,
+                                     MPI_Comm com,
+                                     int root );
+    ompi_coll_tree_t*
+    ompi_coll_tuned_topo_build_in_order_bintree( MPI_Comm comm );
+
+    ompi_coll_tree_t*
+    ompi_coll_tuned_topo_build_bmtree( MPI_Comm comm,
+                                       int root );
+    ompi_coll_tree_t*
+    ompi_coll_tuned_topo_build_in_order_bmtree( MPI_Comm comm,
+                                               int root );
+    ompi_coll_tree_t*
+    ompi_coll_tuned_topo_build_chain( int fanout,
+                                      MPI_Comm com,
+                                      int root );
+
+    int ompi_coll_tuned_topo_destroy_tree( ompi_coll_tree_t** tree );
+
+    /* debugging stuff, will be removed later */
+    int ompi_coll_tuned_topo_dump_tree (ompi_coll_tree_t* tree, int rank);
+
+#endif  /* MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED */
+
index 17c245d..67b62a0 100644 (file)
 #define COLL_NOsep 
 #define COLL_NOTHING(...) 
 
+/*************
+ * GATHER *
+ *************/
+#define COLL_GATHER_SIG gather, int, \
+                         (void *send_buff, int send_count, MPI_Datatype send_type, \
+                          void *recv_buff, int recv_count, MPI_Datatype recv_type, \
+                           int root, MPI_Comm comm)
+
+#define COLL_GATHERS(action, COLL_sep) \
+COLL_APPLY(action, COLL_GATHER_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_GATHER_SIG, ompi_basic_linear) COLL_sep \
+COLL_APPLY(action, COLL_GATHER_SIG, ompi_binomial) COLL_sep \
+COLL_APPLY(action, COLL_GATHER_SIG, ompi_linear_sync) COLL_sep \
+COLL_APPLY(action, COLL_GATHER_SIG, mpich) \
+
+
+
+COLL_GATHERS(COLL_PROTO, COLL_NOsep)
 
 /*************
  * ALLGATHER *
@@ -44,7 +62,11 @@ COLL_APPLY(action, COLL_ALLGATHER_SIG, rhv) COLL_sep \
 COLL_APPLY(action, COLL_ALLGATHER_SIG, ring) COLL_sep \
 COLL_APPLY(action, COLL_ALLGATHER_SIG, SMP_NTS) COLL_sep \
 COLL_APPLY(action, COLL_ALLGATHER_SIG, smp_simple) COLL_sep \
-COLL_APPLY(action, COLL_ALLGATHER_SIG, spreading_simple)
+COLL_APPLY(action, COLL_ALLGATHER_SIG, spreading_simple) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHER_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHER_SIG, ompi_neighborexchange) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHER_SIG, mpich) 
+
 
 COLL_ALLGATHERS(COLL_PROTO, COLL_NOsep)
 
@@ -59,7 +81,12 @@ COLL_ALLGATHERS(COLL_PROTO, COLL_NOsep)
 #define COLL_ALLGATHERVS(action, COLL_sep) \
 COLL_APPLY(action, COLL_ALLGATHERV_SIG, GB) COLL_sep \
 COLL_APPLY(action, COLL_ALLGATHERV_SIG, pair) COLL_sep \
-COLL_APPLY(action, COLL_ALLGATHERV_SIG, ring)
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, ring) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi_neighborexchange) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, ompi_bruck) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, mpich) COLL_sep \
+COLL_APPLY(action, COLL_ALLGATHERV_SIG, mpich_rdb)
 
 COLL_ALLGATHERVS(COLL_PROTO, COLL_NOsep)
 
@@ -85,7 +112,10 @@ COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rdb) COLL_sep \
 COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag) COLL_sep \
 COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag_lr) COLL_sep \
 COLL_APPLY(action, COLL_ALLREDUCE_SIG, smp_rsag_rab) COLL_sep \
-COLL_APPLY(action, COLL_ALLREDUCE_SIG, redbcast)
+COLL_APPLY(action, COLL_ALLREDUCE_SIG, redbcast) COLL_sep \
+COLL_APPLY(action, COLL_ALLREDUCE_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_ALLREDUCE_SIG, ompi_ring_segmented) COLL_sep \
+COLL_APPLY(action, COLL_ALLREDUCE_SIG, mpich)
 
 COLL_ALLREDUCES(COLL_PROTO, COLL_NOsep)
 
@@ -111,7 +141,10 @@ COLL_APPLY(action, COLL_ALLTOALL_SIG, ring) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_light_barrier) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_mpi_barrier) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALL_SIG, ring_one_barrier) COLL_sep \
-COLL_APPLY(action, COLL_ALLTOALL_SIG, simple)
+COLL_APPLY(action, COLL_ALLTOALL_SIG, simple) COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALL_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALL_SIG, mpich)COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALL_SIG, ompi_pairwise)
 
 COLL_ALLTOALLS(COLL_PROTO, COLL_NOsep)
 
@@ -132,7 +165,10 @@ COLL_APPLY(action, COLL_ALLTOALLV_SIG, pair_one_barrier) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_light_barrier) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_mpi_barrier) COLL_sep \
-COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_one_barrier)
+COLL_APPLY(action, COLL_ALLTOALLV_SIG, ring_one_barrier) COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALLV_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALLV_SIG, mpich)COLL_sep \
+COLL_APPLY(action, COLL_ALLTOALLV_SIG, ompi_basic_linear)
 
 COLL_ALLTOALLVS(COLL_PROTO, COLL_NOsep)
 
@@ -158,7 +194,11 @@ COLL_APPLY(action, COLL_BCAST_SIG, scatter_LR_allgather) COLL_sep \
 COLL_APPLY(action, COLL_BCAST_SIG, scatter_rdb_allgather) COLL_sep \
 COLL_APPLY(action, COLL_BCAST_SIG, SMP_binary) COLL_sep \
 COLL_APPLY(action, COLL_BCAST_SIG, SMP_binomial) COLL_sep \
-COLL_APPLY(action, COLL_BCAST_SIG, SMP_linear)
+COLL_APPLY(action, COLL_BCAST_SIG, SMP_linear) COLL_sep \
+COLL_APPLY(action, COLL_BCAST_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_BCAST_SIG, ompi_split_bintree) COLL_sep \
+COLL_APPLY(action, COLL_BCAST_SIG, ompi_pipeline) COLL_sep \
+COLL_APPLY(action, COLL_BCAST_SIG, mpich)
 
 COLL_BCASTS(COLL_PROTO, COLL_NOsep)
 
@@ -175,8 +215,71 @@ COLL_APPLY(action, COLL_REDUCE_SIG, arrival_pattern_aware) COLL_sep \
 COLL_APPLY(action, COLL_REDUCE_SIG, binomial) COLL_sep \
 COLL_APPLY(action, COLL_REDUCE_SIG, flat_tree) COLL_sep \
 COLL_APPLY(action, COLL_REDUCE_SIG, NTSL) COLL_sep \
-COLL_APPLY(action, COLL_REDUCE_SIG, scatter_gather)
+COLL_APPLY(action, COLL_REDUCE_SIG, scatter_gather) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_chain) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_pipeline) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_basic_linear) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_in_order_binary) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_binary) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, ompi_binomial) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SIG, mpich)
 
 COLL_REDUCES(COLL_PROTO, COLL_NOsep)
 
+/*************
+ * REDUCE_SCATTER *
+ *************/
+#define COLL_REDUCE_SCATTER_SIG reduce_scatter, int, \
+                         (void *sbuf, void *rbuf, int *rcounts,\
+                    MPI_Datatype dtype,MPI_Op  op,MPI_Comm  comm)
+
+#define COLL_REDUCE_SCATTERS(action, COLL_sep) \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi_basic_recursivehalving) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, ompi_ring)  COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_pair) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_rdb) COLL_sep \
+COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mpich_noncomm) 
+
+
+COLL_REDUCE_SCATTERS(COLL_PROTO, COLL_NOsep)
+
+
+/*************
+ * SCATTER *
+ *************/
+#define COLL_SCATTER_SIG scatter, int, \
+                (void *sendbuf, int sendcount, MPI_Datatype sendtype,\
+                void *recvbuf, int recvcount, MPI_Datatype recvtype,\
+                int root, MPI_Comm comm)
+
+#define COLL_SCATTERS(action, COLL_sep) \
+COLL_APPLY(action, COLL_SCATTER_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_SCATTER_SIG, ompi_basic_linear) COLL_sep \
+COLL_APPLY(action, COLL_SCATTER_SIG, ompi_binomial)  COLL_sep \
+COLL_APPLY(action, COLL_SCATTER_SIG, mpich) 
+
+COLL_SCATTERS(COLL_PROTO, COLL_NOsep)
+
+/*************
+ * SCATTER *
+ *************/
+#define COLL_BARRIER_SIG barrier, int, \
+                (MPI_Comm comm)
+
+#define COLL_BARRIERS(action, COLL_sep) \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi) COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_basic_linear) COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_two_procs)  COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_tree)  COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_bruck)  COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_recursivedoubling) COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, ompi_doublering) COLL_sep \
+COLL_APPLY(action, COLL_BARRIER_SIG, mpich)  
+
+COLL_BARRIERS(COLL_PROTO, COLL_NOsep)
+
+
 #endif
diff --git a/src/smpi/colls/gather-ompi.c b/src/smpi/colls/gather-ompi.c
new file mode 100644 (file)
index 0000000..22e6e63
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2009 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+
+#define MCA_COLL_BASE_TAG_GATHER 333
+/* Todo: gather_intra_generic, gather_intra_binary, gather_intra_chain,
+ * gather_intra_pipeline, segmentation? */
+int
+smpi_coll_tuned_gather_ompi_binomial(void *sbuf, int scount,
+                                     MPI_Datatype sdtype,
+                                     void *rbuf, int rcount,
+                                     MPI_Datatype rdtype,
+                                     int root,
+                                     MPI_Comm comm)
+{
+    int line = -1;
+    int i;
+    int rank;
+    int vrank;
+    int size;
+    int total_recv = 0;
+    char *ptmp     = NULL;
+    char *tempbuf  = NULL;
+    int err;
+    ompi_coll_tree_t* bmtree;
+    MPI_Status status;
+    MPI_Aint sextent, slb, strue_lb, strue_extent; 
+    MPI_Aint rextent, rlb, rtrue_lb, rtrue_extent;
+
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    XBT_DEBUG(
+                "smpi_coll_tuned_gather_ompi_binomial rank %d", rank);
+
+    /* create the binomial tree */
+   // COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root );
+    bmtree = ompi_coll_tuned_topo_build_in_order_bmtree(comm, root);
+    // data->cached_in_order_bmtree;
+
+    smpi_datatype_extent(sdtype, &slb, &sextent);
+    smpi_datatype_extent(sdtype, &strue_lb, &strue_extent);
+
+    vrank = (rank - root + size) % size;
+
+    if (rank == root) {
+        smpi_datatype_extent(rdtype, &rlb, &rextent);
+        smpi_datatype_extent(rdtype, &rtrue_lb, &rtrue_extent);
+       if (0 == root){
+           /* root on 0, just use the recv buffer */
+           ptmp = (char *) rbuf;
+           if (sbuf != MPI_IN_PLACE) {
+               err = smpi_datatype_copy(sbuf, scount, sdtype,
+                                     ptmp, rcount, rdtype);
+               if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+           }
+       } else {
+           /* root is not on 0, allocate temp buffer for recv,
+            * rotate data at the end */
+           tempbuf = (char *) malloc(rtrue_extent + (rcount*size - 1) * rextent);
+           if (NULL == tempbuf) {
+               err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl;
+           }
+
+           ptmp = tempbuf - rlb;
+           if (sbuf != MPI_IN_PLACE) {
+               /* copy from sbuf to temp buffer */
+               err = smpi_datatype_copy(sbuf, scount, sdtype,
+                                     ptmp, rcount, rdtype);
+               if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+           } else {
+               /* copy from rbuf to temp buffer  */
+               err = smpi_datatype_copy((char *) rbuf + rank*rextent*rcount, rcount, rdtype, ptmp, rcount, rdtype );
+               if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+           }
+       }
+       total_recv = rcount;
+    } else if (!(vrank % 2)) {
+       /* other non-leaf nodes, allocate temp buffer for data received from
+        * children, the most we need is half of the total data elements due
+        * to the property of binimoal tree */
+       tempbuf = (char *) malloc(strue_extent + (scount*size - 1) * sextent);
+       if (NULL == tempbuf) {
+           err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl;
+       }
+
+       ptmp = tempbuf - slb;
+       /* local copy to tempbuf */
+       err = smpi_datatype_copy(sbuf, scount, sdtype,
+                                   ptmp, scount, sdtype);
+       if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+       /* use sdtype,scount as rdtype,rdcount since they are ignored on
+        * non-root procs */
+       rdtype = sdtype;
+       rcount = scount;
+       rextent = sextent;
+       total_recv = rcount;
+    } else {
+       /* leaf nodes, no temp buffer needed, use sdtype,scount as
+        * rdtype,rdcount since they are ignored on non-root procs */
+       ptmp = (char *) sbuf;
+       total_recv = scount;
+    }
+
+    if (!(vrank % 2)) {
+       /* all non-leaf nodes recv from children */
+       for (i = 0; i < bmtree->tree_nextsize; i++) {
+           int mycount = 0, vkid;
+           /* figure out how much data I have to send to this child */
+           vkid = (bmtree->tree_next[i] - root + size) % size;
+           mycount = vkid - vrank;
+           if (mycount > (size - vkid))
+               mycount = size - vkid;
+           mycount *= rcount;
+
+           XBT_DEBUG(
+                        "smpi_coll_tuned_gather_ompi_binomial rank %d recv %d mycount = %d",
+                        rank, bmtree->tree_next[i], mycount);
+
+           smpi_mpi_recv(ptmp + total_recv*rextent, rcount*size-total_recv, rdtype,
+                                   bmtree->tree_next[i], MCA_COLL_BASE_TAG_GATHER,
+                                   comm, &status);
+
+           total_recv += mycount;
+       }
+    }
+
+    if (rank != root) {
+       /* all nodes except root send to parents */
+       XBT_DEBUG(
+                    "smpi_coll_tuned_gather_ompi_binomial rank %d send %d count %d\n",
+                    rank, bmtree->tree_prev, total_recv);
+
+       smpi_mpi_send(ptmp, total_recv, sdtype,
+                               bmtree->tree_prev,
+                               MCA_COLL_BASE_TAG_GATHER,
+                                comm);
+  }
+    if (rank == root) {
+       if (root != 0) {
+           /* rotate received data on root if root != 0 */
+           err = smpi_datatype_copy(ptmp, rcount*(size - root), rdtype,
+                                                (char *) rbuf + rextent*root*rcount, rcount*(size - root), rdtype );
+           if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+
+           err = smpi_datatype_copy( ptmp + rextent*rcount*(size-root), rcount*root,rdtype, 
+                                                (char *) rbuf,rcount*root,rdtype);
+           if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+           free(tempbuf);
+       }
+    } else if (!(vrank % 2)) {
+       /* other non-leaf nodes */
+       free(tempbuf);
+    }
+    return MPI_SUCCESS;
+
+ err_hndl:
+    if (NULL != tempbuf)
+       free(tempbuf);
+
+    XBT_DEBUG(  "%s:%4d\tError occurred %d, rank %2d",
+                __FILE__, line, err, rank);
+    return err;
+}
+
+/*
+ *     gather_intra_linear_sync
+ *
+ *     Function:       - synchronized gather operation with
+ *     Accepts:        - same arguments as MPI_Gather(), first segment size
+ *     Returns:        - MPI_SUCCESS or error code
+ */
+int
+smpi_coll_tuned_gather_ompi_linear_sync(void *sbuf, int scount,
+                                         MPI_Datatype sdtype,
+                                         void *rbuf, int rcount,
+                                         MPI_Datatype rdtype,
+                                         int root, 
+                                         MPI_Comm comm)
+{
+    int i;
+    int ret, line;
+    int rank, size;
+    int first_segment_count;
+    size_t typelng;
+    MPI_Aint extent;
+    MPI_Aint lb;
+
+    int first_segment_size=0;
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+    
+    size_t dsize, block_size;
+    if (rank == root) {
+        dsize= smpi_datatype_size(rdtype);
+        block_size = dsize * rcount;
+    } else {
+        dsize=smpi_datatype_size(sdtype);
+        block_size = dsize * scount;
+    }
+    
+     if (block_size > 92160){
+     first_segment_size = 32768;
+     }else{
+     first_segment_size = 1024;
+     }
+
+    XBT_DEBUG(
+                "smpi_coll_tuned_gather_ompi_linear_sync rank %d, segment %d", rank, first_segment_size);
+
+    if (rank != root) {
+        /* Non-root processes:
+           - receive zero byte message from the root,
+           - send the first segment of the data synchronously,
+           - send the second segment of the data.
+        */
+
+        typelng= smpi_datatype_size(sdtype);
+        smpi_datatype_extent(sdtype, &lb, &extent);
+        first_segment_count = scount;
+        COLL_TUNED_COMPUTED_SEGCOUNT( (size_t) first_segment_size, typelng, 
+                                      first_segment_count );
+
+        smpi_mpi_recv(sbuf, 0, MPI_BYTE, root, 
+                                MCA_COLL_BASE_TAG_GATHER,
+                                comm, MPI_STATUS_IGNORE);
+
+        smpi_mpi_send(sbuf, first_segment_count, sdtype, root,
+                                MCA_COLL_BASE_TAG_GATHER,
+                                 comm);
+
+        smpi_mpi_send((char*)sbuf + extent * first_segment_count, 
+                                (scount - first_segment_count), sdtype, 
+                                root, MCA_COLL_BASE_TAG_GATHER,
+                                 comm);
+    }
+
+    else {
+        /* Root process, 
+           - For every non-root node:
+          - post irecv for the first segment of the message
+          - send zero byte message to signal node to send the message
+          - post irecv for the second segment of the message
+          - wait for the first segment to complete
+           - Copy local data if necessary
+           - Waitall for all the second segments to complete.
+       */
+        char *ptmp;
+        MPI_Request *reqs = NULL, first_segment_req;
+        reqs = (MPI_Request *) calloc(size, sizeof(MPI_Request ));
+        if (NULL == reqs) { ret = -1; line = __LINE__; goto error_hndl; }
+        
+        typelng=smpi_datatype_size(rdtype);
+        smpi_datatype_extent(rdtype, &lb, &extent);
+        first_segment_count = rcount;
+        COLL_TUNED_COMPUTED_SEGCOUNT( (size_t)first_segment_size, typelng, 
+                                      first_segment_count );
+
+        ptmp = (char *) rbuf;
+        for (i = 0; i < size; ++i) {
+            if (i == rank) {  
+                /* skip myself */
+                reqs[i] = MPI_REQUEST_NULL; 
+                continue; 
+            } 
+
+            /* irecv for the first segment from i */
+            ptmp = (char*)rbuf + i * rcount * extent;
+            first_segment_req = smpi_mpi_irecv(ptmp, first_segment_count, rdtype, i,
+                                     MCA_COLL_BASE_TAG_GATHER, comm
+                                     );
+            
+            /* send sync message */
+            smpi_mpi_send(rbuf, 0, MPI_BYTE, i,
+                                    MCA_COLL_BASE_TAG_GATHER,
+                                     comm);
+
+            /* irecv for the second segment */
+            ptmp = (char*)rbuf + (i * rcount + first_segment_count) * extent;
+            reqs[i]=smpi_mpi_irecv(ptmp, (rcount - first_segment_count), 
+                                     rdtype, i, MCA_COLL_BASE_TAG_GATHER, comm
+                                     );
+
+            /* wait on the first segment to complete */
+            smpi_mpi_wait(&first_segment_req, MPI_STATUS_IGNORE);
+        }
+
+        /* copy local data if necessary */
+        if (MPI_IN_PLACE != sbuf) {
+            ret = smpi_datatype_copy(sbuf, scount, sdtype,
+                                  (char*)rbuf + rank * rcount * extent, 
+                                  rcount, rdtype);
+            if (ret != MPI_SUCCESS) { line = __LINE__; goto error_hndl; }
+        }
+        
+        /* wait all second segments to complete */
+        ret = smpi_mpi_waitall(size, reqs, MPI_STATUSES_IGNORE);
+
+        free(reqs);
+    }
+
+    /* All done */
+
+    return MPI_SUCCESS;
+ error_hndl:
+    XBT_DEBUG( 
+                   "ERROR_HNDL: node %d file %s line %d error %d\n", 
+                   rank, __FILE__, line, ret );
+    return ret;
+}
+
+/*
+ * Linear functions are copied from the BASIC coll module
+ * they do not segment the message and are simple implementations
+ * but for some small number of nodes and/or small data sizes they 
+ * are just as fast as tuned/tree based segmenting operations 
+ * and as such may be selected by the decision functions
+ * These are copied into this module due to the way we select modules
+ * in V1. i.e. in V2 we will handle this differently and so will not
+ * have to duplicate code.
+ * JPG following the examples from other coll_tuned implementations. Dec06.
+ */
+
+/* copied function (with appropriate renaming) starts here */
+/*
+ *     gather_intra
+ *
+ *     Function:       - basic gather operation
+ *     Accepts:        - same arguments as MPI_Gather()
+ *     Returns:        - MPI_SUCCESS or error code
+ */
+int
+smpi_coll_tuned_gather_ompi_basic_linear(void *sbuf, int scount,
+                                         MPI_Datatype sdtype,
+                                         void *rbuf, int rcount,
+                                         MPI_Datatype rdtype,
+                                         int root,
+                                         MPI_Comm comm)
+{
+    int i;
+    int err;
+    int rank;
+    int size;
+    char *ptmp;
+    MPI_Aint incr;
+    MPI_Aint extent;
+    MPI_Aint lb;
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    /* Everyone but root sends data and returns. */
+    XBT_DEBUG(
+                "ompi_coll_tuned_gather_intra_basic_linear rank %d", rank);
+
+    if (rank != root) {
+        smpi_mpi_send(sbuf, scount, sdtype, root,
+                                 MCA_COLL_BASE_TAG_GATHER,
+                                  comm);
+        return MPI_SUCCESS;
+    }
+
+    /* I am the root, loop receiving the data. */
+
+    smpi_datatype_extent(rdtype, &lb, &extent);
+    incr = extent * rcount;
+    for (i = 0, ptmp = (char *) rbuf; i < size; ++i, ptmp += incr) {
+        if (i == rank) {
+            if (MPI_IN_PLACE != sbuf) {
+                err = smpi_datatype_copy(sbuf, scount, sdtype,
+                                      ptmp, rcount, rdtype);
+            } else {
+                err = MPI_SUCCESS;
+            }
+        } else {
+            smpi_mpi_recv(ptmp, rcount, rdtype, i,
+                                    MCA_COLL_BASE_TAG_GATHER,
+                                    comm, MPI_STATUS_IGNORE);
+            err = MPI_SUCCESS;
+        }
+        if (MPI_SUCCESS != err) {
+            return err;
+        }
+    }
+
+    /* All done */
+
+    return MPI_SUCCESS;
+}
index 63de8fe..f2555f8 100644 (file)
@@ -13,7 +13,7 @@ int smpi_coll_tuned_reduce_binomial(void *sendbuf, void *recvbuf, int count,
   int tag = 4321;
   MPI_Aint extent;
   void *tmp_buf;
-
+  MPI_Aint true_lb, true_extent;
   if (count == 0)
     return 0;
   rank = smpi_comm_rank(comm);
@@ -22,29 +22,64 @@ int smpi_coll_tuned_reduce_binomial(void *sendbuf, void *recvbuf, int count,
   extent = smpi_datatype_get_extent(datatype);
 
   tmp_buf = (void *) xbt_malloc(count * extent);
-
+  int is_commutative = smpi_op_is_commute(op);
   smpi_mpi_sendrecv(sendbuf, count, datatype, rank, tag,
                recvbuf, count, datatype, rank, tag, comm, &status);
   mask = 1;
-  relrank = (rank - root + comm_size) % comm_size;
+  
+  int lroot;
+  if (is_commutative) 
+        lroot   = root;
+  else
+        lroot   = 0;
+  relrank = (rank - lroot + comm_size) % comm_size;
+
+  smpi_datatype_extent(datatype, &true_lb, &true_extent);
+
+  /* adjust for potential negative lower bound in datatype */
+  tmp_buf = (void *)((char*)tmp_buf - true_lb);
+    
+  /* If I'm not the root, then my recvbuf may not be valid, therefore
+     I have to allocate a temporary one */
+  if (rank != root) {
+      recvbuf = (void *) malloc(count*(max(extent,true_extent)));
+      recvbuf = (void *)((char*)recvbuf - true_lb);
+  }
+   if ((rank != root) || (sendbuf != MPI_IN_PLACE)) {
+      smpi_datatype_copy(sendbuf, count, datatype, recvbuf,count, datatype);
+  }
 
   while (mask < comm_size) {
     /* Receive */
     if ((mask & relrank) == 0) {
       source = (relrank | mask);
       if (source < comm_size) {
-        source = (source + root) % comm_size;
+        source = (source + lroot) % comm_size;
         smpi_mpi_recv(tmp_buf, count, datatype, source, tag, comm, &status);
-        smpi_op_apply(op, tmp_buf, recvbuf, &count, &datatype);
+        
+        if (is_commutative) {
+          smpi_op_apply(op, tmp_buf, recvbuf, &count, &datatype);
+        } else {
+          smpi_op_apply(op, recvbuf, tmp_buf, &count, &datatype);
+          smpi_datatype_copy(tmp_buf, count, datatype,recvbuf, count, datatype);
+        }
       }
     } else {
-      dst = ((relrank & (~mask)) + root) % comm_size;
+      dst = ((relrank & (~mask)) + lroot) % comm_size;
       smpi_mpi_send(recvbuf, count, datatype, dst, tag, comm);
       break;
     }
     mask <<= 1;
   }
 
+if (!is_commutative && (root != 0)){
+  if (rank == 0){
+    smpi_mpi_send(recvbuf, count, datatype, root,tag, comm);
+  }else if (rank == root){
+    smpi_mpi_recv(recvbuf, count, datatype, 0, tag, comm, &status);
+  }
+}
+
   free(tmp_buf);
 
   return 0;
diff --git a/src/smpi/colls/reduce-ompi.c b/src/smpi/colls/reduce-ompi.c
new file mode 100644 (file)
index 0000000..78294e8
--- /dev/null
@@ -0,0 +1,680 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2009 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+#define MCA_COLL_BASE_TAG_REDUCE 555
+
+
+
+int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count,
+                                    MPI_Datatype datatype, MPI_Op  op,
+                                    int root, MPI_Comm comm,
+                                    ompi_coll_tree_t* tree, int count_by_segment,
+                                    int max_outstanding_reqs );
+/**
+ * This is a generic implementation of the reduce protocol. It used the tree
+ * provided as an argument and execute all operations using a segment of
+ * count times a datatype.
+ * For the last communication it will update the count in order to limit
+ * the number of datatype to the original count (original_count)
+ *
+ * Note that for non-commutative operations we cannot save memory copy
+ * for the first block: thus we must copy sendbuf to accumbuf on intermediate 
+ * to keep the optimized loop happy.
+ */
+int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count,
+                                    MPI_Datatype datatype, MPI_Op  op,
+                                    int root, MPI_Comm comm,
+                                    ompi_coll_tree_t* tree, int count_by_segment,
+                                    int max_outstanding_reqs )
+{
+    char *inbuf[2] = {NULL, NULL}, *inbuf_free[2] = {NULL, NULL};
+    char *accumbuf = NULL, *accumbuf_free = NULL;
+    char *local_op_buffer = NULL, *sendtmpbuf = NULL;
+    ptrdiff_t extent, lower_bound, segment_increment;
+    MPI_Request  reqs[2] = {MPI_REQUEST_NULL, MPI_REQUEST_NULL};
+    int num_segments, line, ret, segindex, i, rank;
+    int recvcount, prevcount, inbi;
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    smpi_datatype_extent( datatype, &lower_bound, &extent);
+    num_segments = (original_count + count_by_segment - 1) / count_by_segment;
+    segment_increment = count_by_segment * extent;
+
+    sendtmpbuf = (char*) sendbuf; 
+    if( sendbuf == MPI_IN_PLACE ) { 
+        sendtmpbuf = (char *)recvbuf; 
+    }
+
+    XBT_DEBUG( "coll:tuned:reduce_generic count %d, msg size %ld, segsize %ld, max_requests %d", original_count, (unsigned long)(num_segments * segment_increment), (unsigned long)segment_increment, max_outstanding_reqs);
+
+    rank = smpi_comm_rank(comm);
+
+    /* non-leaf nodes - wait for children to send me data & forward up 
+       (if needed) */
+    if( tree->tree_nextsize > 0 ) {
+        ptrdiff_t true_extent, real_segment_size;
+        true_extent=smpi_datatype_get_extent( datatype);
+
+        /* handle non existant recv buffer (i.e. its NULL) and 
+           protect the recv buffer on non-root nodes */
+        accumbuf = (char*)recvbuf;
+        if( (NULL == accumbuf) || (root != rank) ) {
+            /* Allocate temporary accumulator buffer. */
+            accumbuf_free = (char*)malloc(true_extent + 
+                                          (original_count - 1) * extent);
+            if (accumbuf_free == NULL) { 
+                line = __LINE__; ret = -1; goto error_hndl; 
+            }
+            accumbuf = accumbuf_free - lower_bound;
+        } 
+
+        /* If this is a non-commutative operation we must copy
+           sendbuf to the accumbuf, in order to simplfy the loops */
+        if (!smpi_op_is_commute(op)) {
+            smpi_datatype_copy(
+                                                (char*)sendtmpbuf, original_count, datatype,
+                                                (char*)accumbuf, original_count, datatype);
+        }
+        /* Allocate two buffers for incoming segments */
+        real_segment_size = true_extent + (count_by_segment - 1) * extent;
+        inbuf_free[0] = (char*) malloc(real_segment_size);
+        if( inbuf_free[0] == NULL ) { 
+            line = __LINE__; ret = -1; goto error_hndl; 
+        }
+        inbuf[0] = inbuf_free[0] - lower_bound;
+        /* if there is chance to overlap communication -
+           allocate second buffer */
+        if( (num_segments > 1) || (tree->tree_nextsize > 1) ) {
+            inbuf_free[1] = (char*) malloc(real_segment_size);
+            if( inbuf_free[1] == NULL ) { 
+                line = __LINE__; ret = -1; goto error_hndl;
+            }
+            inbuf[1] = inbuf_free[1] - lower_bound;
+        } 
+
+        /* reset input buffer index and receive count */
+        inbi = 0;
+        recvcount = 0;
+        /* for each segment */
+        for( segindex = 0; segindex <= num_segments; segindex++ ) {
+            prevcount = recvcount;
+            /* recvcount - number of elements in current segment */
+            recvcount = count_by_segment;
+            if( segindex == (num_segments-1) )
+                recvcount = original_count - count_by_segment * segindex;
+
+            /* for each child */
+            for( i = 0; i < tree->tree_nextsize; i++ ) {
+                /**
+                 * We try to overlap communication:
+                 * either with next segment or with the next child
+                 */
+                /* post irecv for current segindex on current child */
+                if( segindex < num_segments ) {
+                    void* local_recvbuf = inbuf[inbi];
+                    if( 0 == i ) {
+                        /* for the first step (1st child per segment) and 
+                         * commutative operations we might be able to irecv 
+                         * directly into the accumulate buffer so that we can 
+                         * reduce(op) this with our sendbuf in one step as 
+                         * ompi_op_reduce only has two buffer pointers, 
+                         * this avoids an extra memory copy.
+                         *
+                         * BUT if the operation is non-commutative or 
+                         * we are root and are USING MPI_IN_PLACE this is wrong!
+                         */
+                        if( (smpi_op_is_commute(op)) &&
+                            !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) {
+                            local_recvbuf = accumbuf + segindex * segment_increment;
+                        }
+                    }
+
+                    reqs[inbi]=smpi_mpi_irecv(local_recvbuf, recvcount, datatype,
+                                             tree->tree_next[i], 
+                                             MCA_COLL_BASE_TAG_REDUCE, comm
+                                             );
+                }
+                /* wait for previous req to complete, if any.
+                   if there are no requests reqs[inbi ^1] will be 
+                   MPI_REQUEST_NULL. */
+                /* wait on data from last child for previous segment */
+                smpi_mpi_waitall( 1, &reqs[inbi ^ 1], 
+                                             MPI_STATUSES_IGNORE );
+                local_op_buffer = inbuf[inbi ^ 1];
+                if( i > 0 ) {
+                    /* our first operation is to combine our own [sendbuf] data 
+                     * with the data we recvd from down stream (but only 
+                     * the operation is commutative and if we are not root and 
+                     * not using MPI_IN_PLACE)
+                     */
+                    if( 1 == i ) {
+                        if( (smpi_op_is_commute(op)) && 
+                            !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) {
+                            local_op_buffer = sendtmpbuf + segindex * segment_increment;
+                        }
+                    }
+                    /* apply operation */
+                    smpi_op_apply(op, local_op_buffer, 
+                                   accumbuf + segindex * segment_increment, 
+                                   &recvcount, &datatype );
+                } else if ( segindex > 0 ) {
+                    void* accumulator = accumbuf + (segindex-1) * segment_increment;
+                    if( tree->tree_nextsize <= 1 ) {
+                        if( (smpi_op_is_commute(op)) &&
+                            !((MPI_IN_PLACE == sendbuf) && (rank == tree->tree_root)) ) {
+                            local_op_buffer = sendtmpbuf + (segindex-1) * segment_increment;
+                        }
+                    }
+                    smpi_op_apply(op, local_op_buffer, accumulator, &prevcount, 
+                                   &datatype );
+
+                    /* all reduced on available data this step (i) complete, 
+                     * pass to the next process unless you are the root.
+                     */
+                    if (rank != tree->tree_root) {
+                        /* send combined/accumulated data to parent */
+                        smpi_mpi_send( accumulator, prevcount, 
+                                                  datatype, tree->tree_prev, 
+                                                  MCA_COLL_BASE_TAG_REDUCE,
+                                                  comm);
+                    }
+
+                    /* we stop when segindex = number of segments 
+                       (i.e. we do num_segment+1 steps for pipelining */
+                    if (segindex == num_segments) break;
+                }
+
+                /* update input buffer index */
+                inbi = inbi ^ 1;
+            } /* end of for each child */
+        } /* end of for each segment */
+
+        /* clean up */
+        if( inbuf_free[0] != NULL) free(inbuf_free[0]);
+        if( inbuf_free[1] != NULL) free(inbuf_free[1]);
+        if( accumbuf_free != NULL ) free(accumbuf_free);
+    }
+
+    /* leaf nodes 
+       Depending on the value of max_outstanding_reqs and 
+       the number of segments we have two options:
+       - send all segments using blocking send to the parent, or
+       - avoid overflooding the parent nodes by limiting the number of 
+       outstanding requests to max_oustanding_reqs.
+       TODO/POSSIBLE IMPROVEMENT: If there is a way to determine the eager size 
+       for the current communication, synchronization should be used only 
+       when the message/segment size is smaller than the eager size.
+    */
+    else {
+
+        /* If the number of segments is less than a maximum number of oustanding
+           requests or there is no limit on the maximum number of outstanding 
+           requests, we send data to the parent using blocking send */
+        if ((0 == max_outstanding_reqs) || 
+            (num_segments <= max_outstanding_reqs)) {
+            
+            segindex = 0;
+            while ( original_count > 0) {
+                if (original_count < count_by_segment) {
+                    count_by_segment = original_count;
+                }
+                smpi_mpi_send((char*)sendbuf + 
+                                         segindex * segment_increment,
+                                         count_by_segment, datatype,
+                                         tree->tree_prev, 
+                                         MCA_COLL_BASE_TAG_REDUCE,
+                                         comm) ;
+                segindex++;
+                original_count -= count_by_segment;
+            }
+        }
+
+        /* Otherwise, introduce flow control:
+           - post max_outstanding_reqs non-blocking synchronous send,
+           - for remaining segments
+           - wait for a ssend to complete, and post the next one.
+           - wait for all outstanding sends to complete.
+        */
+        else {
+
+            int creq = 0;
+            MPI_Request* sreq = NULL;
+
+            sreq = (MPI_Request*) calloc( max_outstanding_reqs,
+                                              sizeof(MPI_Request ) );
+            if (NULL == sreq) { line = __LINE__; ret = -1; goto error_hndl; }
+
+            /* post first group of requests */
+            for (segindex = 0; segindex < max_outstanding_reqs; segindex++) {
+                sreq[segindex]=smpi_mpi_isend((char*)sendbuf +
+                                          segindex * segment_increment,
+                                          count_by_segment, datatype,
+                                          tree->tree_prev, 
+                                          MCA_COLL_BASE_TAG_REDUCE,
+                                          comm);
+                original_count -= count_by_segment;
+            }
+
+            creq = 0;
+            while ( original_count > 0 ) {
+                /* wait on a posted request to complete */
+                smpi_mpi_wait(&sreq[creq], MPI_STATUS_IGNORE);
+                sreq[creq] = MPI_REQUEST_NULL;
+
+                if( original_count < count_by_segment ) {
+                    count_by_segment = original_count;
+                }
+                sreq[creq]=smpi_mpi_isend((char*)sendbuf + 
+                                          segindex * segment_increment, 
+                                          count_by_segment, datatype, 
+                                          tree->tree_prev, 
+                                          MCA_COLL_BASE_TAG_REDUCE, 
+                                          comm );
+                creq = (creq + 1) % max_outstanding_reqs;
+                segindex++;
+                original_count -= count_by_segment;
+            }
+
+            /* Wait on the remaining request to complete */
+            smpi_mpi_waitall( max_outstanding_reqs, sreq, 
+                                         MPI_STATUSES_IGNORE );
+
+            /* free requests */
+            free(sreq);
+        }
+    }
+    return MPI_SUCCESS;
+
+ error_hndl:  /* error handler */
+    XBT_DEBUG("ERROR_HNDL: node %d file %s line %d error %d\n", 
+                   rank, __FILE__, line, ret );
+    if( inbuf_free[0] != NULL ) free(inbuf_free[0]);
+    if( inbuf_free[1] != NULL ) free(inbuf_free[1]);
+    if( accumbuf_free != NULL ) free(accumbuf);
+    return ret;
+}
+
+/* Attention: this version of the reduce operations does not
+   work for:
+   - non-commutative operations
+   - segment sizes which are not multiplies of the extent of the datatype
+     meaning that at least one datatype must fit in the segment !
+*/
+
+int smpi_coll_tuned_reduce_ompi_chain( void *sendbuf, void *recvbuf, int count,
+                                        MPI_Datatype datatype, 
+                                        MPI_Op  op, int root, 
+                                        MPI_Comm  comm
+                                        )
+{
+    uint32_t segsize=64*1024;
+    int segcount = count;
+    size_t typelng;
+    int fanout = smpi_comm_size(comm)/2;
+
+    XBT_DEBUG("coll:tuned:reduce_intra_chain rank %d fo %d ss %5d", smpi_comm_rank(comm), fanout, segsize);
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    typelng = smpi_datatype_size( datatype);
+    
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
+
+    return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, 
+                                           op, root, comm,
+                                           ompi_coll_tuned_topo_build_chain(fanout, comm, root), 
+                                           segcount, 0 );
+}
+
+
+int smpi_coll_tuned_reduce_ompi_pipeline( void *sendbuf, void *recvbuf,
+                                           int count, MPI_Datatype datatype,
+                                           MPI_Op  op, int root,
+                                           MPI_Comm  comm  )
+{
+
+    uint32_t segsize;
+    int segcount = count;
+    size_t typelng;
+//    COLL_TUNED_UPDATE_PIPELINE( comm, tuned_module, root );
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    const double a2 =  0.0410 / 1024.0; /* [1/B] */
+    const double b2 =  9.7128;
+    const double a4 =  0.0033 / 1024.0; /* [1/B] */
+    const double b4 =  1.6761;
+    typelng= smpi_datatype_size( datatype);
+    int communicator_size = smpi_comm_size(comm);
+    size_t message_size = typelng * count; 
+
+    if (communicator_size > (a2 * message_size + b2)) {
+        // Pipeline_1K 
+        segsize = 1024;
+    }else if (communicator_size > (a4 * message_size + b4)) {
+        // Pipeline_32K 
+        segsize = 32*1024;
+    } else {
+        // Pipeline_64K 
+        segsize = 64*1024;
+    }
+
+    XBT_DEBUG("coll:tuned:reduce_intra_pipeline rank %d ss %5d",
+                 smpi_comm_rank(comm), segsize);
+
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
+
+    return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, 
+                                           op, root, comm,
+                                           ompi_coll_tuned_topo_build_chain( 1, comm, root), 
+                                           segcount, 0);
+}
+
+int smpi_coll_tuned_reduce_ompi_binary( void *sendbuf, void *recvbuf,
+                                         int count, MPI_Datatype datatype,
+                                         MPI_Op  op, int root,
+                                         MPI_Comm  comm)
+{
+    uint32_t segsize;
+    int segcount = count;
+    size_t typelng;
+
+
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    typelng=smpi_datatype_size( datatype );
+
+        // Binary_32K 
+    segsize = 32*1024;
+
+    XBT_DEBUG("coll:tuned:reduce_intra_binary rank %d ss %5d",
+                 smpi_comm_rank(comm), segsize);
+
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
+
+    return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, 
+                                           op, root, comm, 
+                                           ompi_coll_tuned_topo_build_tree(2, comm, root), 
+                                           segcount, 0);
+}
+
+int smpi_coll_tuned_reduce_ompi_binomial( void *sendbuf, void *recvbuf,
+                                           int count, MPI_Datatype datatype,
+                                           MPI_Op  op, int root,
+                                           MPI_Comm  comm)
+{
+
+    uint32_t segsize=0;
+    int segcount = count;
+    size_t typelng;
+
+    const double a1 =  0.6016 / 1024.0; /* [1/B] */
+    const double b1 =  1.3496;
+
+//    COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root );
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    typelng= smpi_datatype_size( datatype);
+    int communicator_size = smpi_comm_size(comm);
+    size_t message_size = typelng * count; 
+    if (((communicator_size < 8) && (message_size < 20480)) ||
+               (message_size < 2048) || (count <= 1)) {
+        /* Binomial_0K */
+        segsize = 0;
+    } else if (communicator_size > (a1 * message_size + b1)) {
+        // Binomial_1K 
+        segsize = 1024;
+    }
+
+    XBT_DEBUG("coll:tuned:reduce_intra_binomial rank %d ss %5d",
+                 smpi_comm_rank(comm), segsize);
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
+
+    return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype, 
+                                           op, root, comm, 
+                                           ompi_coll_tuned_topo_build_in_order_bmtree(comm, root), 
+                                           segcount, 0);
+}
+
+/*
+ * reduce_intra_in_order_binary 
+ * 
+ * Function:      Logarithmic reduce operation for non-commutative operations.
+ * Acecpts:       same as MPI_Reduce()
+ * Returns:       MPI_SUCCESS or error code
+ */
+int smpi_coll_tuned_reduce_ompi_in_order_binary( void *sendbuf, void *recvbuf,
+                                                  int count, 
+                                                  MPI_Datatype datatype,
+                                                  MPI_Op  op, int root,
+                                                  MPI_Comm  comm)
+{
+    uint32_t segsize=0;
+    int ret;
+    int rank, size, io_root;
+    int segcount = count;
+    void *use_this_sendbuf = NULL, *use_this_recvbuf = NULL;
+    size_t typelng;
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+    XBT_DEBUG("coll:tuned:reduce_intra_in_order_binary rank %d ss %5d",
+                 rank, segsize);
+
+    /**
+     * Determine number of segments and number of elements
+     * sent per operation
+     */
+    typelng=smpi_datatype_size( datatype);
+    COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
+
+    /* An in-order binary tree must use root (size-1) to preserve the order of
+       operations.  Thus, if root is not rank (size - 1), then we must handle
+       1. MPI_IN_PLACE option on real root, and 
+       2. we must allocate temporary recvbuf on rank (size - 1).
+       Note that generic function must be careful not to switch order of 
+       operations for non-commutative ops.
+    */
+    io_root = size - 1;
+    use_this_sendbuf = sendbuf;
+    use_this_recvbuf = recvbuf;
+    if (io_root != root) {
+        ptrdiff_t text, ext;
+        char *tmpbuf = NULL;
+    
+        ext=smpi_datatype_get_extent(datatype);
+        text=smpi_datatype_get_extent(datatype);
+
+        if ((root == rank) && (MPI_IN_PLACE == sendbuf)) {
+            tmpbuf = (char *) malloc(text + (count - 1) * ext);
+            if (NULL == tmpbuf) {
+                return MPI_ERR_INTERN;
+            }
+            smpi_datatype_copy (
+                                                (char*)recvbuf, count, datatype,
+                                                (char*)tmpbuf, count, datatype);
+            use_this_sendbuf = tmpbuf;
+        } else if (io_root == rank) {
+            tmpbuf = (char *) malloc(text + (count - 1) * ext);
+            if (NULL == tmpbuf) {
+                return MPI_ERR_INTERN;
+            }
+            use_this_recvbuf = tmpbuf;
+        }
+    }
+
+    /* Use generic reduce with in-order binary tree topology and io_root */
+    ret = smpi_coll_tuned_ompi_reduce_generic( use_this_sendbuf, use_this_recvbuf, count, datatype,
+                                          op, io_root, comm, 
+                                          ompi_coll_tuned_topo_build_in_order_bintree(comm), 
+                                          segcount, 0 );
+    if (MPI_SUCCESS != ret) { return ret; }
+
+    /* Clean up */
+    if (io_root != root) {
+        if (root == rank) {
+            /* Receive result from rank io_root to recvbuf */
+            smpi_mpi_recv(recvbuf, count, datatype, io_root,
+                                    MCA_COLL_BASE_TAG_REDUCE, comm,
+                                    MPI_STATUS_IGNORE);
+            if (MPI_IN_PLACE == sendbuf) {
+                free(use_this_sendbuf);
+            }
+          
+        } else if (io_root == rank) {
+            /* Send result from use_this_recvbuf to root */
+            smpi_mpi_send(use_this_recvbuf, count, datatype, root,
+                                    MCA_COLL_BASE_TAG_REDUCE, 
+                                    comm);
+            free(use_this_recvbuf);
+        }
+    }
+
+    return MPI_SUCCESS;
+}
+
+/*
+ * Linear functions are copied from the BASIC coll module
+ * they do not segment the message and are simple implementations
+ * but for some small number of nodes and/or small data sizes they 
+ * are just as fast as tuned/tree based segmenting operations 
+ * and as such may be selected by the decision functions
+ * These are copied into this module due to the way we select modules
+ * in V1. i.e. in V2 we will handle this differently and so will not
+ * have to duplicate code.
+ * GEF Oct05 after asking Jeff.
+ */
+
+/* copied function (with appropriate renaming) starts here */
+
+/*
+ *  reduce_lin_intra
+ *
+ *  Function:   - reduction using O(N) algorithm
+ *  Accepts:    - same as MPI_Reduce()
+ *  Returns:    - MPI_SUCCESS or error code
+ */
+
+int
+smpi_coll_tuned_reduce_ompi_basic_linear(void *sbuf, void *rbuf, int count,
+                                          MPI_Datatype dtype,
+                                          MPI_Op op,
+                                          int root,
+                                          MPI_Comm comm)
+{
+    int i, rank, size;
+    ptrdiff_t true_extent, lb, extent;
+    char *free_buffer = NULL;
+    char *pml_buffer = NULL;
+    char *inplace_temp = NULL;
+    char *inbuf;
+
+    /* Initialize */
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+
+    XBT_DEBUG("coll:tuned:reduce_intra_basic_linear rank %d", rank);
+
+    /* If not root, send data to the root. */
+
+    if (rank != root) {
+        smpi_mpi_send(sbuf, count, dtype, root,
+                                MCA_COLL_BASE_TAG_REDUCE,
+                                comm);
+        return -1;
+    }
+
+    /* see discussion in ompi_coll_basic_reduce_lin_intra about 
+       extent and true extent */
+    /* for reducing buffer allocation lengths.... */
+
+    smpi_datatype_extent(dtype, &lb, &extent);
+    true_extent = smpi_datatype_get_extent(dtype);
+
+    if (MPI_IN_PLACE == sbuf) {
+        sbuf = rbuf;
+        inplace_temp = (char*)malloc(true_extent + (count - 1) * extent);
+        if (NULL == inplace_temp) {
+            return -1;
+        }
+        rbuf = inplace_temp - lb;
+    }
+
+    if (size > 1) {
+        free_buffer = (char*)malloc(true_extent + (count - 1) * extent);
+        pml_buffer = free_buffer - lb;
+    }
+
+    /* Initialize the receive buffer. */
+
+    if (rank == (size - 1)) {
+        smpi_datatype_copy((char*)sbuf, count, dtype,(char*)rbuf, count, dtype);
+    } else {
+        smpi_mpi_recv(rbuf, count, dtype, size - 1,
+                                MCA_COLL_BASE_TAG_REDUCE, comm,
+                                MPI_STATUS_IGNORE);
+    }
+
+    /* Loop receiving and calling reduction function (C or Fortran). */
+
+    for (i = size - 2; i >= 0; --i) {
+        if (rank == i) {
+            inbuf = (char*)sbuf;
+        } else {
+            smpi_mpi_recv(pml_buffer, count, dtype, i,
+                                    MCA_COLL_BASE_TAG_REDUCE, comm,
+                                    MPI_STATUS_IGNORE);
+            inbuf = pml_buffer;
+        }
+
+        /* Perform the reduction */
+        smpi_op_apply(op, inbuf, rbuf, &count, &dtype);
+    }
+
+    if (NULL != inplace_temp) {
+        smpi_datatype_copy(inplace_temp, count, dtype,(char*)sbuf
+                                                  ,count , dtype);
+        free(inplace_temp);
+    }
+    if (NULL != free_buffer) {
+        free(free_buffer);
+    }
+
+    /* All done */
+    return MPI_SUCCESS;
+}
+
+/* copied function (with appropriate renaming) ends here */
+
+
diff --git a/src/smpi/colls/reduce_scatter-mpich.c b/src/smpi/colls/reduce_scatter-mpich.c
new file mode 100644 (file)
index 0000000..e7631be
--- /dev/null
@@ -0,0 +1,487 @@
+#include "colls_private.h"
+#define MPIR_REDUCE_SCATTER_TAG 222
+
+static inline int MPIU_Mirror_permutation(unsigned int x, int bits)
+{
+    /* a mask for the high order bits that should be copied as-is */
+    int high_mask = ~((0x1 << bits) - 1);
+    int retval = x & high_mask;
+    int i;
+
+    for (i = 0; i < bits; ++i) {
+        unsigned int bitval = (x & (0x1 << i)) >> i; /* 0x1 or 0x0 */
+        retval |= bitval << ((bits - i) - 1);
+    }
+
+    return retval;
+}
+
+
+int smpi_coll_tuned_reduce_scatter_mpich_pair(void *sendbuf, void *recvbuf, int recvcounts[],
+                              MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+    int   rank, comm_size, i;
+    MPI_Aint extent, true_extent, true_lb; 
+    int  *disps;
+    void *tmp_recvbuf;
+    int mpi_errno = MPI_SUCCESS;
+    int total_count, dst, src;
+    int is_commutative;
+    comm_size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    extent =smpi_datatype_get_extent(datatype);
+    smpi_datatype_extent(datatype, &true_lb, &true_extent);
+    
+    if (smpi_op_is_commute(op)) {
+        is_commutative = 1;
+    }
+
+    disps = (int*)xbt_malloc( comm_size * sizeof(int));
+
+    total_count = 0;
+    for (i=0; i<comm_size; i++) {
+        disps[i] = total_count;
+        total_count += recvcounts[i];
+    }
+    
+    if (total_count == 0) {
+        return MPI_ERR_COUNT;
+    }
+
+        if (sendbuf != MPI_IN_PLACE) {
+            /* copy local data into recvbuf */
+            smpi_datatype_copy(((char *)sendbuf+disps[rank]*extent),
+                                       recvcounts[rank], datatype, recvbuf,
+                                       recvcounts[rank], datatype);
+        }
+        
+        /* allocate temporary buffer to store incoming data */
+        tmp_recvbuf = (void*)xbt_malloc(recvcounts[rank]*(max(true_extent,extent))+1);
+        /* adjust for potential negative lower bound in datatype */
+        tmp_recvbuf = (void *)((char*)tmp_recvbuf - true_lb);
+        
+        for (i=1; i<comm_size; i++) {
+            src = (rank - i + comm_size) % comm_size;
+            dst = (rank + i) % comm_size;
+            
+            /* send the data that dst needs. recv data that this process
+               needs from src into tmp_recvbuf */
+            if (sendbuf != MPI_IN_PLACE) 
+                smpi_mpi_sendrecv(((char *)sendbuf+disps[dst]*extent), 
+                                             recvcounts[dst], datatype, dst,
+                                             MPIR_REDUCE_SCATTER_TAG, tmp_recvbuf,
+                                             recvcounts[rank], datatype, src,
+                                             MPIR_REDUCE_SCATTER_TAG, comm,
+                                             MPI_STATUS_IGNORE);
+            else
+                smpi_mpi_sendrecv(((char *)recvbuf+disps[dst]*extent), 
+                                             recvcounts[dst], datatype, dst,
+                                             MPIR_REDUCE_SCATTER_TAG, tmp_recvbuf,
+                                             recvcounts[rank], datatype, src,
+                                             MPIR_REDUCE_SCATTER_TAG, comm,
+                                             MPI_STATUS_IGNORE);
+            
+            if (is_commutative || (src < rank)) {
+                if (sendbuf != MPI_IN_PLACE) {
+                    smpi_op_apply( op,
+                                                 tmp_recvbuf, recvbuf, &recvcounts[rank],
+                               &datatype); 
+                }
+                else {
+                   smpi_op_apply(op, 
+                       tmp_recvbuf, ((char *)recvbuf+disps[rank]*extent), 
+                       &recvcounts[rank], &datatype);
+                    /* we can't store the result at the beginning of
+                       recvbuf right here because there is useful data
+                       there that other process/processes need. at the
+                       end, we will copy back the result to the
+                       beginning of recvbuf. */
+                }
+            }
+            else {
+                if (sendbuf != MPI_IN_PLACE) {
+                   smpi_op_apply(op, 
+                      recvbuf, tmp_recvbuf, &recvcounts[rank], &datatype);
+                    /* copy result back into recvbuf */
+                    mpi_errno = smpi_datatype_copy(tmp_recvbuf, recvcounts[rank],
+                                               datatype, recvbuf,
+                                               recvcounts[rank], datatype);
+                    if (mpi_errno) return(mpi_errno);
+                }
+                else {
+                   smpi_op_apply(op, 
+                        ((char *)recvbuf+disps[rank]*extent),
+                       tmp_recvbuf, &recvcounts[rank], &datatype);
+                    /* copy result back into recvbuf */
+                    mpi_errno = smpi_datatype_copy(tmp_recvbuf, recvcounts[rank],
+                                               datatype, 
+                                               ((char *)recvbuf +
+                                                disps[rank]*extent), 
+                                               recvcounts[rank], datatype);
+                    if (mpi_errno) return(mpi_errno);
+                }
+            }
+        }
+        
+        /* if MPI_IN_PLACE, move output data to the beginning of
+           recvbuf. already done for rank 0. */
+        if ((sendbuf == MPI_IN_PLACE) && (rank != 0)) {
+            mpi_errno = smpi_datatype_copy(((char *)recvbuf +
+                                        disps[rank]*extent),  
+                                       recvcounts[rank], datatype,
+                                       recvbuf, 
+                                       recvcounts[rank], datatype );
+            if (mpi_errno) return(mpi_errno);
+        }
+    
+return MPI_SUCCESS;
+}
+    
+
+int smpi_coll_tuned_reduce_scatter_mpich_noncomm(void *sendbuf, void *recvbuf, int recvcounts[],
+                              MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+    int mpi_errno = MPI_SUCCESS;
+    int comm_size = smpi_comm_size(comm) ;
+    int rank = smpi_comm_rank(comm);
+    int pof2;
+    int log2_comm_size;
+    int i, k;
+    int recv_offset, send_offset;
+    int block_size, total_count, size;
+    MPI_Aint true_extent, true_lb;
+    int buf0_was_inout;
+    void *tmp_buf0;
+    void *tmp_buf1;
+    void *result_ptr;
+
+    smpi_datatype_extent(datatype, &true_lb, &true_extent);
+
+    pof2 = 1;
+    log2_comm_size = 0;
+    while (pof2 < comm_size) {
+        pof2 <<= 1;
+        ++log2_comm_size;
+    }
+
+    /* begin error checking */
+    xbt_assert(pof2 == comm_size); /* FIXME this version only works for power of 2 procs */
+
+    for (i = 0; i < (comm_size - 1); ++i) {
+        xbt_assert(recvcounts[i] == recvcounts[i+1]);
+    }
+    /* end error checking */
+
+    /* size of a block (count of datatype per block, NOT bytes per block) */
+    block_size = recvcounts[0];
+    total_count = block_size * comm_size;
+
+    tmp_buf0=( void *)xbt_malloc( true_extent * total_count);
+    tmp_buf1=( void *)xbt_malloc( true_extent * total_count);
+    /* adjust for potential negative lower bound in datatype */
+    tmp_buf0 = (void *)((char*)tmp_buf0 - true_lb);
+    tmp_buf1 = (void *)((char*)tmp_buf1 - true_lb);
+
+    /* Copy our send data to tmp_buf0.  We do this one block at a time and
+       permute the blocks as we go according to the mirror permutation. */
+    for (i = 0; i < comm_size; ++i) {
+        mpi_errno = smpi_datatype_copy((char *)(sendbuf == MPI_IN_PLACE ? recvbuf : sendbuf) + (i * true_extent * block_size), block_size, datatype,
+                                   (char *)tmp_buf0 + (MPIU_Mirror_permutation(i, log2_comm_size) * true_extent * block_size), block_size, datatype);
+        if (mpi_errno) return(mpi_errno);
+    }
+    buf0_was_inout = 1;
+
+    send_offset = 0;
+    recv_offset = 0;
+    size = total_count;
+    for (k = 0; k < log2_comm_size; ++k) {
+        /* use a double-buffering scheme to avoid local copies */
+        char *incoming_data = (buf0_was_inout ? tmp_buf1 : tmp_buf0);
+        char *outgoing_data = (buf0_was_inout ? tmp_buf0 : tmp_buf1);
+        int peer = rank ^ (0x1 << k);
+        size /= 2;
+
+        if (rank > peer) {
+            /* we have the higher rank: send top half, recv bottom half */
+            recv_offset += size;
+        }
+        else {
+            /* we have the lower rank: recv top half, send bottom half */
+            send_offset += size;
+        }
+
+        smpi_mpi_sendrecv(outgoing_data + send_offset*true_extent,
+                                     size, datatype, peer, MPIR_REDUCE_SCATTER_TAG,
+                                     incoming_data + recv_offset*true_extent,
+                                     size, datatype, peer, MPIR_REDUCE_SCATTER_TAG,
+                                     comm, MPI_STATUS_IGNORE);
+        /* always perform the reduction at recv_offset, the data at send_offset
+           is now our peer's responsibility */
+        if (rank > peer) {
+            /* higher ranked value so need to call op(received_data, my_data) */
+            smpi_op_apply(op, 
+                   incoming_data + recv_offset*true_extent,
+                     outgoing_data + recv_offset*true_extent,
+                     &size, &datatype );
+            /* buf0_was_inout = buf0_was_inout; */
+        }
+        else {
+            /* lower ranked value so need to call op(my_data, received_data) */
+           smpi_op_apply( op,
+                    outgoing_data + recv_offset*true_extent,
+                     incoming_data + recv_offset*true_extent,
+                     &size, &datatype);
+            buf0_was_inout = !buf0_was_inout;
+        }
+
+        /* the next round of send/recv needs to happen within the block (of size
+           "size") that we just received and reduced */
+        send_offset = recv_offset;
+    }
+
+    xbt_assert(size == recvcounts[rank]);
+
+    /* copy the reduced data to the recvbuf */
+    result_ptr = (char *)(buf0_was_inout ? tmp_buf0 : tmp_buf1) + recv_offset * true_extent;
+    mpi_errno = smpi_datatype_copy(result_ptr, size, datatype,
+                               recvbuf, size, datatype);
+    if (mpi_errno) return(mpi_errno);
+    return MPI_SUCCESS;
+}
+
+
+
+int smpi_coll_tuned_reduce_scatter_mpich_rdb(void *sendbuf, void *recvbuf, int recvcounts[],
+                              MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+    int   rank, comm_size, i;
+    MPI_Aint extent, true_extent, true_lb; 
+    int  *disps;
+    void *tmp_recvbuf, *tmp_results;
+    int mpi_errno = MPI_SUCCESS;
+    int dis[2], blklens[2], total_count, dst;
+    int mask, dst_tree_root, my_tree_root, j, k;
+    int received;
+    MPI_Datatype sendtype, recvtype;
+    int nprocs_completed, tmp_mask, tree_root, is_commutative;
+    comm_size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    extent =smpi_datatype_get_extent(datatype);
+    smpi_datatype_extent(datatype, &true_lb, &true_extent);
+    
+    if (smpi_op_is_commute(op)) {
+        is_commutative = 1;
+    }
+
+    disps = (int*)xbt_malloc( comm_size * sizeof(int));
+
+    total_count = 0;
+    for (i=0; i<comm_size; i++) {
+        disps[i] = total_count;
+        total_count += recvcounts[i];
+    }
+    
+            /* noncommutative and (non-pof2 or block irregular), use recursive doubling. */
+
+            /* need to allocate temporary buffer to receive incoming data*/
+            tmp_recvbuf= (void *) xbt_malloc( total_count*(max(true_extent,extent)));
+            /* adjust for potential negative lower bound in datatype */
+            tmp_recvbuf = (void *)((char*)tmp_recvbuf - true_lb);
+
+            /* need to allocate another temporary buffer to accumulate
+               results */
+            tmp_results = (void *)xbt_malloc( total_count*(max(true_extent,extent)));
+            /* adjust for potential negative lower bound in datatype */
+            tmp_results = (void *)((char*)tmp_results - true_lb);
+
+            /* copy sendbuf into tmp_results */
+            if (sendbuf != MPI_IN_PLACE)
+                mpi_errno = smpi_datatype_copy(sendbuf, total_count, datatype,
+                                           tmp_results, total_count, datatype);
+            else
+                mpi_errno = smpi_datatype_copy(recvbuf, total_count, datatype,
+                                           tmp_results, total_count, datatype);
+
+            if (mpi_errno) return(mpi_errno);
+
+            mask = 0x1;
+            i = 0;
+            while (mask < comm_size) {
+                dst = rank ^ mask;
+
+                dst_tree_root = dst >> i;
+                dst_tree_root <<= i;
+
+                my_tree_root = rank >> i;
+                my_tree_root <<= i;
+
+                /* At step 1, processes exchange (n-n/p) amount of
+                   data; at step 2, (n-2n/p) amount of data; at step 3, (n-4n/p)
+                   amount of data, and so forth. We use derived datatypes for this.
+
+                   At each step, a process does not need to send data
+                   indexed from my_tree_root to
+                   my_tree_root+mask-1. Similarly, a process won't receive
+                   data indexed from dst_tree_root to dst_tree_root+mask-1. */
+
+                /* calculate sendtype */
+                blklens[0] = blklens[1] = 0;
+                for (j=0; j<my_tree_root; j++)
+                    blklens[0] += recvcounts[j];
+                for (j=my_tree_root+mask; j<comm_size; j++)
+                    blklens[1] += recvcounts[j];
+
+                dis[0] = 0;
+                dis[1] = blklens[0];
+                for (j=my_tree_root; (j<my_tree_root+mask) && (j<comm_size); j++)
+                    dis[1] += recvcounts[j];
+
+                mpi_errno = smpi_datatype_indexed(2, blklens, dis, datatype, &sendtype);
+                if (mpi_errno) return(mpi_errno);
+                
+                smpi_datatype_commit(&sendtype);
+
+                /* calculate recvtype */
+                blklens[0] = blklens[1] = 0;
+                for (j=0; j<dst_tree_root && j<comm_size; j++)
+                    blklens[0] += recvcounts[j];
+                for (j=dst_tree_root+mask; j<comm_size; j++)
+                    blklens[1] += recvcounts[j];
+
+                dis[0] = 0;
+                dis[1] = blklens[0];
+                for (j=dst_tree_root; (j<dst_tree_root+mask) && (j<comm_size); j++)
+                    dis[1] += recvcounts[j];
+
+                mpi_errno = smpi_datatype_indexed(2, blklens, dis, datatype, &recvtype);
+                if (mpi_errno) return(mpi_errno);
+                
+                smpi_datatype_commit(&recvtype);
+
+                received = 0;
+                if (dst < comm_size) {
+                    /* tmp_results contains data to be sent in each step. Data is
+                       received in tmp_recvbuf and then accumulated into
+                       tmp_results. accumulation is done later below.   */ 
+
+                    smpi_mpi_sendrecv(tmp_results, 1, sendtype, dst,
+                                                 MPIR_REDUCE_SCATTER_TAG, 
+                                                 tmp_recvbuf, 1, recvtype, dst,
+                                                 MPIR_REDUCE_SCATTER_TAG, comm,
+                                                 MPI_STATUS_IGNORE);
+                    received = 1;
+                }
+
+                /* if some processes in this process's subtree in this step
+                   did not have any destination process to communicate with
+                   because of non-power-of-two, we need to send them the
+                   result. We use a logarithmic recursive-halfing algorithm
+                   for this. */
+
+                if (dst_tree_root + mask > comm_size) {
+                    nprocs_completed = comm_size - my_tree_root - mask;
+                    /* nprocs_completed is the number of processes in this
+                       subtree that have all the data. Send data to others
+                       in a tree fashion. First find root of current tree
+                       that is being divided into two. k is the number of
+                       least-significant bits in this process's rank that
+                       must be zeroed out to find the rank of the root */ 
+                    j = mask;
+                    k = 0;
+                    while (j) {
+                        j >>= 1;
+                        k++;
+                    }
+                    k--;
+
+                    tmp_mask = mask >> 1;
+                    while (tmp_mask) {
+                        dst = rank ^ tmp_mask;
+
+                        tree_root = rank >> k;
+                        tree_root <<= k;
+
+                        /* send only if this proc has data and destination
+                           doesn't have data. at any step, multiple processes
+                           can send if they have the data */
+                        if ((dst > rank) && 
+                            (rank < tree_root + nprocs_completed)
+                            && (dst >= tree_root + nprocs_completed)) {
+                            /* send the current result */
+                            smpi_mpi_send(tmp_recvbuf, 1, recvtype,
+                                                     dst, MPIR_REDUCE_SCATTER_TAG,
+                                                     comm);
+                        }
+                        /* recv only if this proc. doesn't have data and sender
+                           has data */
+                        else if ((dst < rank) && 
+                                 (dst < tree_root + nprocs_completed) &&
+                                 (rank >= tree_root + nprocs_completed)) {
+                            smpi_mpi_recv(tmp_recvbuf, 1, recvtype, dst,
+                                                     MPIR_REDUCE_SCATTER_TAG,
+                                                     comm, MPI_STATUS_IGNORE); 
+                            received = 1;
+                        }
+                        tmp_mask >>= 1;
+                        k--;
+                    }
+                }
+
+                /* The following reduction is done here instead of after 
+                   the MPIC_Sendrecv_ft or MPIC_Recv_ft above. This is
+                   because to do it above, in the noncommutative 
+                   case, we would need an extra temp buffer so as not to
+                   overwrite temp_recvbuf, because temp_recvbuf may have
+                   to be communicated to other processes in the
+                   non-power-of-two case. To avoid that extra allocation,
+                   we do the reduce here. */
+                if (received) {
+                    if (is_commutative || (dst_tree_root < my_tree_root)) {
+                        {
+                                smpi_op_apply(op, 
+                               tmp_recvbuf, tmp_results, &blklens[0],
+                              &datatype); 
+                               smpi_op_apply(op, 
+                               ((char *)tmp_recvbuf + dis[1]*extent),
+                              ((char *)tmp_results + dis[1]*extent),
+                              &blklens[1], &datatype); 
+                        }
+                    }
+                    else {
+                        {
+                                smpi_op_apply(op,
+                                   tmp_results, tmp_recvbuf, &blklens[0],
+                                   &datatype); 
+                                smpi_op_apply(op,
+                                   ((char *)tmp_results + dis[1]*extent),
+                                   ((char *)tmp_recvbuf + dis[1]*extent),
+                                   &blklens[1], &datatype); 
+                        }
+                        /* copy result back into tmp_results */
+                        mpi_errno = smpi_datatype_copy(tmp_recvbuf, 1, recvtype, 
+                                                   tmp_results, 1, recvtype);
+                        if (mpi_errno) return(mpi_errno);
+                    }
+                }
+
+                //smpi_datatype_free(&sendtype);
+                //smpi_datatype_free(&recvtype);
+
+                mask <<= 1;
+                i++;
+            }
+
+            /* now copy final results from tmp_results to recvbuf */
+            mpi_errno = smpi_datatype_copy(((char *)tmp_results+disps[rank]*extent),
+                                       recvcounts[rank], datatype, recvbuf,
+                                       recvcounts[rank], datatype);
+            if (mpi_errno) return(mpi_errno);
+    xbt_free(disps);
+    xbt_free(tmp_recvbuf);
+    xbt_free(tmp_results);
+    return MPI_SUCCESS;
+        }
+
+
diff --git a/src/smpi/colls/reduce_scatter-ompi.c b/src/smpi/colls/reduce_scatter-ompi.c
new file mode 100644 (file)
index 0000000..e10be98
--- /dev/null
@@ -0,0 +1,515 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2012 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
+ * Copyright (c) 2009      University of Houston. All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+
+#define MCA_COLL_BASE_TAG_REDUCE_SCATTER 222
+/*
+ * Recursive-halving function is (*mostly*) copied from the BASIC coll module.
+ * I have removed the part which handles "large" message sizes 
+ * (non-overlapping version of reduce_Scatter).
+ */
+
+/* copied function (with appropriate renaming) starts here */
+
+/*
+ *  reduce_scatter_ompi_basic_recursivehalving
+ *
+ *  Function:   - reduce scatter implementation using recursive-halving 
+ *                algorithm
+ *  Accepts:    - same as MPI_Reduce_scatter()
+ *  Returns:    - MPI_SUCCESS or error code
+ *  Limitation: - Works only for commutative operations.
+ */
+int
+smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, 
+                                                            void *rbuf, 
+                                                            int *rcounts,
+                                                            MPI_Datatype dtype,
+                                                            MPI_Op op,
+                                                            MPI_Comm comm
+                                                            )
+{
+    int i, rank, size, count, err = MPI_SUCCESS;
+    int tmp_size=1, remain = 0, tmp_rank, *disps = NULL;
+    ptrdiff_t true_lb, true_extent, lb, extent, buf_size;
+    char *recv_buf = NULL, *recv_buf_free = NULL;
+    char *result_buf = NULL, *result_buf_free = NULL;
+   
+    /* Initialize */
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+   
+    XBT_DEBUG("coll:tuned:reduce_scatter_ompi_basic_recursivehalving, rank %d", rank);
+
+    /* Find displacements and the like */
+    disps = (int*) xbt_malloc(sizeof(int) * size);
+    if (NULL == disps) return MPI_ERR_OTHER;
+
+    disps[0] = 0;
+    for (i = 0; i < (size - 1); ++i) {
+        disps[i + 1] = disps[i] + rcounts[i];
+    }
+    count = disps[size - 1] + rcounts[size - 1];
+
+    /* short cut the trivial case */
+    if (0 == count) {
+        xbt_free(disps);
+        return MPI_SUCCESS;
+    }
+
+    /* get datatype information */
+    smpi_datatype_extent(dtype, &lb, &extent);
+    smpi_datatype_extent(dtype, &true_lb, &true_extent);
+    buf_size = true_extent + (ptrdiff_t)(count - 1) * extent;
+
+    /* Handle MPI_IN_PLACE */
+    if (MPI_IN_PLACE == sbuf) {
+        sbuf = rbuf;
+    }
+
+    /* Allocate temporary receive buffer. */
+    recv_buf_free = (char*) xbt_malloc(buf_size);
+    recv_buf = recv_buf_free - lb;
+    if (NULL == recv_buf_free) {
+        err = MPI_ERR_OTHER;
+        goto cleanup;
+    }
+   
+    /* allocate temporary buffer for results */
+    result_buf_free = (char*) xbt_malloc(buf_size);
+    result_buf = result_buf_free - lb;
+   
+    /* copy local buffer into the temporary results */
+    err =smpi_datatype_copy(sbuf, count, dtype, result_buf, count, dtype);
+    if (MPI_SUCCESS != err) goto cleanup;
+   
+    /* figure out power of two mapping: grow until larger than
+       comm size, then go back one, to get the largest power of
+       two less than comm size */
+    while (tmp_size <= size) tmp_size <<= 1;
+    tmp_size >>= 1;
+    remain = size - tmp_size;
+   
+    /* If comm size is not a power of two, have the first "remain"
+       procs with an even rank send to rank + 1, leaving a power of
+       two procs to do the rest of the algorithm */
+    if (rank < 2 * remain) {
+        if ((rank & 1) == 0) {
+            smpi_mpi_send(result_buf, count, dtype, rank + 1, 
+                                    MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                    comm);
+            /* we don't participate from here on out */
+            tmp_rank = -1;
+        } else {
+            smpi_mpi_recv(recv_buf, count, dtype, rank - 1,
+                                    MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                    comm, MPI_STATUS_IGNORE);
+         
+            /* integrate their results into our temp results */
+            smpi_op_apply(op, recv_buf, result_buf, &count, &dtype);
+         
+            /* adjust rank to be the bottom "remain" ranks */
+            tmp_rank = rank / 2;
+        }
+    } else {
+        /* just need to adjust rank to show that the bottom "even
+           remain" ranks dropped out */
+        tmp_rank = rank - remain;
+    }
+   
+    /* For ranks not kicked out by the above code, perform the
+       recursive halving */
+    if (tmp_rank >= 0) {
+        int *tmp_disps = NULL, *tmp_rcounts = NULL;
+        int mask, send_index, recv_index, last_index;
+      
+        /* recalculate disps and rcounts to account for the
+           special "remainder" processes that are no longer doing
+           anything */
+        tmp_rcounts = (int*) xbt_malloc(tmp_size * sizeof(int));
+        if (NULL == tmp_rcounts) {
+            err = MPI_ERR_OTHER;
+            goto cleanup;
+        }
+        tmp_disps = (int*) xbt_malloc(tmp_size * sizeof(int));
+        if (NULL == tmp_disps) {
+            xbt_free(tmp_rcounts);
+            err = MPI_ERR_OTHER;
+            goto cleanup;
+        }
+
+        for (i = 0 ; i < tmp_size ; ++i) {
+            if (i < remain) {
+                /* need to include old neighbor as well */
+                tmp_rcounts[i] = rcounts[i * 2 + 1] + rcounts[i * 2];
+            } else {
+                tmp_rcounts[i] = rcounts[i + remain];
+            }
+        }
+
+        tmp_disps[0] = 0;
+        for (i = 0; i < tmp_size - 1; ++i) {
+            tmp_disps[i + 1] = tmp_disps[i] + tmp_rcounts[i];
+        }
+
+        /* do the recursive halving communication.  Don't use the
+           dimension information on the communicator because I
+           think the information is invalidated by our "shrinking"
+           of the communicator */
+        mask = tmp_size >> 1;
+        send_index = recv_index = 0;
+        last_index = tmp_size;
+        while (mask > 0) {
+            int tmp_peer, peer, send_count, recv_count;
+            MPI_Request request;
+
+            tmp_peer = tmp_rank ^ mask;
+            peer = (tmp_peer < remain) ? tmp_peer * 2 + 1 : tmp_peer + remain;
+
+            /* figure out if we're sending, receiving, or both */
+            send_count = recv_count = 0;
+            if (tmp_rank < tmp_peer) {
+                send_index = recv_index + mask;
+                for (i = send_index ; i < last_index ; ++i) {
+                    send_count += tmp_rcounts[i];
+                }
+                for (i = recv_index ; i < send_index ; ++i) {
+                    recv_count += tmp_rcounts[i];
+                }
+            } else {
+                recv_index = send_index + mask;
+                for (i = send_index ; i < recv_index ; ++i) {
+                    send_count += tmp_rcounts[i];
+                }
+                for (i = recv_index ; i < last_index ; ++i) {
+                    recv_count += tmp_rcounts[i];
+                }
+            }
+
+            /* actual data transfer.  Send from result_buf,
+               receive into recv_buf */
+            if (send_count > 0 && recv_count != 0) {
+                request=smpi_mpi_irecv(recv_buf + (ptrdiff_t)tmp_disps[recv_index] * extent,
+                                         recv_count, dtype, peer,
+                                         MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                         comm);
+                if (MPI_SUCCESS != err) {
+                    xbt_free(tmp_rcounts);
+                    xbt_free(tmp_disps);
+                    goto cleanup;
+                }                                             
+            }
+            if (recv_count > 0 && send_count != 0) {
+                smpi_mpi_send(result_buf + (ptrdiff_t)tmp_disps[send_index] * extent,
+                                        send_count, dtype, peer, 
+                                        MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                        comm);
+                if (MPI_SUCCESS != err) {
+                    xbt_free(tmp_rcounts);
+                    xbt_free(tmp_disps);
+                    goto cleanup;
+                }                                             
+            }
+            if (send_count > 0 && recv_count != 0) {
+                smpi_mpi_wait(&request, MPI_STATUS_IGNORE);
+            }
+
+            /* if we received something on this step, push it into
+               the results buffer */
+            if (recv_count > 0) {
+                smpi_op_apply(op, 
+                               recv_buf + (ptrdiff_t)tmp_disps[recv_index] * extent, 
+                               result_buf + (ptrdiff_t)tmp_disps[recv_index] * extent,
+                               &recv_count, &dtype);
+            }
+
+            /* update for next iteration */
+            send_index = recv_index;
+            last_index = recv_index + mask;
+            mask >>= 1;
+        }
+
+        /* copy local results from results buffer into real receive buffer */
+        if (0 != rcounts[rank]) {
+            err = smpi_datatype_copy(result_buf + disps[rank] * extent,
+                                       rcounts[rank], dtype, 
+                                       rbuf, rcounts[rank], dtype);
+            if (MPI_SUCCESS != err) {
+                xbt_free(tmp_rcounts);
+                xbt_free(tmp_disps);
+                goto cleanup;
+            }                                             
+        }
+
+        xbt_free(tmp_rcounts);
+        xbt_free(tmp_disps);
+    }
+
+    /* Now fix up the non-power of two case, by having the odd
+       procs send the even procs the proper results */
+    if (rank < (2 * remain)) {
+        if ((rank & 1) == 0) {
+            if (rcounts[rank]) {
+                smpi_mpi_recv(rbuf, rcounts[rank], dtype, rank + 1,
+                                        MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                        comm, MPI_STATUS_IGNORE);
+            }
+        } else {
+            if (rcounts[rank - 1]) {
+                smpi_mpi_send(result_buf + disps[rank - 1] * extent,
+                                        rcounts[rank - 1], dtype, rank - 1,
+                                        MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                        comm);
+            }
+        }            
+    }
+
+ cleanup:
+    if (NULL != disps) xbt_free(disps);
+    if (NULL != recv_buf_free) xbt_free(recv_buf_free);
+    if (NULL != result_buf_free) xbt_free(result_buf_free);
+
+    return err;
+}
+
+/* copied function (with appropriate renaming) ends here */
+
+
+/*
+ *   smpi_coll_tuned_reduce_scatter_ompi_ring
+ *
+ *   Function:       Ring algorithm for reduce_scatter operation
+ *   Accepts:        Same as MPI_Reduce_scatter()
+ *   Returns:        MPI_SUCCESS or error code
+ *
+ *   Description:    Implements ring algorithm for reduce_scatter: 
+ *                   the block sizes defined in rcounts are exchanged and 
+ 8                    updated until they reach proper destination.
+ *                   Algorithm requires 2 * max(rcounts) extra buffering
+ *
+ *   Limitations:    The algorithm DOES NOT preserve order of operations so it 
+ *                   can be used only for commutative operations.
+ *         Example on 5 nodes:
+ *         Initial state
+ *   #      0              1             2              3             4
+ *        [00]           [10]   ->     [20]           [30]           [40]
+ *        [01]           [11]          [21]  ->       [31]           [41]
+ *        [02]           [12]          [22]           [32]  ->       [42]
+ *    ->  [03]           [13]          [23]           [33]           [43] --> ..
+ *        [04]  ->       [14]          [24]           [34]           [44]
+ *
+ *        COMPUTATION PHASE
+ *         Step 0: rank r sends block (r-1) to rank (r+1) and 
+ *                 receives block (r+1) from rank (r-1) [with wraparound].
+ *   #      0              1             2              3             4
+ *        [00]           [10]        [10+20]   ->     [30]           [40]
+ *        [01]           [11]          [21]          [21+31]  ->     [41]
+ *    ->  [02]           [12]          [22]           [32]         [32+42] -->..
+ *      [43+03] ->       [13]          [23]           [33]           [43]
+ *        [04]         [04+14]  ->     [24]           [34]           [44]
+ *         
+ *         Step 1:
+ *   #      0              1             2              3             4
+ *        [00]           [10]        [10+20]       [10+20+30] ->     [40]
+ *    ->  [01]           [11]          [21]          [21+31]      [21+31+41] ->
+ *     [32+42+02] ->     [12]          [22]           [32]         [32+42] 
+ *        [03]        [43+03+13] ->    [23]           [33]           [43]
+ *        [04]         [04+14]      [04+14+24]  ->    [34]           [44]
+ *
+ *         Step 2:
+ *   #      0              1             2              3             4
+ *     -> [00]           [10]        [10+20]       [10+20+30]   [10+20+30+40] ->
+ *   [21+31+41+01]->     [11]          [21]          [21+31]      [21+31+41]
+ *     [32+42+02]   [32+42+02+12]->    [22]           [32]         [32+42] 
+ *        [03]        [43+03+13]   [43+03+13+23]->    [33]           [43]
+ *        [04]         [04+14]      [04+14+24]    [04+14+24+34] ->   [44]
+ *
+ *         Step 3:
+ *   #      0             1              2              3             4
+ * [10+20+30+40+00]     [10]         [10+20]       [10+20+30]   [10+20+30+40]
+ *  [21+31+41+01] [21+31+41+01+11]     [21]          [21+31]      [21+31+41]
+ *    [32+42+02]   [32+42+02+12] [32+42+02+12+22]     [32]         [32+42] 
+ *       [03]        [43+03+13]    [43+03+13+23] [43+03+13+23+33]    [43]
+ *       [04]         [04+14]       [04+14+24]    [04+14+24+34] [04+14+24+34+44]
+ *    DONE :)
+ *
+ */
+int 
+smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts,
+                                          MPI_Datatype dtype,
+                                          MPI_Op op,
+                                          MPI_Comm comm
+                                          )
+{
+    int ret, line, rank, size, i, k, recv_from, send_to, total_count, max_block_count;
+    int inbi, *displs = NULL;
+    char *tmpsend = NULL, *tmprecv = NULL, *accumbuf = NULL, *accumbuf_free = NULL;
+    char *inbuf_free[2] = {NULL, NULL}, *inbuf[2] = {NULL, NULL};
+    ptrdiff_t true_lb, true_extent, lb, extent, max_real_segsize;
+    MPI_Request reqs[2] = {NULL, NULL};
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    XBT_DEBUG(  "coll:tuned:reduce_scatter_ompi_ring rank %d, size %d", 
+                 rank, size);
+
+    /* Determine the maximum number of elements per node, 
+       corresponding block size, and displacements array.
+    */
+    displs = (int*) xbt_malloc(size * sizeof(int));
+    if (NULL == displs) { ret = -1; line = __LINE__; goto error_hndl; }
+    displs[0] = 0;
+    total_count = rcounts[0];
+    max_block_count = rcounts[0];
+    for (i = 1; i < size; i++) { 
+        displs[i] = total_count;
+        total_count += rcounts[i];
+        if (max_block_count < rcounts[i]) max_block_count = rcounts[i];
+    }
+      
+    /* Special case for size == 1 */
+    if (1 == size) {
+        if (MPI_IN_PLACE != sbuf) {
+            ret = smpi_datatype_copy((char*)sbuf, total_count, dtype, (char*)rbuf, total_count, dtype);
+            if (ret < 0) { line = __LINE__; goto error_hndl; }
+        }
+        xbt_free(displs);
+        return MPI_SUCCESS;
+    }
+
+    /* Allocate and initialize temporary buffers, we need:
+       - a temporary buffer to perform reduction (size total_count) since
+       rbuf can be of rcounts[rank] size.
+       - up to two temporary buffers used for communication/computation overlap.
+    */
+    smpi_datatype_extent(dtype, &lb, &extent);
+    smpi_datatype_extent(dtype, &true_lb, &true_extent);
+
+    max_real_segsize = true_extent + (ptrdiff_t)(max_block_count - 1) * extent;
+
+    accumbuf_free = (char*)xbt_malloc(true_extent + (ptrdiff_t)(total_count - 1) * extent);
+    if (NULL == accumbuf_free) { ret = -1; line = __LINE__; goto error_hndl; }
+    accumbuf = accumbuf_free - lb;
+
+    inbuf_free[0] = (char*)xbt_malloc(max_real_segsize);
+    if (NULL == inbuf_free[0]) { ret = -1; line = __LINE__; goto error_hndl; }
+    inbuf[0] = inbuf_free[0] - lb;
+    if (size > 2) {
+        inbuf_free[1] = (char*)xbt_malloc(max_real_segsize);
+        if (NULL == inbuf_free[1]) { ret = -1; line = __LINE__; goto error_hndl; }
+        inbuf[1] = inbuf_free[1] - lb;
+    }
+
+    /* Handle MPI_IN_PLACE for size > 1 */
+    if (MPI_IN_PLACE == sbuf) {
+        sbuf = rbuf;
+    }
+
+    ret = smpi_datatype_copy((char*)sbuf, total_count, dtype, accumbuf, total_count, dtype);
+    if (ret < 0) { line = __LINE__; goto error_hndl; }
+
+    /* Computation loop */
+
+    /* 
+       For each of the remote nodes:
+       - post irecv for block (r-2) from (r-1) with wrap around
+       - send block (r-1) to (r+1)
+       - in loop for every step k = 2 .. n
+       - post irecv for block (r - 1 + n - k) % n
+       - wait on block (r + n - k) % n to arrive
+       - compute on block (r + n - k ) % n
+       - send block (r + n - k) % n
+       - wait on block (r)
+       - compute on block (r)
+       - copy block (r) to rbuf
+       Note that we must be careful when computing the begining of buffers and
+       for send operations and computation we must compute the exact block size.
+    */
+    send_to = (rank + 1) % size;
+    recv_from = (rank + size - 1) % size;
+
+    inbi = 0;
+    /* Initialize first receive from the neighbor on the left */
+    reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from,
+                             MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm
+                             );
+    tmpsend = accumbuf + (ptrdiff_t)displs[recv_from] * extent;
+    smpi_mpi_send(tmpsend, rcounts[recv_from], dtype, send_to,
+                            MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                             comm);
+
+    for (k = 2; k < size; k++) {
+        const int prevblock = (rank + size - k) % size;
+      
+        inbi = inbi ^ 0x1;
+
+        /* Post irecv for the current block */
+        reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from,
+                                 MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm 
+                                 );
+      
+        /* Wait on previous block to arrive */
+        smpi_mpi_wait(&reqs[inbi ^ 0x1], MPI_STATUS_IGNORE);
+      
+        /* Apply operation on previous block: result goes to rbuf
+           rbuf[prevblock] = inbuf[inbi ^ 0x1] (op) rbuf[prevblock]
+        */
+        tmprecv = accumbuf + (ptrdiff_t)displs[prevblock] * extent;
+        smpi_op_apply(op, inbuf[inbi ^ 0x1], tmprecv, &(rcounts[prevblock]), &dtype);
+      
+        /* send previous block to send_to */
+        smpi_mpi_send(tmprecv, rcounts[prevblock], dtype, send_to,
+                                MCA_COLL_BASE_TAG_REDUCE_SCATTER,
+                                 comm);
+    }
+
+    /* Wait on the last block to arrive */
+    smpi_mpi_wait(&reqs[inbi], MPI_STATUS_IGNORE);
+
+    /* Apply operation on the last block (my block)
+       rbuf[rank] = inbuf[inbi] (op) rbuf[rank] */
+    tmprecv = accumbuf + (ptrdiff_t)displs[rank] * extent;
+    smpi_op_apply(op, inbuf[inbi], tmprecv, &(rcounts[rank]), &dtype);
+   
+    /* Copy result from tmprecv to rbuf */
+    ret = smpi_datatype_copy(tmprecv, rcounts[rank], dtype, (char*)rbuf, rcounts[rank], dtype);
+    if (ret < 0) { line = __LINE__; goto error_hndl; }
+
+    if (NULL != displs) xbt_free(displs);
+    if (NULL != accumbuf_free) xbt_free(accumbuf_free);
+    if (NULL != inbuf_free[0]) xbt_free(inbuf_free[0]);
+    if (NULL != inbuf_free[1]) xbt_free(inbuf_free[1]);
+
+    return MPI_SUCCESS;
+
+ error_hndl:
+    XBT_DEBUG( "%s:%4d\tRank %d Error occurred %d\n",
+                 __FILE__, line, rank, ret);
+    if (NULL != displs) xbt_free(displs);
+    if (NULL != accumbuf_free) xbt_free(accumbuf_free);
+    if (NULL != inbuf_free[0]) xbt_free(inbuf_free[0]);
+    if (NULL != inbuf_free[1]) xbt_free(inbuf_free[1]);
+    return ret;
+}
+
diff --git a/src/smpi/colls/scatter-ompi.c b/src/smpi/colls/scatter-ompi.c
new file mode 100644 (file)
index 0000000..dbc223f
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+ *                         University Research and Technology
+ *                         Corporation.  All rights reserved.
+ * Copyright (c) 2004-2006 The University of Tennessee and The University
+ *                         of Tennessee Research Foundation.  All rights
+ *                         reserved.
+ * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
+ *                         University of Stuttgart.  All rights reserved.
+ * Copyright (c) 2004-2005 The Regents of the University of California.
+ *                         All rights reserved.
+ * $COPYRIGHT$
+ *
+ * Additional copyrights may follow
+ *
+ * $HEADER$
+ */
+
+
+#include "colls_private.h"
+#include "coll_tuned_topo.h"
+
+#define MCA_COLL_BASE_TAG_SCATTER 111
+
+int
+smpi_coll_tuned_scatter_ompi_binomial(void *sbuf, int scount,
+                                      MPI_Datatype sdtype,
+                                      void *rbuf, int rcount,
+                                      MPI_Datatype rdtype,
+                                      int root,
+                                      MPI_Comm comm
+                                      )
+{
+    int line = -1;
+    int i;
+    int rank;
+    int vrank;
+    int size;
+    int total_send = 0;
+    char *ptmp     = NULL;
+    char *tempbuf  = NULL;
+    int err;
+    ompi_coll_tree_t* bmtree;
+    MPI_Status status;
+    MPI_Aint sextent, slb, strue_lb, strue_extent; 
+    MPI_Aint rextent, rlb, rtrue_lb, rtrue_extent;
+
+    size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    XBT_DEBUG(
+                 "smpi_coll_tuned_scatter_ompi_binomial rank %d", rank);
+
+    /* create the binomial tree */
+    
+//    COLL_TUNED_UPDATE_IN_ORDER_BMTREE( comm, tuned_module, root );
+    bmtree =  ompi_coll_tuned_topo_build_in_order_bmtree( comm, root);//ompi_ data->cached_in_order_bmtree;
+
+    smpi_datatype_extent(sdtype, &slb, &sextent);
+    smpi_datatype_extent(sdtype, &strue_lb, &strue_extent);
+    smpi_datatype_extent(rdtype, &rlb, &rextent);
+    smpi_datatype_extent(rdtype, &rtrue_lb, &rtrue_extent);
+
+    vrank = (rank - root + size) % size;
+
+    if (rank == root) {
+       if (0 == root) {
+           /* root on 0, just use the send buffer */
+           ptmp = (char *) sbuf;
+           if (rbuf != MPI_IN_PLACE) {
+               /* local copy to rbuf */
+               err = smpi_datatype_copy(sbuf, scount, sdtype,
+                                     rbuf, rcount, rdtype);
+               if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+           }
+       } else {
+           /* root is not on 0, allocate temp buffer for send */
+           tempbuf = (char *) malloc(strue_extent + (scount*size - 1) * sextent);
+           if (NULL == tempbuf) {
+               err = MPI_ERR_OTHER; line = __LINE__; goto err_hndl;
+           }
+
+           ptmp = tempbuf - slb;
+
+           /* and rotate data so they will eventually in the right place */
+           err = smpi_datatype_copy((char *) sbuf + sextent*root*scount, scount*(size-root), sdtype,
+            ptmp, scount*(size-root), sdtype);
+           if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+
+           err = smpi_datatype_copy((char*)sbuf, scount*root, sdtype,
+                                                ptmp + sextent*scount*(size - root), scount*root, sdtype);
+           if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+
+           if (rbuf != MPI_IN_PLACE) {
+               /* local copy to rbuf */
+               err = smpi_datatype_copy(ptmp, scount, sdtype,
+                                     rbuf, rcount, rdtype);
+               if (MPI_SUCCESS != err) { line = __LINE__; goto err_hndl; }
+           }
+       }
+       total_send = scount;
+    } else if (!(vrank % 2)) {
+       /* non-root, non-leaf nodes, allocte temp buffer for recv
+        * the most we need is rcount*size/2 */
+       tempbuf = (char *) malloc(rtrue_extent + (rcount*size - 1) * rextent);
+       if (NULL == tempbuf) {
+           err= MPI_ERR_OTHER; line = __LINE__; goto err_hndl;
+       }
+
+       ptmp = tempbuf - rlb;
+
+       sdtype = rdtype;
+       scount = rcount;
+       sextent = rextent;
+       total_send = scount;
+    } else {
+       /* leaf nodes, just use rbuf */
+       ptmp = (char *) rbuf;
+    }
+
+    if (!(vrank % 2)) {
+       if (rank != root) {
+           /* recv from parent on non-root */
+           smpi_mpi_recv(ptmp, rcount*size, rdtype, bmtree->tree_prev,
+                                   MCA_COLL_BASE_TAG_SCATTER, comm, &status);
+           /* local copy to rbuf */
+           err = smpi_datatype_copy(ptmp, scount, sdtype,
+                                 rbuf, rcount, rdtype);
+       }
+       /* send to children on all non-leaf */
+       for (i = 0; i < bmtree->tree_nextsize; i++) {
+           int mycount = 0, vkid;
+           /* figure out how much data I have to send to this child */
+           vkid = (bmtree->tree_next[i] - root + size) % size;
+           mycount = vkid - vrank;
+           if (mycount > (size - vkid))
+               mycount = size - vkid;
+           mycount *= scount;
+
+           smpi_mpi_send(ptmp + total_send*sextent, mycount, sdtype,
+                                   bmtree->tree_next[i],
+                                   MCA_COLL_BASE_TAG_SCATTER,
+                                    comm);
+
+           total_send += mycount;
+       }
+
+       if (NULL != tempbuf) 
+           free(tempbuf);
+    } else {
+       /* recv from parent on leaf nodes */
+       smpi_mpi_recv(ptmp, rcount, rdtype, bmtree->tree_prev,
+                               MCA_COLL_BASE_TAG_SCATTER, comm, &status);
+    }
+    //!FIXME : store the tree, as done in ompi, instead of calculating it each time ?
+    xbt_free(bmtree);
+
+    return MPI_SUCCESS;
+
+ err_hndl:
+    if (NULL != tempbuf)
+       free(tempbuf);
+
+    XBT_DEBUG(  "%s:%4d\tError occurred %d, rank %2d",
+                __FILE__, line, err, rank);
+    return err;
+}
+
+/*
+ * Linear functions are copied from the BASIC coll module
+ * they do not segment the message and are simple implementations
+ * but for some small number of nodes and/or small data sizes they 
+ * are just as fast as tuned/tree based segmenting operations 
+ * and as such may be selected by the decision functions
+ * These are copied into this module due to the way we select modules
+ * in V1. i.e. in V2 we will handle this differently and so will not
+ * have to duplicate code.
+ * JPG following the examples from other coll_tuned implementations. Dec06.
+ */
+
+/* copied function (with appropriate renaming) starts here */
+/*
+ *     scatter_intra
+ *
+ *     Function:       - basic scatter operation
+ *     Accepts:        - same arguments as MPI_Scatter()
+ *     Returns:        - MPI_SUCCESS or error code
+ */
+int
+smpi_coll_tuned_scatter_ompi_basic_linear(void *sbuf, int scount,
+                                          MPI_Datatype sdtype,
+                                          void *rbuf, int rcount,
+                                          MPI_Datatype rdtype,
+                                          int root,
+                                          MPI_Comm comm
+                                          )
+{
+    int i, rank, size, err;
+    char *ptmp;
+    ptrdiff_t lb, incr;
+
+    /* Initialize */
+
+    rank = smpi_comm_rank(comm);
+    size = smpi_comm_size(comm);
+
+    /* If not root, receive data. */
+
+    if (rank != root) {
+        smpi_mpi_recv(rbuf, rcount, rdtype, root,
+                                MCA_COLL_BASE_TAG_SCATTER,
+                                comm, MPI_STATUS_IGNORE);
+        return MPI_SUCCESS;
+    }
+
+    /* I am the root, loop sending data. */
+
+    err = smpi_datatype_extent(sdtype, &lb, &incr);
+    if (MPI_SUCCESS != err) {
+        return MPI_ERR_OTHER;
+    }
+
+    incr *= scount;
+    for (i = 0, ptmp = (char *) sbuf; i < size; ++i, ptmp += incr) {
+
+        /* simple optimization */
+
+        if (i == rank) {
+            if (MPI_IN_PLACE != rbuf) {
+                err =
+                    smpi_datatype_copy(ptmp, scount, sdtype, rbuf, rcount,
+                                    rdtype);
+            }
+        } else {
+            smpi_mpi_send(ptmp, scount, sdtype, i,
+                                    MCA_COLL_BASE_TAG_SCATTER,
+                                     comm);
+        }
+        if (MPI_SUCCESS != err) {
+            return err;
+        }
+    }
+
+    /* All done */
+
+    return MPI_SUCCESS;
+}
diff --git a/src/smpi/colls/smpi_mpich_selector.c b/src/smpi/colls/smpi_mpich_selector.c
new file mode 100644 (file)
index 0000000..3781e34
--- /dev/null
@@ -0,0 +1,696 @@
+/* selector for collective algorithms based on mpich decision logic */
+
+/* Copyright (c) 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "colls_private.h"
+
+/* This is the default implementation of allreduce. The algorithm is:
+   
+   Algorithm: MPI_Allreduce
+
+   For the heterogeneous case, we call MPI_Reduce followed by MPI_Bcast
+   in order to meet the requirement that all processes must have the
+   same result. For the homogeneous case, we use the following algorithms.
+
+
+   For long messages and for builtin ops and if count >= pof2 (where
+   pof2 is the nearest power-of-two less than or equal to the number
+   of processes), we use Rabenseifner's algorithm (see 
+   http://www.hlrs.de/mpi/myreduce.html).
+   This algorithm implements the allreduce in two steps: first a
+   reduce-scatter, followed by an allgather. A recursive-halving
+   algorithm (beginning with processes that are distance 1 apart) is
+   used for the reduce-scatter, and a recursive doubling 
+   algorithm is used for the allgather. The non-power-of-two case is
+   handled by dropping to the nearest lower power-of-two: the first
+   few even-numbered processes send their data to their right neighbors
+   (rank+1), and the reduce-scatter and allgather happen among the remaining
+   power-of-two processes. At the end, the first few even-numbered
+   processes get the result from their right neighbors.
+
+   For the power-of-two case, the cost for the reduce-scatter is 
+   lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma. The cost for the
+   allgather lgp.alpha + n.((p-1)/p).beta. Therefore, the
+   total cost is:
+   Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta + n.((p-1)/p).gamma
+
+   For the non-power-of-two case, 
+   Cost = (2.floor(lgp)+2).alpha + (2.((p-1)/p) + 2).n.beta + n.(1+(p-1)/p).gamma
+
+   
+   For short messages, for user-defined ops, and for count < pof2 
+   we use a recursive doubling algorithm (similar to the one in
+   MPI_Allgather). We use this algorithm in the case of user-defined ops
+   because in this case derived datatypes are allowed, and the user
+   could pass basic datatypes on one process and derived on another as
+   long as the type maps are the same. Breaking up derived datatypes
+   to do the reduce-scatter is tricky. 
+
+   Cost = lgp.alpha + n.lgp.beta + n.lgp.gamma
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Allreduce
+*/
+int smpi_coll_tuned_allreduce_mpich(void *sbuf, void *rbuf, int count,
+                        MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)
+{
+    size_t dsize, block_dsize;
+    int comm_size = smpi_comm_size(comm);
+    const size_t large_message = 2048; //MPIR_PARAM_ALLREDUCE_SHORT_MSG_SIZE
+
+    dsize = smpi_datatype_size(dtype);
+    block_dsize = dsize * count;
+
+
+    /* find nearest power-of-two less than or equal to comm_size */
+    int pof2 = 1;
+    while (pof2 <= comm_size) pof2 <<= 1;
+    pof2 >>=1;
+
+    if (block_dsize > large_message && count >= pof2 && smpi_op_is_commute(op)) {
+      //for long messages
+       return (smpi_coll_tuned_allreduce_rab_rsag (sbuf, rbuf, 
+                                                                   count, dtype,
+                                                                   op, comm));
+    }else {
+      //for short ones and count < pof2
+      return (smpi_coll_tuned_allreduce_rdb (sbuf, rbuf, 
+                                                                   count, dtype,
+                                                                   op, comm));
+    }
+}
+
+
+/* This is the default implementation of alltoall. The algorithm is:
+   
+   Algorithm: MPI_Alltoall
+
+   We use four algorithms for alltoall. For short messages and
+   (comm_size >= 8), we use the algorithm by Jehoshua Bruck et al,
+   IEEE TPDS, Nov. 1997. It is a store-and-forward algorithm that
+   takes lgp steps. Because of the extra communication, the bandwidth
+   requirement is (n/2).lgp.beta.
+
+   Cost = lgp.alpha + (n/2).lgp.beta
+
+   where n is the total amount of data a process needs to send to all
+   other processes.
+
+   For medium size messages and (short messages for comm_size < 8), we
+   use an algorithm that posts all irecvs and isends and then does a
+   waitall. We scatter the order of sources and destinations among the
+   processes, so that all processes don't try to send/recv to/from the
+   same process at the same time.
+
+   *** Modification: We post only a small number of isends and irecvs 
+   at a time and wait on them as suggested by Tony Ladd. ***
+   *** See comments below about an additional modification that 
+   we may want to consider ***
+
+   For long messages and power-of-two number of processes, we use a
+   pairwise exchange algorithm, which takes p-1 steps. We
+   calculate the pairs by using an exclusive-or algorithm:
+           for (i=1; i<comm_size; i++)
+               dest = rank ^ i;
+   This algorithm doesn't work if the number of processes is not a power of
+   two. For a non-power-of-two number of processes, we use an
+   algorithm in which, in step i, each process  receives from (rank-i)
+   and sends to (rank+i). 
+
+   Cost = (p-1).alpha + n.beta
+
+   where n is the total amount of data a process needs to send to all
+   other processes.
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Alltoall
+*/
+
+int smpi_coll_tuned_alltoall_mpich( void *sbuf, int scount, 
+                                             MPI_Datatype sdtype,
+                                             void* rbuf, int rcount, 
+                                             MPI_Datatype rdtype, 
+                                             MPI_Comm comm)
+{
+    int communicator_size;
+    size_t dsize, block_dsize;
+    communicator_size = smpi_comm_size(comm);
+
+    int short_size=256;
+    int medium_size=32768;
+    //short size and comm_size >=8   -> bruck
+    
+//     medium size messages and (short messages for comm_size < 8), we
+//     use an algorithm that posts all irecvs and isends and then does a
+//     waitall. 
+    
+//    For long messages and power-of-two number of processes, we use a
+//   pairwise exchange algorithm
+
+//   For a non-power-of-two number of processes, we use an
+//   algorithm in which, in step i, each process  receives from (rank-i)
+//   and sends to (rank+i). 
+
+
+    dsize = smpi_datatype_size(sdtype);
+    block_dsize = dsize * scount;
+
+    if ((block_dsize < short_size) && (communicator_size >= 8)) {
+        return smpi_coll_tuned_alltoall_bruck(sbuf, scount, sdtype, 
+                                                    rbuf, rcount, rdtype,
+                                                    comm);
+
+    } else if (block_dsize < medium_size) {
+        return smpi_coll_tuned_alltoall_simple(sbuf, scount, sdtype, 
+                                                           rbuf, rcount, rdtype, 
+                                                           comm);
+    }else if (communicator_size%2){
+        return smpi_coll_tuned_alltoall_ring(sbuf, scount, sdtype, 
+                                                           rbuf, rcount, rdtype, 
+                                                           comm);
+    }
+
+    return smpi_coll_tuned_alltoall_pair (sbuf, scount, sdtype, 
+                                                    rbuf, rcount, rdtype,
+                                                    comm);
+}
+
+int smpi_coll_tuned_alltoallv_mpich(void *sbuf, int *scounts, int *sdisps,
+                                              MPI_Datatype sdtype,
+                                              void *rbuf, int *rcounts, int *rdisps,
+                                              MPI_Datatype rdtype,
+                                              MPI_Comm  comm
+                                              )
+{
+    /* For starters, just keep the original algorithm. */
+    return smpi_coll_tuned_alltoallv_bruck(sbuf, scounts, sdisps, sdtype, 
+                                                        rbuf, rcounts, rdisps,rdtype,
+                                                        comm);
+}
+
+
+int smpi_coll_tuned_barrier_mpich(MPI_Comm  comm)
+{   
+    return smpi_coll_tuned_barrier_ompi_bruck(comm);
+}
+
+/* This is the default implementation of broadcast. The algorithm is:
+   
+   Algorithm: MPI_Bcast
+
+   For short messages, we use a binomial tree algorithm. 
+   Cost = lgp.alpha + n.lgp.beta
+
+   For long messages, we do a scatter followed by an allgather. 
+   We first scatter the buffer using a binomial tree algorithm. This costs
+   lgp.alpha + n.((p-1)/p).beta
+   If the datatype is contiguous and the communicator is homogeneous,
+   we treat the data as bytes and divide (scatter) it among processes
+   by using ceiling division. For the noncontiguous or heterogeneous
+   cases, we first pack the data into a temporary buffer by using
+   MPI_Pack, scatter it as bytes, and unpack it after the allgather.
+
+   For the allgather, we use a recursive doubling algorithm for 
+   medium-size messages and power-of-two number of processes. This
+   takes lgp steps. In each step pairs of processes exchange all the
+   data they have (we take care of non-power-of-two situations). This
+   costs approximately lgp.alpha + n.((p-1)/p).beta. (Approximately
+   because it may be slightly more in the non-power-of-two case, but
+   it's still a logarithmic algorithm.) Therefore, for long messages
+   Total Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta
+
+   Note that this algorithm has twice the latency as the tree algorithm
+   we use for short messages, but requires lower bandwidth: 2.n.beta
+   versus n.lgp.beta. Therefore, for long messages and when lgp > 2,
+   this algorithm will perform better.
+
+   For long messages and for medium-size messages and non-power-of-two 
+   processes, we use a ring algorithm for the allgather, which 
+   takes p-1 steps, because it performs better than recursive doubling.
+   Total Cost = (lgp+p-1).alpha + 2.n.((p-1)/p).beta
+
+   Possible improvements: 
+   For clusters of SMPs, we may want to do something differently to
+   take advantage of shared memory on each node.
+
+   End Algorithm: MPI_Bcast
+*/
+
+
+int smpi_coll_tuned_bcast_mpich(void *buff, int count,
+                                          MPI_Datatype datatype, int root,
+                                          MPI_Comm  comm
+                                          )
+{
+    /* Decision function based on MX results for 
+       messages up to 36MB and communicator sizes up to 64 nodes */
+    const size_t small_message_size = 12288;
+    const size_t intermediate_message_size = 524288;
+
+    int communicator_size;
+    //int segsize = 0;
+    size_t message_size, dsize;
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* else we need data size for decision function */
+    dsize = smpi_datatype_size(datatype);
+    message_size = dsize * (unsigned long)count;   /* needed for decision */
+
+    /* Handle messages of small and intermediate size, and 
+       single-element broadcasts */
+    if ((message_size < small_message_size) || (communicator_size <= 8)) {
+        /* Binomial without segmentation */
+        return  smpi_coll_tuned_bcast_binomial_tree (buff, count, datatype, 
+                                                      root, comm);
+
+    } else if (message_size < intermediate_message_size && !(communicator_size%2)) {
+        // SplittedBinary with 1KB segments
+        return smpi_coll_tuned_bcast_scatter_rdb_allgather(buff, count, datatype, 
+                                                         root, comm);
+
+    }
+     //Handle large message sizes 
+     return smpi_coll_tuned_bcast_scatter_LR_allgather (buff, count, datatype, 
+                                                     root, comm);
+                                                         
+}
+
+
+
+/* This is the default implementation of reduce. The algorithm is:
+   
+   Algorithm: MPI_Reduce
+
+   For long messages and for builtin ops and if count >= pof2 (where
+   pof2 is the nearest power-of-two less than or equal to the number
+   of processes), we use Rabenseifner's algorithm (see 
+   http://www.hlrs.de/organization/par/services/models/mpi/myreduce.html ).
+   This algorithm implements the reduce in two steps: first a
+   reduce-scatter, followed by a gather to the root. A
+   recursive-halving algorithm (beginning with processes that are
+   distance 1 apart) is used for the reduce-scatter, and a binomial tree
+   algorithm is used for the gather. The non-power-of-two case is
+   handled by dropping to the nearest lower power-of-two: the first
+   few odd-numbered processes send their data to their left neighbors
+   (rank-1), and the reduce-scatter happens among the remaining
+   power-of-two processes. If the root is one of the excluded
+   processes, then after the reduce-scatter, rank 0 sends its result to
+   the root and exits; the root now acts as rank 0 in the binomial tree
+   algorithm for gather.
+
+   For the power-of-two case, the cost for the reduce-scatter is 
+   lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma. The cost for the
+   gather to root is lgp.alpha + n.((p-1)/p).beta. Therefore, the
+   total cost is:
+   Cost = 2.lgp.alpha + 2.n.((p-1)/p).beta + n.((p-1)/p).gamma
+
+   For the non-power-of-two case, assuming the root is not one of the
+   odd-numbered processes that get excluded in the reduce-scatter,
+   Cost = (2.floor(lgp)+1).alpha + (2.((p-1)/p) + 1).n.beta + 
+           n.(1+(p-1)/p).gamma
+
+
+   For short messages, user-defined ops, and count < pof2, we use a
+   binomial tree algorithm for both short and long messages. 
+
+   Cost = lgp.alpha + n.lgp.beta + n.lgp.gamma
+
+
+   We use the binomial tree algorithm in the case of user-defined ops
+   because in this case derived datatypes are allowed, and the user
+   could pass basic datatypes on one process and derived on another as
+   long as the type maps are the same. Breaking up derived datatypes
+   to do the reduce-scatter is tricky.
+
+   FIXME: Per the MPI-2.1 standard this case is not possible.  We
+   should be able to use the reduce-scatter/gather approach as long as
+   count >= pof2.  [goodell@ 2009-01-21]
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Reduce
+*/
+
+
+int smpi_coll_tuned_reduce_mpich( void *sendbuf, void *recvbuf,
+                                            int count, MPI_Datatype  datatype,
+                                            MPI_Op   op, int root,
+                                            MPI_Comm   comm
+                                            )
+{
+    int communicator_size=0;
+    //int segsize = 0;
+    size_t message_size, dsize;
+    communicator_size = smpi_comm_size(comm);
+
+    /* need data size for decision function */
+    dsize=smpi_datatype_size(datatype);
+    message_size = dsize * count;   /* needed for decision */
+
+    int pof2 = 1;
+    while (pof2 <= communicator_size) pof2 <<= 1;
+    pof2 >>= 1;
+
+
+    if ((count < pof2) || (message_size < 2048) || !smpi_op_is_commute(op)) {
+        return smpi_coll_tuned_reduce_binomial (sendbuf, recvbuf, count, datatype, op, root, comm); 
+    }
+        return smpi_coll_tuned_reduce_scatter_gather(sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
+                                                     segsize, max_requests*/);
+}
+
+
+
+/* This is the default implementation of reduce_scatter. The algorithm is:
+
+   Algorithm: MPI_Reduce_scatter
+
+   If the operation is commutative, for short and medium-size
+   messages, we use a recursive-halving
+   algorithm in which the first p/2 processes send the second n/2 data
+   to their counterparts in the other half and receive the first n/2
+   data from them. This procedure continues recursively, halving the
+   data communicated at each step, for a total of lgp steps. If the
+   number of processes is not a power-of-two, we convert it to the
+   nearest lower power-of-two by having the first few even-numbered
+   processes send their data to the neighboring odd-numbered process
+   at (rank+1). Those odd-numbered processes compute the result for
+   their left neighbor as well in the recursive halving algorithm, and
+   then at  the end send the result back to the processes that didn't
+   participate.
+   Therefore, if p is a power-of-two,
+   Cost = lgp.alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma
+   If p is not a power-of-two,
+   Cost = (floor(lgp)+2).alpha + n.(1+(p-1+n)/p).beta + n.(1+(p-1)/p).gamma
+   The above cost in the non power-of-two case is approximate because
+   there is some imbalance in the amount of work each process does
+   because some processes do the work of their neighbors as well.
+
+   For commutative operations and very long messages we use
+   we use a pairwise exchange algorithm similar to
+   the one used in MPI_Alltoall. At step i, each process sends n/p
+   amount of data to (rank+i) and receives n/p amount of data from
+   (rank-i).
+   Cost = (p-1).alpha + n.((p-1)/p).beta + n.((p-1)/p).gamma
+
+
+   If the operation is not commutative, we do the following:
+
+   We use a recursive doubling algorithm, which
+   takes lgp steps. At step 1, processes exchange (n-n/p) amount of
+   data; at step 2, (n-2n/p) amount of data; at step 3, (n-4n/p)
+   amount of data, and so forth.
+
+   Cost = lgp.alpha + n.(lgp-(p-1)/p).beta + n.(lgp-(p-1)/p).gamma
+
+   Possible improvements:
+
+   End Algorithm: MPI_Reduce_scatter
+*/
+
+
+int smpi_coll_tuned_reduce_scatter_mpich( void *sbuf, void *rbuf,
+                                                    int *rcounts,
+                                                    MPI_Datatype dtype,
+                                                    MPI_Op  op,
+                                                    MPI_Comm  comm
+                                                    )
+{
+    int comm_size, i;
+    size_t total_message_size;
+
+    XBT_DEBUG("smpi_coll_tuned_reduce_scatter_mpich");
+    
+    comm_size = smpi_comm_size(comm);
+    // We need data size for decision function 
+    total_message_size = 0;
+    for (i = 0; i < comm_size; i++) { 
+        total_message_size += rcounts[i];
+    }
+
+    if( smpi_op_is_commute(op) &&  total_message_size > 524288) { 
+        return smpi_coll_tuned_reduce_scatter_mpich_pair (sbuf, rbuf, rcounts, 
+                                                                    dtype, op, 
+                                                                    comm); 
+    }else if (!smpi_op_is_commute(op)) {
+        int is_block_regular = 1;
+        for (i = 0; i < (comm_size - 1); ++i) {
+            if (rcounts[i] != rcounts[i+1]) {
+                is_block_regular = 0;
+                break;
+            }
+        }
+
+        /* slightly retask pof2 to mean pof2 equal or greater, not always greater as it is above */
+        int pof2 = 1;
+        while (pof2 < comm_size) pof2 <<= 1;
+
+        if (pof2 == comm_size && is_block_regular) {
+            /* noncommutative, pof2 size, and block regular */
+            return smpi_coll_tuned_reduce_scatter_mpich_noncomm(sbuf, rbuf, rcounts, dtype, op, comm);
+        }
+
+       return smpi_coll_tuned_reduce_scatter_mpich_rdb(sbuf, rbuf, rcounts, dtype, op, comm);
+    }else{      
+       return smpi_coll_tuned_reduce_scatter_mpich_rdb(sbuf, rbuf, rcounts, dtype, op, comm);
+    }
+}
+
+
+/* This is the default implementation of allgather. The algorithm is:
+   
+   Algorithm: MPI_Allgather
+
+   For short messages and non-power-of-two no. of processes, we use
+   the algorithm from the Jehoshua Bruck et al IEEE TPDS Nov 97
+   paper. It is a variant of the disemmination algorithm for
+   barrier. It takes ceiling(lg p) steps.
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+   where n is total size of data gathered on each process.
+
+   For short or medium-size messages and power-of-two no. of
+   processes, we use the recursive doubling algorithm.
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+
+   TODO: On TCP, we may want to use recursive doubling instead of the Bruck
+   algorithm in all cases because of the pairwise-exchange property of
+   recursive doubling (see Benson et al paper in Euro PVM/MPI
+   2003).
+
+   It is interesting to note that either of the above algorithms for
+   MPI_Allgather has the same cost as the tree algorithm for MPI_Gather!
+
+   For long messages or medium-size messages and non-power-of-two
+   no. of processes, we use a ring algorithm. In the first step, each
+   process i sends its contribution to process i+1 and receives
+   the contribution from process i-1 (with wrap-around). From the
+   second step onwards, each process i forwards to process i+1 the
+   data it received from process i-1 in the previous step. This takes
+   a total of p-1 steps.
+
+   Cost = (p-1).alpha + n.((p-1)/p).beta
+
+   We use this algorithm instead of recursive doubling for long
+   messages because we find that this communication pattern (nearest
+   neighbor) performs twice as fast as recursive doubling for long
+   messages (on Myrinet and IBM SP).
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Allgather
+*/
+
+int smpi_coll_tuned_allgather_mpich(void *sbuf, int scount, 
+                                              MPI_Datatype sdtype,
+                                              void* rbuf, int rcount, 
+                                              MPI_Datatype rdtype, 
+                                              MPI_Comm  comm
+                                              )
+{
+    int communicator_size, pow2_size;
+    size_t dsize, total_dsize;
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* Determine complete data size */
+    dsize=smpi_datatype_size(sdtype);
+    total_dsize = dsize * scount * communicator_size;   
+   
+    for (pow2_size  = 1; pow2_size < communicator_size; pow2_size <<=1); 
+
+    /* Decision as in MPICH-2 
+       presented in Thakur et.al. "Optimization of Collective Communication 
+       Operations in MPICH", International Journal of High Performance Computing 
+       Applications, Vol. 19, No. 1, 49-66 (2005)
+       - for power-of-two processes and small and medium size messages 
+       (up to 512KB) use recursive doubling
+       - for non-power-of-two processes and small messages (80KB) use bruck,
+       - for everything else use ring.
+    */
+    if ((pow2_size == communicator_size) && (total_dsize < 524288)) {
+        return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, 
+                                                                 rbuf, rcount, rdtype, 
+                                                                 comm);
+    } else if (total_dsize <= 81920) { 
+        return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, 
+                                                     rbuf, rcount, rdtype,
+                                                     comm);
+    } 
+    return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, 
+                                                rbuf, rcount, rdtype,
+                                                comm);
+}
+
+
+/* This is the default implementation of allgatherv. The algorithm is:
+   
+   Algorithm: MPI_Allgatherv
+
+   For short messages and non-power-of-two no. of processes, we use
+   the algorithm from the Jehoshua Bruck et al IEEE TPDS Nov 97
+   paper. It is a variant of the disemmination algorithm for
+   barrier. It takes ceiling(lg p) steps.
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+   where n is total size of data gathered on each process.
+
+   For short or medium-size messages and power-of-two no. of
+   processes, we use the recursive doubling algorithm.
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+
+   TODO: On TCP, we may want to use recursive doubling instead of the Bruck
+   algorithm in all cases because of the pairwise-exchange property of
+   recursive doubling (see Benson et al paper in Euro PVM/MPI
+   2003).
+
+   For long messages or medium-size messages and non-power-of-two
+   no. of processes, we use a ring algorithm. In the first step, each
+   process i sends its contribution to process i+1 and receives
+   the contribution from process i-1 (with wrap-around). From the
+   second step onwards, each process i forwards to process i+1 the
+   data it received from process i-1 in the previous step. This takes
+   a total of p-1 steps.
+
+   Cost = (p-1).alpha + n.((p-1)/p).beta
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Allgatherv
+*/
+int smpi_coll_tuned_allgatherv_mpich(void *sbuf, int scount, 
+                                               MPI_Datatype sdtype,
+                                               void* rbuf, int *rcounts, 
+                                               int *rdispls,
+                                               MPI_Datatype rdtype, 
+                                               MPI_Comm  comm
+                                               )
+{
+    int communicator_size, pow2_size,i;
+    size_t dsize, total_dsize;
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* Determine complete data size */
+    dsize=smpi_datatype_size(sdtype);
+    total_dsize = dsize * scount * communicator_size;   
+
+    total_dsize = 0;
+    for (i=0; i<communicator_size; i++)
+        total_dsize += rcounts[i];
+    if (total_dsize == 0) return MPI_SUCCESS;
+    
+    for (pow2_size  = 1; pow2_size < communicator_size; pow2_size <<=1); 
+
+    if ((pow2_size == communicator_size) && (total_dsize < 524288)) {
+        return smpi_coll_tuned_allgatherv_mpich_rdb(sbuf, scount, sdtype, 
+                                                                 rbuf, rcounts, rdispls, rdtype, 
+                                                                 comm);
+    } else if (total_dsize <= 81920) { 
+        return smpi_coll_tuned_allgatherv_ompi_bruck(sbuf, scount, sdtype, 
+                                                     rbuf, rcounts, rdispls, rdtype,
+                                                     comm);
+    } 
+    return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, 
+                                                rbuf, rcounts, rdispls, rdtype,
+                                                comm);
+}
+
+/* This is the default implementation of gather. The algorithm is:
+   
+   Algorithm: MPI_Gather
+
+   We use a binomial tree algorithm for both short and long
+   messages. At nodes other than leaf nodes we need to allocate a
+   temporary buffer to store the incoming message. If the root is not
+   rank 0, for very small messages, we pack it into a temporary
+   contiguous buffer and reorder it to be placed in the right
+   order. For small (but not very small) messages, we use a derived
+   datatype to unpack the incoming data into non-contiguous buffers in
+   the right order. In the heterogeneous case we first pack the
+   buffers by using MPI_Pack and then do the gather.
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+   where n is the total size of the data gathered at the root.
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Gather
+*/
+
+int smpi_coll_tuned_gather_mpich(void *sbuf, int scount, 
+                                           MPI_Datatype sdtype,
+                                           void* rbuf, int rcount, 
+                                           MPI_Datatype rdtype, 
+                                           int root,
+                                           MPI_Comm  comm
+                                           )
+{
+        return smpi_coll_tuned_gather_ompi_binomial (sbuf, scount, sdtype, 
+                                                      rbuf, rcount, rdtype, 
+                                                      root, comm);
+}
+
+/* This is the default implementation of scatter. The algorithm is:
+   
+   Algorithm: MPI_Scatter
+
+   We use a binomial tree algorithm for both short and
+   long messages. At nodes other than leaf nodes we need to allocate
+   a temporary buffer to store the incoming message. If the root is
+   not rank 0, we reorder the sendbuf in order of relative ranks by 
+   copying it into a temporary buffer, so that all the sends from the
+   root are contiguous and in the right order. In the heterogeneous
+   case, we first pack the buffer by using MPI_Pack and then do the
+   scatter. 
+
+   Cost = lgp.alpha + n.((p-1)/p).beta
+   where n is the total size of the data to be scattered from the root.
+
+   Possible improvements: 
+
+   End Algorithm: MPI_Scatter
+*/
+
+
+int smpi_coll_tuned_scatter_mpich(void *sbuf, int scount, 
+                                            MPI_Datatype sdtype,
+                                            void* rbuf, int rcount, 
+                                            MPI_Datatype rdtype, 
+                                            int root, MPI_Comm  comm
+                                            )
+{
+        return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype, 
+                                                       rbuf, rcount, rdtype, 
+                                                       root, comm);
+}
+
diff --git a/src/smpi/colls/smpi_openmpi_selector.c b/src/smpi/colls/smpi_openmpi_selector.c
new file mode 100644 (file)
index 0000000..e092bdd
--- /dev/null
@@ -0,0 +1,607 @@
+/* selector for collective algorithms based on openmpi's default coll_tuned_decision_fixed selector */
+
+/* Copyright (c) 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "colls_private.h"
+
+
+int smpi_coll_tuned_allreduce_ompi(void *sbuf, void *rbuf, int count,
+                        MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)
+{
+    size_t dsize, block_dsize;
+    int comm_size = smpi_comm_size(comm);
+    const size_t intermediate_message = 10000;
+
+    /**
+     * Decision function based on MX results from the Grig cluster at UTK.
+     * 
+     * Currently, linear, recursive doubling, and nonoverlapping algorithms 
+     * can handle both commutative and non-commutative operations.
+     * Ring algorithm does not support non-commutative operations.
+     */
+    dsize = smpi_datatype_size(dtype);
+    block_dsize = dsize * count;
+
+    if (block_dsize < intermediate_message) {
+        return (smpi_coll_tuned_allreduce_rdb (sbuf, rbuf, 
+                                                                   count, dtype,
+                                                                   op, comm));
+    } 
+
+    if( smpi_op_is_commute(op) && (count > comm_size) ) {
+        const size_t segment_size = 1 << 20; /* 1 MB */
+        if ((comm_size * segment_size >= block_dsize)) {
+            //FIXME: ok, these are not the right algorithms, try to find closer ones
+            // lr is a good match for allreduce_ring (difference is mainly the use of sendrecv)
+            return smpi_coll_tuned_allreduce_lr(sbuf, rbuf, count, dtype,
+                                              op, comm);
+        } else {
+           return (smpi_coll_tuned_allreduce_ompi_ring_segmented (sbuf, rbuf,
+                                                                    count, dtype, 
+                                                                    op, comm 
+                                                                    /*segment_size*/));
+        }
+    }
+
+    return (smpi_coll_tuned_allreduce_redbcast(sbuf, rbuf, count, 
+                                                            dtype, op, comm));
+}
+
+
+
+int smpi_coll_tuned_alltoall_ompi( void *sbuf, int scount, 
+                                             MPI_Datatype sdtype,
+                                             void* rbuf, int rcount, 
+                                             MPI_Datatype rdtype, 
+                                             MPI_Comm comm)
+{
+    int communicator_size;
+    size_t dsize, block_dsize;
+    communicator_size = smpi_comm_size(comm);
+
+    /* Decision function based on measurement on Grig cluster at 
+       the University of Tennessee (2GB MX) up to 64 nodes.
+       Has better performance for messages of intermediate sizes than the old one */
+    /* determine block size */
+    dsize = smpi_datatype_size(sdtype);
+    block_dsize = dsize * scount;
+
+    if ((block_dsize < 200) && (communicator_size > 12)) {
+        return smpi_coll_tuned_alltoall_bruck(sbuf, scount, sdtype, 
+                                                    rbuf, rcount, rdtype,
+                                                    comm);
+
+    } else if (block_dsize < 3000) {
+        return smpi_coll_tuned_alltoall_simple(sbuf, scount, sdtype, 
+                                                           rbuf, rcount, rdtype, 
+                                                           comm);
+    }
+
+    return smpi_coll_tuned_alltoall_ompi_pairwise (sbuf, scount, sdtype, 
+                                                    rbuf, rcount, rdtype,
+                                                    comm);
+}
+
+int smpi_coll_tuned_alltoallv_ompi(void *sbuf, int *scounts, int *sdisps,
+                                              MPI_Datatype sdtype,
+                                              void *rbuf, int *rcounts, int *rdisps,
+                                              MPI_Datatype rdtype,
+                                              MPI_Comm  comm
+                                              )
+{
+    /* For starters, just keep the original algorithm. */
+    return smpi_coll_tuned_alltoallv_ompi_basic_linear(sbuf, scounts, sdisps, sdtype, 
+                                                        rbuf, rcounts, rdisps,rdtype,
+                                                        comm);
+}
+
+
+int smpi_coll_tuned_barrier_ompi(MPI_Comm  comm)
+{    int communicator_size = smpi_comm_size(comm);
+
+    if( 2 == communicator_size )
+        return smpi_coll_tuned_barrier_ompi_two_procs(comm);
+/*     * Basic optimisation. If we have a power of 2 number of nodes*/
+/*     * the use the recursive doubling algorithm, otherwise*/
+/*     * bruck is the one we want.*/
+    {
+        int has_one = 0;
+        for( ; communicator_size > 0; communicator_size >>= 1 ) {
+            if( communicator_size & 0x1 ) {
+                if( has_one )
+                    return smpi_coll_tuned_barrier_ompi_bruck(comm);
+                has_one = 1;
+            }
+        }
+    }
+    return smpi_coll_tuned_barrier_ompi_recursivedoubling(comm);
+}
+
+int smpi_coll_tuned_bcast_ompi(void *buff, int count,
+                                          MPI_Datatype datatype, int root,
+                                          MPI_Comm  comm
+                                          )
+{
+    /* Decision function based on MX results for 
+       messages up to 36MB and communicator sizes up to 64 nodes */
+    const size_t small_message_size = 2048;
+    const size_t intermediate_message_size = 370728;
+    const double a_p16  = 3.2118e-6; /* [1 / byte] */
+    const double b_p16  = 8.7936;   
+    const double a_p64  = 2.3679e-6; /* [1 / byte] */
+    const double b_p64  = 1.1787;     
+    const double a_p128 = 1.6134e-6; /* [1 / byte] */
+    const double b_p128 = 2.1102;
+
+    int communicator_size;
+    //int segsize = 0;
+    size_t message_size, dsize;
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* else we need data size for decision function */
+    dsize = smpi_datatype_size(datatype);
+    message_size = dsize * (unsigned long)count;   /* needed for decision */
+
+    /* Handle messages of small and intermediate size, and 
+       single-element broadcasts */
+    if ((message_size < small_message_size) || (count <= 1)) {
+        /* Binomial without segmentation */
+        return  smpi_coll_tuned_bcast_binomial_tree (buff, count, datatype, 
+                                                      root, comm);
+
+    } else if (message_size < intermediate_message_size) {
+        // SplittedBinary with 1KB segments
+        return smpi_coll_tuned_bcast_ompi_split_bintree(buff, count, datatype, 
+                                                         root, comm);
+
+    }
+     //Handle large message sizes 
+    else if (communicator_size < (a_p128 * message_size + b_p128)) {
+        //Pipeline with 128KB segments 
+        //segsize = 1024  << 7;
+        return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, 
+                                                     root, comm);
+                                                     
+
+    } else if (communicator_size < 13) {
+        // Split Binary with 8KB segments 
+        return smpi_coll_tuned_bcast_ompi_split_bintree(buff, count, datatype, 
+                                                         root, comm);
+       
+    } else if (communicator_size < (a_p64 * message_size + b_p64)) {
+        // Pipeline with 64KB segments 
+        //segsize = 1024 << 6;
+        return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, 
+                                                     root, comm);
+                                                     
+
+    } else if (communicator_size < (a_p16 * message_size + b_p16)) {
+        //Pipeline with 16KB segments 
+        //segsize = 1024 << 4;
+        return smpi_coll_tuned_bcast_ompi_pipeline (buff, count, datatype, 
+                                                     root, comm);
+                                                     
+
+    }
+    /* Pipeline with 8KB segments */
+    //segsize = 1024 << 3;
+    return smpi_coll_tuned_bcast_flattree_pipeline (buff, count, datatype, 
+                                                 root, comm
+                                                 /*segsize*/);
+#if 0
+    /* this is based on gige measurements */
+
+    if (communicator_size  < 4) {
+        return smpi_coll_tuned_bcast_intra_basic_linear (buff, count, datatype, root, comm, module);
+    }
+    if (communicator_size == 4) {
+        if (message_size < 524288) segsize = 0;
+        else segsize = 16384;
+        return smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize);
+    }
+    if (communicator_size <= 8 && message_size < 4096) {
+        return smpi_coll_tuned_bcast_intra_basic_linear (buff, count, datatype, root, comm, module);
+    }
+    if (communicator_size > 8 && message_size >= 32768 && message_size < 524288) {
+        segsize = 16384;
+        return  smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize);
+    }
+    if (message_size >= 524288) {
+        segsize = 16384;
+        return smpi_coll_tuned_bcast_intra_pipeline (buff, count, datatype, root, comm, module, segsize);
+    }
+    segsize = 0;
+    /* once tested can swap this back in */
+    /* return smpi_coll_tuned_bcast_intra_bmtree (buff, count, datatype, root, comm, segsize); */
+    return smpi_coll_tuned_bcast_intra_bintree (buff, count, datatype, root, comm, module, segsize);
+#endif  /* 0 */
+}
+
+int smpi_coll_tuned_reduce_ompi( void *sendbuf, void *recvbuf,
+                                            int count, MPI_Datatype  datatype,
+                                            MPI_Op   op, int root,
+                                            MPI_Comm   comm
+                                            )
+{
+    int communicator_size=0;
+    //int segsize = 0;
+    size_t message_size, dsize;
+    const double a1 =  0.6016 / 1024.0; /* [1/B] */
+    const double b1 =  1.3496;
+    const double a2 =  0.0410 / 1024.0; /* [1/B] */
+    const double b2 =  9.7128;
+    const double a3 =  0.0422 / 1024.0; /* [1/B] */
+    const double b3 =  1.1614;
+    //const double a4 =  0.0033 / 1024.0; /* [1/B] */
+    //const double b4 =  1.6761;
+
+    //const int max_requests = 0; /* no limit on # of outstanding requests */
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* need data size for decision function */
+    dsize=smpi_datatype_size(datatype);
+    message_size = dsize * count;   /* needed for decision */
+
+    /**
+     * If the operation is non commutative we currently have choice of linear 
+     * or in-order binary tree algorithm.
+     */
+    if( !smpi_op_is_commute(op) ) {
+        if ((communicator_size < 12) && (message_size < 2048)) {
+            return smpi_coll_tuned_reduce_ompi_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm/*, module*/); 
+        } 
+        return smpi_coll_tuned_reduce_ompi_in_order_binary (sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
+                                                             0, max_requests*/); 
+    }
+
+    if ((communicator_size < 8) && (message_size < 512)){
+        /* Linear_0K */
+        return smpi_coll_tuned_reduce_ompi_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm); 
+    } else if (((communicator_size < 8) && (message_size < 20480)) ||
+               (message_size < 2048) || (count <= 1)) {
+        /* Binomial_0K */
+        //segsize = 0;
+        return smpi_coll_tuned_reduce_ompi_binomial(sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
+                                                     segsize, max_requests*/);
+    } else if (communicator_size > (a1 * message_size + b1)) {
+        // Binomial_1K 
+        //segsize = 1024;
+        return smpi_coll_tuned_reduce_ompi_binomial(sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
+                                                     segsize, max_requests*/);
+    } else if (communicator_size > (a2 * message_size + b2)) {
+        // Pipeline_1K 
+        //segsize = 1024;
+        return smpi_coll_tuned_reduce_ompi_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm/*, module, 
+                                                      segsize, max_requests*/);
+    } else if (communicator_size > (a3 * message_size + b3)) {
+        // Binary_32K 
+        //segsize = 32*1024;
+        return smpi_coll_tuned_reduce_ompi_binary( sendbuf, recvbuf, count, datatype, op, root,
+                                                    comm/*, module, segsize, max_requests*/);
+    }
+    /*if (communicator_size > (a4 * message_size + b4)) {
+        // Pipeline_32K 
+        segsize = 32*1024;
+    } else {
+        // Pipeline_64K 
+        segsize = 64*1024;
+    }*/
+    return smpi_coll_tuned_reduce_ompi_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm/*, module, 
+                                                  segsize, max_requests*/);
+
+#if 0
+    /* for small messages use linear algorithm */
+    if (message_size <= 4096) {
+        segsize = 0;
+        fanout = communicator_size - 1;
+        /* when linear implemented or taken from basic put here, right now using chain as a linear system */
+        /* it is implemented and I shouldn't be calling a chain with a fanout bigger than MAXTREEFANOUT from topo.h! */
+        return smpi_coll_tuned_reduce_intra_basic_linear (sendbuf, recvbuf, count, datatype, op, root, comm, module); 
+        /*        return smpi_coll_tuned_reduce_intra_chain (sendbuf, recvbuf, count, datatype, op, root, comm, segsize, fanout); */
+    }
+    if (message_size < 524288) {
+        if (message_size <= 65536 ) {
+            segsize = 32768;
+            fanout = 8;
+        } else {
+            segsize = 1024;
+            fanout = communicator_size/2;
+        }
+        /* later swap this for a binary tree */
+        /*         fanout = 2; */
+        return smpi_coll_tuned_reduce_intra_chain (sendbuf, recvbuf, count, datatype, op, root, comm, module,
+                                                   segsize, fanout, max_requests);
+    }
+    segsize = 1024;
+    return smpi_coll_tuned_reduce_intra_pipeline (sendbuf, recvbuf, count, datatype, op, root, comm, module,
+                                                  segsize, max_requests);
+#endif  /* 0 */
+}
+
+int smpi_coll_tuned_reduce_scatter_ompi( void *sbuf, void *rbuf,
+                                                    int *rcounts,
+                                                    MPI_Datatype dtype,
+                                                    MPI_Op  op,
+                                                    MPI_Comm  comm
+                                                    )
+{
+    int comm_size, i, pow2;
+    size_t total_message_size, dsize;
+    const double a = 0.0012;
+    const double b = 8.0;
+    const size_t small_message_size = 12 * 1024;
+    const size_t large_message_size = 256 * 1024;
+    int zerocounts = 0;
+
+    XBT_DEBUG("smpi_coll_tuned_reduce_scatter_ompi");
+    
+    comm_size = smpi_comm_size(comm);
+    // We need data size for decision function 
+    dsize=smpi_datatype_size(dtype);
+    total_message_size = 0;
+    for (i = 0; i < comm_size; i++) { 
+        total_message_size += rcounts[i];
+        if (0 == rcounts[i]) {
+            zerocounts = 1;
+        }
+    }
+
+    if( !smpi_op_is_commute(op) || (zerocounts)) {
+        smpi_mpi_reduce_scatter (sbuf, rbuf, rcounts, 
+                                                                    dtype, op, 
+                                                                    comm); 
+        return MPI_SUCCESS;
+    }
+   
+    total_message_size *= dsize;
+
+    // compute the nearest power of 2 
+    for (pow2 = 1; pow2 < comm_size; pow2 <<= 1);
+
+    if ((total_message_size <= small_message_size) ||
+        ((total_message_size <= large_message_size) && (pow2 == comm_size)) ||
+        (comm_size >= a * total_message_size + b)) {
+        return 
+            smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(sbuf, rbuf, rcounts,
+                                                                        dtype, op,
+                                                                        comm);
+    } 
+    return smpi_coll_tuned_reduce_scatter_ompi_ring(sbuf, rbuf, rcounts,
+                                                     dtype, op,
+                                                     comm);
+
+
+
+}
+
+int smpi_coll_tuned_allgather_ompi(void *sbuf, int scount, 
+                                              MPI_Datatype sdtype,
+                                              void* rbuf, int rcount, 
+                                              MPI_Datatype rdtype, 
+                                              MPI_Comm  comm
+                                              )
+{
+    int communicator_size, pow2_size;
+    size_t dsize, total_dsize;
+
+    communicator_size = smpi_comm_size(comm);
+
+    /* Special case for 2 processes */
+    if (communicator_size == 2) {
+        return smpi_coll_tuned_allgather_pair (sbuf, scount, sdtype, 
+                                                          rbuf, rcount, rdtype, 
+                                                          comm/*, module*/);
+    }
+
+    /* Determine complete data size */
+    dsize=smpi_datatype_size(sdtype);
+    total_dsize = dsize * scount * communicator_size;   
+   
+    for (pow2_size  = 1; pow2_size < communicator_size; pow2_size <<=1); 
+
+    /* Decision based on MX 2Gb results from Grig cluster at 
+       The University of Tennesse, Knoxville 
+       - if total message size is less than 50KB use either bruck or 
+       recursive doubling for non-power of two and power of two nodes, 
+       respectively.
+       - else use ring and neighbor exchange algorithms for odd and even 
+       number of nodes, respectively.
+    */
+    if (total_dsize < 50000) {
+        if (pow2_size == communicator_size) {
+            return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, 
+                                                                     rbuf, rcount, rdtype,
+                                                                     comm);
+        } else {
+            return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, 
+                                                         rbuf, rcount, rdtype, 
+                                                         comm);
+        }
+    } else {
+        if (communicator_size % 2) {
+            return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, 
+                                                        rbuf, rcount, rdtype, 
+                                                        comm);
+        } else {
+            return  smpi_coll_tuned_allgather_ompi_neighborexchange(sbuf, scount, sdtype,
+                                                                     rbuf, rcount, rdtype,
+                                                                     comm);
+        }
+    }
+   
+#if defined(USE_MPICH2_DECISION)
+    /* Decision as in MPICH-2 
+       presented in Thakur et.al. "Optimization of Collective Communication 
+       Operations in MPICH", International Journal of High Performance Computing 
+       Applications, Vol. 19, No. 1, 49-66 (2005)
+       - for power-of-two processes and small and medium size messages 
+       (up to 512KB) use recursive doubling
+       - for non-power-of-two processes and small messages (80KB) use bruck,
+       - for everything else use ring.
+    */
+    if ((pow2_size == communicator_size) && (total_dsize < 524288)) {
+        return smpi_coll_tuned_allgather_rdb(sbuf, scount, sdtype, 
+                                                                 rbuf, rcount, rdtype, 
+                                                                 comm);
+    } else if (total_dsize <= 81920) { 
+        return smpi_coll_tuned_allgather_bruck(sbuf, scount, sdtype, 
+                                                     rbuf, rcount, rdtype,
+                                                     comm);
+    } 
+    return smpi_coll_tuned_allgather_ring(sbuf, scount, sdtype, 
+                                                rbuf, rcount, rdtype,
+                                                comm);
+#endif  /* defined(USE_MPICH2_DECISION) */
+}
+
+int smpi_coll_tuned_allgatherv_ompi(void *sbuf, int scount, 
+                                               MPI_Datatype sdtype,
+                                               void* rbuf, int *rcounts, 
+                                               int *rdispls,
+                                               MPI_Datatype rdtype, 
+                                               MPI_Comm  comm
+                                               )
+{
+    int i;
+    int communicator_size;
+    size_t dsize, total_dsize;
+    
+    communicator_size = smpi_comm_size(comm);
+    
+    /* Special case for 2 processes */
+    if (communicator_size == 2) {
+        return smpi_coll_tuned_allgatherv_pair(sbuf, scount, sdtype,
+                                                           rbuf, rcounts, rdispls, rdtype, 
+                                                           comm);
+    }
+    
+    /* Determine complete data size */
+    dsize=smpi_datatype_size(sdtype);
+    total_dsize = 0;
+    for (i = 0; i < communicator_size; i++) {
+        total_dsize += dsize * rcounts[i];
+    }
+    
+    /* Decision based on allgather decision.   */
+    if (total_dsize < 50000) {
+/*        return smpi_coll_tuned_allgatherv_intra_bruck(sbuf, scount, sdtype, 
+                                                      rbuf, rcounts, rdispls, rdtype, 
+                                                      comm, module);*/
+    return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, 
+                                                      rbuf, rcounts, rdispls, rdtype, 
+                                                      comm);
+
+    } else {
+        if (communicator_size % 2) {
+            return smpi_coll_tuned_allgatherv_ring(sbuf, scount, sdtype, 
+                                                         rbuf, rcounts, rdispls, rdtype, 
+                                                         comm);
+        } else {
+            return  smpi_coll_tuned_allgatherv_ompi_neighborexchange(sbuf, scount, sdtype,
+                                                                      rbuf, rcounts, rdispls, rdtype, 
+                                                                      comm);
+        }
+    }
+}
+
+int smpi_coll_tuned_gather_ompi(void *sbuf, int scount, 
+                                           MPI_Datatype sdtype,
+                                           void* rbuf, int rcount, 
+                                           MPI_Datatype rdtype, 
+                                           int root,
+                                           MPI_Comm  comm
+                                           )
+{
+    //const int large_segment_size = 32768;
+    //const int small_segment_size = 1024;
+
+    //const size_t large_block_size = 92160;
+    const size_t intermediate_block_size = 6000;
+    const size_t small_block_size = 1024;
+
+    const int large_communicator_size = 60;
+    const int small_communicator_size = 10;
+
+    int communicator_size, rank;
+    size_t dsize, block_size;
+
+    XBT_DEBUG("smpi_coll_tuned_gather_ompi");
+
+    communicator_size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+
+    // Determine block size 
+    if (rank == root) {
+        dsize = smpi_datatype_size(rdtype);
+        block_size = dsize * rcount;
+    } else {
+        dsize = smpi_datatype_size(sdtype);
+        block_size = dsize * scount;
+    }
+
+/*    if (block_size > large_block_size) {*/
+/*        return smpi_coll_tuned_gather_ompi_linear_sync (sbuf, scount, sdtype, */
+/*                                                         rbuf, rcount, rdtype, */
+/*                                                         root, comm);*/
+
+/*    } else*/ if (block_size > intermediate_block_size) {
+        return smpi_coll_tuned_gather_ompi_linear_sync (sbuf, scount, sdtype, 
+                                                         rbuf, rcount, rdtype, 
+                                                         root, comm);
+
+    } else if ((communicator_size > large_communicator_size) ||
+               ((communicator_size > small_communicator_size) &&
+                (block_size < small_block_size))) {
+        return smpi_coll_tuned_gather_ompi_binomial (sbuf, scount, sdtype, 
+                                                      rbuf, rcount, rdtype, 
+                                                      root, comm);
+
+    }
+    // Otherwise, use basic linear 
+    return smpi_coll_tuned_gather_ompi_basic_linear (sbuf, scount, sdtype, 
+                                                      rbuf, rcount, rdtype, 
+                                                      root, comm);
+}
+
+int smpi_coll_tuned_scatter_ompi(void *sbuf, int scount, 
+                                            MPI_Datatype sdtype,
+                                            void* rbuf, int rcount, 
+                                            MPI_Datatype rdtype, 
+                                            int root, MPI_Comm  comm
+                                            )
+{
+    const size_t small_block_size = 300;
+    const int small_comm_size = 10;
+    int communicator_size, rank;
+    size_t dsize, block_size;
+
+    XBT_DEBUG("smpi_coll_tuned_scatter_ompi");
+
+    communicator_size = smpi_comm_size(comm);
+    rank = smpi_comm_rank(comm);
+    // Determine block size 
+    if (root == rank) {
+        dsize=smpi_datatype_size(sdtype);
+        block_size = dsize * scount;
+    } else {
+        dsize=smpi_datatype_size(rdtype);
+        block_size = dsize * rcount;
+    } 
+
+    if ((communicator_size > small_comm_size) &&
+        (block_size < small_block_size)) {
+        return smpi_coll_tuned_scatter_ompi_binomial (sbuf, scount, sdtype, 
+                                                       rbuf, rcount, rdtype, 
+                                                       root, comm);
+    }
+    return smpi_coll_tuned_scatter_ompi_basic_linear (sbuf, scount, sdtype, 
+                                                       rbuf, rcount, rdtype, 
+                                                       root, comm);
+}
+
index f67ad5e..11a8933 100644 (file)
@@ -82,6 +82,7 @@ typedef struct s_smpi_mpi_request {
 void smpi_process_init(int *argc, char ***argv);
 void smpi_process_destroy(void);
 void smpi_process_finalize(void);
+int smpi_process_finalized(void);
 
 smpi_process_data_t smpi_process_data(void);
 smpi_process_data_t smpi_process_remote_data(int index);
@@ -114,7 +115,7 @@ void smpi_datatype_use(MPI_Datatype type);
 void smpi_datatype_unuse(MPI_Datatype type);
 
 int smpi_datatype_contiguous(int count, MPI_Datatype old_type,
-                       MPI_Datatype* new_type);
+                       MPI_Datatype* new_type, MPI_Aint lb);
 int smpi_datatype_vector(int count, int blocklen, int stride,
                       MPI_Datatype old_type, MPI_Datatype* new_type);
 
@@ -135,6 +136,7 @@ void smpi_datatype_commit(MPI_Datatype* datatype);
 
 void smpi_empty_status(MPI_Status * status);
 MPI_Op smpi_op_new(MPI_User_function * function, int commute);
+int smpi_op_is_commute(MPI_Op op);
 void smpi_op_destroy(MPI_Op op);
 void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len,
                    MPI_Datatype * datatype);
@@ -210,6 +212,8 @@ void smpi_mpi_barrier(MPI_Comm comm);
 void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                      void *recvbuf, int recvcount, MPI_Datatype recvtype,
                      int root, MPI_Comm comm);
+void smpi_mpi_reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
+                       MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
 void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                       void *recvbuf, int *recvcounts, int *displs,
                       MPI_Datatype recvtype, int root, MPI_Comm comm);
@@ -239,7 +243,7 @@ void nary_tree_bcast(void *buf, int count, MPI_Datatype datatype, int root,
                      MPI_Comm comm, int arity);
 void nary_tree_barrier(MPI_Comm comm, int arity);
 
-int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount,
+int smpi_coll_tuned_alltoall_ompi2(void *sendbuf, int sendcount,
                                       MPI_Datatype sendtype, void *recvbuf,
                                       int recvcount, MPI_Datatype recvtype,
                                       MPI_Comm comm);
index baf4891..875ce4e 100644 (file)
@@ -12,7 +12,7 @@
 #include "simix/smx_private.h"
 #include "surf/surf.h"
 #include "simgrid/sg_config.h"
-
+#include "colls/colls.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi, "Logging specific to SMPI (base)");
 
@@ -527,7 +527,12 @@ void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 {
   MPI_Request requests[2];
   MPI_Status stats[2];
-
+  int myid=smpi_process_index();
+  if ((dst == myid) && (src == myid)) {
+      smpi_datatype_copy(sendbuf, sendcount, sendtype,
+                                     recvbuf, recvcount, recvtype);
+      return;
+  }
   requests[0] =
     smpi_isend_init(sendbuf, sendcount, sendtype, dst, sendtag, comm);
   requests[1] =
@@ -941,6 +946,31 @@ void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
   }
 }
 
+
+void smpi_mpi_reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
+                       MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+    int i, size, count;
+    int *displs;
+    int rank = smpi_process_index();
+    void *tmpbuf;
+
+    /* arbitrarily choose root as rank 0 */
+    size = smpi_comm_size(comm);
+    count = 0;
+    displs = xbt_new(int, size);
+    for (i = 0; i < size; i++) {
+      displs[i] = count;
+      count += recvcounts[i];
+    }
+    tmpbuf=(void*)xbt_malloc(count*smpi_datatype_get_extent(datatype));
+    mpi_coll_reduce_fun(sendbuf, tmpbuf, count, datatype, op, 0, comm);
+    smpi_mpi_scatterv(tmpbuf, recvcounts, displs, datatype, recvbuf,
+                      recvcounts[rank], datatype, 0, comm);
+    xbt_free(displs);
+    xbt_free(tmpbuf);
+}
+
 void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                       void *recvbuf, int *recvcounts, int *displs,
                       MPI_Datatype recvtype, int root, MPI_Comm comm)
@@ -1148,6 +1178,13 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count,
 
   rank = smpi_comm_rank(comm);
   size = smpi_comm_size(comm);
+  //non commutative case, use a working algo from openmpi
+  if(!smpi_op_is_commute(op)){
+    smpi_coll_tuned_reduce_ompi_basic_linear(sendbuf, recvbuf, count,
+                     datatype, op, root, comm);
+    return;
+  }
+  
   if(rank != root) {
     // Send buffer to root
     smpi_mpi_send(sendbuf, count, datatype, root, system_tag, comm);
index 18e4205..84a0bac 100644 (file)
@@ -149,7 +149,7 @@ static void smpi_execute(double duration)
 
 void smpi_bench_begin(void)
 {
-  xbt_os_timer_start(smpi_process_timer());
+  xbt_os_threadtimer_start(smpi_process_timer());
   smpi_current_rank = smpi_process_index();
 }
 
@@ -157,14 +157,14 @@ void smpi_bench_end(void)
 {
   xbt_os_timer_t timer = smpi_process_timer();
 
-  xbt_os_timer_stop(timer);
+  xbt_os_threadtimer_stop(timer);
   smpi_execute(xbt_os_timer_elapsed(timer));
 }
 
 unsigned int smpi_sleep(unsigned int secs)
 {
   smpi_bench_end();
-  smpi_execute((double) secs);
+  smpi_execute_flops((double) secs*simcall_host_get_speed(SIMIX_host_self()));
   smpi_bench_begin();
   return secs;
 }
@@ -320,7 +320,7 @@ void smpi_sample_3(int global, const char *file, int line)
   }
 
   // ok, benchmarking this loop is over
-  xbt_os_timer_stop(smpi_process_timer());
+  xbt_os_threadtimer_stop(smpi_process_timer());
 
   // update the stats
   double sample, n;
@@ -350,42 +350,47 @@ void *smpi_shared_malloc(size_t size, const char *file, int line)
   int fd;
   void* mem;
   shared_data_t *data;
-
-  for(i = 0; i < len; i++) {
-    /* Make the 'loc' ID be a flat filename */
-    if(loc[i] == '/') {
-      loc[i] = '_';
-    }
-  }
-  if (!allocs) {
-    allocs = xbt_dict_new_homogeneous(free);
-  }
-  data = xbt_dict_get_or_null(allocs, loc);
-  if(!data) {
-    fd = shm_open(loc, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-    if(fd < 0) {
-      switch(errno) {
-        case EEXIST:
-          xbt_die("Please cleanup /dev/shm/%s", loc);
-        default:
-          xbt_die("An unhandled error occured while opening %s: %s", loc, strerror(errno));
+  if (sg_cfg_get_boolean("smpi/use_shared_malloc")){
+    for(i = 0; i < len; i++) {
+      /* Make the 'loc' ID be a flat filename */
+      if(loc[i] == '/') {
+        loc[i] = '_';
       }
     }
-    data = xbt_new(shared_data_t, 1);
-    data->fd = fd;
-    data->count = 1;
-    data->loc = loc;
-    mem = shm_map(fd, size, data);
-    if(shm_unlink(loc) < 0) {
-      XBT_WARN("Could not early unlink %s: %s", loc, strerror(errno));
+    if (!allocs) {
+      allocs = xbt_dict_new_homogeneous(free);
     }
-    xbt_dict_set(allocs, loc, data, NULL);
-    XBT_DEBUG("Mapping %s at %p through %d", loc, mem, fd);
-  } else {
-    mem = shm_map(data->fd, size, data);
-    data->count++;
+    data = xbt_dict_get_or_null(allocs, loc);
+    if(!data) {
+      fd = shm_open(loc, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+      if(fd < 0) {
+        switch(errno) {
+          case EEXIST:
+            xbt_die("Please cleanup /dev/shm/%s", loc);
+          default:
+            xbt_die("An unhandled error occured while opening %s: %s", loc, strerror(errno));
+        }
+      }
+      data = xbt_new(shared_data_t, 1);
+      data->fd = fd;
+      data->count = 1;
+      data->loc = loc;
+      mem = shm_map(fd, size, data);
+      if(shm_unlink(loc) < 0) {
+        XBT_WARN("Could not early unlink %s: %s", loc, strerror(errno));
+      }
+      xbt_dict_set(allocs, loc, data, NULL);
+      XBT_DEBUG("Mapping %s at %p through %d", loc, mem, fd);
+    } else {
+      mem = shm_map(data->fd, size, data);
+      data->count++;
+    }
+    XBT_DEBUG("Shared malloc %zu in %p (metadata at %p)", size, mem, data);
+  }else{
+    mem = xbt_malloc(size);
+    XBT_DEBUG("Classic malloc %zu in %p", size, mem);
   }
-  XBT_DEBUG("Malloc %zu in %p (metadata at %p)", size, mem, data);
+
   return mem;
 }
 void smpi_shared_free(void *ptr)
@@ -393,33 +398,40 @@ void smpi_shared_free(void *ptr)
   char loc[PTR_STRLEN];
   shared_metadata_t* meta;
   shared_data_t* data;
-
-  if (!allocs) {
-    XBT_WARN("Cannot free: nothing was allocated");
-    return;
-  }
-  if(!allocs_metadata) {
-    XBT_WARN("Cannot free: no metadata was allocated");
-  }
-  snprintf(loc, PTR_STRLEN, "%p", ptr);
-  meta = (shared_metadata_t*)xbt_dict_get_or_null(allocs_metadata, loc);
-  if (!meta) {
-    XBT_WARN("Cannot free: %p was not shared-allocated by SMPI", ptr);
-    return;
-  }
-  data = meta->data;
-  if(!data) {
-    XBT_WARN("Cannot free: something is broken in the metadata link");
-    return;
-  }
-  if(munmap(ptr, meta->size) < 0) {
-    XBT_WARN("Unmapping of fd %d failed: %s", data->fd, strerror(errno));
-  }
-  data->count--;
-  if (data->count <= 0) {
-    close(data->fd);
-    xbt_dict_remove(allocs, data->loc);
-    free(data->loc);
+  if (sg_cfg_get_boolean("smpi/use_shared_malloc")){
+  
+    if (!allocs) {
+      XBT_WARN("Cannot free: nothing was allocated");
+      return;
+    }
+    if(!allocs_metadata) {
+      XBT_WARN("Cannot free: no metadata was allocated");
+    }
+    snprintf(loc, PTR_STRLEN, "%p", ptr);
+    meta = (shared_metadata_t*)xbt_dict_get_or_null(allocs_metadata, loc);
+    if (!meta) {
+      XBT_WARN("Cannot free: %p was not shared-allocated by SMPI", ptr);
+      return;
+    }
+    data = meta->data;
+    if(!data) {
+      XBT_WARN("Cannot free: something is broken in the metadata link");
+      return;
+    }
+    if(munmap(ptr, meta->size) < 0) {
+      XBT_WARN("Unmapping of fd %d failed: %s", data->fd, strerror(errno));
+    }
+    data->count--;
+    XBT_DEBUG("Shared free - no removal - of %p, count = %d", ptr, data->count);
+    if (data->count <= 0) {
+      close(data->fd);
+      xbt_dict_remove(allocs, data->loc);
+      free(data->loc);
+      XBT_DEBUG("Shared free - with removal - of %p", ptr);
+    }
+  }else{
+    XBT_DEBUG("Classic free of %p", ptr);
+    xbt_free(ptr);
   }
 }
 #endif
index 96ccc0d..172ddb1 100644 (file)
 
 #include "private.h"
 #include "colls/colls.h"
+#include "simgrid/sg_config.h"
+
+s_mpi_coll_description_t mpi_coll_gather_description[] = {
+  {"default",
+   "gather default collective",
+   smpi_mpi_gather},
+COLL_GATHERS(COLL_DESCRIPTION, COLL_COMMA),
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
 
 s_mpi_coll_description_t mpi_coll_allgather_description[] = {
   {"default",
@@ -37,10 +47,33 @@ COLL_ALLREDUCES(COLL_DESCRIPTION, COLL_COMMA),
   {NULL, NULL, NULL}      /* this array must be NULL terminated */
 };
 
+s_mpi_coll_description_t mpi_coll_reduce_scatter_description[] = {
+  {"default",
+   "reduce_scatter default collective",
+   smpi_mpi_reduce_scatter},
+COLL_REDUCE_SCATTERS(COLL_DESCRIPTION, COLL_COMMA),
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_scatter_description[] = {
+  {"default",
+   "scatter default collective",
+   smpi_mpi_scatter},
+COLL_SCATTERS(COLL_DESCRIPTION, COLL_COMMA),
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_barrier_description[] = {
+  {"default",
+   "barrier default collective",
+   smpi_mpi_barrier},
+COLL_BARRIERS(COLL_DESCRIPTION, COLL_COMMA),
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
 s_mpi_coll_description_t mpi_coll_alltoall_description[] = {
-  {"ompi",
+  {"default",
    "Ompi alltoall default collective",
-   smpi_coll_tuned_alltoall_ompi},
+   smpi_coll_tuned_alltoall_ompi2},
 COLL_ALLTOALLS(COLL_DESCRIPTION, COLL_COMMA),
   {"bruck",
    "Alltoall Bruck (SG) collective",
@@ -61,7 +94,7 @@ COLL_ALLTOALLVS(COLL_DESCRIPTION, COLL_COMMA),
 
 s_mpi_coll_description_t mpi_coll_bcast_description[] = {
   {"default",
-   "allgather default collective",
+   "bcast default collective",
    smpi_mpi_bcast},
 COLL_BCASTS(COLL_DESCRIPTION, COLL_COMMA),
   {NULL, NULL, NULL}      /* this array must be NULL terminated */
@@ -69,7 +102,7 @@ COLL_BCASTS(COLL_DESCRIPTION, COLL_COMMA),
 
 s_mpi_coll_description_t mpi_coll_reduce_description[] = {
   {"default",
-   "allgather default collective",
+   "reduce default collective",
    smpi_mpi_reduce},
 COLL_REDUCES(COLL_DESCRIPTION, COLL_COMMA),
   {NULL, NULL, NULL}      /* this array must be NULL terminated */
@@ -88,15 +121,28 @@ void coll_help(const char *category, s_mpi_coll_description_t * table)
 }
 
 int find_coll_description(s_mpi_coll_description_t * table,
-                           const char *name)
+                           char *name)
 {
   int i;
   char *name_list = NULL;
-
+  int selector_on=0;
+  if(name==NULL){//no argument provided, use active selector's algorithm
+    name=(char*)sg_cfg_get_string("smpi/coll_selector");
+    selector_on=1;
+  }
   for (i = 0; table[i].name; i++)
     if (!strcmp(name, table[i].name)) {
       return i;
     }
+
+  if(selector_on){
+    // collective seems not handled by the active selector, try with default one
+    name=(char*)"default";
+    for (i = 0; table[i].name; i++)
+      if (!strcmp(name, table[i].name)) {
+        return i;
+    }
+  }
   name_list = strdup(table[0].name);
   for (i = 1; table[i].name; i++) {
     name_list =
@@ -109,11 +155,10 @@ int find_coll_description(s_mpi_coll_description_t * table,
   return -1;
 }
 
-
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi,
                                 "Logging specific to SMPI (coll)");
 
+int (*mpi_coll_gather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, int root, MPI_Comm);
 int (*mpi_coll_allgather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm);
 int (*mpi_coll_allgatherv_fun)(void *, int, MPI_Datatype, void*, int*, int*, MPI_Datatype, MPI_Comm);
 int (*mpi_coll_allreduce_fun)(void *sbuf, void *rbuf, int rcount, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm);
@@ -121,7 +166,9 @@ int (*mpi_coll_alltoall_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype
 int (*mpi_coll_alltoallv_fun)(void *, int*, int*, MPI_Datatype, void*, int*, int*, MPI_Datatype, MPI_Comm);
 int (*mpi_coll_bcast_fun)(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm com);
 int (*mpi_coll_reduce_fun)(void *buf, void *rbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
-
+int (*mpi_coll_reduce_scatter_fun)(void *sbuf, void *rbuf, int *rcounts,MPI_Datatype dtype,MPI_Op  op,MPI_Comm  comm);
+int (*mpi_coll_scatter_fun)(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount, MPI_Datatype recvtype,int root, MPI_Comm comm);
+int (*mpi_coll_barrier_fun)(MPI_Comm comm);
 struct s_proc_tree {
   int PROCTREE_A;
   int numChildren;
@@ -299,7 +346,7 @@ void nary_tree_barrier(MPI_Comm comm, int arity)
   free_tree(tree);
 }
 
-int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount,
+int smpi_coll_tuned_alltoall_ompi2(void *sendbuf, int sendcount,
                                    MPI_Datatype sendtype, void *recvbuf,
                                    int recvcount, MPI_Datatype recvtype,
                                    MPI_Comm comm)
index f7a1583..56fefc8 100644 (file)
@@ -570,7 +570,7 @@ void mpi_info_create_( int *info, int* ierr){
 }
 
 void mpi_info_set_( int *info, char *key, char *value, int* ierr){
-  *ierr =  MPI_Info_set( (MPI_Info *)info, key, value);
+  *ierr =  MPI_Info_set( *(MPI_Info *)info, key, value);
 }
 
 void mpi_info_free_(int* info, int* ierr){
index 7fca6d7..8c7edea 100644 (file)
@@ -79,7 +79,7 @@ void smpi_process_init(int *argc, char ***argv)
 void smpi_process_destroy(void)
 {
   int index = smpi_process_index();
-
+  process_data[index]->index=-100;
   XBT_DEBUG("<%d> Process left the game", index);
 }
 
@@ -94,6 +94,16 @@ void smpi_process_finalize(void)
   }
 }
 
+/**
+ * @brief Check if a process is finalized
+ */
+int smpi_process_finalized()
+{
+  // If finalized, this value has been set to -100;
+  return process_data[smpi_process_index()]->index==-100;
+}
+
+
 #ifdef SMPI_F2C
 int smpi_process_argc(void) {
   smpi_process_data_t data = smpi_process_data();
@@ -360,6 +370,12 @@ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[])
   SIMIX_function_register_default(realmain);
   SIMIX_launch_application(argv[2]);
 
+  int gather_id = find_coll_description(mpi_coll_gather_description,
+                                           sg_cfg_get_string("smpi/gather"));
+  mpi_coll_gather_fun = (int (*)(void *, int, MPI_Datatype,
+                                   void*, int, MPI_Datatype, int, MPI_Comm))
+                          mpi_coll_gather_description[gather_id].coll;
+
   int allgather_id = find_coll_description(mpi_coll_allgather_description,
                                            sg_cfg_get_string("smpi/allgather"));
   mpi_coll_allgather_fun = (int (*)(void *, int, MPI_Datatype,
@@ -402,6 +418,24 @@ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[])
                                  MPI_Op op, int root, MPI_Comm comm))
                        mpi_coll_reduce_description[reduce_id].coll;
 
+  int reduce_scatter_id = find_coll_description(mpi_coll_reduce_scatter_description,
+                                           sg_cfg_get_string("smpi/reduce_scatter"));
+  mpi_coll_reduce_scatter_fun = (int (*)(void *sbuf, void *rbuf, int *rcounts,\
+                    MPI_Datatype dtype,MPI_Op  op,MPI_Comm  comm))
+                          mpi_coll_reduce_scatter_description[reduce_scatter_id].coll;
+
+  int scatter_id = find_coll_description(mpi_coll_scatter_description,
+                                           sg_cfg_get_string("smpi/scatter"));
+  mpi_coll_scatter_fun = (int (*)(void *sendbuf, int sendcount, MPI_Datatype sendtype,\
+                void *recvbuf, int recvcount, MPI_Datatype recvtype,\
+                int root, MPI_Comm comm))
+                          mpi_coll_scatter_description[scatter_id].coll;
+
+  int barrier_id = find_coll_description(mpi_coll_barrier_description,
+                                           sg_cfg_get_string("smpi/barrier"));
+  mpi_coll_barrier_fun = (int (*)(MPI_Comm comm))
+                          mpi_coll_barrier_description[barrier_id].coll;
+
   smpi_global_init();
 
   /* Clean IO before the run */
index 266ec5e..f98336e 100644 (file)
@@ -23,6 +23,11 @@ int MPI_Finalize(void)
   return PMPI_Finalize();
 }
 
+int MPI_Finalized(int * flag)
+{
+  return PMPI_Finalized(flag);
+}
+
 int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
 {
   return PMPI_Init_thread(argc, argv, required, provided);
@@ -58,11 +63,55 @@ int MPI_Address(void *location, MPI_Aint * address)
   return PMPI_Address(location, address);
 }
 
+int MPI_Get_address(void *location, MPI_Aint * address)
+{
+  return PMPI_Get_address(location, address);
+}
+
 int MPI_Type_free(MPI_Datatype * datatype)
 {
   return PMPI_Type_free(datatype);
 }
 
+int MPI_Type_dup(MPI_Datatype  datatype, MPI_Datatype * newdatatype)
+{
+  return PMPI_Type_dup(datatype, newdatatype);
+}
+
+int MPI_Type_set_name(MPI_Datatype  datatype, char * name)
+{
+  return PMPI_Type_set_name(datatype, name);
+}
+
+int MPI_Type_get_name(MPI_Datatype  datatype, char * name, int* len)
+{
+  return PMPI_Type_get_name(datatype,name,len);
+}
+
+int MPI_Type_get_attr (MPI_Datatype type, int type_keyval, void *attribute_val, int* flag)
+{
+   return PMPI_Type_set_attr ( type, type_keyval, attribute_val);
+}
+
+int MPI_Type_set_attr (MPI_Datatype type, int type_keyval, void *attribute_val)
+{
+   return PMPI_Type_set_attr ( type, type_keyval, attribute_val);
+}
+
+int MPI_Type_delete_attr (MPI_Datatype type, int type_keyval)
+{
+   return PMPI_Type_delete_attr (type,  type_keyval);
+}
+
+int MPI_Type_create_keyval(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state)
+{
+   return PMPI_Type_create_keyval(copy_fn,  delete_fn,  keyval,  extra_state) ;
+}
+
+int MPI_Type_free_keyval(int* keyval) {
+   return PMPI_Type_free_keyval( keyval);
+}
+
 int MPI_Pcontrol(const int level )
 {
   return PMPI_Pcontrol(level);
@@ -78,6 +127,11 @@ int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent)
   return PMPI_Type_get_extent(datatype, lb, extent);
 }
 
+int MPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent)
+{
+  return PMPI_Type_get_true_extent(datatype, lb, extent);
+}
+
 int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
 {
   return PMPI_Type_extent(datatype, extent);
@@ -181,6 +235,25 @@ int MPI_Comm_get_attr (MPI_Comm comm, int comm_keyval, void *attribute_val, int
   return PMPI_Comm_get_attr (comm, comm_keyval, attribute_val, flag);
 }
 
+int MPI_Comm_set_attr (MPI_Comm comm, int comm_keyval, void *attribute_val)
+{
+   return PMPI_Comm_set_attr ( comm, comm_keyval, attribute_val);
+}
+
+int MPI_Comm_delete_attr (MPI_Comm comm, int comm_keyval)
+{
+   return PMPI_Comm_delete_attr (comm,  comm_keyval);
+}
+
+int MPI_Comm_create_keyval(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state)
+{
+   return PMPI_Comm_create_keyval(copy_fn,  delete_fn,  keyval,  extra_state) ;
+}
+
+int MPI_Comm_free_keyval(int* keyval) {
+   return PMPI_Comm_free_keyval( keyval);
+}
+
 int MPI_Comm_get_name (MPI_Comm comm, char* name, int* len)
 {
   return PMPI_Comm_get_name(comm, name, len);
@@ -392,6 +465,11 @@ int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
   return PMPI_Reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
 }
 
+int MPI_Reduce_local(void *inbuf, void *inoutbuf, int count,
+    MPI_Datatype datatype, MPI_Op op){
+  return PMPI_Reduce_local(inbuf, inoutbuf, count, datatype, op);
+}
+
 int MPI_Allreduce(void *sendbuf, void *recvbuf, int count,
                   MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
 {
@@ -410,6 +488,12 @@ int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
   return PMPI_Reduce_scatter(sendbuf, recvbuf, recvcounts, datatype, op, comm);
 }
 
+int MPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount,
+                      MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+  return PMPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm);
+}
+
 int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
                  MPI_Comm comm)
@@ -527,6 +611,10 @@ int MPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler) {
   return PMPI_Errhandler_set(comm, errhandler);
 }
 
+int MPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler) {
+  return PMPI_Errhandler_set(comm, errhandler);
+}
+
 int MPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* newtype) {
   return PMPI_Type_contiguous(count, old_type, newtype);
 }
@@ -555,6 +643,18 @@ int MPI_Unpack(void* inbuf, int insize, int* position, void* outbuf, int outcoun
   return PMPI_Unpack(inbuf, insize, position, outbuf, outcount, type, comm);
 }
 
+int MPI_Pack_external_size(char *datarep, int incount, MPI_Datatype datatype, MPI_Aint *size){
+  return PMPI_Pack_external_size(datarep, incount, datatype, size);
+}
+
+int MPI_Pack_external(char *datarep, void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, MPI_Aint outcount, MPI_Aint *position){
+  return PMPI_Pack_external(datarep, inbuf, incount, datatype, outbuf, outcount, position);
+}
+
+int MPI_Unpack_external( char *datarep, void *inbuf, MPI_Aint insize, MPI_Aint *position, void *outbuf, int outcount, MPI_Datatype datatype){
+  return PMPI_Unpack_external( datarep, inbuf, insize, position, outbuf, outcount, datatype);
+}
+
 int MPI_Type_commit(MPI_Datatype* datatype) {
   return PMPI_Type_commit(datatype);
 }
@@ -563,6 +663,10 @@ int MPI_Type_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype
   return PMPI_Type_hindexed(count, blocklens, indices, old_type, newtype);
 }
 
+int MPI_Type_create_hindexed_block(int count, int blocklength, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* newtype) {
+  return PMPI_Type_create_hindexed_block(count, blocklength, indices, old_type, newtype);
+}
+
 int MPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* newtype) {
   return PMPI_Type_hvector(count, blocklen, stride, old_type, newtype);
 }
@@ -571,10 +675,18 @@ int MPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_t
   return PMPI_Type_indexed(count, blocklens, indices, old_type, newtype);
 }
 
+int MPI_Type_create_indexed_block(int count, int blocklength, int* indices,  MPI_Datatype old_type,  MPI_Datatype *newtype){
+  return PMPI_Type_create_indexed_block(count, blocklength, indices, old_type, newtype);
+}
+
 int MPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* newtype) {
   return PMPI_Type_struct(count, blocklens, indices, old_types, newtype);
 }
 
+int MPI_Type_create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* newtype) {
+  return PMPI_Type_create_struct(count, blocklens, indices, old_types, newtype);
+}
+
 int MPI_Type_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* newtype) {
   return PMPI_Type_vector(count, blocklen, stride, old_type, newtype);
 }
@@ -699,7 +811,7 @@ int MPI_Info_create( MPI_Info *info){
   return PMPI_Info_create( info);
 }
 
-int MPI_Info_set( MPI_Info *info, char *key, char *value){
+int MPI_Info_set( MPI_Info info, char *key, char *value){
   return PMPI_Info_set( info, key, value);
 }
 
@@ -712,3 +824,194 @@ int MPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
   return PMPI_Get( origin_addr,origin_count, origin_datatype,target_rank,
       target_disp, target_count,target_datatype, win);
 }
+
+int MPI_Type_get_envelope( MPI_Datatype datatype, int *num_integers,
+                          int *num_addresses, int *num_datatypes, int *combiner){
+  return PMPI_Type_get_envelope(  datatype, num_integers,
+      num_addresses, num_datatypes, combiner);
+}
+
+int MPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses,
+                            int max_datatypes, int* array_of_integers, MPI_Aint* array_of_addresses,
+                            MPI_Datatype *array_of_datatypes){
+  return PMPI_Type_get_contents(datatype, max_integers, max_addresses,
+      max_datatypes, array_of_integers, array_of_addresses,
+       array_of_datatypes);
+}
+
+int MPI_Type_create_darray(int size, int rank, int ndims, int* array_of_gsizes,
+                            int* array_of_distribs, int* array_of_dargs, int* array_of_psizes,
+                            int order, MPI_Datatype oldtype, MPI_Datatype *newtype) {
+  return PMPI_Type_create_darray(size, rank, ndims,  array_of_gsizes,
+       array_of_distribs,  array_of_dargs,  array_of_psizes,
+      order,  oldtype, newtype) ;
+}
+
+int MPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){
+  return PMPI_Type_create_resized(oldtype,lb, extent, newtype);
+}
+
+int MPI_Type_create_subarray(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype){
+  return PMPI_Type_create_subarray(ndims,array_of_sizes, array_of_subsizes, array_of_starts, order, oldtype, newtype);
+}
+
+int MPI_Type_match_size(int typeclass,int size,MPI_Datatype *datatype){
+  return PMPI_Type_match_size(typeclass,size,datatype);
+}
+
+int MPI_Alltoallw( void *sendbuf, int *sendcnts, int *sdispls, MPI_Datatype *sendtypes,
+                   void *recvbuf, int *recvcnts, int *rdispls, MPI_Datatype *recvtypes,
+                   MPI_Comm comm){
+  return PMPI_Alltoallw( sendbuf, sendcnts, sdispls, sendtypes,
+      recvbuf, recvcnts, rdispls, recvtypes,
+      comm);
+}
+
+int MPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+                MPI_Op op, MPI_Comm comm){
+  return PMPI_Exscan(sendbuf, recvbuf, count, datatype, op, comm);
+}
+
+int MPI_Comm_set_name (MPI_Comm comm, char* name){
+  return PMPI_Comm_set_name (comm, name);
+}
+
+int MPI_Comm_dup_with_info(MPI_Comm comm, MPI_Info info, MPI_Comm * newcomm){
+  return PMPI_Comm_dup_with_info(comm,info,newcomm);
+}
+
+int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, MPI_Info info, MPI_Comm *newcomm){
+  return PMPI_Comm_split_type(comm, split_type, key, info, newcomm);
+}
+
+int MPI_Comm_set_info (MPI_Comm comm, MPI_Info info){
+  return PMPI_Comm_set_info (comm, info);
+}
+
+int MPI_Comm_get_info (MPI_Comm comm, MPI_Info* info){
+  return PMPI_Comm_get_info (comm, info);
+}
+
+int MPI_Info_get(MPI_Info info,char *key,int valuelen, char *value, int *flag){
+  return PMPI_Info_get(info,key,valuelen, value, flag);
+}
+
+int MPI_Comm_create_errhandler( MPI_Comm_errhandler_fn *function, MPI_Errhandler *errhandler){
+  return PMPI_Comm_create_errhandler( function, errhandler);
+}
+
+int MPI_Add_error_class( int *errorclass){
+  return PMPI_Add_error_class( errorclass);
+}
+
+int MPI_Add_error_code(  int errorclass, int *errorcode){
+  return PMPI_Add_error_code(errorclass, errorcode);
+}
+
+int MPI_Add_error_string( int errorcode, char *string){
+  return PMPI_Add_error_string(errorcode, string);
+}
+
+int MPI_Comm_call_errhandler(MPI_Comm comm,int errorcode){
+  return PMPI_Comm_call_errhandler(comm, errorcode);
+}
+
+int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo){
+  return PMPI_Info_dup(info, newinfo);
+}
+
+int MPI_Info_get_valuelen( MPI_Info info, char *key, int *valuelen, int *flag){
+  return PMPI_Info_get_valuelen( info, key, valuelen, flag);
+}
+
+int MPI_Info_delete(MPI_Info info, char *key){
+  return PMPI_Info_delete(info, key);
+}
+
+int MPI_Info_get_nkeys( MPI_Info info, int *nkeys){
+  return PMPI_Info_get_nkeys(  info, nkeys);
+}
+
+int MPI_Info_get_nthkey( MPI_Info info, int n, char *key){
+  return PMPI_Info_get_nthkey( info, n, key);
+}
+
+int MPI_Get_version (int *version,int *subversion){
+  return PMPI_Get_version (version,subversion);
+}
+
+int MPI_Get_library_version (char *version,int *len){
+  return PMPI_Get_library_version (version,len);
+}
+
+int MPI_Request_get_status( MPI_Request request, int *flag, MPI_Status *status){
+  return PMPI_Request_get_status( request, flag, status);
+}
+
+int MPI_Grequest_start( MPI_Grequest_query_function *query_fn, MPI_Grequest_free_function *free_fn, MPI_Grequest_cancel_function *cancel_fn, void *extra_state, MPI_Request *request){
+  return PMPI_Grequest_start( query_fn, free_fn, cancel_fn, extra_state, request);
+}
+
+int MPI_Grequest_complete( MPI_Request request){
+  return PMPI_Grequest_complete( request);
+}
+
+int MPI_Status_set_cancelled(MPI_Status *status,int flag){
+  return PMPI_Status_set_cancelled(status,flag);
+}
+
+int MPI_Status_set_elements( MPI_Status *status, MPI_Datatype datatype, int count){
+  return PMPI_Status_set_elements( status, datatype, count);
+}
+
+int MPI_Comm_connect( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm){
+  return PMPI_Comm_connect( port_name, info, root, comm, newcomm);
+}
+
+int MPI_Publish_name( char *service_name, MPI_Info info, char *port_name){
+  return PMPI_Publish_name( service_name, info, port_name);
+}
+
+int MPI_Unpublish_name( char *service_name, MPI_Info info, char *port_name){
+  return PMPI_Unpublish_name( service_name, info, port_name);
+}
+
+int MPI_Lookup_name( char *service_name, MPI_Info info, char *port_name){
+  return PMPI_Lookup_name( service_name, info, port_name);
+}
+
+int MPI_Comm_join( int fd, MPI_Comm *intercomm){
+  return PMPI_Comm_join( fd, intercomm);
+}
+
+int MPI_Open_port( MPI_Info info, char *port_name){
+  return PMPI_Open_port( info,port_name);
+}
+
+int MPI_Close_port( char *port_name){
+  return PMPI_Close_port( port_name);
+}
+
+int MPI_Comm_accept( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm){
+ return PMPI_Comm_accept( port_name, info, root, comm, newcomm);
+}
+
+int MPI_Comm_spawn( char *command, char **argv, int maxprocs, MPI_Info info, int root,
+                    MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){
+  return PMPI_Comm_spawn( command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes);
+}
+
+int MPI_Comm_spawn_multiple( int count, char **array_of_commands, char*** array_of_argv,
+                             int* array_of_maxprocs, MPI_Info* array_of_info, int root,
+                             MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){
+  return PMPI_Comm_spawn_multiple( count, array_of_commands, array_of_argv, array_of_maxprocs,
+                                  array_of_info, root, comm, intercomm, array_of_errcodes);
+}
+
+int MPI_Comm_get_parent( MPI_Comm *parent){
+  return PMPI_Comm_get_parent( parent);
+}
+
+int MPI_Type_create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) {
+  return PMPI_Type_create_hvector(count, blocklen, stride, old_type, new_type);
+}
index 59512b6..0db4d81 100644 (file)
@@ -180,9 +180,9 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 
       void * buf_tmp = xbt_malloc(count);
 
-      subtype->serialize( sendbuf, buf_tmp,1, subtype);
+      subtype->serialize( sendbuf, buf_tmp,count/smpi_datatype_size(sendtype), subtype);
       subtype =  recvtype->substruct;
-      subtype->unserialize( buf_tmp, recvbuf,1, subtype);
+      subtype->unserialize( buf_tmp, recvbuf,count/smpi_datatype_size(recvtype), subtype);
 
       free(buf_tmp);
     }
@@ -221,6 +221,9 @@ void serialize_vector( const void *noncontiguous_vector,
                                                                      type_c->old_type->substruct);
 
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    if((i+1)%type_c->block_count ==0)
+    noncontiguous_vector_char += type_c->block_length*smpi_datatype_get_extent(type_c->old_type);
+    else
     noncontiguous_vector_char += type_c->block_stride*smpi_datatype_get_extent(type_c->old_type);
   }
 }
@@ -255,6 +258,9 @@ void unserialize_vector( const void *contiguous_vector,
                                                                      type_c->block_length,
                                                                      type_c->old_type->substruct);
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    if((i+1)%type_c->block_count ==0)
+    noncontiguous_vector_char += type_c->block_length*smpi_datatype_get_extent(type_c->old_type);
+    else
     noncontiguous_vector_char += type_c->block_stride*smpi_datatype_get_extent(type_c->old_type);
   }
 }
@@ -286,7 +292,7 @@ void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int h
                           void *struct_type, int flags){
   MPI_Datatype new_t= xbt_new(s_smpi_mpi_datatype_t,1);
   new_t->size = size;
-  new_t->has_subtype = has_subtype;
+  new_t->has_subtype = size>0? has_subtype:0;
   new_t->lb = lb;
   new_t->ub = ub;
   new_t->flags = flags;
@@ -323,17 +329,100 @@ void smpi_datatype_unuse(MPI_Datatype type){
     smpi_datatype_free(&type);
 }
 
-int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type)
+
+
+
+/*
+Contiguous Implementation
+*/
+
+
+/*
+ *  Copies noncontiguous data into contiguous memory.
+ *  @param contiguous_hvector - output hvector
+ *  @param noncontiguous_hvector - input hvector
+ *  @param type - pointer contening :
+ *      - stride - stride of between noncontiguous data, in bytes
+ *      - block_length - the width or height of blocked matrix
+ *      - count - the number of rows of matrix
+ */
+void serialize_contiguous( const void *noncontiguous_hvector,
+                       void *contiguous_hvector,
+                       size_t count,
+                       void *type)
+{
+  s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type;
+  char* contiguous_vector_char = (char*)contiguous_hvector;
+  char* noncontiguous_vector_char = (char*)noncontiguous_hvector+type_c->lb;
+  memcpy(contiguous_vector_char,
+           noncontiguous_vector_char, count* type_c->block_count * type_c->size_oldtype);
+}
+/*
+ *  Copies contiguous data into noncontiguous memory.
+ *  @param noncontiguous_vector - output hvector
+ *  @param contiguous_vector - input hvector
+ *  @param type - pointer contening :
+ *      - stride - stride of between noncontiguous data, in bytes
+ *      - block_length - the width or height of blocked matrix
+ *      - count - the number of rows of matrix
+ */
+void unserialize_contiguous( const void *contiguous_vector,
+                         void *noncontiguous_vector,
+                         size_t count,
+                         void *type)
+{
+  s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type;
+  char* contiguous_vector_char = (char*)contiguous_vector;
+  char* noncontiguous_vector_char = (char*)noncontiguous_vector+type_c->lb;
+
+  memcpy(noncontiguous_vector_char,
+           contiguous_vector_char, count*  type_c->block_count * type_c->size_oldtype);
+}
+
+void free_contiguous(MPI_Datatype* d){
+}
+
+/*
+ * Create a Sub type contiguous to be able to serialize and unserialize it
+ * the structure s_smpi_mpi_contiguous_t is derived from s_smpi_subtype which
+ * required the functions unserialize and serialize
+ *
+ */
+s_smpi_mpi_contiguous_t* smpi_datatype_contiguous_create( MPI_Aint lb,
+                                                  int block_count,
+                                                  MPI_Datatype old_type,
+                                                  int size_oldtype){
+  s_smpi_mpi_contiguous_t *new_t= xbt_new(s_smpi_mpi_contiguous_t,1);
+  new_t->base.serialize = &serialize_contiguous;
+  new_t->base.unserialize = &unserialize_contiguous;
+  new_t->base.subtype_free = &free_contiguous;
+  new_t->lb = lb;
+  new_t->block_count = block_count;
+  new_t->old_type = old_type;
+  new_t->size_oldtype = size_oldtype;
+  return new_t;
+}
+
+
+
+
+int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type, MPI_Aint lb)
 {
   int retval;
   if(old_type->has_subtype){
          //handle this case as a hvector with stride equals to the extent of the datatype
          return smpi_datatype_hvector(count, 1, smpi_datatype_get_extent(old_type), old_type, new_type);
   }
+  
+  s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb,
+                                                                count,
+                                                                old_type,
+                                                                smpi_datatype_size(old_type));
+                                                                
   smpi_datatype_create(new_type,
                                          count * smpi_datatype_size(old_type),
-                                         0,count * smpi_datatype_size(old_type),
-                                         0,NULL, DT_FLAG_CONTIGUOUS);
+                                         lb,lb + count * smpi_datatype_size(old_type),
+                                         1,subtype, DT_FLAG_CONTIGUOUS);
   retval=MPI_SUCCESS;
   return retval;
 }
@@ -341,7 +430,7 @@ int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new
 int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_type, MPI_Datatype* new_type)
 {
   int retval;
-  if (blocklen<=0) return MPI_ERR_ARG;
+  if (blocklen<0) return MPI_ERR_ARG;
   MPI_Aint lb = 0;
   MPI_Aint ub = 0;
   if(count>0){
@@ -415,6 +504,9 @@ void serialize_hvector( const void *noncontiguous_hvector,
                                                                    type_c->old_type->substruct);
 
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    if((i+1)%type_c->block_count ==0)
+    noncontiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    else
     noncontiguous_vector_char += type_c->block_stride;
   }
 }
@@ -448,6 +540,9 @@ void unserialize_hvector( const void *contiguous_vector,
                                                                      type_c->block_length,
                                                                      type_c->old_type->substruct);
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    if((i+1)%type_c->block_count ==0)
+    noncontiguous_vector_char += type_c->block_length*type_c->size_oldtype;
+    else
     noncontiguous_vector_char += type_c->block_stride;
   }
 }
@@ -482,7 +577,7 @@ void free_hvector(MPI_Datatype* d){
 int smpi_datatype_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type)
 {
   int retval;
-  if (blocklen<=0) return MPI_ERR_ARG;
+  if (blocklen<0) return MPI_ERR_ARG;
   MPI_Aint lb = 0;
   MPI_Aint ub = 0;
   if(count>0){
@@ -536,7 +631,7 @@ void serialize_indexed( const void *noncontiguous_indexed,
   s_smpi_mpi_indexed_t* type_c = (s_smpi_mpi_indexed_t*)type;
   int i,j;
   char* contiguous_indexed_char = (char*)contiguous_indexed;
-  char* noncontiguous_indexed_char = (char*)noncontiguous_indexed;
+  char* noncontiguous_indexed_char = (char*)noncontiguous_indexed+type_c->block_indices[0] * type_c->size_oldtype;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_type->has_subtype == 0)
@@ -570,15 +665,15 @@ void unserialize_indexed( const void *contiguous_indexed,
                          size_t count,
                          void *type)
 {
+
   s_smpi_mpi_indexed_t* type_c = (s_smpi_mpi_indexed_t*)type;
   int i,j;
-
   char* contiguous_indexed_char = (char*)contiguous_indexed;
-  char* noncontiguous_indexed_char = (char*)noncontiguous_indexed;
+  char* noncontiguous_indexed_char = (char*)noncontiguous_indexed+type_c->block_indices[0]*smpi_datatype_get_extent(type_c->old_type);
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_type->has_subtype == 0)
-        memcpy(noncontiguous_indexed_char,
+        memcpy(noncontiguous_indexed_char ,
              contiguous_indexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
       else
         ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_indexed_char,
@@ -643,7 +738,7 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype
   }
 
   for(i=0; i< count; i++){
-    if   (blocklens[i]<=0)
+    if   (blocklens[i]<0)
       return MPI_ERR_ARG;
     size += blocklens[i];
 
@@ -666,9 +761,12 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype
      smpi_datatype_create(new_type,  size *
                          smpi_datatype_size(old_type),lb,ub,1, subtype, DT_FLAG_DATA);
   }else{
+    s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb,
+                                                                  size,
+                                                                  old_type,
+                                                                  smpi_datatype_size(old_type));
     smpi_datatype_create(new_type,  size *
-                         smpi_datatype_size(old_type),0,size *
-                         smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
+                         smpi_datatype_size(old_type),lb,ub,1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   retval=MPI_SUCCESS;
   return retval;
@@ -696,7 +794,7 @@ void serialize_hindexed( const void *noncontiguous_hindexed,
   s_smpi_mpi_hindexed_t* type_c = (s_smpi_mpi_hindexed_t*)type;
   int i,j;
   char* contiguous_hindexed_char = (char*)contiguous_hindexed;
-  char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed;
+  char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed+ type_c->block_indices[0];
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_type->has_subtype == 0)
@@ -733,7 +831,7 @@ void unserialize_hindexed( const void *contiguous_hindexed,
   int i,j;
 
   char* contiguous_hindexed_char = (char*)contiguous_hindexed;
-  char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed;
+  char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed+ type_c->block_indices[0];
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_type->has_subtype == 0)
@@ -800,7 +898,7 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat
     ub=indices[0] + blocklens[0]*smpi_datatype_ub(old_type);
   }
   for(i=0; i< count; i++){
-    if   (blocklens[i]<=0)
+    if   (blocklens[i]<0)
       return MPI_ERR_ARG;
     size += blocklens[i];
 
@@ -823,9 +921,13 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat
                          ub
                          ,1, subtype, DT_FLAG_DATA);
   }else{
+    s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb,
+                                                                  size,
+                                                                  old_type,
+                                                                  smpi_datatype_size(old_type));
     smpi_datatype_create(new_type,  size * smpi_datatype_size(old_type),
                                             0,size * smpi_datatype_size(old_type),
-                                            0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
+                                            1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   retval=MPI_SUCCESS;
   return retval;
@@ -853,7 +955,7 @@ void serialize_struct( const void *noncontiguous_struct,
   s_smpi_mpi_struct_t* type_c = (s_smpi_mpi_struct_t*)type;
   int i,j;
   char* contiguous_struct_char = (char*)contiguous_struct;
-  char* noncontiguous_struct_char = (char*)noncontiguous_struct;
+  char* noncontiguous_struct_char = (char*)noncontiguous_struct+ type_c->block_indices[0];
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_types[i]->has_subtype == 0)
@@ -891,7 +993,7 @@ void unserialize_struct( const void *contiguous_struct,
   int i,j;
 
   char* contiguous_struct_char = (char*)contiguous_struct;
-  char* noncontiguous_struct_char = (char*)noncontiguous_struct;
+  char* noncontiguous_struct_char = (char*)noncontiguous_struct+ type_c->block_indices[0];
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
       if (type_c->old_types[i]->has_subtype == 0)
@@ -964,7 +1066,7 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat
   int forced_lb=0;
   int forced_ub=0;
   for(i=0; i< count; i++){
-    if (blocklens[i]<=0)
+    if (blocklens[i]<0)
       return MPI_ERR_ARG;
     if (old_types[i]->has_subtype == 1)
       contiguous=0;
@@ -993,7 +1095,11 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat
 
     smpi_datatype_create(new_type,  size, lb, ub,1, subtype, DT_FLAG_DATA);
   }else{
-    smpi_datatype_create(new_type,  size, lb, ub,0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
+    s_smpi_mpi_contiguous_t* subtype = smpi_datatype_contiguous_create( lb,
+                                                                  size,
+                                                                  MPI_CHAR,
+                                                                  1);
+    smpi_datatype_create(new_type,  size, lb, ub,1, subtype, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   return MPI_SUCCESS;
 }
@@ -1005,6 +1111,7 @@ void smpi_datatype_commit(MPI_Datatype *datatype)
 
 typedef struct s_smpi_mpi_op {
   MPI_User_function *func;
+  int is_commute;
 } s_smpi_mpi_op_t;
 
 #define MAX_OP(a, b)  (b) = (a) < (b) ? (b) : (a)
@@ -1326,7 +1433,7 @@ static void maxloc_func(void *a, void *b, int *length,
 
 
 #define CREATE_MPI_OP(name, func)                             \
-  static s_smpi_mpi_op_t mpi_##name = { &(func) /* func */ }; \
+  static s_smpi_mpi_op_t mpi_##name = { &(func) /* func */, TRUE }; \
 MPI_Op name = &mpi_##name;
 
 CREATE_MPI_OP(MPI_MAX, max_func);
@@ -1345,13 +1452,17 @@ CREATE_MPI_OP(MPI_MINLOC, minloc_func);
 MPI_Op smpi_op_new(MPI_User_function * function, int commute)
 {
   MPI_Op op;
-
-  //FIXME: add commute param
   op = xbt_new(s_smpi_mpi_op_t, 1);
   op->func = function;
+  op-> is_commute = commute;
   return op;
 }
 
+int smpi_op_is_commute(MPI_Op op)
+{
+  return (op==MPI_OP_NULL) ? 1 : op-> is_commute;
+}
+
 void smpi_op_destroy(MPI_Op op)
 {
   xbt_free(op);
index 656754d..23af198 100644 (file)
@@ -40,6 +40,14 @@ extern MPI_Datatype MPI_PTR;
   used for serialization/unserialization of messages
 */
 
+typedef struct s_smpi_mpi_contiguous{
+  s_smpi_subtype_t base;
+  MPI_Datatype old_type;
+  MPI_Aint lb;
+  size_t size_oldtype;
+  size_t block_count;
+} s_smpi_mpi_contiguous_t;
+
 typedef struct s_smpi_mpi_vector{
   s_smpi_subtype_t base;
   MPI_Datatype old_type;
@@ -90,7 +98,23 @@ typedef struct s_smpi_mpi_struct{
   Functions to handle serialization/unserialization of messages, 3 for each type of MPI_Type
   One for creating the substructure to handle, one for serialization, one for unserialization
 */
+void unserialize_contiguous( const void *contiguous_vector,
+                         void *noncontiguous_vector,
+                         size_t count,
+                         void *type);
 
+void serialize_contiguous( const void *noncontiguous_vector,
+                       void *contiguous_vector,
+                       size_t count,
+                       void *type);
+
+void free_contiguous(MPI_Datatype* type);
+
+s_smpi_mpi_contiguous_t* smpi_datatype_contiguous_create( MPI_Aint lb,
+                                                  int block_count,
+                                                  MPI_Datatype old_type,
+                                                  int size_oldtype);
+                                                  
 void unserialize_vector( const void *contiguous_vector,
                          void *noncontiguous_vector,
                          size_t count,
index 42d6294..b034aaf 100644 (file)
@@ -50,6 +50,28 @@ int PMPI_Finalize(void)
   return MPI_SUCCESS;
 }
 
+int PMPI_Finalized(int* flag)
+{
+  *flag=smpi_process_finalized();
+  return MPI_SUCCESS;
+}
+
+int PMPI_Get_version (int *version,int *subversion){
+  *version = MPI_VERSION;
+  *subversion= MPI_SUBVERSION;
+  return MPI_SUCCESS;
+}
+
+int PMPI_Get_library_version (char *version,int *len){
+  int retval = MPI_SUCCESS;
+  smpi_bench_end();
+  snprintf(version,MPI_MAX_LIBRARY_VERSION_STRING,"SMPI Version %d.%d. Copyright The Simgrid Team 2007-2013",SIMGRID_VERSION_MAJOR,
+          SIMGRID_VERSION_MINOR);
+  *len = strlen(version) > MPI_MAX_LIBRARY_VERSION_STRING ? MPI_MAX_LIBRARY_VERSION_STRING : strlen(version);
+  smpi_bench_begin();
+  return retval;
+}
+
 int PMPI_Init_thread(int *argc, char ***argv, int required, int *provided)
 {
   if (provided != NULL) {
@@ -131,6 +153,11 @@ int PMPI_Address(void *location, MPI_Aint * address)
   return retval;
 }
 
+int PMPI_Get_address(void *location, MPI_Aint * address)
+{
+  return PMPI_Address(location, address);
+}
+
 int PMPI_Type_free(MPI_Datatype * datatype)
 {
   int retval;
@@ -179,6 +206,11 @@ int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent
   return retval;
 }
 
+int PMPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent)
+{
+  return PMPI_Type_get_extent(datatype, lb, extent);
+}
+
 int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
 {
   int retval;
@@ -986,7 +1018,7 @@ int PMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst,
     *request = MPI_REQUEST_NULL;
     retval = MPI_SUCCESS;
   } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (count < 0) {
     retval = MPI_ERR_COUNT;
   } else if (buf==NULL && count > 0) {
@@ -1031,7 +1063,7 @@ int PMPI_Issend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, M
     *request = MPI_REQUEST_NULL;
     retval = MPI_SUCCESS;
   } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (count < 0) {
     retval = MPI_ERR_COUNT;
   } else if (buf==NULL && count > 0) {
@@ -1077,7 +1109,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
     status->MPI_SOURCE = MPI_PROC_NULL;
     retval = MPI_SUCCESS;
   } else if (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0)){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (count < 0) {
     retval = MPI_ERR_COUNT;
   } else if (buf==NULL && count > 0) {
@@ -1123,7 +1155,7 @@ int PMPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag,
   } else if (dst == MPI_PROC_NULL) {
     retval = MPI_SUCCESS;
   } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (count < 0) {
     retval = MPI_ERR_COUNT;
   } else if (buf==NULL && count > 0) {
@@ -1167,7 +1199,7 @@ int PMPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dst, int tag, MP
    } else if (dst == MPI_PROC_NULL) {
      retval = MPI_SUCCESS;
    } else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0){
-     retval = MPI_ERR_COMM;
+     retval = MPI_ERR_RANK;
    } else if (count < 0) {
      retval = MPI_ERR_COUNT;
    } else if (buf==NULL && count > 0) {
@@ -1219,7 +1251,7 @@ int PMPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
       retval = MPI_SUCCESS;
   }else if (dst >= smpi_group_size(smpi_comm_group(comm)) || dst <0 ||
       (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0))){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (sendcount < 0 || recvcount<0) {
       retval = MPI_ERR_COUNT;
   } else if ((sendbuf==NULL && sendcount > 0)||(recvbuf==NULL && recvcount>0)) {
@@ -1579,7 +1611,7 @@ int PMPI_Barrier(MPI_Comm comm)
   if (comm == MPI_COMM_NULL) {
     retval = MPI_ERR_COMM;
   } else {
-    smpi_mpi_barrier(comm);
+    mpi_coll_barrier_fun(comm);
     retval = MPI_SUCCESS;
   }
 #ifdef HAVE_TRACING
@@ -1609,7 +1641,7 @@ int PMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
              || recvtype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else {
-    smpi_mpi_gather(sendbuf, sendcount, sendtype, recvbuf, recvcount,
+    mpi_coll_gather_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount,
                     recvtype, root, comm);
     retval = MPI_SUCCESS;
   }
@@ -1735,7 +1767,7 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
              || recvtype == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
   } else {
-    smpi_mpi_scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount,
+    mpi_coll_scatter_fun(sendbuf, sendcount, sendtype, recvbuf, recvcount,
                      recvtype, root, comm);
     retval = MPI_SUCCESS;
   }
@@ -1808,6 +1840,21 @@ int PMPI_Reduce(void *sendbuf, void *recvbuf, int count,
   return retval;
 }
 
+int PMPI_Reduce_local(void *inbuf, void *inoutbuf, int count,
+    MPI_Datatype datatype, MPI_Op op){
+  int retval;
+
+    smpi_bench_end();
+    if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) {
+      retval = MPI_ERR_ARG;
+    } else {
+      smpi_op_apply(op, inbuf, inoutbuf, &count, &datatype);
+      retval=MPI_SUCCESS;
+    }
+    smpi_bench_begin();
+    return retval;
+}
+
 int PMPI_Allreduce(void *sendbuf, void *recvbuf, int count,
                   MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
 {
@@ -1869,12 +1916,42 @@ int PMPI_Scan(void *sendbuf, void *recvbuf, int count,
 int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
 {
-  int retval, i, size, count;
-  int *displs;
+  int retval;
+  smpi_bench_end();
+#ifdef HAVE_TRACING
   int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
+  TRACE_smpi_computing_out(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
+#endif
+  if (comm == MPI_COMM_NULL) {
+    retval = MPI_ERR_COMM;
+  } else if (datatype == MPI_DATATYPE_NULL) {
+    retval = MPI_ERR_TYPE;
+  } else if (op == MPI_OP_NULL) {
+    retval = MPI_ERR_OP;
+  } else if (recvcounts == NULL) {
+    retval = MPI_ERR_ARG;
+  } else {
+
+    mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts,
+                       datatype,  op, comm);
+    retval = MPI_SUCCESS;
+  }
+#ifdef HAVE_TRACING
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+  TRACE_smpi_computing_in(rank);
+#endif
+  smpi_bench_begin();
+  return retval;
+}
 
+int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount,
+                       MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
+{
+  int retval,i;
   smpi_bench_end();
 #ifdef HAVE_TRACING
+  int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1;
   TRACE_smpi_computing_out(rank);
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
@@ -1884,22 +1961,15 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts,
     retval = MPI_ERR_TYPE;
   } else if (op == MPI_OP_NULL) {
     retval = MPI_ERR_OP;
-  } else if (recvcounts == NULL) {
+  } else if (recvcount < 0) {
     retval = MPI_ERR_ARG;
   } else {
-    /* arbitrarily choose root as rank 0 */
-    /* TODO: faster direct implementation ? */
-    size = smpi_comm_size(comm);
-    count = 0;
-    displs = xbt_new(int, size);
-    for (i = 0; i < size; i++) {
-      count += recvcounts[i];
-      displs[i] = 0;
-    }
-    mpi_coll_reduce_fun(sendbuf, recvbuf, count, datatype, op, 0, comm);
-    smpi_mpi_scatterv(recvbuf, recvcounts, displs, datatype, recvbuf,
-                      recvcounts[rank], datatype, 0, comm);
-    xbt_free(displs);
+    int count=smpi_comm_size(comm);
+    int* recvcounts=(int*)xbt_malloc(count);
+    for (i=0; i<count;i++)recvcounts[i]=recvcount;
+    mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts,
+                       datatype,  op, comm);
+    xbt_free(recvcounts);
     retval = MPI_SUCCESS;
   }
 #ifdef HAVE_TRACING
@@ -2023,7 +2093,7 @@ int PMPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_typ
   } else if (count<0){
     retval = MPI_ERR_COUNT;
   } else {
-    retval = smpi_datatype_contiguous(count, old_type, new_type);
+    retval = smpi_datatype_contiguous(count, old_type, new_type, 0);
   }
   smpi_bench_begin();
   return retval;
@@ -2074,6 +2144,9 @@ int PMPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old
   return retval;
 }
 
+int PMPI_Type_create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) {
+  return MPI_Type_hvector(count, blocklen, stride, old_type, new_type);
+}
 
 int PMPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
   int retval;
@@ -2090,6 +2163,25 @@ int PMPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_
   return retval;
 }
 
+int PMPI_Type_create_indexed_block(int count, int blocklength, int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
+  int retval,i;
+
+  smpi_bench_end();
+  if (old_type == MPI_DATATYPE_NULL) {
+    retval = MPI_ERR_TYPE;
+  } else if (count<0){
+    retval = MPI_ERR_COUNT;
+  } else {
+    int* blocklens=(int*)xbt_malloc(blocklength*count);
+    for (i=0; i<count;i++)blocklens[i]=blocklength;
+    retval = smpi_datatype_indexed(count, blocklens, indices, old_type, new_type);
+    xbt_free(blocklens);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+
 int PMPI_Type_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
   int retval;
 
@@ -2105,6 +2197,24 @@ int PMPI_Type_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatyp
   return retval;
 }
 
+int PMPI_Type_create_hindexed_block(int count, int blocklength, MPI_Aint* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
+  int retval,i;
+
+  smpi_bench_end();
+  if (old_type == MPI_DATATYPE_NULL) {
+    retval = MPI_ERR_TYPE;
+  } else if (count<0){
+    retval = MPI_ERR_COUNT;
+  } else {
+    int* blocklens=(int*)xbt_malloc(blocklength*count);
+    for (i=0; i<count;i++)blocklens[i]=blocklength;
+    retval = smpi_datatype_hindexed(count, blocklens, indices, old_type, new_type);
+    xbt_free(blocklens);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
 
 int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* new_type) {
   int retval;
@@ -2116,7 +2226,13 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype*
     retval = smpi_datatype_struct(count, blocklens, indices, old_types, new_type);
   }
   smpi_bench_begin();
-  return retval;}
+  return retval;
+}
+
+int PMPI_Type_create_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* old_types, MPI_Datatype* new_type) {
+  return PMPI_Type_struct(count, blocklens, indices, old_types, new_type);
+}
+
 
 int PMPI_Error_class(int errorcode, int* errorclass) {
   // assume smpi uses only standard mpi error codes
@@ -2133,230 +2249,474 @@ int PMPI_Initialized(int* flag) {
 /* The following calls are not yet implemented and will fail at runtime. */
 /* Once implemented, please move them above this notice. */
 
-static int not_yet_implemented(void) {
-         XBT_WARN("Not yet implemented");
-   return MPI_SUCCESS;
+#define NOT_YET_IMPLEMENTED {\
+       XBT_WARN("Not yet implemented : %s. Please contact the Simgrid team if support is needed", __FUNCTION__);\
+       return MPI_SUCCESS;\
+        }
+
+
+int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_set_name(MPI_Datatype  datatype, char * name)
+{
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_get_name(MPI_Datatype  datatype, char * name, int* len)
+{
+  NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int* coords) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_create(MPI_Comm comm_old, int ndims, int* dims, int* periods, int reorder, MPI_Comm* comm_cart) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_get(MPI_Comm comm, int maxdims, int* dims, int* periods, int* coords) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_map(MPI_Comm comm_old, int ndims, int* dims, int* periods, int* newrank) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_rank(MPI_Comm comm, int* coords, int* rank) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_shift(MPI_Comm comm, int direction, int displ, int* source, int* dest) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cart_sub(MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Cartdim_get(MPI_Comm comm, int* ndims) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graph_create(MPI_Comm comm_old, int nnodes, int* index, int* edges, int reorder, MPI_Comm* comm_graph) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int* index, int* edges) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graph_map(MPI_Comm comm_old, int nnodes, int* index, int* edges, int* newrank) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int* neighbors) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graph_neighbors_count(MPI_Comm comm, int rank, int* nneighbors) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Graphdims_get(MPI_Comm comm, int* nnodes, int* nedges) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Topo_test(MPI_Comm comm, int* top_type) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Errhandler_create(MPI_Handler_function* function, MPI_Errhandler* errhandler) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Errhandler_free(MPI_Errhandler* errhandler) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler* errhandler) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Error_string(int errorcode, char* string, int* resultlen) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
+int PMPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler) {
+   NOT_YET_IMPLEMENTED
+}
 
 int PMPI_Cancel(MPI_Request* request) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Buffer_attach(void* buffer, int size) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Buffer_detach(void* buffer, int* size) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Comm_test_inter(MPI_Comm comm, int* flag) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Comm_get_attr (MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag)
 {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_set_attr (MPI_Comm comm, int comm_keyval, void *attribute_val)
+{
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_delete_attr (MPI_Comm comm, int comm_keyval)
+{
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_create_keyval(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state)
+{
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_free_keyval(int* keyval) {
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Pcontrol(const int level )
 {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_get_attr (MPI_Datatype type, int type_keyval, void *attribute_val, int* flag)
+{
+  NOT_YET_IMPLEMENTED
 }
 
+int PMPI_Type_set_attr (MPI_Datatype type, int type_keyval, void *attribute_val)
+{
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_delete_attr (MPI_Datatype type, int comm_keyval)
+{
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_create_keyval(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state)
+{
+  NOT_YET_IMPLEMENTED
+}
 
+int PMPI_Type_free_keyval(int* keyval) {
+  NOT_YET_IMPLEMENTED
+}
 
 int PMPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm, int remote_leader, int tag, MPI_Comm* comm_out) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Intercomm_merge(MPI_Comm comm, int high, MPI_Comm* comm_out) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Bsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Bsend_init(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Ibsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Comm_remote_group(MPI_Comm comm, MPI_Group* group) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Comm_remote_size(MPI_Comm comm, int* size) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Attr_delete(MPI_Comm comm, int keyval) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Attr_get(MPI_Comm comm, int keyval, void* attr_value, int* flag) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Attr_put(MPI_Comm comm, int keyval, void* attr_value) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Rsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Rsend_init(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Irsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Keyval_create(MPI_Copy_function* copy_fn, MPI_Delete_function* delete_fn, int* keyval, void* extra_state) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Keyval_free(int* keyval) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Test_cancelled(MPI_Status* status, int* flag) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Pack(void* inbuf, int incount, MPI_Datatype type, void* outbuf, int outcount, int* position, MPI_Comm comm) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Pack_external_size(char *datarep, int incount, MPI_Datatype datatype, MPI_Aint *size){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Pack_external(char *datarep, void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, MPI_Aint outcount, MPI_Aint *position){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Unpack_external( char *datarep, void *inbuf, MPI_Aint insize, MPI_Aint *position, void *outbuf, int outcount, MPI_Datatype datatype){
+  NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Get_elements(MPI_Status* status, MPI_Datatype datatype, int* elements) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Dims_create(int nnodes, int ndims, int* dims) {
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Win_fence( int assert,  MPI_Win win){
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Win_free( MPI_Win* win){
-   return not_yet_implemented();
+   NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){
-  return not_yet_implemented();
+  NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Info_create( MPI_Info *info){
-  return not_yet_implemented();
+  NOT_YET_IMPLEMENTED
 }
 
-int PMPI_Info_set( MPI_Info *info, char *key, char *value){
-  return not_yet_implemented();
+int PMPI_Info_set( MPI_Info info, char *key, char *value){
+  NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Info_free( MPI_Info *info){
-  return not_yet_implemented();
+  NOT_YET_IMPLEMENTED
 }
 
 int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
     MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
-  return not_yet_implemented();
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_get_envelope( MPI_Datatype datatype, int *num_integers,
+                          int *num_addresses, int *num_datatypes, int *combiner){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses,
+                          int max_datatypes, int* array_of_integers, MPI_Aint* array_of_addresses,
+                          MPI_Datatype* array_of_datatypes){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_create_darray(int size, int rank, int ndims, int* array_of_gsizes,
+                            int* array_of_distribs, int* array_of_dargs, int* array_of_psizes,
+                            int order, MPI_Datatype oldtype, MPI_Datatype *newtype) {
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_create_subarray(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Type_match_size(int typeclass,int size,MPI_Datatype *datatype){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Alltoallw( void *sendbuf, int *sendcnts, int *sdispls, MPI_Datatype *sendtypes,
+                   void *recvbuf, int *recvcnts, int *rdispls, MPI_Datatype *recvtypes,
+                   MPI_Comm comm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
+                MPI_Op op, MPI_Comm comm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_set_name(MPI_Comm comm, char* name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_dup_with_info(MPI_Comm comm, MPI_Info info, MPI_Comm * newcomm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_split_type(MPI_Comm comm, int split_type, int key, MPI_Info info, MPI_Comm *newcomm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_set_info (MPI_Comm comm, MPI_Info info){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_get_info (MPI_Comm comm, MPI_Info* info){
+  NOT_YET_IMPLEMENTED
 }
 
+int PMPI_Info_get(MPI_Info info,char *key,int valuelen, char *value, int *flag){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_create_errhandler( MPI_Comm_errhandler_fn *function, MPI_Errhandler *errhandler){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Add_error_class( int *errorclass){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Add_error_code(  int errorclass, int *errorcode){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Add_error_string( int errorcode, char *string){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_call_errhandler(MPI_Comm comm,int errorcode){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Info_dup(MPI_Info info, MPI_Info *newinfo){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Info_delete(MPI_Info info, char *key){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Info_get_nkeys( MPI_Info info, int *nkeys){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Info_get_nthkey( MPI_Info info, int n, char *key){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Info_get_valuelen( MPI_Info info, char *key, int *valuelen, int *flag){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Request_get_status( MPI_Request request, int *flag, MPI_Status *status){
+  NOT_YET_IMPLEMENTED
+}
+
+int MPI_Request_get_status( MPI_Request request, int *flag, MPI_Status *status){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Grequest_start( MPI_Grequest_query_function *query_fn, MPI_Grequest_free_function *free_fn, MPI_Grequest_cancel_function *cancel_fn, void *extra_state, MPI_Request *request){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Grequest_complete( MPI_Request request){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Status_set_cancelled(MPI_Status *status,int flag){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Status_set_elements( MPI_Status *status, MPI_Datatype datatype, int count){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_connect( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Publish_name( char *service_name, MPI_Info info, char *port_name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Unpublish_name( char *service_name, MPI_Info info, char *port_name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Lookup_name( char *service_name, MPI_Info info, char *port_name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_join( int fd, MPI_Comm *intercomm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Open_port( MPI_Info info, char *port_name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Close_port(char *port_name){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_accept( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_spawn( char *command, char **argv, int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_spawn_multiple( int count, char **array_of_commands, char*** array_of_argv,
+                             int* array_of_maxprocs, MPI_Info* array_of_info, int root,
+                             MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){
+  NOT_YET_IMPLEMENTED
+}
+
+int PMPI_Comm_get_parent( MPI_Comm *parent){
+  NOT_YET_IMPLEMENTED
+}
index a82925e..5991906 100644 (file)
@@ -16,7 +16,8 @@ int communicator_size = 0;
 static int active_processes = 0;
 xbt_dynar_t *reqq = NULL;
 
-MPI_Datatype MPI_DEFAULT_TYPE, MPI_CURRENT_TYPE;
+MPI_Datatype MPI_DEFAULT_TYPE;
+MPI_Datatype MPI_CURRENT_TYPE;
 
 static void log_timed_action (const char *const *action, double clock){
   if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
@@ -491,11 +492,18 @@ static void action_allToAll(const char *const *action) {
   int comm_size = smpi_comm_size(MPI_COMM_WORLD);
   int send_size = parse_double(action[2]);
   int recv_size = parse_double(action[3]);
-  void *send = xbt_new0(int, send_size*comm_size);  
-  void *recv = xbt_new0(int, send_size*comm_size);
+  MPI_Datatype MPI_CURRENT_TYPE2;
   
-  if(action[4]) MPI_CURRENT_TYPE=decode_datatype(action[4]);
-  else MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
+  if(action[4]) {
+    MPI_CURRENT_TYPE=decode_datatype(action[4]);
+    MPI_CURRENT_TYPE2=decode_datatype(action[5]);
+  }
+  else {
+    MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE;
+    MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE;
+  }
+  void *send = calloc(send_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE));  
+  void *recv = calloc(recv_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE2));  
 
 #ifdef HAVE_TRACING
   int rank = smpi_process_index();
@@ -503,7 +511,7 @@ static void action_allToAll(const char *const *action) {
   TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
 #endif
   
-  mpi_coll_alltoall_fun(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE, MPI_COMM_WORLD);
+  mpi_coll_alltoall_fun(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
 
 #ifdef HAVE_TRACING
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
@@ -515,6 +523,182 @@ static void action_allToAll(const char *const *action) {
   xbt_free(recv);
 }
 
+
+static void action_gather(const char *const *action) {
+  
+  
+  /*
+ The structure of the gather action for the rank 0 (total 4 processes) 
+ is the following:   
+ 0 gather 68 68 0 0 0
+
+  where: 
+  1) 68 is the sendcounts
+  2) 68 is the recvcounts
+  3) 0 is the root node
+  4) 0 is the send datatype id, see decode_datatype()
+  5) 0 is the recv datatype id, see decode_datatype()
+    
+  */
+  double clock = smpi_process_simulated_elapsed();
+  int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+  int send_size = parse_double(action[2]);
+  int recv_size = parse_double(action[3]);
+  MPI_Datatype MPI_CURRENT_TYPE2;
+  if(action[5]) {
+    MPI_CURRENT_TYPE=decode_datatype(action[5]);
+    MPI_CURRENT_TYPE2=decode_datatype(action[6]);
+  } else {
+    MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE;
+    MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE;
+  }
+  void *send = calloc(send_size, smpi_datatype_size(MPI_CURRENT_TYPE));  
+  void *recv = calloc(recv_size, smpi_datatype_size(MPI_CURRENT_TYPE2));  
+
+  int root=atoi(action[4]);
+  int rank = smpi_process_index();
+
+  if(rank==root)
+    recv = calloc(recv_size*comm_size, smpi_datatype_size(MPI_CURRENT_TYPE2));
+
+#ifdef HAVE_TRACING
+  TRACE_smpi_computing_out(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
+#endif
+smpi_mpi_gather(send, send_size, MPI_CURRENT_TYPE,
+                recv, recv_size, MPI_CURRENT_TYPE2,
+                root, MPI_COMM_WORLD);
+
+#ifdef HAVE_TRACING
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+  TRACE_smpi_computing_in(rank);
+#endif
+
+  log_timed_action (action, clock);
+  xbt_free(send);
+  xbt_free(recv);
+}
+
+
+static void action_reducescatter(const char *const *action) {
+  
+    /*
+ The structure of the reducescatter action for the rank 0 (total 4 processes) 
+ is the following:   
+0 reduceScatter 275427 275427 275427 204020 11346849 0
+
+  where: 
+  1) The first four values after the name of the action declare the recvcounts array
+  2) The value 11346849 is the amount of instructions
+  3) The last value corresponds to the datatype, see decode_datatype().
+  
+  We analyze a MPI_Reduce_scatter call to one MPI_Reduce and one MPI_Scatterv.
+  
+   */
+
+  double clock = smpi_process_simulated_elapsed();
+  int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+  int comp_size = parse_double(action[2+comm_size]);
+  int *recvcounts = xbt_new0(int, comm_size);  
+  int *disps = xbt_new0(int, comm_size);  
+  int i=0,recv_sum=0;
+  int root=0;
+  int rank = smpi_process_index();
+
+  if(action[3+comm_size])
+    MPI_CURRENT_TYPE=decode_datatype(action[3+comm_size]);
+  else
+    MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
+
+  for(i=0;i<comm_size;i++) {
+    recvcounts[i] = atoi(action[i+2]);
+    recv_sum=recv_sum+recvcounts[i];
+    disps[i] = 0;
+  }
+
+#ifdef HAVE_TRACING
+  TRACE_smpi_computing_out(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
+#endif
+   mpi_coll_reduce_fun(NULL, NULL, recv_sum, MPI_CURRENT_TYPE, MPI_OP_NULL,
+       root, MPI_COMM_WORLD);
+   smpi_mpi_scatterv(NULL, recvcounts, disps, MPI_CURRENT_TYPE, NULL,
+                      recvcounts[rank], MPI_CURRENT_TYPE, 0, MPI_COMM_WORLD);
+   smpi_execute_flops(comp_size);
+    
+    
+#ifdef HAVE_TRACING
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+  TRACE_smpi_computing_in(rank);
+#endif
+
+  log_timed_action (action, clock);
+}
+
+
+static void action_allgatherv(const char *const *action) {
+  
+  /*
+ The structure of the allgatherv action for the rank 0 (total 4 processes) 
+ is the following:   
+0 allGatherV 275427 275427 275427 275427 204020 0 275427 550854 826281 
+
+  where: 
+  1) 275427 is the sendcount
+  2) The next four elements declare the recvcounts array
+  3) The next four values declare the disps array
+  4) No more values mean that the datatype for sent and receive buffer
+  is the default one, see decode_datatype().
+
+   */
+
+  double clock = smpi_process_simulated_elapsed();
+  
+  int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+  int i=0;
+  int sendcount=atoi(action[2]);
+  int *recvcounts = xbt_new0(int, comm_size);  
+  int *disps = xbt_new0(int, comm_size);  
+  int recv_sum=0;  
+  MPI_Datatype MPI_CURRENT_TYPE2;
+
+  if(action[3+2*comm_size]) {
+    MPI_CURRENT_TYPE = decode_datatype(action[3+2*comm_size]);
+    MPI_CURRENT_TYPE2 = decode_datatype(action[4+2*comm_size]);
+  } else {
+    MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE;
+    MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;    
+  }
+  void *sendbuf = calloc(sendcount, smpi_datatype_size(MPI_CURRENT_TYPE));    
+
+  for(i=0;i<comm_size;i++) {
+    recvcounts[i] = atoi(action[i+3]);
+    recv_sum=recv_sum+recvcounts[i];
+    disps[i] = atoi(action[i+3+comm_size]);
+  }
+  void *recvbuf = calloc(recv_sum, smpi_datatype_size(MPI_CURRENT_TYPE2));  
+
+#ifdef HAVE_TRACING
+  int rank = MPI_COMM_WORLD != MPI_COMM_NULL ? smpi_process_index() : -1;
+  TRACE_smpi_computing_out(rank);
+  TRACE_smpi_collective_in(rank, -1, __FUNCTION__);
+#endif
+  
+mpi_coll_allgatherv_fun(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcounts, disps, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
+
+#ifdef HAVE_TRACING
+  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+  TRACE_smpi_computing_in(rank);
+#endif
+   
+  log_timed_action (action, clock);
+  xbt_free(sendbuf);
+  xbt_free(recvbuf);
+  xbt_free(recvcounts);
+  xbt_free(disps);
+}
+
+
 static void action_allToAllv(const char *const *action) {
   /*
  The structure of the allToAllV action for the rank 0 (total 4 processes) 
@@ -540,15 +724,22 @@ static void action_allToAllv(const char *const *action) {
   int *recvcounts = xbt_new0(int, comm_size);  
   int *senddisps = xbt_new0(int, comm_size);  
   int *recvdisps = xbt_new0(int, comm_size);  
+
+  MPI_Datatype MPI_CURRENT_TYPE2;
   
   send_buf_size=parse_double(action[2]);
   recv_buf_size=parse_double(action[3+2*comm_size]);
-
-  int *sendbuf = xbt_new0(int, send_buf_size);  
-  int *recvbuf = xbt_new0(int, recv_buf_size);  
-
-  if(action[4+4*comm_size]) MPI_CURRENT_TYPE=decode_datatype(action[4+4*comm_size]);    
-  else MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
+  if(action[4+4*comm_size]) {
+    MPI_CURRENT_TYPE=decode_datatype(action[4+4*comm_size]);    
+    MPI_CURRENT_TYPE2=decode_datatype(action[5+4*comm_size]);    
+  }
+  else {
+      MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE;
+      MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE;
+  }
+  
+  void *sendbuf = calloc(send_buf_size, smpi_datatype_size(MPI_CURRENT_TYPE));  
+  void *recvbuf = calloc(recv_buf_size, smpi_datatype_size(MPI_CURRENT_TYPE2));  
 
   for(i=0;i<comm_size;i++) {
     sendcounts[i] = atoi(action[i+3]);
@@ -603,6 +794,9 @@ void smpi_replay_init(int *argc, char***argv){
     xbt_replay_action_register("allReduce",  action_allReduce);
     xbt_replay_action_register("allToAll",   action_allToAll);
     xbt_replay_action_register("allToAllV",  action_allToAllv);
+    xbt_replay_action_register("gather",  action_gather);
+    xbt_replay_action_register("allGatherV",  action_allgatherv);
+    xbt_replay_action_register("reduceScatter",  action_reducescatter);
     xbt_replay_action_register("compute",    action_compute);
   }
 
index 357f9e2..dad0cbd 100644 (file)
@@ -392,6 +392,12 @@ static double cpu_get_speed(void *cpu, double load)
   return load * ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak;
 }
 
+static int cpu_get_core(void *cpu)
+{
+  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->core;
+}
+
+
 static double cpu_get_available_speed(void *cpu)
 {
   /* number between 0 and 1 */
@@ -516,6 +522,7 @@ static void surf_cpu_model_init_internal()
   surf_cpu_model->extension.cpu.sleep = cpu_action_sleep;
 
   surf_cpu_model->extension.cpu.get_state = cpu_get_state;
+  surf_cpu_model->extension.cpu.get_core = cpu_get_core;
   surf_cpu_model->extension.cpu.get_speed = cpu_get_speed;
   surf_cpu_model->extension.cpu.get_available_speed =
       cpu_get_available_speed;
index ea2b572..35e725e 100644 (file)
@@ -10,7 +10,6 @@
 
 #include "xbt/ex.h"
 #include "xbt/dict.h"
-#include "xbt/file_stat.h"
 #include "portable.h"
 #include "surf_private.h"
 #include "new_model_private.h"
index 6eabcca..0f87990 100644 (file)
@@ -67,7 +67,7 @@
 <!ATTLIST host_link up CDATA #REQUIRED>
 <!ATTLIST host_link down CDATA #REQUIRED>
 
-<!ELEMENT cluster EMPTY>
+<!ELEMENT cluster (prop*)>
 <!ATTLIST cluster id CDATA #REQUIRED>
 <!ATTLIST cluster prefix CDATA #REQUIRED>
 <!ATTLIST cluster suffix CDATA #REQUIRED>
index 7f9149d..fb7a5a7 100644 (file)
@@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 564
-#define YY_END_OF_BUFFER 565
+#define YY_NUM_RULES 562
+#define YY_END_OF_BUFFER 563
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -412,7 +412,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3289] =
+static yyconst flex_int16_t yy_accept[3286] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -441,330 +441,330 @@ static yyconst flex_int16_t yy_accept[3289] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  565,  563,   15,   10,   10,   15,   15,  543,
-       10,  543,    5,    6,    5,    8,    9,    8,  559,  551,
-      552,  560,  557,  560,  558,  562,  551,  552,  562,  563,
-       22,   10,   22,   22,   22,   20,   22,   26,   10,   26,
-       26,  563,   26,  563,  563,   26,   33,   10,   33,   33,
-
-       33,   31,   33,   37,   10,   37,   37,   48,   10,   48,
-       48,   48,   46,   48,   48,   48,  560,  559,   78,   10,
-       78,   78,   78,   76,   78,   78,   78,   78,   78,   82,
-       10,   82,  101,   10,  101,  101,  101,   99,  101,  101,
-      101,  105,   10,  105,  126,   10,  126,  126,  126,  124,
-      126,  126,  130,   10,  130,  130,  563,  130,  563,  130,
-      130,  563,  563,  130,  563,  130,  563,  130,  143,   10,
-      143,  143,  143,  141,  143,  143,  143,  143,  147,   10,
-      147,  147,  158,   10,  158,  158,  158,  156,  158,  158,
-      158,  162,   10,  162,  162,  171,   10,  171,  171,  171,
-
-      169,  171,  171,  175,   10,  175,  184,   10,  184,  184,
-      184,  182,  184,  184,  188,   10,  188,  213,   10,  213,
-      213,  213,  211,  213,  213,  213,  213,  213,  217,   10,
-      217,  563,  217,  224,   10,  224,  224,  224,  222,  224,
-      228,   10,  228,  239,   10,  239,  239,  239,  237,  239,
-      239,  239,  243,   10,  243,  290,   10,  290,  290,  290,
-      288,  290,  290,  290,  290,  290,  290,  290,  290,  294,
-       10,  294,  313,   10,  313,  313,  313,  311,  313,  313,
-      313,  313,  313,  313,  317,   10,  317,  338,   10,  338,
-      338,  338,  336,  338,  338,  338,  338,  338,  338,  338,
-
-      342,   10,  342,  351,   10,  351,  351,  351,  349,  351,
-      351,  355,   10,  355,  366,   10,  366,  366,  366,  364,
-      366,  366,  366,  370,   10,  370,  397,   10,  397,  397,
-      397,  395,  397,  397,  397,  397,  401,   10,  401,  401,
-      414,   10,  414,  414,  414,  412,  414,  414,  418,   10,
-      418,  563,  418,  435,   10,  435,  435,  435,  433,  435,
-      435,  435,  439,   10,  439,  439,  452,   10,  452,  452,
-      452,  450,  452,  452,  456,   10,  456,  465,   10,  465,
-      465,  465,  463,  465,  465,  469,   10,  469,  469,  482,
-       10,  482,  482,  482,  480,  482,  482,  482,  486,   10,
-
-      486,  486,  503,   10,  503,  503,  503,  501,  503,  503,
-      503,  503,  503,  507,   10,  507,  563,  507,  514,   10,
-      514,  514,  514,  512,  514,  518,   10,  518,  525,   10,
-      525,  525,  525,  523,  525,  529,   10,  529,  529,  538,
-       10,  538,  538,  538,  536,  538,  538,  542,   10,  542,
-       10,    0,    2,    2,    0,    4,    7,  554,  553,    0,
-        0,    0,    0,    0,    0,    0,   21,   23,   23,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  563,  561,
+       15,   10,   10,   15,   15,  541,   10,  541,    5,    6,
+        5,    8,    9,    8,  557,  549,  550,  558,  555,  558,
+      556,  560,  549,  550,  560,  561,   22,   10,   22,   22,
+       22,   20,   22,   26,   10,   26,   26,  561,   26,  561,
+
+      561,   26,   33,   10,   33,   33,   33,   31,   33,   37,
+       10,   37,   37,   48,   10,   48,   48,   48,   46,   48,
+       48,   48,  558,  557,   78,   10,   78,   78,   78,   76,
+       78,   78,   78,   78,   78,   82,   10,   82,  101,   10,
+      101,  101,  101,   99,  101,  101,  101,  105,   10,  105,
+      126,   10,  126,  126,  126,  124,  126,  126,  130,   10,
+      130,  130,  561,  130,  561,  130,  130,  561,  561,  130,
+      561,  130,  561,  130,  143,   10,  143,  143,  143,  141,
+      143,  143,  143,  143,  147,   10,  147,  147,  158,   10,
+      158,  158,  158,  156,  158,  158,  158,  162,   10,  162,
+
+      162,  171,   10,  171,  171,  171,  169,  171,  171,  175,
+       10,  175,  184,   10,  184,  184,  184,  182,  184,  184,
+      188,   10,  188,  211,   10,  211,  211,  211,  209,  211,
+      211,  211,  211,  211,  215,   10,  215,  561,  215,  222,
+       10,  222,  222,  222,  220,  222,  226,   10,  226,  237,
+       10,  237,  237,  237,  235,  237,  237,  237,  241,   10,
+      241,  288,   10,  288,  288,  288,  286,  288,  288,  288,
+      288,  288,  288,  288,  288,  292,   10,  292,  292,  311,
+       10,  311,  311,  311,  309,  311,  311,  311,  311,  311,
+      311,  315,   10,  315,  336,   10,  336,  336,  336,  334,
+
+      336,  336,  336,  336,  336,  336,  336,  340,   10,  340,
+      349,   10,  349,  349,  349,  347,  349,  349,  353,   10,
+      353,  364,   10,  364,  364,  364,  362,  364,  364,  364,
+      368,   10,  368,  395,   10,  395,  395,  395,  393,  395,
+      395,  395,  395,  399,   10,  399,  399,  412,   10,  412,
+      412,  412,  410,  412,  412,  416,   10,  416,  561,  416,
+      433,   10,  433,  433,  433,  431,  433,  433,  433,  437,
+       10,  437,  437,  450,   10,  450,  450,  450,  448,  450,
+      450,  454,   10,  454,  463,   10,  463,  463,  463,  461,
+      463,  463,  467,   10,  467,  467,  480,   10,  480,  480,
+
+      480,  478,  480,  480,  480,  484,   10,  484,  484,  501,
+       10,  501,  501,  501,  499,  501,  501,  501,  501,  501,
+      505,   10,  505,  561,  505,  512,   10,  512,  512,  512,
+      510,  512,  516,   10,  516,  523,   10,  523,  523,  523,
+      521,  523,  527,   10,  527,  527,  536,   10,  536,  536,
+      536,  534,  536,  536,  540,   10,  540,   10,    0,    2,
+        2,    0,    4,    7,  552,  551,    0,    0,    0,    0,
+        0,    0,    0,   21,   23,   23,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   32,   34,   34,    0,   47,   49,   49,
 
-       49,   49,    0,    0,    0,   77,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,    0,  100,  102,  102,  102,
-      102,    0,  125,  127,  127,  127,    0,    0,    0,    0,
+       32,   34,   34,    0,   47,   49,   49,   49,   49,    0,
+        0,    0,   77,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,    0,  100,  102,  102,  102,  102,    0,  125,
+      127,  127,  127,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  142,  144,  144,  144,  144,
-      144,    0,  157,  159,  159,  159,  159,    0,  170,  172,
-      172,  172,    0,  183,  185,  185,  185,    0,  212,  214,
-      214,  214,  214,  214,  214,  214,    0,    0,  223,  225,
-      225,    0,  238,  240,  240,  240,  240,    0,  289,  291,
-      291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
-
-      291,  291,  291,  291,  291,    0,  312,  314,  314,  314,
-      314,  314,  314,  314,  314,    0,  337,  339,  339,  339,
-      339,  339,  339,  339,  339,    0,  350,  352,  352,  352,
-        0,  365,  367,  367,  367,  367,    0,  396,  398,  398,
-      398,  398,  398,  398,    0,  413,  415,  415,  415,  415,
-        0,    0,  434,  436,  436,  436,  436,  436,    0,  451,
-      453,  453,  453,    0,  464,  466,  466,  466,    0,  481,
-      483,  483,  483,  483,    0,  502,  504,  504,  504,  504,
-      504,  504,    0,    0,  513,  515,  515,    0,  524,  526,
-      526,    0,  537,  539,  539,  539,    0,    0,    0,    0,
-
-        0,    3,    0,    0,    0,    0,    0,    0,    0,  561,
-        0,   23,    0,    0,  107,    0,    0,    0,    0,    0,
+        0,    0,  142,  144,  144,  144,  144,  144,    0,  157,
+      159,  159,  159,  159,    0,  170,  172,  172,  172,    0,
+      183,  185,  185,  185,    0,  210,  212,  212,  212,  212,
+      212,  212,    0,    0,  221,  223,  223,    0,  236,  238,
+      238,  238,  238,    0,  287,  289,  289,  289,  289,  289,
+
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,    0,  310,  312,  312,  312,  312,  312,  312,  312,
+      312,    0,  335,  337,  337,  337,  337,  337,  337,  337,
+      337,    0,  348,  350,  350,  350,    0,  363,  365,  365,
+      365,  365,    0,  394,  396,  396,  396,  396,  396,  396,
+        0,  411,  413,  413,  413,  413,    0,    0,  432,  434,
+      434,  434,  434,  434,    0,  449,  451,  451,  451,    0,
+      462,  464,  464,  464,    0,  479,  481,  481,  481,  481,
+        0,  500,  502,  502,  502,  502,  502,  502,    0,    0,
+      511,  513,  513,    0,  522,  524,  524,    0,  535,  537,
+
+      537,  537,    0,    0,    0,    0,    0,    3,    0,    0,
+        0,    0,    0,    0,    0,  559,    0,   23,    0,    0,
+      107,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  106,    0,    0,    0,
-        0,    0,    0,   34,    0,    0,   49,    0,    0,   49,
-        0,    0,    0,  556,   79,    0,    0,   79,   79,   79,
-       79,   79,   79,    0,    0,  102,  102,  102,    0,    0,
-        0,    0,  127,    0,    0,  107,    0,    0,    0,    0,
-        0,    0,    0,    0,  106,    0,    0,    0,    0,  144,
-        0,    0,  144,  144,    0,    0,  159,    0,    0,  159,
-
-        0,    0,    0,    0,  172,    0,    0,  185,  185,    0,
-        0,  214,  214,  214,    0,    0,  214,  214,  214,    0,
-        0,    0,    0,  225,    0,    0,  240,    0,    0,    0,
-        0,    0,    0,  291,  291,    0,    0,  291,    0,    0,
-      291,  291,  291,  291,  291,  291,  291,  291,  291,  291,
-        0,    0,    0,    0,    0,    0,  314,  314,  314,  314,
-      314,    0,    0,  339,  339,  339,    0,    0,  339,  339,
-      339,    0,    0,  352,    0,    0,    0,    0,  367,    0,
-        0,  367,    0,    0,  398,    0,    0,  398,  398,  398,
-        0,    0,  415,  415,  415,    0,    0,    0,  436,  436,
-
-      436,  436,    0,    0,  453,    0,    0,    0,    0,  466,
-      466,    0,    0,  483,  483,  483,    0,    0,  504,  504,
-      504,  504,  504,    0,    0,    0,  515,    0,    0,    0,
-        0,    0,    0,    0,    0,  539,    0,    0,    0,   14,
-        1,    0,    0,  549,    0,    0,    0,  546,  545,    0,
-        0,   23,    0,    0,   25,    0,  107,    0,    0,    0,
-        0,    0,    0,    0,  218,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  106,
-        0,    0,    0,    0,    0,    0,   34,    0,    0,   36,
-        0,   49,    0,   41,   40,   49,    0,    0,    0,   51,
-
-        0,   79,    0,   55,   54,    0,    0,   79,    0,    0,
-       79,   79,   79,    0,    0,   81,    0,  102,  102,  102,
-        0,    0,  104,    0,    0,  109,  108,  127,    0,    0,
-      129,    0,    0,    0,    0,  219,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  144,    0,  134,  133,  144,
-      144,    0,    0,  146,    0,  159,    0,  151,  150,  159,
-        0,    0,  161,    0,    0,  166,  165,  172,    0,    0,
-      174,    0,  185,  185,    0,    0,  187,    0,  214,  214,
-      214,    0,  192,  191,  214,  214,  214,    0,    0,  216,
-        0,    0,    0,  225,    0,    0,  227,    0,  240,    0,
-
-      232,  231,    0,  234,  233,    0,    0,  242,    0,  291,
-      291,  291,  291,    0,  259,  258,  291,    0,  247,  246,
-        0,    0,  291,  291,  291,  291,  291,  291,  291,  291,
-      291,    0,    0,  293,    0,    0,  308,  307,    0,  298,
-      297,    0,    0,  314,  314,  314,  314,    0,    0,  316,
-        0,  339,  339,  339,  339,    0,  321,  320,    0,    0,
-      339,  339,    0,    0,  341,    0,  352,    0,  346,  345,
-        0,    0,  354,    0,  367,    0,  359,  358,  367,    0,
-        0,  369,    0,  398,    0,  374,  373,  398,  398,  398,
-        0,    0,  400,    0,    0,    0,    0,    0,  415,    0,
-
-        0,  417,    0,    0,    0,    0,  436,  436,    0,    0,
-      436,    0,    0,  438,    0,  453,    0,  443,  442,    0,
-        0,  455,    0,    0,    0,    0,    0,    0,    0,  468,
-        0,    0,    0,  483,  483,    0,    0,    0,    0,  485,
-        0,  504,  504,  504,  504,  504,    0,    0,  506,    0,
-        0,  515,    0,    0,  517,    0,    0,  522,  521,    0,
-        0,  528,    0,    0,  533,  532,  539,    0,    0,  541,
-        0,    0,    0,  550,  544,    0,    0,    0,   23,    0,
-        0,    0,    0,    0,    0,    0,    0,  218,  189,    0,
-      371,    0,    0,  319,    0,    0,  530,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,  318,    0,    0,    0,
-        0,    0,    0,    0,   49,    0,    0,   79,    0,   59,
-       58,    0,    0,    0,   57,   56,   79,    0,    0,   79,
-        0,  102,    0,    0,  102,    0,  127,    0,  128,    0,
-        0,    0,  219,  190,  372,  531,    0,    0,    0,    0,
-        0,    0,  144,  144,    0,    0,    0,  159,  159,    0,
-        0,    0,    0,    0,    0,  185,    0,  214,  214,    0,
-        0,  214,  214,  214,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  291,  291,  291,  291,    0,    0,    0,
-      261,  260,  291,  291,  291,  291,  291,  291,  291,  291,
-
-      291,    0,    0,  310,  309,  314,  314,  314,  314,    0,
-      339,  339,  339,  339,    0,  329,  328,  339,  339,    0,
-      352,    0,  367,  367,    0,  398,  398,  398,  398,    0,
-        0,  407,  406,    0,  405,  404,  415,    0,  371,    0,
-      424,  423,  436,  436,    0,  422,  421,  436,    0,  453,
-        0,    0,  462,  461,    0,  460,  459,    0,    0,  475,
-      474,  483,  483,    0,  473,  472,    0,  504,    0,    0,
-      504,  504,  504,    0,    0,  515,    0,    0,  539,    0,
-        0,    0,    0,   12,    0,  547,  548,    0,   23,    0,
-        0,    0,    0,    0,    0,    0,    0,  189,    0,    0,
-
-      371,    0,  163,    0,  319,    0,    0,  530,    0,  402,
-        0,   39,    0,    0,    0,    0,    0,  318,    0,   38,
-        0,   30,   29,    0,    0,   43,   42,   49,    0,    0,
-       79,    0,   61,   60,   79,    0,   65,   64,   79,    0,
-      102,    0,    0,    0,    0,    0,    0,  127,    0,    0,
-        0,  190,    0,  372,  531,  403,    0,    0,    0,  403,
-      402,  144,    0,    0,    0,  138,  137,    0,  159,  159,
-        0,    0,  168,  167,    0,    0,  181,  180,  185,    0,
-      214,  214,    0,  196,  195,    0,    0,  214,    0,    0,
-      214,    0,  164,    0,    0,  221,  220,    0,  226,    0,
-
-      236,  235,    0,  291,    0,    0,  291,  291,    0,  257,
-      256,  291,  291,    0,    0,  291,  291,  291,  291,  291,
-      291,    0,    0,    0,  314,  314,  314,    0,  339,    0,
-        0,  339,  339,    0,    0,  339,    0,  352,    0,  367,
-      367,    0,  398,  398,  398,    0,    0,  398,    0,  415,
-        0,    0,  436,  436,  436,    0,  453,    0,    0,  483,
-      483,    0,  504,    0,  490,  489,  504,  504,  504,    0,
+        0,    0,  106,    0,    0,    0,    0,    0,    0,   34,
+        0,    0,   49,    0,    0,   49,    0,    0,    0,  554,
+       79,    0,    0,   79,   79,   79,   79,   79,   79,    0,
+        0,  102,  102,  102,    0,    0,    0,    0,  127,    0,
+        0,  107,    0,    0,    0,    0,    0,    0,    0,    0,
+      106,    0,    0,    0,    0,  144,    0,    0,  144,  144,
+
+        0,    0,  159,    0,    0,  159,    0,    0,    0,    0,
+      172,    0,    0,  185,  185,    0,    0,  212,  212,  212,
+        0,    0,  212,  212,    0,    0,    0,    0,  223,    0,
+        0,  238,    0,    0,    0,    0,    0,    0,  289,  289,
+        0,    0,  289,    0,    0,  289,  289,  289,  289,  289,
+      289,  289,  289,  289,  289,    0,    0,    0,    0,    0,
+        0,  312,  312,  312,  312,  312,    0,    0,  337,  337,
+      337,    0,    0,  337,  337,  337,    0,    0,  350,    0,
+        0,    0,    0,  365,    0,    0,  365,    0,    0,  396,
+        0,    0,  396,  396,  396,    0,    0,  413,  413,  413,
+
+        0,    0,    0,  434,  434,  434,  434,    0,    0,  451,
+        0,    0,    0,    0,  464,  464,    0,    0,  481,  481,
+      481,    0,    0,  502,  502,  502,  502,  502,    0,    0,
+        0,  513,    0,    0,    0,    0,    0,    0,    0,    0,
+      537,    0,    0,    0,   14,    1,    0,    0,  547,    0,
+        0,    0,  544,  543,    0,    0,   23,    0,    0,   25,
+        0,  107,    0,    0,    0,    0,    0,    0,    0,  216,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   11,    0,   23,    0,    0,    0,    0,    0,    0,
-        0,  520,    0,    0,    0,  163,    0,    0,    0,   53,
-
-      402,  343,    0,   39,    0,  519,   52,    0,    0,    0,
-        0,   38,    0,    0,   49,    0,    0,   79,   79,   79,
-        0,  102,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   96,   95,    0,  127,    0,    0,    0,    0,  403,
-      344,    0,    0,    0,  144,    0,  136,  135,    0,  159,
-        0,    0,    0,    0,    0,    0,    0,  214,  214,    0,
-      194,  193,    0,    0,    0,    0,    0,  214,    0,  215,
-      164,    0,    0,  291,    0,  269,  268,    0,    0,  291,
-      291,  291,    0,  255,  254,    0,    0,  291,  291,  291,
-      291,    0,    0,    0,    0,  306,  305,    0,    0,  314,
-
-        0,    0,    0,  339,    0,  325,  324,    0,    0,  339,
-        0,  323,  322,  339,    0,  340,  352,    0,  367,  367,
-        0,  398,  398,  398,    0,    0,    0,  398,    0,  399,
-      415,    0,    0,    0,    0,    0,    0,  436,    0,  453,
-        0,    0,    0,    0,    0,    0,    0,  504,  504,  504,
-      504,    0,    0,    0,  511,  510,    0,    0,    0,  535,
-      534,    0,  540,    0,    0,    0,    0,    0,    0,    0,
-      419,    0,    0,    0,    0,  296,  245,  520,    0,   28,
-        0,    0,    0,  488,   53,  343,  148,    0,  519,   52,
-      295,  244,   27,  487,    0,    0,   49,    0,    0,   50,
+        0,    0,    0,    0,  106,    0,    0,    0,    0,    0,
+        0,   34,    0,    0,   36,    0,   49,    0,   41,   40,
+
+       49,    0,    0,    0,   51,    0,   79,    0,   55,   54,
+        0,    0,   79,    0,    0,   79,   79,   79,    0,    0,
+       81,    0,  102,  102,  102,    0,    0,  104,    0,    0,
+      109,  108,  127,    0,    0,  129,    0,    0,    0,    0,
+      217,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      144,    0,  134,  133,  144,  144,    0,    0,  146,    0,
+      159,    0,  151,  150,  159,    0,    0,  161,    0,    0,
+      166,  165,  172,    0,    0,  174,    0,  185,  185,    0,
+        0,  187,    0,  212,  212,  212,    0,  192,  191,  212,
+      212,    0,    0,  214,    0,    0,    0,  223,    0,    0,
+
+      225,    0,  238,    0,  230,  229,    0,  232,  231,    0,
+        0,  240,    0,  289,  289,  289,  289,    0,  257,  256,
+      289,    0,  245,  244,    0,    0,  289,  289,  289,  289,
+      289,  289,  289,  289,  289,    0,    0,  291,    0,    0,
+      306,  305,    0,  296,  295,    0,    0,  312,  312,  312,
+      312,    0,    0,  314,    0,  337,  337,  337,  337,    0,
+      319,  318,    0,    0,  337,  337,    0,    0,  339,    0,
+      350,    0,  344,  343,    0,    0,  352,    0,  365,    0,
+      357,  356,  365,    0,    0,  367,    0,  396,    0,  372,
+      371,  396,  396,  396,    0,    0,  398,    0,    0,    0,
+
+        0,    0,  413,    0,    0,  415,    0,    0,    0,    0,
+      434,  434,    0,    0,  434,    0,    0,  436,    0,  451,
+        0,  441,  440,    0,    0,  453,    0,    0,    0,    0,
+        0,    0,    0,  466,    0,    0,    0,  481,  481,    0,
+        0,    0,    0,  483,    0,  502,  502,  502,  502,  502,
+        0,    0,  504,    0,    0,  513,    0,    0,  515,    0,
+        0,  520,  519,    0,    0,  526,    0,    0,  531,  530,
+      537,    0,    0,  539,    0,    0,    0,  548,  542,    0,
+        0,    0,   23,    0,    0,    0,    0,    0,    0,    0,
+        0,  216,  189,    0,  369,    0,    0,  317,    0,    0,
+
+      528,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      316,    0,    0,    0,    0,    0,    0,    0,   49,    0,
+        0,   79,    0,   59,   58,    0,    0,    0,   57,   56,
+       79,    0,    0,   79,    0,  102,    0,    0,  102,    0,
+      127,    0,  128,    0,    0,    0,  217,  190,  370,  529,
+        0,    0,    0,    0,    0,    0,  144,  144,    0,    0,
+        0,  159,  159,    0,    0,    0,    0,    0,    0,  185,
+        0,  212,  212,    0,    0,  212,  212,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  289,  289,  289,  289,
+        0,    0,    0,  259,  258,  289,  289,  289,  289,  289,
+
+      289,  289,  289,  289,    0,    0,  308,  307,  312,  312,
+      312,  312,    0,  337,  337,  337,  337,    0,  327,  326,
+      337,  337,    0,  350,    0,  365,  365,    0,  396,  396,
+      396,  396,    0,    0,  405,  404,    0,  403,  402,  413,
+        0,  369,    0,  422,  421,  434,  434,    0,  420,  419,
+      434,    0,  451,    0,    0,  460,  459,    0,  458,  457,
+        0,    0,  473,  472,  481,  481,    0,  471,  470,    0,
+      502,    0,    0,  502,  502,  502,    0,    0,  513,    0,
+        0,  537,    0,    0,    0,    0,   12,    0,  545,  546,
+        0,   23,    0,    0,    0,    0,    0,    0,    0,    0,
+
+      189,    0,    0,  369,    0,  163,    0,  317,    0,    0,
+      528,    0,  400,    0,   39,    0,    0,    0,    0,    0,
+      316,    0,   38,    0,   30,   29,    0,    0,   43,   42,
+       49,    0,    0,   79,    0,   61,   60,   79,    0,   65,
+       64,   79,    0,  102,    0,    0,    0,    0,    0,    0,
+      127,    0,    0,    0,  190,    0,  370,  529,  401,    0,
+        0,    0,  401,  400,  144,    0,    0,    0,  138,  137,
+        0,  159,  159,    0,    0,  168,  167,    0,    0,  181,
+      180,  185,    0,  212,  212,    0,  196,  195,    0,    0,
+        0,    0,  212,    0,  164,    0,    0,  219,  218,    0,
+
+      224,    0,  234,  233,    0,  289,    0,    0,  289,  289,
+        0,  255,  254,  289,  289,    0,    0,  289,  289,  289,
+      289,  289,  289,    0,    0,    0,  312,  312,  312,    0,
+      337,    0,    0,  337,  337,    0,    0,  337,    0,  350,
+        0,  365,  365,    0,  396,  396,  396,    0,    0,  396,
+        0,  413,    0,    0,  434,  434,  434,    0,  451,    0,
+        0,  481,  481,    0,  502,    0,  488,  487,  502,  502,
+      502,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   11,    0,   23,    0,    0,    0,    0,
+        0,    0,    0,  518,    0,    0,    0,  163,    0,    0,
+
+        0,   53,  400,  341,    0,   39,    0,  517,   52,    0,
+        0,    0,    0,   38,    0,    0,   49,    0,    0,   79,
+       79,   79,    0,  102,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   96,   95,    0,  127,    0,    0,    0,
+        0,  401,  342,    0,    0,    0,  144,    0,  136,  135,
+        0,  159,    0,    0,    0,    0,    0,    0,    0,  212,
+      212,    0,  194,  193,    0,    0,    0,  212,    0,  213,
+      164,    0,    0,  289,    0,  267,  266,    0,    0,  289,
+      289,  289,    0,  253,  252,    0,    0,  289,  289,  289,
+      289,    0,    0,    0,    0,  304,  303,    0,    0,  312,
+
+        0,    0,    0,  337,    0,  323,  322,    0,    0,  337,
+        0,  321,  320,  337,    0,  338,  350,    0,  365,  365,
+        0,  396,  396,  396,    0,    0,    0,  396,    0,  397,
+      413,    0,    0,    0,    0,    0,    0,  434,    0,  451,
+        0,    0,    0,    0,    0,    0,    0,  502,  502,  502,
+      502,    0,    0,    0,  509,  508,    0,    0,    0,  533,
+      532,    0,  538,    0,    0,    0,    0,    0,    0,    0,
+      417,    0,    0,    0,    0,  294,  243,  518,    0,   28,
+        0,    0,    0,  486,   53,  341,  148,    0,  517,   52,
+      293,  242,   27,  485,    0,    0,   49,    0,    0,   50,
 
        79,    0,    0,   79,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      420,    0,    0,    0,    0,  344,  149,    0,    0,    0,
+      418,    0,    0,    0,    0,  342,  149,    0,    0,    0,
         0,    0,    0,  153,  152,    0,    0,  173,    0,  179,
-      178,    0,  214,  214,    0,  210,  209,    0,    0,  214,
-        0,    0,  291,    0,  271,  270,  291,  291,  291,    0,
-      249,  248,    0,    0,  291,  291,  291,    0,  251,  250,
-        0,    0,  300,  299,    0,    0,    0,  302,  301,    0,
-      339,    0,  327,  326,  339,  339,  352,    0,  367,    0,
-        0,    0,  398,    0,    0,  398,  398,    0,    0,  398,
-
-      415,    0,  416,    0,    0,  428,  427,    0,  426,  425,
-      436,    0,  453,    0,    0,    0,  479,  478,    0,  477,
-      476,    0,  504,  504,  504,  504,    0,    0,    0,    0,
-        0,    0,    0,   17,    0,   19,   18,    0,  419,  508,
-      356,    0,    0,  296,  245,    0,   28,  440,  176,   16,
-      488,  148,    0,    0,  295,  244,   27,  487,    0,    0,
-       49,  555,   79,    0,   67,   66,   79,    0,   80,    0,
-       98,   97,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  420,  357,    0,    0,
-        0,  149,    0,    0,  140,  139,    0,    0,  155,  154,
-
-        0,    0,  214,  214,    0,    0,    0,    0,  214,  177,
-        0,  291,  291,  291,  291,    0,  253,  252,  291,  291,
-      291,    0,    0,  304,  303,    0,  339,  339,  339,  352,
-        0,  353,  367,    0,  363,  362,    0,  398,    0,  380,
-      379,  398,  398,    0,    0,    0,    0,  398,  415,  441,
-      436,    0,  453,    0,    0,    0,    0,    0,  504,  504,
-      504,    0,  509,    0,    0,  527,    0,    0,    0,   17,
-        0,  508,  356,    0,    0,  229,  440,  176,   16,    0,
-        0,    0,    0,   35,   49,    0,    0,   79,    0,    0,
+      178,    0,  212,  212,    0,    0,  212,    0,    0,  289,
+        0,  269,  268,  289,  289,  289,    0,  247,  246,    0,
+        0,  289,  289,  289,    0,  249,  248,    0,    0,  298,
+      297,    0,    0,    0,  300,  299,    0,  337,    0,  325,
+      324,  337,  337,  350,    0,  365,    0,    0,    0,  396,
+        0,    0,  396,  396,    0,    0,  396,  413,    0,  414,
+
+        0,    0,  426,  425,    0,  424,  423,  434,    0,  451,
+        0,    0,    0,  477,  476,    0,  475,  474,    0,  502,
+      502,  502,  502,    0,    0,    0,    0,    0,    0,    0,
+       17,    0,   19,   18,    0,  417,  506,  354,    0,    0,
+      294,  243,    0,   28,  438,  176,   16,  486,  148,    0,
+        0,  293,  242,   27,  485,    0,    0,   49,  553,   79,
+        0,   67,   66,   79,    0,   80,    0,   98,   97,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  418,  355,    0,    0,    0,  149,    0,
+        0,  140,  139,    0,    0,  155,  154,    0,    0,  212,
+
+      212,    0,    0,    0,    0,  212,  177,    0,  289,  289,
+      289,  289,    0,  251,  250,  289,  289,  289,    0,    0,
+      302,  301,    0,  337,  337,  337,  350,    0,  351,  365,
+        0,  361,  360,    0,  396,    0,  378,  377,  396,  396,
+        0,    0,    0,    0,  396,  413,  439,  434,    0,  451,
+        0,    0,    0,    0,    0,  502,  502,  502,    0,  507,
+        0,    0,  525,    0,    0,    0,   17,    0,  506,  354,
+        0,    0,  227,  438,  176,   16,    0,    0,    0,    0,
+       35,   49,    0,    0,   79,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  357,
-        0,    0,  230,    0,    0,    0,  160,    0,  214,  214,
-        0,  202,    0,  201,  214,  177,    0,  291,  291,  291,
-      291,  291,    0,    0,  291,  291,    0,  292,    0,  315,
-      339,  339,  339,  352,    0,    0,    0,    0,    0,  398,
-      398,  398,    0,  384,    0,  383,  398,  415,  441,  436,
-        0,  437,    0,    0,    0,    0,    0,    0,  492,  491,
-        0,    0,  504,  504,    0,  505,  509,    0,    0,    0,
-        0,    0,   24,    0,    0,  229,    0,    0,    0,   49,
-        0,    0,    0,   79,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  355,    0,    0,  228,
+        0,    0,    0,  160,    0,  212,  212,    0,  202,    0,
+      201,  212,  177,    0,  289,  289,  289,  289,  289,    0,
+        0,  289,  289,    0,  290,    0,  313,  337,  337,  337,
+      350,    0,    0,    0,    0,    0,  396,  396,  396,    0,
+      382,    0,  381,  396,  413,  439,  434,    0,  435,    0,
+        0,    0,    0,    0,    0,  490,  489,    0,    0,  502,
+      502,    0,  503,  507,    0,    0,    0,    0,    0,   24,
+        0,    0,  227,    0,    0,    0,   49,    0,    0,    0,
+       79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  230,
-        0,    0,    0,  186,  214,  214,  204,  203,    0,    0,
-        0,  291,  291,  291,  291,  291,    0,  281,  280,  291,
-        0,    0,  339,  339,    0,    0,  352,    0,  361,  360,
-        0,  368,    0,  376,  375,  398,  398,  398,  386,  385,
-        0,    0,  415,  436,    0,    0,    0,    0,  454,    0,
-        0,    0,  496,  495,    0,    0,    0,    0,    0,  516,
-        0,    0,    0,    0,  457,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   79,    0,    0,    0,
-
-        0,   88,    0,    0,    0,    0,   87,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  458,    0,    0,  214,    0,    0,    0,  206,  205,
-        0,  241,  291,  291,  291,    0,    0,  291,  291,    0,
-      279,  278,  339,    0,    0,    0,  335,  334,    0,    0,
-      398,  398,  398,    0,  388,  387,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  494,  493,    0,    0,    0,    0,  457,  131,
-        0,    0,    0,   45,   44,    0,    0,    0,    0,    0,
-        0,    0,    0,   79,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  228,    0,    0,    0,
+      186,  212,  212,  204,  203,    0,    0,    0,  289,  289,
+      289,  289,  289,    0,  279,  278,  289,    0,    0,  337,
+      337,    0,    0,  350,    0,  359,  358,    0,  366,    0,
+      374,  373,  396,  396,  396,  384,  383,    0,    0,  413,
+      434,    0,    0,    0,    0,  452,    0,    0,    0,  494,
+      493,    0,    0,    0,    0,    0,  514,    0,    0,    0,
+        0,  455,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   79,    0,    0,    0,    0,   88,    0,
+
+        0,    0,    0,   87,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  456,    0,
+        0,  212,    0,    0,    0,  206,  205,    0,  239,  289,
+      289,  289,    0,    0,  289,  289,    0,  277,  276,  337,
+        0,    0,    0,  333,  332,    0,    0,  396,  396,  396,
+        0,  386,  385,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  492,
+      491,    0,    0,    0,    0,  455,  131,    0,    0,    0,
+       45,   44,    0,    0,    0,    0,    0,    0,    0,    0,
+       79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  458,  132,    0,    0,
-        0,  214,    0,  208,  207,  291,  291,    0,    0,    0,
-      285,  284,    0,    0,  291,  339,    0,  331,  330,    0,
-      348,  347,  398,    0,    0,  398,    0,    0,    0,    0,
+        0,    0,    0,  456,  132,    0,    0,    0,  212,    0,
+      208,  207,  289,  289,    0,    0,    0,  283,  282,    0,
+        0,  289,  337,    0,  329,  328,    0,  346,  345,  396,
+        0,    0,  396,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  468,  131,   84,   83,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  470,  131,
+        0,   94,    0,    0,    0,   93,    0,    0,    0,    0,
+        0,  111,  119,    0,    0,    0,    0,  110,  118,    0,
+
+      469,  132,    0,    0,  198,  197,  212,  289,  289,    0,
+      281,  280,    0,  285,  284,  289,  337,  396,    0,  380,
+      379,  396,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  443,    0,    0,  442,    0,  465,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  468,
        84,   83,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   94,    0,    0,    0,   93,    0,
-        0,    0,    0,    0,  111,  119,    0,    0,    0,    0,
-
-      110,  118,    0,  471,  132,    0,    0,  198,  197,  214,
-      291,  291,    0,  283,  282,    0,  287,  286,  291,  339,
-      398,    0,  382,  381,  398,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  445,    0,    0,  444,    0,
-      467,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  470,   84,   83,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   63,   62,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  113,    0,    0,    0,  112,
-        0,  471,    0,  145,  214,  291,  291,    0,    0,  339,
+        0,   63,   62,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  113,    0,    0,    0,  112,    0,  469,    0,
+      145,  212,  289,  289,    0,    0,  337,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   75,   71,
-        0,    0,   74,   70,    0,   92,    0,    0,   91,    0,
-        0,    0,  103,    0,    0,    0,    0,    0,    0,  214,
-      291,  291,    0,    0,    0,  339,    0,  378,  377,    0,
-        0,    0,  411,    0,  410,    0,  432,    0,  431,    0,
-      447,  449,  446,  448,    0,  484,  498,    0,  497,    0,
-        0,    0,    0,   12,    0,   12,    0,    0,    0,    0,
-        0,   86,   90,   85,   89,  123,    0,  121,  122,    0,
-      120,  214,  291,  291,    0,    0,    0,    0,  339,    0,
-
-        0,    0,    0,  409,  408,  430,  429,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  115,    0,
-      114,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   75,   71,    0,    0,   74,
+       70,    0,   92,    0,    0,   91,    0,    0,    0,  103,
+        0,    0,    0,    0,    0,    0,  212,  289,  289,    0,
+        0,    0,  337,    0,  376,  375,    0,    0,    0,  409,
+        0,  408,    0,  430,    0,  429,    0,  445,  447,  444,
+      446,    0,  482,  496,    0,  495,    0,    0,    0,    0,
+       12,    0,   12,    0,    0,    0,    0,    0,   86,   90,
+       85,   89,  123,    0,  121,  122,    0,  120,  212,  289,
+      289,    0,    0,    0,    0,  337,    0,    0,    0,    0,
+
+      407,  406,  428,  427,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  115,    0,  114,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   69,    0,   68,    0,
-        0,    0,    0,  200,  199,    0,  277,  276,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  333,  332,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   11,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   69,    0,   68,    0,    0,    0,    0,
+      200,  199,    0,  275,  274,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  331,  330,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   11,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  498,  497,    0,
 
-      500,  499,    0,   73,   72,    0,    0,    0,    0,    0,
+       73,   72,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  117,  116,    0,    0,    0,    0,    0,
-        0,  263,    0,    0,  262,    0,    0,  390,    0,    0,
-      389,    0,    0,    0,    0,    0,  267,    0,  266,    0,
-      392,    0,  391,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  273,    0,  272,    0,    0,
-        0,    0,    0,    0,  275,  274,  265,  264,  394,  393,
+      117,  116,    0,    0,    0,    0,    0,    0,  261,    0,
+        0,  260,    0,    0,  388,    0,    0,  387,    0,    0,
+        0,    0,    0,  265,    0,  264,    0,  390,    0,  389,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  271,    0,  270,    0,    0,    0,    0,    0,
+        0,  273,  272,  263,  262,  392,  391,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -774,7 +774,7 @@ static yyconst flex_int16_t yy_accept[3289] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   13,    0
+        0,    0,    0,   13,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -821,7 +821,7 @@ static yyconst flex_int32_t yy_meta[75] =
         5,    5,    5,    5
     } ;
 
-static yyconst flex_int16_t yy_base[3769] =
+static yyconst flex_int16_t yy_base[3766] =
     {   0,
         0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
        14,   17,   33,   36,   49,   55,   45,   61,   66,   72,
@@ -839,2366 +839,2373 @@ static yyconst flex_int16_t yy_base[3769] =
      1149, 1153, 1191, 1253, 1211, 1214, 1315, 1383, 1217, 1221,
      1451, 1518, 1224, 1273, 1276, 1279, 1283, 1286, 1335, 1338,
      1585, 1647, 1341, 1345, 1709, 1778, 1348, 1403, 1847,    0,
-     1406, 1409, 1921, 1988, 1413, 1416, 2055, 2122, 1471, 1474,
-     2189, 2246, 1477, 1481, 2303, 2363, 1538, 1541, 2423, 2490,
-     1544, 1548, 1605, 1608, 1611, 1615, 1618, 1667, 2557, 2624,
-     1670, 1673, 1677, 1680, 1729, 1732, 1735, 1739, 2691, 2758,
-     1742, 1798, 1801, 1804, 1808, 1811, 1941, 1944, 2825, 2882,
-
-     1947, 1951, 2939, 3006, 1954, 2008, 2011, 2014, 2018, 2021,
-     2075, 2078, 3073, 3140, 2081, 2085, 2142, 2145, 2148, 2152,
-     2209, 2212, 3207, 3274, 2215, 2219, 2266, 2269, 2272, 2276,
-     2323, 2326, 3341, 3411, 2329, 2333, 3481, 3538, 2336, 2383,
-     2386, 2389, 2393, 2396, 2443, 2446, 3595, 3665, 2449, 2453,
-        0,    0, 9025,12042,12042,   95,  100,   29,   41,12042,
-      103,   51,12042,12042, 9010,12042,12042, 8999,12042, 9014,
-     9010,  202,12042,12042,12042,12042, 9008, 9008, 8959,  153,
-    12042,  161, 8985,    0,  145,12042, 8951,12042,  165, 3731,
-       73, 2462,  315,  357, 8987, 8934,12042,  168, 8977,    0,
-
-      152,12042, 8935,12042,  261, 8979,   31,12042,  266, 8970,
-        0,  245,12042, 8928, 8932, 8930,  421, 8931,12042,  269,
-     8957,    0,  340,12042, 8923, 8919,  271, 8921,  238,12042,
-      441,  484,12042,  504, 8949,    0,  401,12042, 8904, 8906,
-     8896,12042,  561,  548,12042,  571, 8937,    0,  481,12042,
-     8904, 8892,12042,  628, 3795, 8886,  163, 2456,  567,  206,
-       38, 8937,  954, 2465,  639,  907,  437,   79,12042,  634,
-     8928,    0,  546,12042, 8880, 8890, 8878, 8879,12042,  638,
-      313,  368,12042,  697, 8915,    0,  549,12042, 8871, 8877,
-     8855,12042,  704,  426,  497,12042,  707, 8907,    0,  747,
-
-    12042, 8321, 8323,12042,  767,  753,12042,  773, 8350,    0,
-      757,12042, 8320, 8295,12042,  831,  818,12042,  838, 8347,
-        0,  758,12042, 8296, 8302, 8312,  251, 8294,12042,  841,
-      559,  825,  530,12042,  906, 8341,    0,  815,12042, 8310,
-    12042,  914,  891,12042,  977, 8331,    0,  953,12042, 8287,
-     8296, 8276,12042,  981,  965,12042, 1021, 8319,    0,  966,
-    12042, 8267,  203, 8268, 8277,  378,   85,  311,  972,12042,
-     1040, 1025,12042, 1048, 8304,    0, 1026,12042, 8252, 8269,
-     8267,  157, 8266, 8239,12042, 1088, 1092,12042, 1105, 8286,
-        0, 1033,12042, 8235, 8232, 8227, 8237, 8238, 8216, 8210,
-
-    12042, 1112, 1154,12042, 1115, 8256,    0, 1089,12042, 8212,
-     8221,12042, 1118, 1160,12042, 1174, 8248,    0, 1090,12042,
-     8218, 8209, 8211,12042, 1180, 1228,12042, 1183, 8238,    0,
-     1158,12042, 8197, 8193, 8192,   15,12042, 1186,  564,  814,
-    12042, 1241, 8220,    0, 1225,12042, 8171,  181,12042, 1248,
-     1294,  432,  303,12042, 1305, 8217,    0, 1226,12042, 8146,
-     8137,  299,12042, 1309, 1224,  350,12042, 1365, 8187,    0,
-     1293,12042, 8137, 8141,12042, 1368, 1352,12042, 1372, 8171,
-        0, 1360,12042, 8119, 8119,12042, 1376, 1426,  676,12042,
-     1433, 8163,    0, 1418,12042, 8111, 8106, 8109,12042, 1438,
-
-     1436,  685,12042, 1503, 8146,    0, 1423,12042, 8096, 8101,
-     8104, 8098, 8081,12042, 1507, 1504,  560,  899,12042, 1510,
-     8128,    0, 1428,12042, 8094,12042, 1568, 1622,12042, 1574,
-     8122,    0, 1482,12042, 8088,12042, 1577,  963, 1007,12042,
-     1635, 8118,    0, 1496,12042, 8085, 8086,12042, 1638, 1623,
-     1697,  677, 8057,12042, 8111, 8100,12042,12042,12042, 1690,
-      375, 8050, 8044, 8042, 8089, 8040,12042,    0, 8029, 8017,
-     8036, 8008,  104, 1383, 8008, 7990, 7986, 7990,  889, 1636,
-     1037, 7967, 7968, 1500, 1105, 7989, 1691, 7958, 1699, 7953,
-     1709, 1710, 1711,12042,    0, 7957, 7955,12042,    0, 7951,
-
-     2088, 7942,  666, 7935, 7980,12042,    0, 7936, 2155, 7918,
-     7940, 7919, 7927, 7925, 7920, 7905,12042,    0, 7916, 7896,
-     7908, 7887,12042,    0, 2222, 7881, 7927, 7904,  172, 7877,
-     7877, 7881, 1767, 1297, 7865, 1768, 7893,  707,  724,  814,
-      841, 1567, 1782, 1629,  888,12042,    0, 7865, 2279, 7874,
-     7840, 7846,12042,    0, 7849, 2456, 7839, 7835,12042,    0,
-     2514, 7830, 7829,12042,    0, 7826, 7815, 7808,12042,    0,
-     7819,  758, 2519, 7786, 7788, 7805, 7793,  897,12042,    0,
-     7787, 7791,12042,    0, 7774, 2525, 2577, 7787,12042,    0,
-     7789, 7789, 2580, 7765, 2583, 7762, 7767, 7754, 7745, 7761,
-
-     7757, 7737, 7752, 7751, 7744, 7737,12042,    0, 2586, 2589,
-     7718, 7709, 7725, 7718, 7715, 7716,12042,    0, 7713, 7712,
-     7695, 2644, 7689, 7684, 7700, 7677,12042,    0, 7667, 2647,
-     7657,12042,    0, 7660, 2650, 7652, 7659,12042,    0, 7646,
-     2653, 7638, 7652, 7651, 7637,12042,    0, 7627, 7639, 7627,
-     7621, 7621,12042,    0, 7609, 7627, 7619, 7608, 7642,12042,
-        0, 7597, 2656, 7601,12042,    0, 7584, 7598, 7597,12042,
-        0, 7575, 7583, 7579, 7578,12042,    0, 7557, 7550, 7552,
-     7563, 7560, 7537, 7534,12042,    0, 7538, 7543,12042,    0,
-     2711, 7534,12042,    0, 2714, 7524, 7518, 7552, 7551, 1537,
-
-     7499,12042, 1823,    0, 7494, 7490, 7535, 7533, 7485,12042,
-     7497, 7478, 2719, 2722, 1971, 7467, 7469, 7455, 7466, 7445,
-     7448, 7437, 7430, 7445, 7432, 7417, 7417, 7426, 7427, 7400,
-     7393, 7385, 7385, 7397, 7380, 7375, 1980, 7386, 7360, 7365,
-     7355, 7344, 7356, 7344, 2725, 2732, 7343, 2781, 2038, 7337,
-     7369, 2786, 2789,12042, 7338, 2793, 2107, 2799, 7324, 2845,
-     7328, 7326, 7328, 2848, 2855, 7304, 7312, 7310, 2858, 2903,
-     2906, 2174, 7291, 2910, 2916, 2353, 7303, 7288, 7278, 7279,
-     7282, 7270, 7263, 7267, 2413, 7263, 7260, 7230, 7228, 7222,
-     2913, 2539, 7236, 7234, 2959, 2962, 7218, 2968, 2608, 7224,
-
-     2972, 3029, 2986, 2675, 7206, 3034, 3037, 7201, 7200, 3040,
-     3043, 7194, 7180, 7188, 3099, 2745, 7185, 7178, 7154, 3102,
-     3109, 7151, 7147, 7161, 3112, 3165, 7150, 3105, 2813, 3160,
-     2991, 3171, 3174, 7144, 1910, 3178, 3062, 7147, 3186, 3197,
-     3228, 7141, 7133, 7142, 7140, 7135, 7123, 7108, 7105, 7112,
-     3231, 3236, 3239, 3246, 3295, 3298, 3306, 3313, 3320, 3376,
-     3373, 3242, 3361, 7108,   37, 7091, 3365, 3387, 3432, 7099,
-     7082, 3309, 3444, 7078, 3435, 3395, 3439, 3458, 7087, 3501,
-     3463, 7074, 3504, 3511, 7074, 3507, 3471, 7068, 7052, 7043,
-     3514, 3560, 3563, 3567, 3570, 3573, 3618, 7047, 3621, 3641,
-
-     3630, 3644, 3633, 3686, 7054, 3694, 3652, 3697, 3700, 3712,
-     3725, 3730, 3735, 3743, 3757, 3764, 3738, 3769, 7055, 7032,
-     7039, 7021, 7005, 3799, 3802, 7011, 6996, 3808, 3811, 3775,
-     3823, 3833, 3837, 3845, 3863, 6994, 3871, 3876, 7019,12042,
-    12042, 1138, 6978,12042, 7019, 7014, 6963,12042,12042, 6949,
-     6936, 6945, 3879, 3882,12042, 3885, 1704, 6937, 6926, 6925,
-     6934, 6915, 6901, 6913, 1771, 6888, 6894, 6894, 6887, 6885,
-     6877, 6874,  446, 6888, 6854, 6851, 6864, 6860, 6860, 2047,
-     6847, 6830, 6834, 6823, 1109, 6833, 3890, 3904, 3908,12042,
-     3911, 3914, 3917,12042,12042, 3933, 6850, 3936, 3941,12042,
-
-     3944, 6807, 3951,12042,12042, 3947, 3965, 3973, 3976, 3979,
-     6814, 3987, 6812, 3995, 3998,12042, 4001, 6809, 4005, 6803,
-     4008, 4023,12042, 4027, 4030,12042,12042, 6797, 4038, 4042,
-    12042, 4046, 6785, 6778, 6786, 2240, 6766, 6770, 1510, 6760,
-     6760, 6769, 6768, 6718, 6716, 6727, 4050,12042,12042, 6715,
-     4065, 4068, 4071,12042, 4075, 6720, 4083,12042,12042, 6738,
-     4078, 4097,12042, 4100, 4103,12042,12042, 4111, 4119, 4122,
-    12042, 4125, 4129, 4132, 4150, 4153,12042, 4156, 6707, 6713,
-     4162, 4165,12042,12042, 6682, 6679, 6673, 4175, 4180,12042,
-     4183, 6653, 6651, 4186, 4189, 4194,12042, 4208, 4204, 4213,
-
-    12042,12042, 4223,12042,12042, 4231, 4234,12042, 4237, 6652,
-     6636, 6657, 6639, 4240,12042,12042, 4256, 4259,12042,12042,
-     4267, 4270, 6626, 6637, 6595, 6603, 6603, 6599, 6586, 6589,
-     6581, 4278, 4281,12042, 4285, 4288,12042,12042, 4304,12042,
-    12042, 4312, 4315, 6567, 6575, 6575, 6566, 4323, 4326,12042,
-     4330, 6561, 6558, 6549, 6554, 4333,12042,12042, 4345, 4349,
-     6538, 6550, 4357, 4363,12042, 4366, 6549, 4369,12042,12042,
-     4385, 4388,12042, 4391, 6520, 4394,12042,12042, 6526, 4410,
-     4413,12042, 4418, 6512, 4422,12042,12042, 6514, 6518, 6520,
-     4432, 4437,12042, 4441, 4444, 4447, 4462, 4468, 6509, 4476,
-
-     4480,12042, 4484, 6501, 4487, 4505, 6488, 6488, 4491, 4513,
-     6494, 4521, 4524,12042, 4527, 6488, 4530,12042,12042, 4546,
-     4552,12042, 4555, 4558, 4561, 4576, 4579, 4587, 4594,12042,
-     4598, 4601, 4606, 6452, 6436, 4619, 4622, 4630, 4633,12042,
-     4637, 6428, 4640, 6432, 6428, 6398, 4643, 4652,12042, 4662,
-     6370, 6382, 4665, 4671,12042, 4674, 4677,12042,12042, 4685,
-     4693,12042, 4696, 4700,12042,12042, 6357, 4708, 4715,12042,
-     4718, 1013, 4728,12042,12042, 6392, 6389, 6295, 6285, 4737,
-     6277, 6270, 6219, 6191, 6193, 6162, 6172, 2297, 2549, 6158,
-     2552, 6107, 6060, 2616, 6014, 5995, 2619, 5961, 5959, 5890,
-
-     5874, 5860, 5705, 5703, 5675, 5668, 2683, 5662, 5634, 4740,
-     4758, 4743, 4749, 4767, 5608,    1, 4775,   17, 4780,12042,
-    12042, 4788, 4795, 4806,12042,12042,   40, 4814, 4818,  141,
-     4826,  255, 4832, 4835, 4845, 4850,  320, 4752,12042,  330,
-      355,  379, 2686, 2863, 3000, 2753,  425,  450,  460,  483,
-      503,  565,  581, 4853, 4856, 4859, 4877,  622,  633, 4880,
-     4883, 4886, 4901, 4904, 4907,  677, 4915,  706,  710, 4922,
-     4925, 4934,  759, 4945, 4948,  763,  780, 4952, 4956, 4970,
-     4973, 4977, 4985,  843, 4992,  829,  853, 4995, 4998, 5006,
-    12042,12042,  867,  999, 5015, 1026, 1056, 1073, 1145, 1174,
-
-     1162, 5018, 5021,12042,12042, 5029, 5033, 5037, 5040, 5043,
-     1192, 5047, 1201, 1236, 5058,12042,12042, 5068, 1247, 5071,
-     1239, 5074, 1245, 1252, 5077, 1248, 1280, 1293, 5080, 5086,
-     5105,12042,12042, 5113,12042,12042, 1314, 5100, 3135, 5121,
-    12042,12042, 1331, 1363, 5129,12042,12042, 1354, 5137, 1357,
-     5144, 5147,12042,12042, 5156,12042,12042, 5167, 5170,12042,
-    12042, 1358, 1396, 5179,12042,12042, 5187, 1393, 5190, 5193,
-     1399, 1425, 1440, 5202, 1429, 5208, 5211, 5215, 5221, 5226,
-     1538, 1471, 5230,12042, 1473,12042,12042, 1471, 1492, 5235,
-     1487, 1531, 1538, 1557, 1572, 1592, 1591, 2877, 1603, 1634,
-
-     3131, 1636, 3265, 1641, 3269, 1634, 1658, 3332, 1687, 3404,
-     1694, 3533, 1712, 1707, 1741, 1756, 1765, 3368, 1751, 4495,
-     5239,12042,12042, 5254, 5257,12042,12042, 1766, 1792, 5268,
-     1771, 5273,12042,12042, 1781, 5289,12042,12042, 1773, 5282,
-     1776, 5301, 2898, 2944, 5309, 5313, 5322, 1791, 1869, 1889,
-     1894, 3588, 1903, 3624, 3761, 5327, 1909, 1899, 1909, 5330,
-     5333, 1911, 5336, 5344, 5354,12042,12042, 5362, 1912, 5365,
-     5368, 5374,12042,12042, 5383, 5388,12042,12042, 5402, 5398,
-     1936, 1942, 5406,12042,12042, 5420, 5423, 5431, 5434, 5438,
-     1965, 5452, 5455, 1978, 5459,12042,12042, 5467,12042, 5471,
-
-    12042,12042, 5479, 1978, 5482, 5486, 5494, 1964, 5500,12042,
-    12042, 1965, 1982, 5512, 5515, 5526, 1983, 2005, 2016, 2032,
-     5530, 5533, 5536, 5548, 5539, 5544, 5557, 5562, 2044, 5565,
-     5568, 5576, 2033, 5583, 5587, 2043, 5595, 2036, 5603, 2048,
-     2035, 5607, 2062, 2044, 2063, 5610, 5616, 2066, 5628, 2055,
-     5631, 2087, 5634, 5639, 5642, 5660, 2096, 5663, 5666, 5669,
-     5672, 5675, 2098, 5690,12042,12042, 2105, 2104, 2097, 5698,
-     2114, 5701, 5710, 5719, 5724, 5728, 5732, 5746, 2168, 2167,
-     2242,12042, 2109, 5750, 5753, 2128, 2122, 2123, 2264, 2152,
-     2162, 5508, 2174, 2179, 2166, 5756, 2183, 2173, 2178, 5759,
-
-     5768, 5772, 2224, 5775, 2234, 5780, 5783, 2220, 2223, 2238,
-     2229, 5786, 2268, 5789, 2283, 2320, 5792, 2280, 5795, 2288,
-     5798, 5801, 2324, 2312, 2372, 2316, 2336, 2323, 2432, 2325,
-     5804,12042,12042, 5819, 5823, 2309, 2317, 2383, 2346, 5826,
-     5829, 2353, 2443, 2444, 5832, 5841,12042,12042, 5850, 5853,
-     5858, 5862, 5871, 5876, 5879, 5883, 5891, 2351, 2363, 5897,
-    12042,12042, 5905, 5910, 5919, 2382, 2386, 2382, 5927,12042,
-     5930, 2408, 5933, 2415, 5939,12042,12042, 5947, 5952, 2419,
-     2429, 2426, 5961,12042,12042, 5969, 5972, 5980, 2429, 2440,
-     2432, 5983, 5988, 6001, 6004,12042,12042, 6012, 6016, 6024,
-
-     6030, 6033, 6042, 2455, 6049,12042,12042, 6057, 6061, 2465,
-     6069,12042,12042, 2468, 6077,12042, 2483, 6080, 2466, 6083,
-     6086, 2467, 6089, 2491, 6101, 2510, 2513, 2516, 6109,12042,
-     2537, 6112, 2527, 6115, 6118, 6136, 6139, 2541, 6148, 2538,
-     6154, 6157, 6160, 6163, 6178, 6181, 6189, 2544, 2546, 2544,
-     2558, 6192, 2554, 6197,12042,12042, 6211, 6215, 6219,12042,
-    12042, 6230,12042, 2641, 2699, 2654, 2579, 6234, 6237, 6245,
-     6258, 2594, 2611, 2626, 2605, 6264, 6269, 6272, 2611, 6275,
-     2618, 2629, 2622, 6278, 6281, 6284, 6287, 2644, 6290, 6293,
-     6296, 6299, 6302, 6305, 2668, 6310, 2675, 2694, 6313,12042,
-
-     2675, 6317, 6320, 2695, 6335, 6338, 6341, 2718, 2735, 2740,
-     2746, 2743, 2752, 2759, 2759, 2772, 2765, 6349, 6356, 6362,
-     6370, 2758, 2775, 2757, 2759, 6374, 6377, 6380, 6383, 6391,
-     6394, 6399, 6412,12042,12042, 6420, 6425,12042, 6428,12042,
-    12042, 6439, 2763, 2756, 6444,12042,12042, 3024, 3034, 2781,
-     2800, 6452, 2794, 6458,12042,12042, 2794, 2803, 2821, 6472,
-    12042,12042, 6466, 6480, 2818, 2809, 2814, 6489,12042,12042,
-     6497, 6501,12042,12042, 6509, 6512, 6520,12042,12042, 6528,
-     2816, 6531,12042,12042, 2830, 2862, 2856, 6539, 2870, 6542,
-     6547, 6562, 2877, 6565, 6568, 2883, 2874, 3035, 3096, 2908,
-
-     2927, 6577,12042, 2918, 6583,12042,12042, 6596,12042,12042,
-     2932, 6591, 2922, 6605, 6610, 6613,12042,12042, 6625,12042,
-    12042, 6633, 6637, 6643, 6647, 6655, 6661, 2928, 6665, 6668,
-     6673, 3009, 3069, 6676, 6680,12042,12042, 6688, 6695, 6698,
-     6701, 2932, 2930, 6707, 6715, 2942, 6718, 6721, 6727, 6730,
-     6733, 6736, 2954, 2966, 6739, 6742, 6748, 6751, 2972, 6754,
-     2967,12042, 6757, 6760,12042,12042, 6768, 6775,12042, 6779,
-    12042,12042, 3025, 3015, 3030, 3035, 3069, 3071, 3058, 3073,
-     3085, 3095, 6787, 6790, 5682, 6773, 6799, 6802, 3060, 3058,
-     3071, 6807, 3088, 6810,12042,12042, 6818, 6821,12042,12042,
-
-     6829, 6837, 3108, 3113, 3143, 3165, 3157, 3184, 3143, 6840,
-     6843, 3141, 3147, 3147, 3323, 6849,12042,12042, 6857, 3160,
-     3183, 6865, 6868,12042,12042, 6876, 3200, 3206, 3207, 3211,
-     6879,12042, 6884, 6889,12042,12042, 6898, 6904, 6907,12042,
-    12042, 6917, 6922, 3238, 3284, 3276, 3296, 6925, 3257, 6928,
-     3269, 6935, 6931, 6943, 6955, 6962, 6958, 6967, 6977, 6984,
-     6987, 6990, 6995, 7005, 7009,12042, 7012, 3424, 3337, 7017,
-     7024, 7020, 7031, 3256, 3258, 7039, 7043, 7046, 7049, 3254,
-     3269, 3276, 7052,12042, 3267, 7055, 7058, 3325, 3342, 3338,
-     3365, 3354, 3365, 3362, 3361, 3405, 3397, 3411, 7066, 3390,
-
-     3395, 3463, 3390, 3398, 3396, 3406, 3518, 3405, 3414, 7075,
-     3416, 3444, 7078, 3446, 7081, 7085,12042, 7088, 3454, 3458,
-     3523,12042, 3521,12042, 7091, 7094, 7100, 3465, 3506, 3499,
-     3497, 3530, 7110, 7113, 3523, 7121, 7128,12042, 7131,12042,
-     3520, 3527, 7134, 3544, 7139, 7158, 7143, 7152, 7166, 7174,
-     7177, 7180, 3612,12042, 3610,12042, 7183, 3569, 7186, 3570,
-     7201,12042, 7204, 7207, 7215, 7222, 7227, 7230,12042,12042,
-     7241, 7246, 7254, 7259, 7262,12042, 7265, 7268, 3631, 3630,
-     3644, 7272,12042, 3570, 3604, 7277, 3595, 3609, 3639, 7281,
-     7292, 3795, 4026, 3631, 3665, 3687, 3686, 3696, 3713, 3691,
-
-     3701, 3700, 3704, 3721, 7300, 3679, 3691, 3688, 3694, 3694,
-     3699, 3701, 3716, 3712, 3724, 3723, 3720, 3724, 3743, 7303,
-     3754, 7306, 7309,12042, 3748, 7312,12042,12042, 7315, 7319,
-     7333, 3750, 3770, 3779, 7336, 3775, 7339,12042,12042, 3797,
-     7347, 7354, 3785, 7365, 7368, 7371, 7379, 7386,12042,12042,
-     7397,12042, 7400,12042,12042, 7408, 7411, 7416,12042,12042,
-     7419, 7422, 7430, 7437, 7441, 3835, 4268, 7449,12042, 7455,
-     7458, 7468,12042,12042, 7464, 7478, 7486, 7489, 7497,12042,
-     3878, 3870, 3910, 3803, 7500, 3842, 3846, 3850, 7505, 7509,
-     3865, 3868, 3951, 3884, 3889, 4000, 3867, 3916, 3916, 3914,
-
-     3921,12042, 3940, 3928, 3939, 3945,12042, 7523, 3927, 3954,
-     3941, 3956, 3964, 3970, 3953, 3964, 3964, 3978, 4002, 4008,
-     3992, 7526, 4012, 7529, 7532, 7535, 7538, 7553,12042,12042,
-     7561,12042, 4035, 4027, 7564, 7567, 7585, 7571, 4042, 7593,
-    12042,12042, 4046, 7601, 7604, 7612,12042,12042, 7620, 7623,
-     7631, 7634, 7638, 7642,12042,12042, 7652, 7656, 7664, 7670,
-     4060, 4061, 4071, 4074, 4075, 4079, 7678, 7682, 7690, 4112,
-     4193, 7701,12042,12042, 4152, 4120, 7709, 4065, 7575, 7712,
-     4051, 4073, 7715,12042,12042, 4121, 4109, 4111, 4119, 4127,
-     4126, 4145, 4171, 7723, 4161, 4180, 4198, 4191, 4181, 4208,
-
-     4236, 4225, 7730, 4180, 4185, 4201, 4249, 4250, 4204, 4198,
-     4200, 4226, 4286, 4287, 4239, 4247, 7733, 7736, 7741, 7744,
-     7750, 4248, 7762,12042,12042, 4257, 4252, 7770, 7773, 7781,
-    12042,12042, 7789, 7793, 4247, 4268, 7801,12042,12042, 7809,
-    12042,12042, 7817, 7820, 7823, 7831, 7838, 4339, 4364, 7849,
-     4392, 4397, 4280, 4303, 4334, 4298, 4309, 4336, 7857, 7860,
-     4326, 4331, 4332, 4337, 4356, 7863, 7869, 7872, 7882, 7891,
-     7894, 7897, 4344, 4355, 4357, 4346, 4366, 4376, 4379, 4367,
-     7903, 7906, 4378, 4388,12042, 4393, 4400, 4424,12042, 4425,
-     7914, 4405, 4391, 4456,12042,12042, 4415, 4415, 4405, 4466,
-
-    12042,12042, 4424, 7917, 7921, 7927, 7933,12042,12042, 4428,
-     4435, 4444, 7942,12042,12042, 7950,12042,12042, 7958, 4445,
-     7961, 7964,12042,12042, 7972, 4469, 4486, 4477, 4492, 4484,
-     4495, 4499, 4511, 4503, 4514,12042, 4507, 4519,12042, 7981,
-    12042, 7984, 4520, 4512, 4526, 4529, 4553, 7990, 7993, 8012,
-     8037, 8084, 8003, 8020, 8023, 4544, 4565, 4568, 4536, 4559,
-     4577, 4578, 4552, 8027,12042,12042, 4588, 4566, 4573, 4602,
-     4580, 4586, 8048, 4561, 4563,12042, 4573, 4582, 4583,12042,
-     4594, 8057, 8060,12042, 4592, 4598, 4609, 8063, 8067, 4601,
-     8075, 8104, 8095, 8113, 4664, 4632, 4675, 4651, 4686, 4654,
-
-     4698, 4669, 4708, 4709, 4714, 4715, 8121, 4720, 4687, 4724,
-     4694, 4730, 8130, 4760, 4765, 8150, 8197, 4722,12042,12042,
-     4699, 4751,12042,12042, 4737,12042, 4781, 4782,12042, 4784,
-     4785, 8124,12042, 4794, 4753, 4800, 4802, 4764, 4805, 4766,
-     4770, 4752, 8170, 4804, 4893, 4779, 8178,12042,12042, 8186,
-     4903, 4906,12042, 4834,12042, 4833,12042, 4839,12042, 4841,
-    12042,12042,12042,12042, 8143,12042,12042, 4844,12042, 4845,
-     4851, 4871, 4853, 4863, 5045, 4867, 8208, 4878, 4868, 4881,
-     4872,12042,12042,12042,12042,12042, 4916,12042,12042, 4890,
-    12042, 8217, 8220, 8223, 4944, 4886, 4962, 4910, 8228, 5088,
-
-     4915, 5122, 4928,12042,12042,12042,12042, 4923, 4929, 8231,
-     4963, 4949, 4973, 8246, 4985, 4984, 5004, 5004,12042, 4979,
-    12042, 4980, 8250, 8253, 8261, 8268, 8279, 8282, 5015, 5024,
-     5036, 5028, 5036, 5070, 8290, 8298, 5053, 5062, 5074, 5058,
-     5068, 5091, 5078, 5081, 8293, 5106,12042, 5100,12042, 5109,
-     5101, 5103, 8308,12042,12042, 8316,12042,12042, 8324, 5128,
-     5139, 5124, 5142, 5139, 5143, 5151, 5148, 8332,12042,12042,
-     5161, 5168, 5170, 5183, 5188, 5188, 5238, 5238, 5242,12042,
-     5243, 5242, 5196, 5198, 5242, 5236, 5245, 5239, 5243, 5253,
-     5255, 5264, 5271, 5271, 5269, 5276, 5280, 5278, 5284, 5288,
-
-    12042,12042, 5323,12042,12042, 5265, 5267, 5287, 5319, 5304,
-     5327, 5314, 5311, 5329, 5322, 5320, 5348, 5337, 5338, 5356,
-     5352, 5354, 5373, 5408, 5401, 5404, 5377, 5378, 5382, 5382,
-     5404, 5394, 5437, 5419, 5409, 5440, 5426, 5423, 5460, 5441,
-     5439, 5469, 5474,12042,12042, 5449, 5465, 5463, 5479, 5501,
-     5475,12042, 5511, 5489,12042, 5517, 5492,12042, 5517, 5511,
-    12042, 5574, 5519, 5537, 5536, 5550,12042, 5555,12042, 5557,
-    12042, 5562,12042, 5566, 8340, 5574, 5597, 5590, 5608, 5577,
-     5582, 5584, 5595, 8343, 5634,12042, 5638,12042, 5643, 5641,
-     5646, 5645, 5669, 5690,12042,12042,12042,12042,12042,12042,
-
-     5677, 5747, 5820, 5829, 5799, 5826, 5639, 5665, 5670, 5864,
-     5890, 5926, 5744, 5895, 5900, 5932, 5797, 5898, 5849, 5924,
-     5957, 5975, 5960, 5981, 5948, 5978, 5949, 6036, 6046, 6054,
-     6074, 6076, 6113, 6115, 5991, 6057, 6116, 6133, 5976, 6078,
-     6178, 6191, 6150, 6153, 5678, 6124, 6188, 6290, 6200, 6206,
-     6020, 6105, 6231, 6307, 6308, 6334, 6341, 6370, 6232, 6392,
-     6350, 6371, 6400, 6406, 5989, 6184, 6312, 6432, 6399, 6413,
-     6431, 6451, 6438, 6486, 6314, 6516, 6500, 6505, 6079, 6429,
-     6538, 6558, 5818, 5828, 8351, 8354,12042,12042, 8374, 8383,
-     8392, 8401, 8410, 8419, 8428, 8437, 8446, 8455, 8464, 8473,
-
-     8482, 8491, 8500, 8509, 8518, 8527, 8536, 8545, 8554, 8563,
-     8572, 8581, 8590, 8599, 8608, 8617, 8626, 8635, 8644, 8653,
-     8662, 8671, 8680, 8689, 8698, 8707, 8716, 8725, 8734, 8743,
-     8752, 8761, 8770, 8779, 8788, 8797, 8806, 8815, 8824, 8833,
-     8842, 8851, 8860, 8869, 8878, 8887, 8896, 8905, 8914, 8921,
-     8928, 8935, 8942, 8949, 8956, 8963, 8970, 8977, 8984, 8991,
-     8998, 9005, 9012, 9019, 9026, 9033, 9040, 9047, 9054, 9061,
-     9068, 9075, 9082, 9089, 9096, 9103, 9110, 9119, 9126, 9131,
-     9138, 9143, 9150, 9155, 9162, 9167, 9174, 9179, 9186, 9191,
-     9198, 9203, 9210, 9215, 9222, 9227, 9234, 9239, 9246, 9251,
-
-     9258, 9263, 9270, 9275, 9282, 9287, 9294, 9299, 9306, 9311,
-     9318, 9323, 9330, 9335, 9342, 9347, 9354, 9359, 9366, 9371,
-     9378, 9383, 9390, 9395, 9402, 9407, 9414, 9419, 9426, 9431,
-     9438, 9443, 9450, 9455, 9464, 9470, 9477, 9485, 9492, 9500,
-     9507, 9515, 9522, 9530, 9537, 9545, 9552, 9560, 9567, 9575,
-     9582, 9590, 9597, 9605, 9612, 9620, 9627, 9635, 9642, 9650,
-     9657, 9665, 9672, 9680, 9688, 9696, 9703, 9711, 9718, 9726,
-     9733, 9741, 9748, 9756, 9764, 9772, 9780, 9788, 9795, 9803,
-     9811, 9819, 9827, 9835, 9842, 9850, 9857, 9865, 9873, 9880,
-     9888, 9897, 9903, 9910, 9918, 9926, 9934, 9942, 9950, 9957,
-
-     9965, 9972, 9980, 9987, 9995,10002,10010,10017,10025,10033,
-    10041,10049,10057,10064,10072,10080,10088,10096,10104,10111,
-    10119,10126,10134,10141,10149,10156,10164,10171,10179,10186,
-    10194,10201,10209,10216,10224,10231,10239,10247,10254,10262,
-    10269,10277,10284,10292,10300,10307,10315,10324,10333,10340,
-    10348,10356,10363,10371,10378,10386,10393,10401,10408,10415,
-    10423,10430,10438,10446,10453,10461,10468,10476,10484,10492,
-    10499,10507,10515,10523,10530,10538,10545,10553,10560,10568,
-    10575,10583,10590,10598,10605,10613,10620,10628,10636,10643,
-    10651,10658,10666,10674,10682,10690,10698,10706,10715,10724,
-
-    10731,10739,10747,10754,10762,10769,10777,10784,10792,10799,
-    10806,10814,10821,10829,10837,10845,10853,10860,10868,10876,
-    10883,10891,10899,10907,10914,10922,10929,10937,10944,10952,
-    10959,10967,10974,10982,10990,10998,11005,11013,11021,11029,
-    11037,11044,11052,11060,11068,11076,11085,11094,11102,11110,
-    11118,11125,11133,11140,11148,11156,11164,11172,11180,11188,
-    11196,11204,11212,11220,11227,11235,11242,11250,11258,11266,
-    11273,11280,11288,11295,11303,11310,11317,11325,11332,11340,
-    11347,11355,11363,11371,11378,11386,11394,11402,11411,11420,
-    11428,11436,11443,11450,11458,11466,11474,11482,11490,11497,
-
-    11505,11512,11520,11528,11535,11542,11550,11557,11565,11572,
-    11579,11586,11594,11601,11609,11617,11625,11633,11641,11649,
-    11657,11666,11675,11683,11691,11698,11706,11714,11722,11730,
-    11738,11745,11753,11760,11768,11776,11783,11790,11798,11806,
-    11814,11821,11828,11836,11844,11852,11860,11868,11876,11884,
-    11892,11901,11910,11918,11925,11932,11940,11948,11956,11963,
-    11971,11978,11987,11996,12005,12014,12023,12032
+     1406, 1409, 1413, 1416, 1471, 1474, 1477, 1481, 1921, 1988,
+     1538, 1541, 2055, 2122, 1544, 1548, 2189, 2246, 1605, 1608,
+     2303, 2363, 1611, 1615, 2423, 2490, 1618, 1667, 1670, 1673,
+     1677, 1680, 1729, 1732, 2557, 2624, 1735, 1739, 1742, 1798,
+     1801, 1804, 1808, 1811, 2691, 2758, 1941, 1944, 1947, 1951,
+
+     1954, 2008, 2011, 2014, 2825, 2882, 2018, 2021, 2939, 3006,
+     2075, 2078, 2081, 2085, 2142, 2145, 2148, 2152, 3073, 3140,
+     2209, 2212, 2215, 2219, 2266, 2269, 2272, 2276, 3207, 3274,
+     2323, 2326, 2329, 2333, 2336, 2383, 2386, 2389, 3341, 3411,
+     2393, 2396, 3481, 3538, 2443, 2446, 2449, 2453, 2456, 2510,
+     2513, 2516, 3595, 3665, 2520, 2523,    0,    0, 8394,12107,
+    12107,   95,  100,   29,   41,12107,  103,   51,12107,12107,
+     8379,12107,12107, 8368,12107, 8382, 8378,  202,12107,12107,
+    12107,12107, 8376, 8370, 8324,  153,12107,  161, 8350,    0,
+      145,12107, 8315,12107,  165, 3731,   73, 2530,  315,  357,
+
+     8343, 8290,12107,  168, 8332,    0,  152,12107, 8287,12107,
+      261, 8331,   31,12107,  266, 8321,    0,  245,12107, 8283,
+     8286, 8280,  421, 8285,12107,  269, 8306,    0,  340,12107,
+     8272, 8271,  271, 8262,  238,12107,  441,  484,12107,  504,
+     8290,    0,  401,12107, 8246, 8248, 8237,12107,  561,  548,
+    12107,  571, 8282,    0,  481,12107, 8226, 8210,12107,  628,
+     3795, 8208,  163, 2532,  567,  206,   38, 8247,  954, 2523,
+      639,  907,  437,   79,12107,  634, 8238,    0,  546,12107,
+     8193, 8199, 8187, 8191,12107,  638,  313,  368,12107,  697,
+     8223,    0,  549,12107, 8179, 8188, 8158,12107,  704,  426,
+
+      497,12107,  707, 8210,    0,  747,12107, 8177, 8177,12107,
+      767,  753,12107,  773, 8205,    0,  757,12107, 8165, 8140,
+    12107,  831,  818,12107,  838, 8188,    0,  758,12107, 8137,
+     8142, 8151, 8139, 8132,12107,  841,  559,  825,  530,12107,
+      906, 8174,    0,  815,12107, 8137,12107,  914,  891,12107,
+      977, 8165,    0,  953,12107, 8120, 8125, 8112,12107,  981,
+      965,12107, 1021, 8154,    0,  966,12107, 8095,  203, 8097,
+     8094,  378,   85,  311,  972,12107, 1040,  564,  814,12107,
+     1044, 8120,    0, 1032,12107, 8068, 8085, 8069,  157, 8064,
+     8043,12107, 1048, 1086,12107, 1106, 8080,    0, 1033,12107,
+
+     8029, 8022, 8022, 8032, 8033, 8014, 8008,12107, 1111, 1099,
+    12107, 1114, 8053,    0, 1100,12107, 8005, 8013,12107, 1156,
+     1160,12107, 1173, 8043,    0, 1157,12107, 8006, 8002, 7997,
+    12107, 1180, 1228,12107, 1183, 8024,    0, 1158,12107, 7994,
+     7985, 7987,   15,12107, 1186,  899,  963,12107, 1241, 8014,
+        0, 1225,12107, 7956,  181,12107, 1248, 1294,  432,  303,
+    12107, 1305, 8002,    0, 1226,12107, 7953, 7944,  299,12107,
+     1309, 1224,  350,12107, 1365, 7994,    0, 1293,12107, 7951,
+     7954,12107, 1368, 1352,12107, 1372, 7985,    0, 1360,12107,
+     7936, 7932,12107, 1376, 1426,  676,12107, 1433, 7977,    0,
+
+     1418,12107, 7925, 7920, 7913,12107, 1438, 1436,  685,12107,
+     1503, 7958,    0, 1423,12107, 7907, 7905, 7910, 7894, 7887,
+    12107, 1507, 1504,  560, 1007,12107, 1510, 7932,    0, 1428,
+    12107, 7895,12107, 1568, 1622,12107, 1574, 7914,    0, 1482,
+    12107, 7881,12107, 1577, 1229, 1291,12107, 1635, 7902,    0,
+     1496,12107, 7869, 7870,12107, 1638, 1623, 1697,  677, 7842,
+    12107, 7903, 7891,12107,12107,12107, 1690,  253, 7842, 7840,
+     7834, 7882, 7836,12107,    0, 7829, 7829, 7843, 7815,  104,
+     1037, 7815, 7811, 7809, 7809,  889, 1636, 1105, 7797, 7797,
+     1383, 1297, 7814, 1500, 7789, 1698, 7779, 1705, 1710, 1767,
+
+    12107,    0, 7783, 7778,12107,    0, 7774, 2088, 7766,  666,
+     7759, 7805,12107,    0, 7761, 2155, 7750, 7771, 7752, 7754,
+     7742, 7736, 7721,12107,    0, 7732, 7712, 7724, 7703,12107,
+        0, 2222, 7697, 7743, 7723,  172, 7696, 7692, 7696, 1768,
+     1567, 7684, 1778, 7704,  707,  724,  814,  841, 1629, 1783,
+     1710,  888,12107,    0, 7680, 2279, 7688, 7661, 7667,12107,
+        0, 7667, 2582, 7664, 7659,12107,    0, 2588, 7656, 7653,
+    12107,    0, 7651, 7644, 7635,12107,    0, 7646,  373, 2644,
+     7622, 7635, 7626,  897,12107,    0, 7616, 7621,12107,    0,
+     7603, 2647, 2650, 7610,12107,    0, 7616, 7615, 2653, 7591,
+
+     2656, 7582, 7588, 7584, 7566, 7573, 7573, 7554, 7569, 7568,
+     7561, 7562,12107,    0, 2711, 2714, 7543, 7539, 7534, 7533,
+     7530, 7530,12107,    0, 7530, 7527, 7508, 2717, 7494, 7490,
+     7510, 7487,12107,    0, 7487, 2720, 7478,12107,    0, 7479,
+     2723, 7460, 7470,12107,    0, 7457, 2778, 7445, 7462, 7458,
+     7442,12107,    0, 7433, 7443, 7420, 7407, 7415,12107,    0,
+     7402, 7414, 7410, 7398, 7436,12107,    0, 7390, 2781, 7391,
+    12107,    0, 7382, 7392, 7391,12107,    0, 7362, 7381, 7375,
+     7374,12107,    0, 7357, 7350, 7352, 7363, 7360, 7334, 7331,
+    12107,    0, 7335, 7343,12107,    0, 2784, 7338,12107,    0,
+
+     2787, 7304, 7298, 7335, 7344, 1537, 7291,12107, 1960,    0,
+     7287, 7279, 7307, 7302, 7255,12107, 7267, 7244, 2791, 2845,
+     1980, 7251, 7252, 7228, 7237, 7216, 7218, 7210, 7210, 7215,
+     7203, 7194, 7194, 7207, 7210, 7194, 7194, 7170, 7175, 7182,
+     7168, 7160, 2047, 7167, 7146, 7158, 7151, 7129, 7142, 7133,
+     2848, 2853, 7130, 2805, 2038, 7119, 7150, 2856, 2859,12107,
+     7119, 2904, 2174, 2907, 7109, 2914, 7108, 7112, 7092, 2910,
+     2917, 7075, 7079, 7079, 2959, 2967, 2970, 2353, 7060, 2973,
+     3026, 2413, 7053, 7039, 7032, 7029, 7033, 7019, 7000, 7004,
+     2473, 7001, 6996, 6980, 6979, 6969, 2978, 2608, 6980, 6979,
+
+     3034, 3037, 6953, 3040, 2675, 6966, 3046, 3094, 3097, 2745,
+     6965, 3104, 3107, 6961, 6960, 3119, 3162, 6951, 6941, 6952,
+     3165, 2812, 6934, 6914, 3169, 3173, 6911, 6911, 6924, 3176,
+     3235, 6907, 3228, 2992, 3231, 3058, 3238, 3242, 6905, 2050,
+     3294, 3127, 6906, 3298, 3195, 3304, 6897, 6885, 6887, 6884,
+     6873, 6861, 6861, 6853, 6865, 3307, 3312, 3361, 3364, 3372,
+     3375, 3390, 3444, 3449, 3452, 3457, 3502, 3511, 6856,   37,
+     6836, 3431, 3393, 3514, 6847, 6831, 3517, 3566, 6828, 3559,
+     3401, 3562, 3569, 6841, 3572, 3434, 6838, 3618, 3641, 6831,
+     3621, 3463, 6829, 6785, 6781, 3626, 3631, 3645, 3689, 3694,
+
+     3697, 3700, 6783, 3712, 3722, 3725, 3735, 3703, 3730, 6787,
+     3743, 3471, 3755, 3763, 3774, 3799, 3802, 3806, 3809, 3821,
+     3828, 3833, 3862, 6787, 6765, 6772, 6776, 6747, 3865, 3872,
+     6757, 6722, 3887, 3891, 3839, 3651, 3894, 3897, 3868, 3900,
+     6711, 3916, 3919, 6759,12107,12107, 1070, 6717,12107, 6755,
+     6754, 6693,12107,12107, 6691, 6684, 6669, 3922, 3925,12107,
+     3928, 1704, 6662, 6650, 6658, 6659, 6650, 6636, 6644, 1837,
+     6629, 6631, 6629, 6624, 6622, 6617, 6607,  446, 6619, 6601,
+     6602, 6615, 6602, 6603, 2240, 6596, 6581, 6583, 6575, 1510,
+     6589, 3947, 3950, 3959,12107, 3969, 3965, 3972,12107,12107,
+
+     3984, 6613, 3988, 3991,12107, 3994, 6561, 3998,12107,12107,
+     4013, 4019, 4027, 4031, 4035, 6574, 4049, 6571, 4052, 4055,
+    12107, 4058, 6569, 4061, 6567, 4067, 4079,12107, 4082, 4086,
+    12107,12107, 6562, 4094, 4101,12107, 4104, 6554, 6553, 6555,
+     2297, 6535, 6542, 1772, 6524, 6524, 6536, 6535, 6505, 6503,
+     6509, 4107,12107,12107, 6501, 4115, 4123, 4126,12107, 4133,
+     6502, 4136,12107,12107, 6523, 4145, 4148,12107, 4152, 4155,
+    12107,12107, 4167, 4171, 4174,12107, 4177, 4180, 4186, 4198,
+     4204,12107, 4207, 6492, 6498, 4210, 4217,12107,12107, 6479,
+     6487, 4228, 4231,12107, 4234, 6477, 6470, 4237, 4240, 4259,
+
+    12107, 4262, 4255, 4267,12107,12107, 4281,12107,12107, 4289,
+     4292,12107, 4295, 6471, 6459, 6479, 6471, 4301,12107,12107,
+     4314, 4317,12107,12107, 4325, 4332, 6457, 6462, 6445, 6452,
+     6457, 6453, 6442, 6440, 6435, 4343, 4346,12107, 4349, 4352,
+    12107,12107, 4368,12107,12107, 4376, 4379, 6424, 6428, 6432,
+     6425, 4387, 4390,12107, 4394, 6420, 6417, 6408, 6412, 4397,
+    12107,12107, 4409, 4413, 6397, 6408, 4421, 4427,12107, 4430,
+     6391, 4433,12107,12107, 4449, 4452,12107, 4455, 6369, 4458,
+    12107,12107, 6373, 4474, 4477,12107, 4482, 6363, 4486,12107,
+    12107, 6367, 6370, 6369, 4496, 4501,12107, 4505, 4508, 4511,
+
+     4526, 4532, 6368, 4540, 4544,12107, 4548, 6360, 4551, 4569,
+     6340, 6339, 4555, 4577, 6351, 4585, 4588,12107, 4591, 6350,
+     4594,12107,12107, 4610, 4616,12107, 4619, 4622, 4625, 4640,
+     4643, 4651, 4658,12107, 4662, 4665, 4670, 6333, 6332, 4683,
+     4686, 4694, 4697,12107, 4701, 6323, 4704, 6335, 6293, 6268,
+     4707, 4716,12107, 4726, 6262, 6275, 4729, 4735,12107, 4738,
+     4741,12107,12107, 4749, 4757,12107, 4760, 4764,12107,12107,
+     6265, 4772, 4779,12107, 4782, 1099, 4792,12107,12107, 6286,
+     6285, 6246, 6157, 4801, 6137, 6143, 6151, 6131, 6079, 6071,
+     6028, 2482, 2485, 6015, 2616, 6002, 5976, 2619, 5880, 5856,
+
+     2683, 5844, 5798, 5799, 5794, 5766, 5707, 5705, 5663, 5607,
+     2686, 5544, 5517, 4804, 4822, 4807, 4813, 4831, 5466, 5491,
+     4839, 5441, 4844,12107,12107, 4852, 4859, 4870,12107,12107,
+       17, 4878, 4882,   36, 4890,  132, 4896, 4899, 4909, 4914,
+      256, 4816,12107,  313,  349,  338, 2753, 3067, 3532, 3000,
+      393,  429,  432,  460,  497,  503,  556, 4917, 4920, 4923,
+     4941,  581,  632, 4944, 4947, 4950, 4965, 4968, 4971,  633,
+     4979,  680,  698, 4986, 4989, 4998, 5009, 5012,  699,  746,
+     5016, 5020, 5034, 5037, 5041, 5049,  772, 5056,  756,  782,
+     5059, 5062, 5070,12107,12107,  793,  843, 5079,  825,  853,
+
+      854,  968,  983,  961, 5082, 5085,12107,12107, 5093, 5097,
+     5101, 5104, 5107, 1043, 5111, 1027, 1065, 5122,12107,12107,
+     5132, 1118, 5135, 1116, 5138, 1150, 1171, 5141, 1177, 1218,
+     1233, 5144, 5150, 5169,12107,12107, 5177,12107,12107, 1228,
+     5164, 4559, 5185,12107,12107, 1234, 1254, 5193,12107,12107,
+     1263, 5201, 1314, 5208, 5211,12107,12107, 5220,12107,12107,
+     5231, 5234,12107,12107, 1331, 1363, 5243,12107,12107, 5251,
+     1365, 5254, 5257, 1357, 1369, 1399, 5266, 1389, 5272, 5275,
+     5279, 5285, 5290, 1538, 1447, 5294,12107, 1462,12107,12107,
+     1425, 1428, 5299, 1423, 1440, 1471, 1487, 1502, 1531, 1546,
+
+     3100, 1564, 1573, 3265, 1594, 3269, 1597, 3322, 1600, 1619,
+     3332, 1626, 3521, 1635, 5303, 1642, 1664, 1687, 1695, 1697,
+     3336, 1685, 5309, 5318,12107,12107, 5326, 5332,12107,12107,
+     1710, 1729, 5346, 1703, 5356,12107,12107, 1712, 5365,12107,
+    12107, 1704, 5373, 1707, 5376, 2841, 2955, 5384, 5388, 5398,
+     1722, 1726, 1746, 1750, 3590, 1758, 3768, 5402, 5405, 1782,
+     1775, 1778, 5408, 5411, 1869, 5418, 5421, 5429,12107,12107,
+     5437, 1884, 5440, 5443, 5446,12107,12107, 5458, 5463,12107,
+    12107, 5477, 5480, 1910, 1899, 5485,12107,12107, 5495, 5499,
+     5508, 5513, 1909, 5521, 5526, 1915, 5529,12107,12107, 5540,
+
+    12107, 5545,12107,12107, 5553, 1916, 5559, 5562, 5572, 1904,
+     5577,12107,12107, 1910, 1928, 5585, 5590, 5603, 1920, 1938,
+     1949, 1965, 5606, 5609, 5612, 5615, 5624, 5630, 5633, 5636,
+     1977, 5642, 5651, 5660, 1966, 5663, 5666, 1976, 5681, 1969,
+     5684, 1981, 1964, 5689, 1991, 1980, 2016, 5692, 5704, 2032,
+     5712, 2028, 5715, 2044, 5719, 5722, 5725, 5743, 2040, 5746,
+     5749, 5752, 5755, 5758, 2035, 5773,12107,12107, 2051, 2049,
+     2043, 5781, 2061, 5784, 5793, 5802, 5807, 5811, 5815, 5829,
+     2101, 2100, 2167,12107, 2050, 5833, 5836, 2065, 2091, 2099,
+     2143, 2096, 2101, 5839, 2118, 2131, 2117, 5842, 2133, 2139,
+
+     2161, 5851, 5855, 5858, 2176, 5863, 2180, 5866, 5869, 2164,
+     2168, 2185, 2172, 5872, 2194, 5875, 2211, 2255, 5878, 2222,
+     5881, 2229, 5884, 5887, 2266, 2253, 2312, 2255, 2273, 2260,
+     2372, 2266, 5899,12107,12107, 5890, 5909, 2266, 2281, 2323,
+     2289, 5912, 5915, 2295, 2381, 2383, 5918, 5927,12107,12107,
+     5921, 5940, 5944, 5947, 5958, 5962, 5965, 5968, 5977, 2295,
+     2309, 5983,12107,12107, 5992, 2343, 2370, 2351, 6000,12107,
+     6003, 2357, 6007, 2361, 6012,12107,12107, 6020, 6026, 2365,
+     2391, 2395, 6034,12107,12107, 6042, 6045, 6053, 2405, 2415,
+     2408, 6056, 6060, 6074, 6077,12107,12107, 6085, 6089, 6097,
+
+     6103, 6106, 6115, 2409, 6122,12107,12107, 6130, 6134, 2419,
+     6142,12107,12107, 2415, 6150,12107, 2429, 6153, 2413, 6156,
+     6159, 2414, 6162, 2458, 6174, 2485, 2493, 2473, 6182,12107,
+     2475, 6185, 2467, 6188, 6191, 6209, 6212, 2486, 6221, 2483,
+     6227, 6230, 6233, 6236, 6251, 6254, 6262, 2486, 2488, 2482,
+     2496, 6265, 2493, 6270,12107,12107, 6284, 6288, 6292,12107,
+    12107, 6303,12107, 2573, 2772, 2536, 2518, 6307, 6310, 6318,
+     6331, 2512, 2530, 2549, 2532, 6337, 6342, 6345, 2535, 6348,
+     2543, 2553, 2547, 6351, 6354, 6357, 6360, 2550, 6363, 6366,
+     6369, 6372, 6375, 6378, 2552, 6383, 2559, 2594, 6386,12107,
+
+     2595, 6390, 6393, 2613, 6408, 6411, 6414, 2630, 2628, 2628,
+     2638, 2631, 2645, 2643, 2643, 2672, 2685, 6422, 6429, 6435,
+     6443, 2676, 2692, 2669, 2672, 6447, 6450, 6453, 6456, 6464,
+     6467, 6472, 6485,12107,12107, 6493, 6498,12107, 6501,12107,
+    12107, 6512, 2675, 2672, 2717, 2718, 2681, 2697, 6517, 2714,
+     6520,12107,12107, 2734, 2738, 2751, 6532,12107,12107, 6540,
+     6545, 2749, 2738, 2752, 6554,12107,12107, 6562, 6566,12107,
+    12107, 6574, 6577, 6585,12107,12107, 6593, 2757, 6596,12107,
+    12107, 2751, 2760, 2754, 6604, 2785, 6607, 6612, 6627, 2797,
+     6630, 6633, 2800, 2802, 2840, 2897, 2809, 2829, 6642,12107,
+
+     2819, 6648,12107,12107, 6661,12107,12107, 2847, 6656, 2842,
+     6670, 6675, 6678,12107,12107, 6690,12107,12107, 6698, 6702,
+     6708, 6712, 6720, 6726, 2854, 6730, 6733, 6738, 3069, 2916,
+     6741, 6745,12107,12107, 6753, 6760, 6763, 6766, 2861, 2862,
+     6772, 6780, 2876, 6783, 6786, 6792, 6795, 6798, 6801, 2870,
+     2893, 6804, 6807, 6813, 6816, 2902, 6819, 2897,12107, 6822,
+     6825,12107,12107, 6833, 6840,12107, 6844,12107,12107, 2942,
+     2928, 2964, 2967, 2974, 2980, 2982, 3005, 3000, 3008, 6852,
+     6855, 5765, 6838, 6864, 6867, 2969, 2976, 2988, 6872, 2983,
+     6875,12107,12107, 6883, 6886,12107,12107, 6894, 6902, 2998,
+
+     3003, 3036, 3062, 3045, 3086, 3059, 6905, 6908, 3056, 3062,
+     3061, 3131, 6914,12107,12107, 6922, 3063, 3081, 6930, 6933,
+    12107,12107, 6941, 3078, 3084, 3085, 3103, 6944,12107, 6949,
+     6954,12107,12107, 6963, 6969, 6972,12107,12107, 6982, 6987,
+     3136, 3168, 3156, 3176, 6990, 3139, 6993, 3141, 7000, 6996,
+     7008, 7020, 7027, 7023, 7032, 7042, 7049, 7052, 7055, 7060,
+     7070, 7074,12107, 7077, 3270, 3186, 7082, 7089, 7085, 7096,
+     3131, 3132, 7104, 7108, 7111, 7114, 3129, 3141, 3143, 7117,
+    12107, 3150, 7120, 7123, 3191, 3206, 3203, 3217, 3208, 3219,
+     3216, 3212, 3229, 3217, 3265, 7131, 3244, 3255, 3329, 3255,
+
+     3262, 3269, 3274, 3410, 3294, 3312, 7140, 3308, 3314, 7143,
+     3310, 7146, 7150,12107, 7153, 3317, 3319, 3384,12107, 3391,
+    12107, 7156, 7159, 7165, 3333, 3358, 3346, 3356, 3390, 7175,
+     7178, 3381, 7186, 7193,12107, 7196,12107, 3374, 3377, 7199,
+     3378, 7204, 7223, 7208, 7217, 7231, 7239, 7242, 7245, 3443,
+    12107, 3453,12107, 7248, 3404, 7251, 3418, 7266,12107, 7269,
+     7272, 7280, 7287, 7292, 7295,12107,12107, 7306, 7311, 7319,
+     7324, 7327,12107, 7330, 7333, 3557, 3510, 3563, 7337,12107,
+     3438, 3455, 7342, 3446, 3459, 3473, 7346, 7357, 3726, 3908,
+     3466, 3502, 3532, 3555, 3559, 3582, 3560, 3589, 3594, 3605,
+
+     3622, 7365, 3567, 3579, 3576, 3590, 3594, 3588, 3590, 3604,
+     3600, 3621, 3625, 3619, 3625, 3642, 7368, 3645, 7371, 7374,
+    12107, 3637, 7377,12107,12107, 7380, 7384, 7398, 3645, 3655,
+     3662, 7401, 3662, 7404,12107,12107, 3683, 7412, 7419, 3669,
+     7430, 7433, 7436, 7444, 7451,12107,12107, 7462,12107, 7465,
+    12107,12107, 7473, 7476, 7481,12107,12107, 7484, 7487, 7495,
+     7502, 7506, 3813, 4001, 7514,12107, 7520, 7523, 7533,12107,
+    12107, 7529, 7543, 7551, 7554, 7562,12107, 3736, 3728, 3753,
+     3681, 7565, 3707, 3717, 3728, 7570, 7574, 3746, 3758, 3792,
+     3781, 3785, 3912, 3767, 3808, 3792, 3794, 3807,12107, 3832,
+
+     3818, 3832, 3836,12107, 7588, 3813, 3822, 3810, 3824, 3833,
+     3856, 3841, 3851, 3839, 3853, 3862, 3867, 3869, 7591, 3887,
+     7594, 7597, 7600, 7603, 7618,12107,12107, 7626,12107, 3893,
+     3881, 7629, 7632, 7650, 7636, 3904, 7658,12107,12107, 3908,
+     7666, 7669, 7677,12107,12107, 7685, 7688, 7696, 7699, 7703,
+     7707,12107,12107, 7717, 7721, 7729, 7735, 3922, 3923, 3927,
+     3929, 3944, 3945, 7743, 7747, 7755, 3974, 3980, 7766,12107,
+    12107, 3999, 3990, 7774, 3930, 7640, 7777, 3938, 3941, 7780,
+    12107,12107, 3991, 3989, 3992, 4012, 4026, 4014, 4031, 4045,
+     7788, 4034, 4054, 4071, 4057, 4051, 4071, 4085, 4078, 7795,
+
+     4033, 4045, 4063, 4116, 4117, 4072, 4065, 4074, 4092, 4151,
+     4153, 4103, 4113, 7798, 7801, 7806, 7809, 7815, 4113, 7827,
+    12107,12107, 4131, 4127, 7835, 7838, 7846,12107,12107, 7854,
+     7858, 4119, 4139, 7866,12107,12107, 7874,12107,12107, 7882,
+     7885, 7888, 7896, 7903, 4210, 4232, 7914, 4233, 4279, 4152,
+     4163, 4197, 4161, 4182, 4213, 7922, 7925, 4195, 4202, 4217,
+     4223, 4232, 7928, 7934, 7937, 7947, 7956, 7959, 7962, 4215,
+     4227, 4247, 4241, 4246, 4262, 4264, 4261, 7968, 7971, 4273,
+     4276,12107, 4278, 4282, 4283,12107, 4292, 7979, 4272, 4262,
+     4326,12107,12107, 4285, 4286, 4272, 4333,12107,12107, 4291,
+
+     7982, 7986, 7992, 7998,12107,12107, 4300, 4302, 4303, 8007,
+    12107,12107, 8015,12107,12107, 8023, 4307, 8026, 8029,12107,
+    12107, 8037, 4329, 4341, 4332, 4347, 4339, 4350, 4348, 4360,
+     4352, 4376,12107, 4369, 4379,12107, 8046,12107, 8049, 4382,
+     4370, 4394, 4382, 4407, 8055, 8058, 8077, 8102, 8149, 8068,
+     8085, 8088, 4401, 4432, 4434, 4403, 4420, 4437, 4439, 4409,
+     8092,12107,12107, 4457, 4432, 4433, 4459, 4438, 4440, 8113,
+     4408, 4416,12107, 4430, 4425, 4427,12107, 4439, 8122, 8125,
+    12107, 4441, 4446, 4467, 8128, 8132, 4459, 8140, 8169, 8160,
+     8178, 4516, 4484, 4517, 4492, 4526, 4498, 4530, 4501, 4543,
+
+     4550, 4556, 4557, 8186, 4563, 4536, 4568, 4542, 4582, 8195,
+     4579, 4595, 8215, 8262, 4570,12107,12107, 4563, 4592,12107,
+    12107, 4571,12107, 4604, 4610,12107, 4623, 4624, 8189,12107,
+     4629, 4588, 4632, 4631, 4601, 4642, 4603, 4605, 4590, 8235,
+     4685, 4686, 4617, 8243,12107,12107, 8251, 4695, 4751,12107,
+     4669,12107, 4668,12107, 4674,12107, 4674,12107,12107,12107,
+    12107, 8208,12107,12107, 4669,12107, 4671, 4674, 4751, 4695,
+     4742, 4778, 4745, 8273, 4741, 4746, 4764, 4762,12107,12107,
+    12107,12107,12107, 4833,12107,12107, 4805,12107, 8282, 8285,
+     8288, 4808, 4762, 4829, 4768, 8293, 4836, 4771, 4842, 4772,
+
+    12107,12107,12107,12107, 4800, 4806, 8296, 4846, 4839, 4857,
+     8311, 4869, 4856, 4878, 4867,12107, 4846,12107, 4847, 8315,
+     8318, 8326, 8333, 8344, 8347, 4864, 4873, 4885, 4869, 4881,
+     4908, 8355, 8363, 4891, 4900, 4913, 4897, 4905, 4918, 4901,
+     4915, 8358, 4937,12107, 4924,12107, 4926, 4911, 4912, 8373,
+    12107,12107, 8381,12107,12107, 8389, 4957, 4967, 4939, 4945,
+     4941, 4949, 4964, 4965, 8397,12107,12107, 4967, 4975, 4971,
+     4984, 4992, 4992, 5025, 5024, 5047,12107, 5028, 5037, 4992,
+     4993, 5033, 5041, 5055, 5061, 5063, 5093, 5093, 5091, 5097,
+     5103, 5102, 5108, 5130, 5127, 5134, 5134,12107,12107, 5154,
+
+    12107,12107, 5109, 5112, 5137, 5160, 5145, 5168, 5161, 5166,
+     5183, 5179, 5177, 5194, 5188, 5186, 5205, 5194, 5198, 5216,
+     5222, 5238, 5239, 5213, 5227, 5235, 5246, 5259, 5253, 5302,
+     5283, 5278, 5307, 5292, 5286, 5319, 5300, 5294, 5323, 5317,
+    12107,12107, 5309, 5314, 5312, 5319, 5346, 5322,12107, 5347,
+     5328,12107, 5357, 5337,12107, 5363, 5340,12107, 5364, 5344,
+     5358, 5352, 5371,12107, 5390,12107, 5391,12107, 5393,12107,
+     5400, 8405, 5402, 5423, 5408, 5444, 5410, 5412, 5414, 5420,
+     8408, 5462,12107, 5461,12107, 5467, 5466, 5470, 5476, 5484,
+     5489,12107,12107,12107,12107,12107,12107, 5501, 5514, 5516,
+
+     5517, 5475, 5486, 5582, 5631, 5547, 5583, 5630, 5661, 5533,
+     5638, 5621, 5677, 5610, 5628, 5710, 5753, 5557, 5654, 5679,
+     5683, 5500, 5538, 5722, 5761, 5773, 5877, 5744, 5919, 5639,
+     5680, 5760, 5830, 5920, 5935, 5938, 5980, 5809, 5915, 5968,
+     6011, 5937, 5988, 5999, 6054, 6014, 6033, 5934, 5992, 6062,
+     6091, 6076, 6093, 6101, 6103, 6130, 6162, 6176, 6179, 6151,
+     6152, 5932, 6183, 5997, 6206, 6251, 6261, 6242, 6273, 5660,
+     6077, 6264, 6304, 6197, 6207, 5552, 6257, 6228, 6231, 5487,
+     6094, 8416, 8419,12107,12107, 8439, 8448, 8457, 8466, 8475,
+     8484, 8493, 8502, 8511, 8520, 8529, 8538, 8547, 8556, 8565,
+
+     8574, 8583, 8592, 8601, 8610, 8619, 8628, 8637, 8646, 8655,
+     8664, 8673, 8682, 8691, 8700, 8709, 8718, 8727, 8736, 8745,
+     8754, 8763, 8772, 8781, 8790, 8799, 8808, 8817, 8826, 8835,
+     8844, 8853, 8862, 8871, 8880, 8889, 8898, 8907, 8916, 8925,
+     8934, 8943, 8952, 8961, 8970, 8979, 8986, 8993, 9000, 9007,
+     9014, 9021, 9028, 9035, 9042, 9049, 9056, 9063, 9070, 9077,
+     9084, 9091, 9098, 9105, 9112, 9119, 9126, 9133, 9140, 9147,
+     9154, 9161, 9168, 9175, 9184, 9191, 9196, 9203, 9208, 9215,
+     9220, 9227, 9232, 9239, 9244, 9251, 9256, 9263, 9268, 9275,
+     9280, 9287, 9292, 9299, 9304, 9311, 9316, 9323, 9328, 9335,
+
+     9340, 9347, 9352, 9359, 9364, 9371, 9376, 9383, 9388, 9395,
+     9400, 9407, 9412, 9419, 9424, 9431, 9436, 9443, 9448, 9455,
+     9460, 9467, 9472, 9479, 9484, 9491, 9496, 9503, 9508, 9515,
+     9520, 9529, 9535, 9542, 9550, 9557, 9565, 9572, 9580, 9587,
+     9595, 9602, 9610, 9617, 9625, 9632, 9640, 9647, 9655, 9662,
+     9670, 9677, 9685, 9692, 9700, 9707, 9715, 9722, 9730, 9737,
+     9745, 9753, 9761, 9768, 9776, 9783, 9791, 9798, 9806, 9813,
+     9821, 9829, 9837, 9845, 9853, 9860, 9868, 9876, 9884, 9892,
+     9900, 9907, 9915, 9922, 9930, 9938, 9945, 9953, 9962, 9968,
+     9975, 9983, 9991, 9999,10007,10015,10022,10030,10037,10045,
+
+    10052,10060,10067,10075,10082,10090,10098,10106,10114,10122,
+    10129,10137,10145,10153,10161,10169,10176,10184,10191,10199,
+    10206,10214,10221,10229,10236,10244,10251,10259,10266,10274,
+    10281,10289,10296,10304,10312,10319,10327,10334,10342,10349,
+    10357,10365,10372,10380,10389,10398,10405,10413,10421,10428,
+    10436,10443,10451,10458,10466,10473,10480,10488,10495,10503,
+    10511,10518,10526,10533,10541,10549,10557,10564,10572,10580,
+    10588,10595,10603,10610,10618,10625,10633,10640,10648,10655,
+    10663,10670,10678,10685,10693,10701,10708,10716,10723,10731,
+    10739,10747,10755,10763,10771,10780,10789,10796,10804,10812,
+
+    10819,10827,10834,10842,10849,10857,10864,10871,10879,10886,
+    10894,10902,10910,10918,10925,10933,10941,10948,10956,10964,
+    10972,10979,10987,10994,11002,11009,11017,11024,11032,11039,
+    11047,11055,11063,11070,11078,11086,11094,11102,11109,11117,
+    11125,11133,11141,11150,11159,11167,11175,11183,11190,11198,
+    11205,11213,11221,11229,11237,11245,11253,11261,11269,11277,
+    11285,11292,11300,11307,11315,11323,11331,11338,11345,11353,
+    11360,11368,11375,11382,11390,11397,11405,11412,11420,11428,
+    11436,11443,11451,11459,11467,11476,11485,11493,11501,11508,
+    11515,11523,11531,11539,11547,11555,11562,11570,11577,11585,
+
+    11593,11600,11607,11615,11622,11630,11637,11644,11651,11659,
+    11666,11674,11682,11690,11698,11706,11714,11722,11731,11740,
+    11748,11756,11763,11771,11779,11787,11795,11803,11810,11818,
+    11825,11833,11841,11848,11855,11863,11871,11879,11886,11893,
+    11901,11909,11917,11925,11933,11941,11949,11957,11966,11975,
+    11983,11990,11997,12005,12013,12021,12028,12036,12043,12052,
+    12061,12070,12079,12088,12097
     } ;
 
-static yyconst flex_int16_t yy_def[3769] =
+static yyconst flex_int16_t yy_def[3766] =
     {   0,
-     3289, 3289, 3290, 3290, 3290, 3290, 3291, 3291, 3292, 3292,
-     3293, 3293, 3294, 3294, 3294, 3294, 3295, 3295, 3289, 3289,
-     3296, 3296, 3297, 3297, 3297, 3297, 3289, 3289, 3297, 3297,
-     3297, 3297, 3289, 3289, 3297, 3297, 3289, 3289, 3297, 3297,
-     3297, 3297, 3298, 3298, 3299, 3299, 3289, 3289, 3299, 3299,
-     3299, 3299, 3300, 3300, 3294, 3294, 3301, 3301, 3302, 3302,
-     3303, 3303, 3304, 3304, 3305, 3305, 3306, 3306, 3306, 3306,
-     3289, 3289, 3306, 3306, 3306, 3306, 3289, 3289, 3306, 3306,
-     3306, 3306, 3289, 3289, 3306, 3306, 3289, 3289, 3306, 3306,
-     3306, 3306, 3289, 3289, 3306, 3306, 3289, 3289, 3306, 3306,
-
-     3306, 3306, 3307, 3307, 3308, 3308, 3289, 3289, 3308, 3308,
-     3308, 3308, 3309, 3309, 3310, 3310, 3289, 3289, 3310, 3310,
-     3310, 3310, 3311, 3311, 3312, 3312, 3313, 3313, 3314, 3314,
-     3315, 3315, 3316, 3316, 3289, 3289, 3316, 3316, 3316, 3316,
-     3317, 3317, 3318, 3318, 3319, 3319, 3320, 3320, 3288,  149,
-     3321, 3321, 3322, 3322, 3323, 3323, 3324, 3324, 3325, 3325,
-     3326, 3326, 3327, 3327, 3328, 3328, 3329, 3329, 3330, 3330,
-     3331, 3331, 3289, 3289, 3331, 3331, 3331, 3331, 3332, 3332,
-     3333, 3333, 3289, 3289, 3333, 3333, 3333, 3333, 3334, 3334,
-     3335, 3335, 3289, 3289, 3335, 3335, 3335, 3335, 3336, 3336,
-
-     3337, 3337, 3338, 3338, 3339, 3339, 3289, 3289, 3339, 3339,
-     3339, 3339, 3340, 3340, 3341, 3341, 3289, 3289, 3341, 3341,
-     3341, 3341, 3342, 3342, 3343, 3343, 3289, 3289, 3343, 3343,
-     3343, 3343, 3344, 3344, 3345, 3345, 3346, 3346, 3347, 3347,
-     3289, 3289, 3347, 3347, 3347, 3347, 3348, 3348, 3349, 3349,
-     3289, 3289, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3350, 3288, 3288, 3350, 3288, 3288, 3288,
-      290,  290,  292,  290,  293,  293, 3288, 3288, 3288, 3351,
-
-     3288, 3288, 3351, 3288, 3288,  294,  293, 3288, 3288, 3288,
-     3352, 3288, 3288, 3352, 3352, 3352, 3288, 3288, 3288, 3288,
-     3288, 3353, 3288, 3288, 3353, 3353, 3353, 3353, 3353, 3288,
-     3288, 3288, 3288, 3288, 3288, 3354, 3288, 3288, 3354, 3354,
-     3354, 3288, 3288, 3288, 3288, 3288, 3288, 3355, 3288, 3288,
-     3355, 3355, 3288, 3288, 3288,  355,  293,  293,  294,  359,
-      358,  358,  358,  358,  359,  365,  363,  363, 3288, 3288,
-     3288, 3356, 3288, 3288, 3356, 3356, 3356, 3356, 3288, 3288,
-      293,  293, 3288, 3288, 3288, 3357, 3288, 3288, 3357, 3357,
-     3357, 3288, 3288,  293,  293, 3288, 3288, 3288, 3358, 3288,
-
-     3288, 3358, 3358, 3288, 3288, 3288, 3288, 3288, 3288, 3359,
-     3288, 3288, 3359, 3359, 3288, 3288, 3288, 3288, 3288, 3288,
-     3360, 3288, 3288, 3360, 3360, 3360, 3360, 3360, 3288, 3288,
-      293,  293,  293, 3288, 3288, 3288, 3361, 3288, 3288, 3361,
-     3288, 3288, 3288, 3288, 3288, 3288, 3362, 3288, 3288, 3362,
-     3362, 3362, 3288, 3288, 3288, 3288, 3288, 3288, 3363, 3288,
-     3288, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3288,
-     3288, 3288, 3288, 3288, 3288, 3364, 3288, 3288, 3364, 3364,
-     3364, 3364, 3364, 3364, 3288, 3288, 3288, 3288, 3288, 3288,
-     3365, 3288, 3288, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3366, 3288, 3288, 3366,
-     3366, 3288, 3288, 3288, 3288, 3288, 3288, 3367, 3288, 3288,
-     3367, 3367, 3367, 3288, 3288, 3288, 3288, 3288, 3288, 3368,
-     3288, 3288, 3368, 3368, 3368, 3368, 3288, 3288,  293,  293,
-     3288, 3288, 3288, 3369, 3288, 3288, 3369, 3369, 3288, 3288,
-      293,  363,  363, 3288, 3288, 3288, 3370, 3288, 3288, 3370,
-     3370, 3370, 3288, 3288,  363,  363, 3288, 3288, 3288, 3371,
-     3288, 3288, 3371, 3371, 3288, 3288, 3288, 3288, 3288, 3288,
-     3372, 3288, 3288, 3372, 3372, 3288, 3288,  363,  363, 3288,
-     3288, 3288, 3373, 3288, 3288, 3373, 3373, 3373, 3288, 3288,
-
-      363,  363, 3288, 3288, 3288, 3374, 3288, 3288, 3374, 3374,
-     3374, 3374, 3374, 3288, 3288,  293,  432,  293, 3288, 3288,
-     3288, 3375, 3288, 3288, 3375, 3288, 3288, 3288, 3288, 3288,
-     3288, 3376, 3288, 3288, 3376, 3288, 3288,  293,  293, 3288,
-     3288, 3288, 3377, 3288, 3288, 3377, 3377, 3288, 3288, 3288,
-     3288, 3378, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3379, 3379, 3380,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3381, 3381, 3382, 3288, 3383, 3383,
-
-     3383, 3383, 3288, 3384, 3288, 3288, 3385, 3385, 3385, 3385,
-     3385, 3385, 3385, 3385, 3385, 3386, 3288, 3387, 3387, 3387,
-     3387, 3388, 3288, 3389, 3389, 3389, 3390, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3391, 3391, 3391, 3391,
-     3391, 3392, 3288, 3393, 3393, 3393, 3393, 3394, 3288, 3395,
-     3395, 3395, 3396, 3288, 3397, 3397, 3397, 3398, 3288, 3399,
-     3399, 3399, 3399, 3399, 3399, 3399, 3400, 3288, 3288, 3401,
-     3401, 3402, 3288, 3403, 3403, 3403, 3403, 3404, 3288, 3405,
-     3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405,
-
-     3405, 3405, 3405, 3405, 3405, 3406, 3288, 3407, 3407, 3407,
-     3407, 3407, 3407, 3407, 3407, 3408, 3288, 3409, 3409, 3409,
-     3409, 3409, 3409, 3409, 3409, 3410, 3288, 3411, 3411, 3411,
-     3412, 3288, 3413, 3413, 3413, 3413, 3414, 3288, 3415, 3415,
-     3415, 3415, 3415, 3415, 3416, 3288, 3417, 3417, 3417, 3417,
-     3418, 3288, 3288, 3419, 3419, 3419, 3419, 3419, 3420, 3288,
-     3421, 3421, 3421, 3422, 3288, 3423, 3423, 3423, 3424, 3288,
-     3425, 3425, 3425, 3425, 3426, 3288, 3427, 3427, 3427, 3427,
-     3427, 3427, 3428, 3288, 3288, 3429, 3429, 3430, 3288, 3431,
-     3431, 3432, 3288, 3433, 3433, 3433, 3434, 3435, 3288, 3435,
-
-     3288, 3288, 3288, 3436, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3437, 3438, 3438, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3439, 3440, 3440, 3441, 3288, 3288, 3441,
-     3288, 3442, 3442, 3288, 3443, 3288, 3288, 3443, 3443, 3443,
-     3443, 3443, 3443, 3444, 3444, 3445, 3445, 3445, 3446, 3446,
-     3288, 3288, 3447, 3448, 3448, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3449,
-     3288, 3288, 3449, 3449, 3450, 3450, 3451, 3288, 3288, 3451,
-
-     3452, 3452, 3288, 3288, 3453, 3454, 3454, 3455, 3455, 3456,
-     3456, 3457, 3457, 3457, 3288, 3288, 3457, 3457, 3457, 3458,
-     3458, 3288, 3288, 3459, 3460, 3460, 3461, 3288, 3288, 3288,
-     3288, 3462, 3462, 3463, 3463, 3288, 3288, 3463, 3288, 3288,
-     3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463,
-     3464, 3464, 3288, 3288, 3288, 3288, 3465, 3465, 3465, 3465,
-     3465, 3466, 3466, 3467, 3467, 3467, 3288, 3288, 3467, 3467,
-     3467, 3468, 3468, 3469, 3288, 3288, 3470, 3470, 3471, 3288,
-     3288, 3471, 3472, 3472, 3473, 3288, 3288, 3473, 3473, 3473,
-     3474, 3474, 3475, 3475, 3475, 3476, 3476, 3288, 3477, 3477,
-
-     3477, 3477, 3478, 3478, 3479, 3288, 3288, 3480, 3480, 3481,
-     3481, 3482, 3482, 3483, 3483, 3483, 3484, 3484, 3485, 3485,
-     3485, 3485, 3485, 3486, 3486, 3288, 3487, 3488, 3488, 3288,
-     3288, 3489, 3489, 3288, 3288, 3490, 3491, 3491, 3492, 3288,
-     3288, 3492, 3288, 3288, 3493, 3288, 3288, 3288, 3288, 3288,
-     3288, 3494, 3288, 3495, 3288, 3495, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3496, 3288, 3497, 3288,
-     3497, 3498, 3288, 3288, 3288, 3498, 3288, 3288, 3499, 3288,
-
-     3499, 3500, 3288, 3288, 3288, 3288, 3288, 3500, 3288, 3288,
-     3500, 3500, 3500, 3288, 3501, 3288, 3501, 3502, 3502, 3502,
-     3288, 3503, 3288, 3503, 3288, 3288, 3288, 3504, 3288, 3505,
-     3288, 3505, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3506, 3288, 3288, 3288, 3506,
-     3506, 3288, 3507, 3288, 3507, 3508, 3288, 3288, 3288, 3508,
-     3288, 3509, 3288, 3509, 3288, 3288, 3288, 3510, 3288, 3511,
-     3288, 3511, 3512, 3512, 3288, 3513, 3288, 3513, 3514, 3514,
-     3514, 3288, 3288, 3288, 3514, 3514, 3514, 3288, 3515, 3288,
-     3515, 3288, 3288, 3516, 3288, 3517, 3288, 3517, 3518, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3519, 3288, 3519, 3520,
-     3520, 3520, 3520, 3288, 3288, 3288, 3520, 3288, 3288, 3288,
-     3288, 3288, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520,
-     3520, 3288, 3521, 3288, 3521, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3522, 3522, 3522, 3522, 3288, 3523, 3288,
-     3523, 3524, 3524, 3524, 3524, 3288, 3288, 3288, 3288, 3288,
-     3524, 3524, 3288, 3525, 3288, 3525, 3526, 3288, 3288, 3288,
-     3288, 3527, 3288, 3527, 3528, 3288, 3288, 3288, 3528, 3288,
-     3529, 3288, 3529, 3530, 3288, 3288, 3288, 3530, 3530, 3530,
-     3288, 3531, 3288, 3531, 3288, 3288, 3288, 3288, 3532, 3288,
-
-     3533, 3288, 3533, 3288, 3288, 3288, 3534, 3534, 3288, 3288,
-     3534, 3288, 3535, 3288, 3535, 3536, 3288, 3288, 3288, 3288,
-     3537, 3288, 3537, 3288, 3288, 3288, 3288, 3288, 3538, 3288,
-     3538, 3288, 3288, 3539, 3539, 3288, 3288, 3288, 3540, 3288,
-     3540, 3541, 3541, 3541, 3541, 3541, 3288, 3542, 3288, 3542,
-     3288, 3543, 3288, 3544, 3288, 3544, 3288, 3288, 3288, 3288,
-     3545, 3288, 3545, 3288, 3288, 3288, 3546, 3288, 3547, 3288,
-     3547, 3548, 3549, 3288, 3288, 3288, 3288, 3288, 3550, 3551,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3552, 3288, 3288, 3553, 3288, 3554, 3555, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3555, 3288, 3288, 3555,
-     3556, 3557, 3288, 3288, 3557, 3558, 3559, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3560, 3560, 3288, 3288, 3561, 3562, 3562, 3563,
-     3288, 3288, 3564, 3288, 3288, 3565, 3566, 3567, 3567, 3288,
-     3288, 3567, 3567, 3567, 3568, 3288, 3288, 3288, 3288, 3569,
-     3288, 3288, 3570, 3571, 3571, 3571, 3571, 3288, 3288, 3288,
-     3288, 3288, 3571, 3571, 3571, 3571, 3571, 3571, 3571, 3571,
-
-     3571, 3572, 3288, 3288, 3288, 3573, 3573, 3573, 3573, 3574,
-     3575, 3575, 3575, 3575, 3288, 3288, 3288, 3575, 3575, 3576,
-     3577, 3578, 3579, 3579, 3580, 3581, 3581, 3581, 3581, 3582,
-     3288, 3288, 3288, 3288, 3288, 3288, 3583, 3584, 3288, 3288,
-     3288, 3288, 3585, 3585, 3288, 3288, 3288, 3585, 3586, 3587,
-     3588, 3288, 3288, 3288, 3288, 3288, 3288, 3589, 3288, 3288,
-     3288, 3590, 3590, 3288, 3288, 3288, 3591, 3592, 3288, 3288,
-     3592, 3592, 3592, 3593, 3288, 3594, 3595, 3596, 3597, 3598,
-     3599, 3600, 3600, 3288, 3600, 3288, 3288, 3288, 3601, 3602,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3603, 3288, 3288, 3288, 3604, 3288, 3605,
-     3606, 3288, 3288, 3288, 3606, 3288, 3288, 3288, 3606, 3607,
-     3608, 3288, 3288, 3288, 3288, 3288, 3609, 3610, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3611, 3288, 3288, 3288, 3288, 3288, 3612, 3613, 3613,
-     3614, 3288, 3288, 3288, 3615, 3288, 3288, 3288, 3616, 3617,
-     3618, 3618, 3288, 3288, 3288, 3288, 3288, 3618, 3288, 3288,
-     3618, 3619, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3620, 3621, 3288, 3288, 3621, 3621, 3288, 3288,
-     3288, 3621, 3621, 3288, 3288, 3621, 3621, 3621, 3621, 3621,
-     3621, 3622, 3288, 3288, 3623, 3623, 3623, 3624, 3625, 3288,
-     3288, 3625, 3625, 3288, 3288, 3625, 3626, 3627, 3628, 3629,
-     3629, 3630, 3631, 3631, 3631, 3288, 3288, 3631, 3632, 3633,
-     3634, 3288, 3635, 3635, 3635, 3636, 3637, 3638, 3639, 3640,
-     3640, 3641, 3642, 3288, 3288, 3288, 3642, 3642, 3642, 3643,
-     3288, 3288, 3288, 3644, 3645, 3288, 3288, 3646, 3647, 3648,
-     3648, 3288, 3288, 3649, 3650, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3651, 3652, 3288, 3653, 3654, 3654, 3654,
-     3655, 3656, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3657, 3658, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3659, 3288, 3288, 3288, 3660, 3661,
-     3288, 3288, 3662, 3663, 3288, 3288, 3664, 3665, 3665, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3665, 3288, 3288,
-     3288, 3288, 3666, 3667, 3288, 3288, 3288, 3288, 3288, 3667,
-     3667, 3667, 3288, 3288, 3288, 3288, 3288, 3667, 3667, 3667,
-     3667, 3288, 3288, 3668, 3288, 3288, 3288, 3288, 3288, 3669,
-
-     3288, 3288, 3670, 3671, 3288, 3288, 3288, 3288, 3288, 3671,
-     3288, 3288, 3288, 3671, 3288, 3288, 3672, 3673, 3674, 3674,
-     3675, 3676, 3676, 3676, 3288, 3288, 3288, 3676, 3288, 3288,
-     3677, 3678, 3288, 3288, 3288, 3288, 3288, 3679, 3680, 3681,
-     3682, 3683, 3288, 3288, 3288, 3288, 3684, 3685, 3685, 3685,
-     3685, 3686, 3288, 3288, 3288, 3288, 3687, 3688, 3288, 3288,
-     3288, 3288, 3288, 3689, 3690, 3690, 3288, 3288, 3288, 3691,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3692, 3693, 3288, 3288, 3288,
-
-     3694, 3288, 3288, 3694, 3695, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3696, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3697,
-     3288, 3288, 3288, 3288, 3288, 3698, 3288, 3288, 3288, 3288,
-     3288, 3699, 3700, 3700, 3288, 3288, 3288, 3288, 3288, 3700,
-     3288, 3701, 3702, 3288, 3288, 3288, 3702, 3702, 3702, 3288,
-     3288, 3288, 3288, 3288, 3702, 3702, 3702, 3288, 3288, 3288,
-     3703, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3704,
-     3705, 3288, 3288, 3288, 3705, 3705, 3706, 3707, 3708, 3288,
-     3288, 3709, 3710, 3288, 3288, 3710, 3710, 3288, 3288, 3710,
-
-     3711, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3712, 3713, 3714, 3715, 3716, 3288, 3288, 3288, 3288, 3288,
-     3288, 3717, 3718, 3718, 3718, 3718, 3719, 3288, 3720, 3721,
-     3722, 3723, 3723, 3288, 3288, 3288, 3288, 3724, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3725,
-     3726, 3288, 3727, 3288, 3288, 3288, 3727, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3728, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3729, 3288, 3288, 3288,
-
-     3730, 3731, 3732, 3732, 3288, 3288, 3288, 3288, 3732, 3288,
-     3733, 3734, 3734, 3734, 3734, 3288, 3288, 3288, 3734, 3734,
-     3734, 3735, 3288, 3288, 3288, 3736, 3737, 3737, 3737, 3738,
-     3288, 3288, 3739, 3288, 3288, 3288, 3740, 3741, 3288, 3288,
-     3288, 3741, 3741, 3288, 3288, 3288, 3288, 3741, 3742, 3288,
-     3743, 3744, 3745, 3746, 3747, 3748, 3288, 3288, 3749, 3749,
-     3749, 3750, 3288, 3751, 3288, 3288, 3752, 3753, 3753, 3288,
-     3754, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3755, 3288, 3288, 3756, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3757, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3758, 3288, 3288, 3759, 3760, 3760,
-     3288, 3288, 3288, 3288, 3760, 3288, 3761, 3762, 3762, 3762,
-     3762, 3762, 3288, 3288, 3762, 3762, 3288, 3288, 3288, 3288,
-     3737, 3737, 3737, 3738, 3288, 3288, 3740, 3288, 3288, 3741,
-     3741, 3741, 3288, 3288, 3288, 3288, 3741, 3742, 3288, 3743,
-     3288, 3288, 3288, 3288, 3746, 3747, 3748, 3288, 3288, 3288,
-     3288, 3288, 3749, 3749, 3288, 3288, 3288, 3751, 3752, 3753,
-     3753, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3755,
-     3288, 3288, 3288, 3756, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3757, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3758, 3288, 3288, 3760, 3760, 3288, 3288, 3288, 3288,
-     3761, 3762, 3762, 3762, 3762, 3762, 3288, 3288, 3288, 3762,
-     3288, 3288, 3737, 3737, 3288, 3288, 3738, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3741, 3741, 3741, 3288, 3288,
-     3288, 3288, 3742, 3743, 3288, 3288, 3288, 3288, 3288, 3747,
-     3748, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3752, 3753, 3753, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3756, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3757, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3758, 3760, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3762, 3762, 3762, 3288, 3288, 3762, 3762, 3288,
-     3288, 3288, 3737, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3741, 3741, 3741, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3747, 3748, 3288, 3288,
-     3288, 3288, 3288, 3288, 3752, 3753, 3753, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3756, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3757, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3758, 3288,
-     3288, 3760, 3288, 3288, 3288, 3762, 3762, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3762, 3737, 3288, 3288, 3288, 3288,
-     3288, 3288, 3741, 3288, 3288, 3741, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3747, 3748,
-     3288, 3288, 3288, 3288, 3752, 3753, 3753, 3753, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3757, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3758, 3288, 3288, 3288, 3760,
-     3762, 3762, 3288, 3288, 3288, 3288, 3288, 3288, 3762, 3737,
-     3741, 3288, 3288, 3288, 3741, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3748, 3288, 3288, 3288, 3288, 3752, 3753, 3753, 3753,
-     3763, 3764, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3757, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3760, 3762, 3762, 3288, 3288, 3737,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3748, 3288, 3288, 3288,
-     3288, 3752, 3753, 3765, 3766, 3763, 3764, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3760,
-     3762, 3762, 3288, 3288, 3288, 3737, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3752, 3765, 3753, 3767, 3766, 3768, 3753, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3760, 3762, 3762, 3288, 3288, 3288, 3288, 3737, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3752,
-     3767, 3288, 3768, 3753, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3752, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3752, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3752, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3752, 3752, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3752, 3752, 3752, 3752, 3752, 3752, 3288,    0, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288
+     3286, 3286, 3287, 3287, 3287, 3287, 3288, 3288, 3289, 3289,
+     3290, 3290, 3291, 3291, 3291, 3291, 3292, 3292, 3286, 3286,
+     3293, 3293, 3294, 3294, 3294, 3294, 3286, 3286, 3294, 3294,
+     3294, 3294, 3286, 3286, 3294, 3294, 3286, 3286, 3294, 3294,
+     3294, 3294, 3295, 3295, 3296, 3296, 3286, 3286, 3296, 3296,
+     3296, 3296, 3297, 3297, 3291, 3291, 3298, 3298, 3299, 3299,
+     3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, 3303, 3303,
+     3286, 3286, 3303, 3303, 3303, 3303, 3286, 3286, 3303, 3303,
+     3303, 3303, 3286, 3286, 3303, 3303, 3286, 3286, 3303, 3303,
+     3303, 3303, 3286, 3286, 3303, 3303, 3286, 3286, 3303, 3303,
+
+     3303, 3303, 3304, 3304, 3305, 3305, 3286, 3286, 3305, 3305,
+     3305, 3305, 3306, 3306, 3307, 3307, 3286, 3286, 3307, 3307,
+     3307, 3307, 3308, 3308, 3309, 3309, 3310, 3310, 3311, 3311,
+     3312, 3312, 3313, 3313, 3286, 3286, 3313, 3313, 3313, 3313,
+     3314, 3314, 3315, 3315, 3316, 3316, 3317, 3317, 3285,  149,
+     3318, 3318, 3286, 3286, 3318, 3318, 3318, 3318, 3319, 3319,
+     3320, 3320, 3321, 3321, 3322, 3322, 3323, 3323, 3324, 3324,
+     3325, 3325, 3326, 3326, 3327, 3327, 3328, 3328, 3286, 3286,
+     3328, 3328, 3328, 3328, 3329, 3329, 3330, 3330, 3286, 3286,
+     3330, 3330, 3330, 3330, 3331, 3331, 3332, 3332, 3286, 3286,
+
+     3332, 3332, 3332, 3332, 3333, 3333, 3334, 3334, 3335, 3335,
+     3336, 3336, 3286, 3286, 3336, 3336, 3336, 3336, 3337, 3337,
+     3338, 3338, 3286, 3286, 3338, 3338, 3338, 3338, 3339, 3339,
+     3340, 3340, 3286, 3286, 3340, 3340, 3340, 3340, 3341, 3341,
+     3342, 3342, 3343, 3343, 3344, 3344, 3286, 3286, 3344, 3344,
+     3344, 3344, 3345, 3345, 3346, 3346, 3286, 3286, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3347,
+     3285, 3285, 3347, 3285, 3285, 3285,  296,  296,  298,  296,
+
+      299,  299, 3285, 3285, 3285, 3348, 3285, 3285, 3348, 3285,
+     3285,  300,  299, 3285, 3285, 3285, 3349, 3285, 3285, 3349,
+     3349, 3349, 3285, 3285, 3285, 3285, 3285, 3350, 3285, 3285,
+     3350, 3350, 3350, 3350, 3350, 3285, 3285, 3285, 3285, 3285,
+     3285, 3351, 3285, 3285, 3351, 3351, 3351, 3285, 3285, 3285,
+     3285, 3285, 3285, 3352, 3285, 3285, 3352, 3352, 3285, 3285,
+     3285,  361,  299,  299,  300,  365,  364,  364,  364,  364,
+      365,  371,  369,  369, 3285, 3285, 3285, 3353, 3285, 3285,
+     3353, 3353, 3353, 3353, 3285, 3285,  299,  299, 3285, 3285,
+     3285, 3354, 3285, 3285, 3354, 3354, 3354, 3285, 3285,  299,
+
+      299, 3285, 3285, 3285, 3355, 3285, 3285, 3355, 3355, 3285,
+     3285, 3285, 3285, 3285, 3285, 3356, 3285, 3285, 3356, 3356,
+     3285, 3285, 3285, 3285, 3285, 3285, 3357, 3285, 3285, 3357,
+     3357, 3357, 3357, 3357, 3285, 3285,  299,  299,  299, 3285,
+     3285, 3285, 3358, 3285, 3285, 3358, 3285, 3285, 3285, 3285,
+     3285, 3285, 3359, 3285, 3285, 3359, 3359, 3359, 3285, 3285,
+     3285, 3285, 3285, 3285, 3360, 3285, 3285, 3360, 3360, 3360,
+     3360, 3360, 3360, 3360, 3360, 3285, 3285,  299,  299, 3285,
+     3285, 3285, 3361, 3285, 3285, 3361, 3361, 3361, 3361, 3361,
+     3361, 3285, 3285, 3285, 3285, 3285, 3285, 3362, 3285, 3285,
+
+     3362, 3362, 3362, 3362, 3362, 3362, 3362, 3285, 3285, 3285,
+     3285, 3285, 3285, 3363, 3285, 3285, 3363, 3363, 3285, 3285,
+     3285, 3285, 3285, 3285, 3364, 3285, 3285, 3364, 3364, 3364,
+     3285, 3285, 3285, 3285, 3285, 3285, 3365, 3285, 3285, 3365,
+     3365, 3365, 3365, 3285, 3285,  299,  299, 3285, 3285, 3285,
+     3366, 3285, 3285, 3366, 3366, 3285, 3285,  299,  369,  369,
+     3285, 3285, 3285, 3367, 3285, 3285, 3367, 3367, 3367, 3285,
+     3285,  369,  369, 3285, 3285, 3285, 3368, 3285, 3285, 3368,
+     3368, 3285, 3285, 3285, 3285, 3285, 3285, 3369, 3285, 3285,
+     3369, 3369, 3285, 3285,  369,  369, 3285, 3285, 3285, 3370,
+
+     3285, 3285, 3370, 3370, 3370, 3285, 3285,  369,  369, 3285,
+     3285, 3285, 3371, 3285, 3285, 3371, 3371, 3371, 3371, 3371,
+     3285, 3285,  299,  438,  299, 3285, 3285, 3285, 3372, 3285,
+     3285, 3372, 3285, 3285, 3285, 3285, 3285, 3285, 3373, 3285,
+     3285, 3373, 3285, 3285,  299,  299, 3285, 3285, 3285, 3374,
+     3285, 3285, 3374, 3374, 3285, 3285, 3285, 3285, 3375, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3376, 3376, 3377, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3378, 3378, 3379, 3285, 3380, 3380, 3380, 3380, 3285,
+     3381, 3285, 3285, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+     3382, 3382, 3383, 3285, 3384, 3384, 3384, 3384, 3385, 3285,
+     3386, 3386, 3386, 3387, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3388, 3388, 3388, 3388, 3388, 3389, 3285,
+     3390, 3390, 3390, 3390, 3391, 3285, 3392, 3392, 3392, 3393,
+     3285, 3394, 3394, 3394, 3395, 3285, 3396, 3396, 3396, 3396,
+     3396, 3396, 3397, 3285, 3285, 3398, 3398, 3399, 3285, 3400,
+     3400, 3400, 3400, 3401, 3285, 3402, 3402, 3402, 3402, 3402,
+
+     3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3402,
+     3402, 3403, 3285, 3404, 3404, 3404, 3404, 3404, 3404, 3404,
+     3404, 3405, 3285, 3406, 3406, 3406, 3406, 3406, 3406, 3406,
+     3406, 3407, 3285, 3408, 3408, 3408, 3409, 3285, 3410, 3410,
+     3410, 3410, 3411, 3285, 3412, 3412, 3412, 3412, 3412, 3412,
+     3413, 3285, 3414, 3414, 3414, 3414, 3415, 3285, 3285, 3416,
+     3416, 3416, 3416, 3416, 3417, 3285, 3418, 3418, 3418, 3419,
+     3285, 3420, 3420, 3420, 3421, 3285, 3422, 3422, 3422, 3422,
+     3423, 3285, 3424, 3424, 3424, 3424, 3424, 3424, 3425, 3285,
+     3285, 3426, 3426, 3427, 3285, 3428, 3428, 3429, 3285, 3430,
+
+     3430, 3430, 3431, 3432, 3285, 3432, 3285, 3285, 3285, 3433,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3434, 3435, 3435,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3436,
+     3437, 3437, 3438, 3285, 3285, 3438, 3285, 3439, 3439, 3285,
+     3440, 3285, 3285, 3440, 3440, 3440, 3440, 3440, 3440, 3441,
+     3441, 3442, 3442, 3442, 3443, 3443, 3285, 3285, 3444, 3445,
+     3445, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3446, 3285, 3285, 3446, 3446,
+
+     3447, 3447, 3448, 3285, 3285, 3448, 3449, 3449, 3285, 3285,
+     3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, 3454,
+     3285, 3285, 3454, 3454, 3455, 3455, 3285, 3285, 3456, 3457,
+     3457, 3458, 3285, 3285, 3285, 3285, 3459, 3459, 3460, 3460,
+     3285, 3285, 3460, 3285, 3285, 3460, 3460, 3460, 3460, 3460,
+     3460, 3460, 3460, 3460, 3460, 3461, 3461, 3285, 3285, 3285,
+     3285, 3462, 3462, 3462, 3462, 3462, 3463, 3463, 3464, 3464,
+     3464, 3285, 3285, 3464, 3464, 3464, 3465, 3465, 3466, 3285,
+     3285, 3467, 3467, 3468, 3285, 3285, 3468, 3469, 3469, 3470,
+     3285, 3285, 3470, 3470, 3470, 3471, 3471, 3472, 3472, 3472,
+
+     3473, 3473, 3285, 3474, 3474, 3474, 3474, 3475, 3475, 3476,
+     3285, 3285, 3477, 3477, 3478, 3478, 3479, 3479, 3480, 3480,
+     3480, 3481, 3481, 3482, 3482, 3482, 3482, 3482, 3483, 3483,
+     3285, 3484, 3485, 3485, 3285, 3285, 3486, 3486, 3285, 3285,
+     3487, 3488, 3488, 3489, 3285, 3285, 3489, 3285, 3285, 3490,
+     3285, 3285, 3285, 3285, 3285, 3285, 3491, 3285, 3492, 3285,
+     3492, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3493, 3285, 3494, 3285, 3494, 3495, 3285, 3285, 3285,
+
+     3495, 3285, 3285, 3496, 3285, 3496, 3497, 3285, 3285, 3285,
+     3285, 3285, 3497, 3285, 3285, 3497, 3497, 3497, 3285, 3498,
+     3285, 3498, 3499, 3499, 3499, 3285, 3500, 3285, 3500, 3285,
+     3285, 3285, 3501, 3285, 3502, 3285, 3502, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3503, 3285, 3285, 3285, 3503, 3503, 3285, 3504, 3285, 3504,
+     3505, 3285, 3285, 3285, 3505, 3285, 3506, 3285, 3506, 3285,
+     3285, 3285, 3507, 3285, 3508, 3285, 3508, 3509, 3509, 3285,
+     3510, 3285, 3510, 3511, 3511, 3511, 3285, 3285, 3285, 3511,
+     3511, 3285, 3512, 3285, 3512, 3285, 3285, 3513, 3285, 3514,
+
+     3285, 3514, 3515, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3516, 3285, 3516, 3517, 3517, 3517, 3517, 3285, 3285, 3285,
+     3517, 3285, 3285, 3285, 3285, 3285, 3517, 3517, 3517, 3517,
+     3517, 3517, 3517, 3517, 3517, 3285, 3518, 3285, 3518, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3519, 3519, 3519,
+     3519, 3285, 3520, 3285, 3520, 3521, 3521, 3521, 3521, 3285,
+     3285, 3285, 3285, 3285, 3521, 3521, 3285, 3522, 3285, 3522,
+     3523, 3285, 3285, 3285, 3285, 3524, 3285, 3524, 3525, 3285,
+     3285, 3285, 3525, 3285, 3526, 3285, 3526, 3527, 3285, 3285,
+     3285, 3527, 3527, 3527, 3285, 3528, 3285, 3528, 3285, 3285,
+
+     3285, 3285, 3529, 3285, 3530, 3285, 3530, 3285, 3285, 3285,
+     3531, 3531, 3285, 3285, 3531, 3285, 3532, 3285, 3532, 3533,
+     3285, 3285, 3285, 3285, 3534, 3285, 3534, 3285, 3285, 3285,
+     3285, 3285, 3535, 3285, 3535, 3285, 3285, 3536, 3536, 3285,
+     3285, 3285, 3537, 3285, 3537, 3538, 3538, 3538, 3538, 3538,
+     3285, 3539, 3285, 3539, 3285, 3540, 3285, 3541, 3285, 3541,
+     3285, 3285, 3285, 3285, 3542, 3285, 3542, 3285, 3285, 3285,
+     3543, 3285, 3544, 3285, 3544, 3545, 3546, 3285, 3285, 3285,
+     3285, 3285, 3547, 3548, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3549, 3285, 3285, 3550, 3285,
+     3551, 3552, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3552, 3285, 3285, 3552, 3553, 3554, 3285, 3285, 3554, 3555,
+     3556, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3557, 3557, 3285, 3285,
+     3558, 3559, 3559, 3560, 3285, 3285, 3561, 3285, 3285, 3562,
+     3563, 3564, 3564, 3285, 3285, 3564, 3564, 3565, 3285, 3285,
+     3285, 3285, 3566, 3285, 3285, 3567, 3568, 3568, 3568, 3568,
+     3285, 3285, 3285, 3285, 3285, 3568, 3568, 3568, 3568, 3568,
+
+     3568, 3568, 3568, 3568, 3569, 3285, 3285, 3285, 3570, 3570,
+     3570, 3570, 3571, 3572, 3572, 3572, 3572, 3285, 3285, 3285,
+     3572, 3572, 3573, 3574, 3575, 3576, 3576, 3577, 3578, 3578,
+     3578, 3578, 3579, 3285, 3285, 3285, 3285, 3285, 3285, 3580,
+     3581, 3285, 3285, 3285, 3285, 3582, 3582, 3285, 3285, 3285,
+     3582, 3583, 3584, 3585, 3285, 3285, 3285, 3285, 3285, 3285,
+     3586, 3285, 3285, 3285, 3587, 3587, 3285, 3285, 3285, 3588,
+     3589, 3285, 3285, 3589, 3589, 3589, 3590, 3285, 3591, 3592,
+     3593, 3594, 3595, 3596, 3597, 3597, 3285, 3597, 3285, 3285,
+     3285, 3598, 3599, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3600, 3285, 3285, 3285,
+     3601, 3285, 3602, 3603, 3285, 3285, 3285, 3603, 3285, 3285,
+     3285, 3603, 3604, 3605, 3285, 3285, 3285, 3285, 3285, 3606,
+     3607, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3608, 3285, 3285, 3285, 3285, 3285,
+     3609, 3610, 3610, 3611, 3285, 3285, 3285, 3612, 3285, 3285,
+     3285, 3613, 3614, 3615, 3615, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3615, 3616, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3617, 3618, 3285, 3285, 3618, 3618,
+     3285, 3285, 3285, 3618, 3618, 3285, 3285, 3618, 3618, 3618,
+     3618, 3618, 3618, 3619, 3285, 3285, 3620, 3620, 3620, 3621,
+     3622, 3285, 3285, 3622, 3622, 3285, 3285, 3622, 3623, 3624,
+     3625, 3626, 3626, 3627, 3628, 3628, 3628, 3285, 3285, 3628,
+     3629, 3630, 3631, 3285, 3632, 3632, 3632, 3633, 3634, 3635,
+     3636, 3637, 3637, 3638, 3639, 3285, 3285, 3285, 3639, 3639,
+     3639, 3640, 3285, 3285, 3285, 3641, 3642, 3285, 3285, 3643,
+     3644, 3645, 3645, 3285, 3285, 3646, 3647, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3648, 3649, 3285, 3650, 3651,
+     3651, 3651, 3652, 3653, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3654, 3655, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3656, 3285, 3285, 3285,
+     3657, 3658, 3285, 3285, 3659, 3660, 3285, 3285, 3661, 3662,
+     3662, 3285, 3285, 3285, 3285, 3285, 3285, 3662, 3285, 3285,
+     3285, 3285, 3663, 3664, 3285, 3285, 3285, 3285, 3285, 3664,
+     3664, 3664, 3285, 3285, 3285, 3285, 3285, 3664, 3664, 3664,
+     3664, 3285, 3285, 3665, 3285, 3285, 3285, 3285, 3285, 3666,
+
+     3285, 3285, 3667, 3668, 3285, 3285, 3285, 3285, 3285, 3668,
+     3285, 3285, 3285, 3668, 3285, 3285, 3669, 3670, 3671, 3671,
+     3672, 3673, 3673, 3673, 3285, 3285, 3285, 3673, 3285, 3285,
+     3674, 3675, 3285, 3285, 3285, 3285, 3285, 3676, 3677, 3678,
+     3679, 3680, 3285, 3285, 3285, 3285, 3681, 3682, 3682, 3682,
+     3682, 3683, 3285, 3285, 3285, 3285, 3684, 3685, 3285, 3285,
+     3285, 3285, 3285, 3686, 3687, 3687, 3285, 3285, 3285, 3688,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3689, 3690, 3285, 3285, 3285,
+
+     3691, 3285, 3285, 3691, 3692, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3693, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3694,
+     3285, 3285, 3285, 3285, 3285, 3695, 3285, 3285, 3285, 3285,
+     3285, 3696, 3697, 3697, 3285, 3285, 3697, 3285, 3698, 3699,
+     3285, 3285, 3285, 3699, 3699, 3699, 3285, 3285, 3285, 3285,
+     3285, 3699, 3699, 3699, 3285, 3285, 3285, 3700, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3701, 3702, 3285, 3285,
+     3285, 3702, 3702, 3703, 3704, 3705, 3285, 3285, 3706, 3707,
+     3285, 3285, 3707, 3707, 3285, 3285, 3707, 3708, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3709, 3710, 3711,
+     3712, 3713, 3285, 3285, 3285, 3285, 3285, 3285, 3714, 3715,
+     3715, 3715, 3715, 3716, 3285, 3717, 3718, 3719, 3720, 3720,
+     3285, 3285, 3285, 3285, 3721, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3722, 3723, 3285, 3724,
+     3285, 3285, 3285, 3724, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3725,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3726, 3285, 3285, 3285, 3727, 3728, 3729,
+
+     3729, 3285, 3285, 3285, 3285, 3729, 3285, 3730, 3731, 3731,
+     3731, 3731, 3285, 3285, 3285, 3731, 3731, 3731, 3732, 3285,
+     3285, 3285, 3733, 3734, 3734, 3734, 3735, 3285, 3285, 3736,
+     3285, 3285, 3285, 3737, 3738, 3285, 3285, 3285, 3738, 3738,
+     3285, 3285, 3285, 3285, 3738, 3739, 3285, 3740, 3741, 3742,
+     3743, 3744, 3745, 3285, 3285, 3746, 3746, 3746, 3747, 3285,
+     3748, 3285, 3285, 3749, 3750, 3750, 3285, 3751, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3752, 3285, 3285, 3753, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3754, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3755, 3285, 3285, 3756, 3757, 3757, 3285, 3285, 3285,
+     3285, 3757, 3285, 3758, 3759, 3759, 3759, 3759, 3759, 3285,
+     3285, 3759, 3759, 3285, 3285, 3285, 3285, 3734, 3734, 3734,
+     3735, 3285, 3285, 3737, 3285, 3285, 3738, 3738, 3738, 3285,
+     3285, 3285, 3285, 3738, 3739, 3285, 3740, 3285, 3285, 3285,
+     3285, 3743, 3744, 3745, 3285, 3285, 3285, 3285, 3285, 3746,
+     3746, 3285, 3285, 3285, 3748, 3749, 3750, 3750, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3752, 3285, 3285, 3285,
+     3753, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3754, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3755, 3285,
+     3285, 3757, 3757, 3285, 3285, 3285, 3285, 3758, 3759, 3759,
+     3759, 3759, 3759, 3285, 3285, 3285, 3759, 3285, 3285, 3734,
+     3734, 3285, 3285, 3735, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3738, 3738, 3738, 3285, 3285, 3285, 3285, 3739,
+     3740, 3285, 3285, 3285, 3285, 3285, 3744, 3745, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3750, 3750,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3753, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3754, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3755, 3757, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3759,
+     3759, 3759, 3285, 3285, 3759, 3759, 3285, 3285, 3285, 3734,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3738, 3738, 3738,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3744, 3745, 3285, 3285, 3285, 3285, 3285,
+     3285, 3749, 3750, 3750, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3753, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3755, 3285, 3285, 3757, 3285,
+     3285, 3285, 3759, 3759, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3759, 3734, 3285, 3285, 3285, 3285, 3285, 3285, 3738,
+     3285, 3285, 3738, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3744, 3745, 3285, 3285, 3285,
+     3285, 3749, 3750, 3750, 3750, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3755, 3285, 3285, 3285, 3757, 3759, 3759, 3285,
+     3285, 3285, 3285, 3285, 3285, 3759, 3734, 3738, 3285, 3285,
+     3285, 3738, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3745, 3285,
+     3285, 3285, 3285, 3749, 3750, 3750, 3750, 3760, 3761, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3754,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3757, 3759, 3759, 3285, 3285, 3734, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3745, 3285, 3285, 3285, 3285, 3749, 3750,
+     3762, 3763, 3760, 3761, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3757, 3759, 3759, 3285,
+     3285, 3285, 3734, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3762, 3750,
+     3764, 3763, 3765, 3750, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3757, 3759,
+     3759, 3285, 3285, 3285, 3285, 3734, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3749, 3764, 3285, 3765,
+     3750, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3749, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3749, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3749,
+     3749, 3285, 3285, 3285, 3285, 3285, 3285, 3749, 3749, 3749,
+
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3285,    0, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285
     } ;
 
-static yyconst flex_int16_t yy_nxt[12117] =
+static yyconst flex_int16_t yy_nxt[12182] =
     {   0,
-     3288,  256,  257,  256,  256,  257,  256,  256,  257,  256,
-      256,  257,  256,  261,  257,  261,  267,  258,  264,  267,
-      258,  264, 1729,  259, 3288,  265,  259, 3288,  265,  262,
-      261,  257,  261,  652,  268,  270,  271,  268,  270,  271,
-      272,  273,  697,  272,  273,  652,  262,  277,  278,  653,
-      274,  270,  271,  274,  275,  655,  272,  270,  271,  686,
-      275,  654,  272,  277,  278, 1731,  274,  257,  257,  257,
-      843,  654,  274,  257,  257,  257,  289,  257,  289,  289,
-      257,  289,  844,  280,  289,  257,  289,  673, 1735,  280,
-      727,  279,  290, 1353,  689,  290,  651,  651,  651, 1354,
-
-      291,  651,  651,  651,  651,  651,  651,  279,  281,  282,
-      257,  282,  281,  281,  281,  281,  281,  281,  281,  283,
-      281,  281,  281,  684,  281,  285,  281,  286,  281,  289,
-      257,  289,  257,  257,  257,  257,  257,  257,  685,  289,
-      257,  289,  289,  257,  289,  291,  690,  799,  292,  655,
-      800,  292,  917,  281,  281,  290,  655,  655,  290,  289,
-      257,  289,  651,  651,  651,  654,  651,  651,  651,  651,
-      651,  651,  654,  654, 3288,  293,  918,  287,  281,  282,
-      257,  282,  281,  281,  281,  281,  281,  281,  281,  283,
-      281,  281,  281, 1739,  281,  285,  281,  286,  281,  289,
-
-      257,  289,  257,  257,  257,  257,  257,  257,  660,  289,
-      257,  289,  289,  257,  289,  293,  666,  727,  294,  812,
-      977,  294,  813,  281,  281,  291,  736,  728,  291,  257,
-      257,  257,  257,  257,  257,  289,  257,  289,  289,  257,
-      289,  289,  257,  289,  978,  295,  849,  287,  295,  655,
-      661,  293,  792,  850,  293,  740,  662,  296,  289,  257,
-      289,  663,  651,  651,  651,  654,  664,  651,  651,  651,
-      651,  651,  651,  793,  296,  297,  298,  257,  298,  297,
-      297,  297,  297,  297,  297,  297,  299,  297,  297,  297,
-      714,  297,  301,  297,  302,  297,  305,  257,  305,  305,
-
-      257,  305,  257,  257,  257,  715,  257,  257,  257,  305,
-      257,  305,  306,  774,  851,  306, 1741,  775,  294,  710,
-      297,  297,  294,  711,  752,  306,  670,  712,  303,  297,
-      298,  257,  298,  297,  297,  297,  297,  297,  297,  297,
-      299,  297,  297,  297,  655,  297,  301,  297,  302,  297,
-      305,  257,  305,  305,  257,  305,  305,  257,  305,  801,
-      654,  859,  270,  271,  857,  691,  306,  272, 3288,  307,
-      690,  858,  307,  802,  297,  297,  736,  317,  692,  752,
-      685, 1748,  303,  308,  309,  257,  309,  308,  308,  308,
-      308,  308,  308,  308,  310,  308,  308,  308, 1749,  308,
-
-      312,  308,  313,  308, 1750,  655,  318,  684,  331,  257,
-      331,  331,  257,  331,  343,  257,  343,  690,  270,  271,
-      693,  654,  685,  272,  332,  703,  796,  332,  308,  308,
-      344,  689,  704,  317,  797,  905,  314,  758,  906,  315,
-      798,  654,  651,  651,  651, 1751,  316,  308,  309,  257,
-      309,  308,  308,  308,  308,  308,  308,  308,  310,  308,
-      308,  308,  318,  308,  312,  308,  313,  308,  343,  257,
-      343,  354,  257,  354,  354,  257,  354, 1756,  354,  257,
-      354,  354,  257,  354,  344,  655,  741,  355,  655,  736,
-      355,  852,  308,  308,  356,  716, 1496,  356, 1757,  690,
-
-      314,  654,  742,  315,  654,  651,  651,  651,  758, 1497,
-      316,  319,  320,  257,  320,  319,  319,  319,  319,  319,
-      319,  319,  321,  319,  319,  319, 1758,  319,  323,  319,
-      324,  319,  257,  257,  257,  257,  257,  257,  354,  257,
-      354,  777,  354,  257,  354,  354,  257,  354,  357, 1759,
-      655,  357,  655,  655,  355, 1760,  319,  319,  355,  722,
-      689,  358,  651,  651,  651,  325,  654,  326,  654,  654,
-      777,  327,  651,  651,  651,  845,  328,  329,  319,  320,
-      257,  320,  319,  319,  319,  319,  319,  319,  319,  321,
-      319,  319,  319,  689,  319,  323,  319,  324,  319,  354,
-
-      257,  354,  257,  257,  257,  257,  257,  257,  884,  354,
-      257,  354,  354,  257,  354,  358,  739, 1761,  359,  778,
-      679,  359,  736,  319,  319,  360,  732,  736,  360,  651,
-      651,  651,  325,  735,  326,  651,  651,  651,  327,  651,
-      651,  651, 1762,  328,  329,  333,  334,  257,  334,  333,
-      333,  333,  333,  333,  333,  333,  335,  333,  333,  333,
-      686,  333,  337,  333,  338,  333,  354,  257,  354,  354,
-      257,  354,  257,  257,  257,  899,  257,  257,  257,  354,
-      257,  354,  361, 1769, 1770,  361,  899,  869,  362,  743,
-      333,  333,  362,  730,  731,  358,  875,  339,  651,  651,
-
-      651,  900,  689,  340,  744,  651,  651,  651,  651,  651,
-      651,  951,  341,  333,  334,  257,  334,  333,  333,  333,
-      333,  333,  333,  333,  335,  333,  333,  333, 1779,  333,
-      337,  333,  338,  333,  354,  257,  354,  257,  257,  257,
-      257,  257,  257,  690,  354,  257,  354,  354,  257,  354,
-      358,  655,  690,  363, 1781,  917,  363,  655,  333,  333,
-      361,  655,  655,  361,  763,  339, 1782,  654,  651,  651,
-      651,  340,  977,  654,  651,  651,  651,  654,  654,  986,
-      341,  345,  346,  257,  346,  345,  345,  345,  345,  345,
-      345,  345,  347,  345,  345,  345,  918,  345,  349,  345,
-
-      350,  345,  354,  257,  354,  354,  257,  354,  257,  257,
-      257, 1788,  257,  257,  257,  354,  257,  354,  364,  655,
-     1013,  364,  655, 1014,  365,  845,  345,  345,  365,  768,
-     1793,  366,  651,  651,  651,  654, 3288,  351,  654,  651,
-      651,  651,  651,  651,  651, 1794,  352,  345,  346,  257,
-      346,  345,  345,  345,  345,  345,  345,  345,  347,  345,
-      345,  345,  977,  345,  349,  345,  350,  345,  354,  257,
-      354,  257,  257,  257,  257,  257,  257,  689,  354,  257,
-      354,  354,  257,  354,  366,  778,  986,  367,  736,  917,
-      367, 1804,  345,  345,  364,  655, 1807,  364,  354,  257,
-
-      354, 1808,  782,  351,  354,  257,  354,  651,  651,  651,
-      883,  654,  352,  987,  368,  651,  651,  651,  727, 1812,
-      368,  369,  370,  257,  370,  369,  369,  369,  369,  369,
-      369,  369,  371,  369,  369,  369,  977,  369,  373,  369,
-      374,  369,  380,  257,  380,  380,  257,  380,  257,  257,
-      257,  926,  257,  257,  257,  927,  745,  655,  381, 1022,
-      987,  381,  689, 1023,  357, 3288,  369,  369,  357,  655,
-      655,  375,  734,  654,  892,  686,  788,  376,  651,  651,
-      651,  377,  651,  651,  651,  654,  654,  378,  369,  370,
-      257,  370,  369,  369,  369,  369,  369,  369,  369,  371,
-
-      369,  369,  369,  673,  369,  373,  369,  374,  369,  380,
-      257,  380,  380,  257,  380,  380,  257,  380,  892,  380,
-      257,  380,  651,  651,  651,  381,  736,  803,  381,  655,
-      655,  382, 1140,  369,  369,  382,  806,  655,  375,  804,
-      805,  651,  651,  651,  376,  654,  654, 1813,  377,  651,
-      651,  651, 1681,  654,  378,  383,  384,  257,  384,  383,
-      383,  383,  383,  383,  383,  383,  385,  383,  383,  383,
-      689,  383,  387,  383,  388,  383,  393,  257,  393,  393,
-      257,  393,  257,  257,  257,  931,  257,  257,  257,  651,
-      651,  651,  394,  655,  655,  394,  655, 1816,  357,  932,
-
-      383,  383,  357,  816, 1817,  389,  651,  651,  651,  654,
-      654,  390,  654,  651,  651,  651,  651,  651,  651,  651,
-      651,  651,  391,  383,  384,  257,  384,  383,  383,  383,
-      383,  383,  383,  383,  385,  383,  383,  383, 1818,  383,
-      387,  383,  388,  383,  393,  257,  393,  393,  257,  393,
-      393,  257,  393,  936,  393,  257,  393, 1140,  655, 1508,
-      394, 1472,  655,  394,  655,  826,  395,  932,  383,  383,
-      395,  831, 1497,  389,  654,  651,  651,  651,  654,  390,
-      654,  651,  651,  651,  651,  651,  651,  651,  651,  651,
-      391,  396,  397,  257,  397,  396,  396,  396,  396,  396,
-
-      396,  396,  398,  396,  396,  396, 1819,  396,  400,  396,
-      401,  396,  405,  257,  405,  405,  257,  405,  416,  257,
-      416, 1820,  416,  257,  416,  430,  257,  430,  406,  655,
-      655,  406,  655, 1821,  417,  859,  396,  396,  417,  837,
-     1829,  431,  651,  651,  651,  654,  654,  402,  654,  651,
-      651,  651,  403,  396,  397,  257,  397,  396,  396,  396,
-      396,  396,  396,  396,  398,  396,  396,  396, 1832,  396,
-      400,  396,  401,  396,  430,  257,  430,  257,  257,  257,
-      257,  257,  257,  852,  430,  257,  430,  430,  257,  430,
-      431,  690, 1833,  432, 1836, 1838,  432,  655,  396,  396,
-
-      431, 1840, 1841,  431, 1843,  851,  651,  651,  651,  402,
-      651,  651,  651,  654,  403,  407,  408,  257,  408,  407,
-      407,  407,  407,  407,  407,  407,  409,  407,  407,  407,
-     1844,  407,  411,  407,  412,  407,  430,  257,  430,  430,
-      257,  430,  442,  257,  442,  936,  442,  257,  442,  454,
-      257,  454,  433,  852, 1845,  433,  655,  689,  443,  983,
-      407,  407,  443,  864,  655,  455,  651,  651,  651,  651,
-      651,  651,  654,  651,  651,  651,  413,  651,  651,  651,
-      654, 1850,  414,  407,  408,  257,  408,  407,  407,  407,
-      407,  407,  407,  407,  409,  407,  407,  407, 1853,  407,
-
-      411,  407,  412,  407,  454,  257,  454,  471,  257,  471,
-      471,  257,  471, 1854,  486,  257,  486,  486,  257,  486,
-      455, 1855,  655,  472, 1857, 1860,  472,  655,  407,  407,
-      487,  919,  655,  487,  651,  651,  651,  869,  654,  651,
-      651,  651,  920,  654,  413,  921, 1861,  875,  654, 1863,
-      414,  418,  419,  257,  419,  418,  418,  418,  418,  418,
-      418,  418,  420,  418,  418,  418, 1867,  418,  422,  418,
-      423,  418,  502,  257,  502,  502,  257,  502,  513,  257,
-      513, 1868,  513,  257,  513,  852,  655, 1869,  503, 1871,
-     1684,  503, 1882,  690,  514,  852,  418,  418,  514,  424,
-
-      655,  425,  654,  690,  651,  651,  651,  426,  651,  651,
-      651,  651,  651,  651,  427,  883,  654,  428,  418,  419,
-      257,  419,  418,  418,  418,  418,  418,  418,  418,  420,
-      418,  418,  418, 1883,  418,  422,  418,  423,  418,  525,
-      257,  525,  525,  257,  525,  538,  257,  538,  919,  538,
-      257,  538,  884, 1884, 1886,  526, 1140, 1140,  526,  920,
-     1508,  539,  935,  418,  418,  539,  424,  736,  425,  651,
-      651,  651, 1142, 1546,  426,  651,  651,  651,  651,  651,
-      651,  427, 1879, 1887,  428,  434,  435,  257,  435,  434,
-      434,  434,  434,  434,  434,  434,  436,  434,  434,  434,
-
-     1888,  434,  438,  434,  439,  434,  257,  257,  257,  257,
-      257,  257,  538,  257,  538,  936,  538,  257,  538,  538,
-      257,  538,  357, 1889, 1890,  357,  655,  655,  539,  988,
-      434,  434,  539,  888,  897,  540,  651,  651,  651,  651,
-      651,  651,  654,  654, 1891, 1892,  440,  434,  435,  257,
-      435,  434,  434,  434,  434,  434,  434,  434,  436,  434,
-      434,  434, 1893,  434,  438,  434,  439,  434,  538,  257,
-      538,  550,  257,  550,  550,  257,  550,  936,  257,  257,
-      257,  257,  257,  257,  540, 1894, 1895,  551,  928, 1897,
-      551,  989,  434,  434,  552,  929, 1898,  552,  651,  651,
-
-      651,  930,  903,  903,  903, 1157, 1157, 1157,  440,  444,
-      445,  257,  445,  444,  444,  444,  444,  444,  444,  444,
-      446,  444,  444,  444, 1899,  444,  448,  444,  449,  444,
-      550,  257,  550,  550,  257,  550,  550,  257,  550,  938,
-      550,  257,  550,  564,  257,  564,  551, 1900, 1903,  551,
-      939,  941,  553,  921,  444,  444,  553,  938,  929,  565,
-      450,  904,  941,  928,  942,  451, 1906, 1907,  939,  929,
-      929,  935, 1488, 1488, 1488,  930,  942,  452,  444,  445,
-      257,  445,  444,  444,  444,  444,  444,  444,  444,  446,
-      444,  444,  444, 1908,  444,  448,  444,  449,  444,  564,
-
-      257,  564,  257,  257,  257,  257,  257,  257, 1909,  564,
-      257,  564,  564,  257,  564,  565, 1910, 1911,  552,  928,
-      941,  552, 1915,  444,  444,  565,  929,  929,  565,  450,
-      919, 1916,  982,  982,  451,  903,  903,  903, 1918, 1144,
-     1919,  939, 1920, 1922,  935, 1935,  452,  456,  457,  257,
-      457,  456,  456,  456,  456,  456,  456,  456,  458,  456,
-      456,  456,  459,  456,  460,  456,  461,  456,  459,  459,
-      459,  459,  459,  459,  459,  459,  459,  459,  459,  459,
-      459,  459,  459,  459,  459,  459,  459,  459,  459,  459,
-      459,  459,  456,  456,  459,  462,  463,  464,  459,  459,
-
-      459,  459,  459,  465,  459,  459,  466,  459,  459,  459,
-      467,  459,  468,  469,  459,  459,  459,  459,  459,  459,
-      459,  473,  474,  257,  474,  473,  473,  473,  473,  473,
-      473,  473,  475,  473,  473,  473, 1936,  473,  477,  473,
-      478,  473,  564,  257,  564,  564,  257,  564,  576,  257,
-      576, 1937,  576,  257,  576,  587,  257,  587,  566, 1311,
-     1938,  566, 1939, 1942,  577, 1943,  473,  473,  577, 1312,
-      479,  588, 1157, 1157, 1157, 1944, 1313,  480, 1945, 1950,
-      481, 1180, 1180, 1180,  482, 1958,  483,  484,  473,  474,
-      257,  474,  473,  473,  473,  473,  473,  473,  473,  475,
-
-      473,  473,  473, 1959,  473,  477,  473,  478,  473,  587,
-      257,  587,  257,  257,  257,  257,  257,  257, 1968,  587,
-      257,  587,  587,  257,  587,  588, 1972, 1974,  552, 1980,
-     1981,  552, 1982,  473,  473,  588, 1158,  479,  588, 1193,
-     1193, 1193, 1988, 1194,  480, 1158, 1195,  481, 1180, 1180,
-     1180,  482, 1989,  483,  484,  488,  489,  257,  489,  488,
-      488,  488,  488,  488,  488,  488,  490,  488,  488,  488,
-     1990,  488,  492,  488,  493,  488,  587,  257,  587,  587,
-      257,  587,  600,  257,  600, 1991,  600,  257,  600,  948,
-      948,  948,  589, 2004, 2010,  589, 2014, 2017,  601, 2019,
-
-      488,  488,  601,  494,  495,  496,  949, 2020, 1203, 1203,
-     1203,  497, 1204, 2022,  498, 1205, 2023, 2024,  499, 2028,
-     2031,  500,  488,  489,  257,  489,  488,  488,  488,  488,
-      488,  488,  488,  490,  488,  488,  488, 2033,  488,  492,
-      488,  493,  488,  257,  257,  257,  257,  257,  257,  600,
-      257,  600, 2040,  600,  257,  600,  956,  956,  956,  552,
-     2048, 2049,  552, 2050, 2051,  601, 2053,  488,  488,  601,
-      494,  495,  496,  957, 2067, 1225, 1225, 1225,  497, 1226,
-     2071,  498, 1227, 2072, 2073,  499, 1684, 1140,  500,  504,
-      505,  257,  505,  504,  504,  504,  504,  504,  504,  504,
-
-      506,  504,  504,  504, 2064,  504,  508,  504,  509,  504,
-      600,  257,  600,  600,  257,  600,  615,  257,  615, 2076,
-      615,  257,  615,  971,  971,  971,  602, 2077, 2065,  602,
-     2079, 2080,  616, 2081,  504,  504,  616, 2082, 2083,  510,
-      972, 1543, 1543, 1543, 2084,  511,  504,  505,  257,  505,
-      504,  504,  504,  504,  504,  504,  504,  506,  504,  504,
-      504, 1684,  504,  508,  504,  509,  504,  257,  257,  257,
-      257,  257,  257,  615,  257,  615, 2087,  615,  257,  615,
-      991,  991,  991,  617, 2088, 2074,  617, 2091, 2092,  616,
-     2093,  504,  504,  616, 2066, 2094,  510,  992, 1488, 1488,
-
-     1488, 2075,  511,  515,  516,  257,  516,  515,  515,  515,
-      515,  515,  515,  515,  517,  515,  515,  515, 2095,  515,
-      519,  515,  520,  515,  615,  257,  615,  615,  257,  615,
-      627,  257,  627, 2097,  627,  257,  627,  637,  257,  637,
-      618, 2098, 2101,  618, 2104, 2108,  628, 2109,  515,  515,
-      628, 2112,  521,  638, 1157, 1157, 1157, 2113, 2114,  522,
-     2117, 2121,  523,  515,  516,  257,  516,  515,  515,  515,
-      515,  515,  515,  515,  517,  515,  515,  515, 2122,  515,
-      519,  515,  520,  515,  637,  257,  637,  257,  257,  257,
-      257,  257,  257, 2110,  637,  257,  637,  637,  257,  637,
-
-      638, 2111, 2125,  357, 2123, 2127,  357, 2143,  515,  515,
-      638, 2144,  521,  638, 1180, 1180, 1180, 2148, 1233,  522,
-     2124, 2149,  523,  527,  528,  257,  528,  527,  527,  527,
-      527,  527,  527,  527,  529,  527,  527,  527, 2150,  527,
-      531,  527,  532,  527,  637,  257,  637,  637,  257,  637,
-      649,  257,  649, 2115,  649,  257,  649,  998,  998,  998,
-      639, 2116, 2151,  639, 2123, 2074,  650,  727,  527,  527,
-      650, 2153,  533, 3288,  999, 2157, 2158,  737, 1233,  534,
-     2075, 2124,  535,  686, 2159, 2165,  686, 2166, 2167,  536,
-      527,  528,  257,  528,  527,  527,  527,  527,  527,  527,
-
-      527,  529,  527,  527,  527,  738,  527,  531,  527,  532,
-      527, 2181,  687, 2185,  741, 1003, 1003, 1003,  688,  689,
-     1015, 1015, 1015,  683, 2186,  689, 1028, 1028, 1028,  690,
-      742, 2187, 1004, 2189, 2193,  527,  527, 1016, 2197,  533,
-     1247, 1247, 1247, 1029, 1248, 2198,  534, 1249, 2199,  535,
-     1698, 1698, 1698, 1701, 1701, 1701,  536,  541,  542,  257,
-      542,  541,  541,  541,  541,  541,  541,  541,  543,  541,
-      541,  541, 2200,  541,  545,  541,  546,  541, 1030, 1030,
-     1030, 1036, 1036, 1036, 1039, 1039, 1039, 1053, 1053, 1053,
-     1055, 1055, 1055, 2201, 2204, 1031, 1699, 2211, 1037, 1702,
-
-     2213, 1040,  541,  541, 1054, 2223, 2224, 1056,  547, 1257,
-     1257, 1257, 2225, 1258, 2226, 2228, 1259, 1705, 1705, 1705,
-     1708, 1708, 1708,  548,  541,  542,  257,  542,  541,  541,
-      541,  541,  541,  541,  541,  543,  541,  541,  541, 2234,
-      541,  545,  541,  546,  541, 1067, 1067, 1067, 1075, 1075,
-     1075, 1080, 1080, 1080, 1086, 1086, 1086, 1106, 1106, 1106,
-     1140, 2240, 1068, 2241, 2242, 1076, 2231, 2243, 1081,  541,
-      541, 1087, 2246, 1684, 1107,  547, 1265, 1265, 1265, 2248,
-     1266, 2249, 2250, 1267, 1718, 1718, 1718, 1543, 1543, 1543,
-      548,  554,  555,  257,  555,  554,  554,  554,  554,  554,
-
-      554,  554,  556,  554,  554,  554, 2254,  554,  558,  554,
-      559,  554, 1130, 1130, 1130, 1134, 1134, 1134, 1684, 2233,
-     1153, 1153, 1153, 1153, 1153, 1153, 1188, 1188, 1188, 1131,
-     2259, 2261, 1135, 1188, 1188, 1188,  554,  554, 1155, 2262,
-     2263, 1155,  560, 2267, 1190,  561, 1282, 1282, 1282, 2232,
-     1283, 1190, 2273, 1284, 1755, 1755, 1755,  562,  554,  555,
-      257,  555,  554,  554,  554,  554,  554,  554,  554,  556,
-      554,  554,  554, 2274,  554,  558,  554,  559,  554, 2275,
-     2276, 1156,  948,  948,  948, 2277, 2278, 1198, 1198, 1198,
-     1198, 1198, 1198, 1191,  956,  956,  956, 2279, 2280,  949,
-
-     1206, 1206, 1206,  554,  554, 1200, 2281, 2282, 1200,  560,
-     2288,  957,  561, 2289, 1300, 1300, 1300, 1207, 1301, 2290,
-     2291, 1302, 2303, 2304,  562,  567,  568,  257,  568,  567,
-      567,  567,  567,  567,  567,  567,  569,  567,  567,  567,
-     2309,  567,  571,  567,  572,  567, 1209, 1209, 1209, 1214,
-     1214, 1214, 2310, 2312, 1201, 2313, 1214, 1214, 1214, 1221,
-     1221, 1221, 2314, 1210, 1752, 1752, 1752, 1216, 2315, 2319,
-      567,  567, 2320, 2321, 1216, 2327,  573, 1223, 1698, 1698,
-     1698,  574,  567,  568,  257,  568,  567,  567,  567,  567,
-      567,  567,  567,  569,  567,  567,  567, 2328,  567,  571,
-
-      567,  572,  567, 1217, 1221, 1221, 1221,  971,  971,  971,
-     1753, 1229, 1229, 1229,  991,  991,  991, 1229, 1229, 1229,
-     1923, 2329, 1223, 2330,  972, 2333, 1924,  567,  567, 1231,
-     1925,  992, 2338,  573, 1926, 1231, 2342, 2343,  574,  578,
-      579,  257,  579,  578,  578,  578,  578,  578,  578,  578,
-      580,  578,  578,  578, 1232,  578,  582,  578,  583,  578,
-     1252, 1252, 1252, 1252, 1252, 1252, 1927, 2348, 1224,  998,
-      998,  998, 1928, 1261, 1261, 1261, 1929, 2349, 1254, 2350,
-     1930, 1254, 2351, 2353,  578,  578,  999, 1003, 1003, 1003,
-      584, 1263, 1303, 1303, 1303, 2363, 1304, 2374, 2375, 1305,
-
-     2376, 1754, 1754, 1754, 1004,  585,  578,  579,  257,  579,
-      578,  578,  578,  578,  578,  578,  578,  580,  578,  578,
-      578, 2380,  578,  582,  578,  583,  578, 2381, 1684, 1255,
-     1261, 1261, 1261, 2382, 2385, 1269, 1269, 1269, 1269, 1269,
-     1269, 1275, 1275, 1275, 1275, 1275, 1275, 1702, 1263, 2389,
-     2305,  578,  578, 1271, 2390, 2391, 1271,  584, 2306, 1277,
-     2307, 2344, 1277, 1314, 1314, 1314, 2392, 1315, 2308, 2345,
-     1316, 2368,  585,  590,  591,  257,  591,  590,  590,  590,
-      590,  590,  590,  590,  592,  590,  590,  590, 1684,  590,
-      594,  590,  595,  590, 2393, 2394, 1264, 2395, 2396, 1272,
-
-     1015, 1015, 1015, 1288, 1288, 1288, 1028, 1028, 1028, 1278,
-     1288, 1288, 1288, 1295, 1295, 1295, 2397, 1016,  590,  590,
-     2398, 1290, 2346, 1029,  596, 2411, 2412,  597, 1290, 2413,
-     2347, 1297, 1701, 1701, 1701, 2369, 1701, 1701, 1701,  598,
-      590,  591,  257,  591,  590,  590,  590,  590,  590,  590,
-      590,  592,  590,  590,  590, 2414,  590,  594,  590,  595,
-      590, 1030, 1030, 1030, 2419, 2420, 1295, 1295, 1295, 2421,
-     2422, 1291, 1306, 1306, 1306, 1306, 1306, 1306, 1031, 1036,
-     1036, 1036, 1852, 2423, 1297,  590,  590, 1039, 1039, 1039,
-     1308,  596, 2424, 1308,  597, 2425, 1037, 2428, 1318, 1318,
-
-     1318, 2429, 1319, 2430, 1040, 1320,  598,  603,  604,  257,
-      604,  603,  603,  603,  603,  603,  603,  603,  605,  603,
-      603,  603, 2435,  603,  607,  603,  608,  603, 1298, 1321,
-     1321, 1321, 1332, 1332, 1332, 2436, 1309, 1332, 1332, 1332,
-     1053, 1053, 1053, 1348, 1348, 1348, 1322, 1336, 1336, 1336,
-     1334, 1337,  603,  603, 1338, 1334, 2441, 1054, 2442, 2443,
-      609, 1350,  610, 2444, 2453,  611, 1896, 1896, 1896,  612,
-     1705, 1705, 1705,  613,  603,  604,  257,  604,  603,  603,
-      603,  603,  603,  603,  603,  605,  603,  603,  603, 2454,
-      603,  607,  603,  608,  603, 1335, 1055, 1055, 1055, 1339,
-
-     1339, 1339, 2455, 1340, 2456, 2458, 1341, 1342, 1342, 1342,
-     1363, 1363, 1363, 1056, 3288, 3288, 3288, 2460, 2484,  603,
-      603, 3288, 3288, 3288, 1343, 2485, 2487,  609, 1365,  610,
-     2488, 3288,  611, 1708, 1708, 1708,  612, 2489, 3288, 2490,
-      613,  619,  620,  257,  620,  619,  619,  619,  619,  619,
-      619,  619,  621,  619,  619,  619, 1684,  619,  623,  619,
-      624,  619, 1348, 1348, 1348, 1344, 1067, 1067, 1067, 1718,
-     1718, 1718, 2431, 1345, 3288, 3288, 3288, 3288, 3288, 3288,
-     1350, 2494, 2432, 1068, 2495, 2496,  619,  619, 1356, 1356,
-     1356, 3288, 1357, 2481, 3288, 1358, 1368, 1368, 1368, 2497,
-
-     1369, 2498, 2499, 1370, 2500, 1901, 1901, 1901, 2501, 1351,
-      625,  619,  620,  257,  620,  619,  619,  619,  619,  619,
-      619,  619,  621,  619,  619,  619, 1347,  619,  623,  619,
-      624,  619, 1346, 1359, 1359, 1359, 1075, 1075, 1075, 2502,
-     1371, 1371, 1371, 1684, 2503, 1363, 1363, 1363, 2504, 2506,
-     1360, 2507, 2510, 1076, 2511, 2512,  619,  619, 1373, 1371,
-     1371, 1371, 2513, 1365, 1376, 1376, 1376, 2516, 1377, 1902,
-     2517, 1378, 1385, 1385, 1385, 2480, 1386, 1373, 2518, 1387,
-      625,  629,  630,  257,  630,  629,  629,  629,  629,  629,
-      629,  629,  631,  629,  629,  629, 1366,  629,  633,  629,
-
-      634,  629, 1080, 1080, 1080, 1380, 1380, 1380, 1086, 1086,
-     1086, 2519, 1380, 1380, 1380, 1391, 1391, 1391, 2521, 1081,
-     1374, 2525, 2508, 1382, 2526, 1087,  629,  629, 2527, 2528,
-     1382, 2509, 2532, 1393, 1904, 1904, 1904,  635,  629,  630,
-      257,  630,  629,  629,  629,  629,  629,  629,  629,  631,
-      629,  629,  629, 2533,  629,  633,  629,  634,  629, 1383,
-     2534, 1391, 1391, 1391, 1395, 1395, 1395, 2535, 1397, 1397,
-     1397, 3288, 3288, 3288, 1400, 1400, 1400, 2514, 2536, 1393,
-     1905, 1396, 2540,  629,  629, 1398, 2515, 2543, 3288, 1752,
-     1752, 1752, 1402, 2544,  635,  640,  641,  257,  641,  640,
-
-      640,  640,  640,  640,  640,  640,  642,  640,  640,  640,
-     2547,  640,  644,  640,  645,  640, 1394, 2559, 2560, 1400,
-     1400, 1400, 1405, 1405, 1405, 1754, 1754, 1754, 2563, 2564,
-     1399, 1409, 1409, 1409, 1412, 1412, 1412, 1402, 2584, 1406,
-      640,  640, 3288, 3288, 3288, 3288, 3288, 3288, 1410, 1684,
-     1140,  646, 1414, 1417, 1417, 1417, 2585, 1418, 2586, 3288,
-     1419, 2587, 3288, 1684,  647,  640,  641,  257,  641,  640,
-      640,  640,  640,  640,  640,  640,  642,  640,  640,  640,
-     1403,  640,  644,  640,  645,  640, 2582, 1412, 1412, 1412,
-     2581, 2588, 1407, 2597, 2598, 1106, 1106, 1106, 1420, 1420,
-
-     1420, 1420, 1420, 1420, 1411, 1414, 2583, 1408, 2599, 2600,
-      640,  640, 1107, 1424, 1424, 1424, 1422, 2601, 2602, 1422,
-     2603,  646, 2604, 2605, 1415, 2606, 1426, 1426, 1426, 2607,
-     1425, 1428, 1428, 1428,  647,  655, 1428, 1428, 1428, 1438,
-     1438, 1438,  670, 1427, 1432, 1432, 1432, 2609, 2610, 1430,
-     2611,  654,  671, 2612, 1430, 2613, 1423, 1440, 3288, 3288,
-     3288, 1433, 1755, 1755, 1755, 1436, 1436, 1436, 2614, 2615,
-     1438, 1438, 1438, 2616, 2617, 3288, 1130, 1130, 1130,  672,
-      673,  674, 1437, 2618, 2619,  675,  676,  677, 1440, 2620,
-      678,  679, 2621, 1131,  680, 2622,  681,  682,  683,  655,
-
-     1447, 1447, 1447, 1447, 1447, 1447,  727, 1431, 1434, 1453,
-     1453, 1453, 1453, 1453, 1453,  654,  728, 2623, 1449, 2591,
-     2625, 1449, 2633, 1435, 1457, 1457, 1457, 1455, 1458, 2592,
-     1455, 1459, 2593, 2634, 1460, 1460, 1460, 2635, 1460, 1460,
-     1460, 1441, 2638,  672,  729,  684, 1134, 1134, 1134,  730,
-      731,  677, 1462, 2639,  732,  679, 1462, 2643,  733, 2661,
-      734,  735,  683, 1135, 1464, 1464, 1464, 1450, 1465, 2662,
-     2678, 1466, 1468, 1468, 1468, 2663, 1456, 1468, 1468, 1468,
-     1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1684,
-     1470, 1510, 1510, 1510, 2680, 1470, 2681, 1140, 1155, 1463,
-
-     2682, 1155, 2686, 2687, 1155, 1188, 1188, 1188, 1511, 1188,
-     1188, 1188, 1188, 1188, 1188, 1513, 1513, 1513, 1193, 1193,
-     1193, 2690, 1194, 1190, 2691, 1195, 2675, 1190, 2694, 1684,
-     1190, 2676, 1514, 1480, 3288, 3288, 3288, 1198, 1198, 1198,
-     2695, 1471, 1198, 1198, 1198, 1198, 1198, 1198, 1206, 1206,
-     1206, 3288, 1203, 1203, 1203, 1200, 1204, 2696, 2697, 1205,
-     1200, 1512, 2698, 1200, 2699, 1207, 1519, 1519, 1519, 2700,
-     1520, 2677, 2688, 1521, 1522, 1522, 1522, 1209, 1209, 1209,
-     1524, 1524, 1524, 2701, 1525, 2689, 2702, 1526, 1528, 1528,
-     1528, 1523, 1517, 2704, 1210, 1515, 1214, 1214, 1214, 1214,
-
-     1214, 1214, 1214, 1214, 1214, 1529, 1533, 1533, 1533, 1221,
-     1221, 1221, 2705, 2706, 1216, 2707, 2708, 1216, 2709, 2710,
-     1216, 2692, 2711, 1534, 1221, 1221, 1221, 1223, 1221, 1221,
-     1221, 1225, 1225, 1225, 2693, 1226, 2712, 2713, 1227, 1229,
-     1229, 1229, 1223, 1229, 1229, 1229, 1223, 1538, 1538, 1538,
-     2594, 1247, 1247, 1247, 2714, 1248, 2715, 1231, 1249, 2716,
-     2595, 1231, 1531, 2596, 2718, 1539, 1555, 1555, 1555, 1252,
-     1252, 1252, 1252, 1252, 1252, 1536, 1252, 1252, 1252, 1261,
-     1261, 1261, 2726, 1556, 1257, 1257, 1257, 1254, 1258, 2727,
-     1254, 1259, 2735, 2736, 1254, 2753, 2754, 1263, 1261, 1261,
-
-     1261, 1261, 1261, 1261, 1265, 1265, 1265, 2755, 1266, 2756,
-     2757, 1267, 1561, 1561, 1561, 2758, 1263, 2769, 2771, 1263,
-     1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1562,
-     1564, 1564, 1564, 3288, 3288, 3288, 2761, 1557, 1271, 1684,
-     2772, 1271, 2773, 2774, 1271, 2775, 2776, 1565, 2777, 2762,
-     3288, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275,
-     2778, 1566, 1560, 1570, 1570, 1570, 1282, 1282, 1282, 1277,
-     1283, 1140, 1277, 1284, 2766, 1277, 1288, 1288, 1288, 2779,
-     1571, 1288, 1288, 1288, 1288, 1288, 1288, 1578, 1578, 1578,
-     1295, 1295, 1295, 1563, 1290, 1295, 1295, 1295, 2780, 1290,
-
-     2783, 2784, 1290, 2785, 1579, 1581, 1581, 1581, 1297, 1295,
-     1295, 1295, 2786, 1297, 1300, 1300, 1300, 2763, 1301, 2765,
-     2787, 1302, 1582, 1567, 1303, 1303, 1303, 1297, 1304, 2788,
-     2764, 1305, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306,
-     1306, 1314, 1314, 1314, 2789, 1315, 2790, 2792, 1316, 1575,
-     1308, 2793, 2794, 1308, 2795, 2796, 1308, 1588, 1588, 1588,
-     1318, 1318, 1318, 2797, 1319, 2798, 2799, 1320, 1321, 1321,
-     1321, 1590, 1590, 1590, 1589, 1591, 1580, 2800, 1592, 1332,
-     1332, 1332, 1332, 1332, 1332, 1322, 1332, 1332, 1332, 1336,
-     1336, 1336, 2664, 1337, 2801, 2802, 1338, 1334, 2803, 2804,
-
-     1334, 2810, 2665, 1583, 1334, 1339, 1339, 1339, 2666, 1340,
-     2811, 2812, 1341, 1342, 1342, 1342, 1603, 1603, 1603, 2819,
-     1604, 2820, 2834, 1605, 1348, 1348, 1348, 1348, 1348, 1348,
-     1343, 1348, 1348, 1348, 1356, 1356, 1356, 2835, 1357, 2836,
-     2837, 1358, 1350, 2838, 2839, 1350, 1359, 1359, 1359, 1350,
-     1615, 1615, 1615, 1602, 1616, 2843, 2844, 1617, 1363, 1363,
-     1363, 2845, 2846, 1360, 1363, 1363, 1363, 1363, 1363, 1363,
-     1368, 1368, 1368, 2826, 1369, 1140, 1365, 1370, 2856, 1610,
-     2857, 2858, 1365, 2827, 2859, 1365, 1371, 1371, 1371, 1371,
-     1371, 1371, 1371, 1371, 1371, 1376, 1376, 1376, 2828, 1377,
-
-     2860, 2861, 1378, 2862, 1373, 2863, 2867, 1373, 2829, 2847,
-     1373, 1380, 1380, 1380, 1380, 1380, 1380, 2868, 1620, 1380,
-     1380, 1380, 2869, 1385, 1385, 1385, 2830, 1386, 2870, 1382,
-     1387, 2832, 1382, 1391, 1391, 1391, 2831, 1382, 1391, 1391,
-     1391, 2833, 1391, 1391, 1391, 1395, 1395, 1395, 1631, 1631,
-     1631, 1393, 1632, 2871, 2872, 1633, 1393, 2874, 2875, 1622,
-     1393, 2876, 1396, 1397, 1397, 1397, 2877, 2878, 1625, 1634,
-     1634, 1634, 2879, 1635, 2880, 2881, 1636, 1400, 1400, 1400,
-     1398, 1400, 1400, 1400, 2885, 1400, 1400, 1400, 1405, 1405,
-     1405, 2886, 1409, 1409, 1409, 1402, 1912, 1912, 1912, 1402,
-
-     2887, 2890, 1630, 1402, 2895, 1406, 1640, 1640, 1640, 1410,
-     1641, 2896, 2897, 1642, 1645, 1645, 1645, 2898, 1646, 2899,
-     2900, 1647, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
-     1412, 1417, 1417, 1417, 2901, 1418, 2902, 2903, 1419, 2904,
-     1414, 2905, 1913, 1414, 2906, 2908, 1414, 1420, 1420, 1420,
-     2909, 2910, 1638, 1420, 1420, 1420, 1420, 1420, 1420, 1424,
-     1424, 1424, 1652, 1652, 1652, 1422, 1653, 2911, 2918, 1654,
-     2919, 1422, 1140, 2920, 1422, 2921, 1425, 1426, 1426, 1426,
-     1655, 1655, 1655, 2922, 1656, 2923, 2924, 1657, 1428, 1428,
-     1428, 2925, 1649, 2926, 1427, 1428, 1428, 1428, 2927, 1428,
-
-     1428, 1428, 1432, 1432, 1432, 2928, 1430, 1659, 1659, 1659,
-     2929, 1660, 2930, 1430, 1661, 2912, 1651, 1430, 2931, 1433,
-     1436, 1436, 1436, 1664, 1664, 1664, 2934, 1665, 2935, 2936,
-     1666, 1438, 1438, 1438, 1438, 1438, 1438, 1437, 1438, 1438,
-     1438, 1669, 1669, 1669, 1447, 1447, 1447, 2937, 2938, 1440,
-     2939, 2940, 1440, 1447, 1447, 1447, 1440, 2941, 1670, 2942,
-     2946, 1658, 1449, 1447, 1447, 1447, 1453, 1453, 1453, 2953,
-     2954, 1449, 1453, 1453, 1453, 1453, 1453, 1453, 1457, 1457,
-     1457, 1449, 1458, 2955, 1455, 1459, 1460, 1460, 1460, 2956,
-     1455, 2957, 2958, 1455, 1460, 1460, 1460, 1460, 1460, 1460,
-
-     1667, 1464, 1464, 1464, 1462, 1465, 2959, 2960, 1466, 1468,
-     1468, 1468, 1462, 2961, 2962, 1462, 1468, 1468, 1468, 1468,
-     1468, 1468, 2963, 2964, 1674, 2967, 2968, 1470, 1677, 1683,
-     1683, 1683, 2969, 2970, 1470, 2978, 2979, 1470, 1153, 1153,
-     1153, 1510, 1510, 1510, 1188, 1188, 1188, 1684, 1685, 1140,
-     1513, 1513, 1513, 1538, 1538, 1538, 1155, 1678, 1511, 1721,
-     1721, 1721, 1190, 1722, 2980, 2973, 1723, 1514, 1725, 1725,
-     1725, 1539, 1726, 2973, 2981, 1727, 1198, 1198, 1198, 2974,
-     1680, 1519, 1519, 1519, 2976, 1520, 2982, 2983, 1521, 1522,
-     1522, 1522, 2984, 2985, 1200, 2971, 1732, 1732, 1732, 2986,
-
-     1733, 2987, 1724, 1734, 1690, 2988, 1523, 1524, 1524, 1524,
-     2989, 1525, 2990, 2991, 1526, 1528, 1528, 1528, 2992, 1736,
-     1736, 1736, 2993, 1737, 2994, 1730, 1738, 1214, 1214, 1214,
-     2995, 2999, 1529, 1533, 1533, 1533, 1742, 1742, 1742, 3004,
-     1743, 3005, 2996, 1744, 3006, 1216, 1745, 1745, 1745, 3007,
-     1534, 1221, 1221, 1221, 1763, 1763, 1763, 1555, 1555, 1555,
-     1765, 1765, 1765, 1746, 1766, 3008, 3009, 1767, 3012, 1223,
-     1140, 1764, 1684, 1685, 1556, 3012, 2973, 1740, 1252, 1252,
-     1252, 1261, 1261, 1261, 1561, 1561, 1561, 1772, 1772, 1772,
-     2974, 1773, 3015, 3016, 1774, 3017, 1254, 3018, 3021, 1263,
-
-     1747, 1562, 1269, 1269, 1269, 1564, 1564, 1564, 1776, 1776,
-     1776, 3010, 1777, 3022, 3031, 1778, 1275, 1275, 1275, 2997,
-     1271, 3019, 1565, 1570, 1570, 1570, 1783, 1783, 1783, 3000,
-     1784, 2998, 3002, 1785, 1277, 1786, 1786, 1786, 3034, 3020,
-     1571, 3001, 1768, 3039, 3003, 1771, 1789, 1789, 1789, 1288,
-     1288, 1288, 1787, 1578, 1578, 1578, 3042, 1795, 1795, 1795,
-     3043, 1796, 1775, 1790, 1797, 3029, 3044, 1290, 3012, 3046,
-     1579, 1798, 1798, 1798, 1581, 1581, 1581, 1780, 1800, 1800,
-     1800, 3012, 1801, 3032, 3030, 1802, 1306, 1306, 1306, 1799,
-     3047, 1582, 1791, 1805, 1805, 1805, 1588, 1588, 1588, 1809,
-
-     1809, 1809, 3033, 1810, 1308, 3048, 1811, 1590, 1590, 1590,
-     1806, 1591, 3049, 1589, 1592, 1792, 1814, 1814, 1814, 1332,
-     1332, 1332, 1603, 1603, 1603, 3050, 1604, 3051, 3052, 1605,
-     1823, 1823, 1823, 1815, 3288, 3288, 3288, 1334, 3288, 3288,
-     3288, 3288, 3288, 3288, 1348, 1348, 1348, 1824, 1830, 1830,
-     1830, 3288, 1803, 2973, 3062, 3288, 3063, 3064, 3288, 1615,
-     1615, 1615, 1350, 1616, 2976, 1831, 1617, 3065, 3066, 1834,
-     1834, 1834, 1363, 1363, 1363, 1371, 1371, 1371, 1380, 1380,
-     1380, 1846, 1846, 1846, 1822, 1826, 1835, 1391, 1391, 1391,
-     1365, 3067, 3071, 1373, 3072, 3073, 1382, 3074, 1847, 1828,
-
-     3075, 1400, 1400, 1400, 1825, 1393, 1631, 1631, 1631, 3037,
-     1632, 1827, 3076, 1633, 1634, 1634, 1634, 3077, 1635, 1402,
-     3078, 1636, 1640, 1640, 1640, 3080, 1641, 1848, 3038, 1642,
-     1645, 1645, 1645, 3081, 1646, 1842, 1837, 1647, 1412, 1412,
-     1412, 1839, 3082, 3040, 1849, 1420, 1420, 1420, 1652, 1652,
-     1652, 3083, 1653, 3084, 3085, 1654, 1414, 1655, 1655, 1655,
-     3089, 1656, 3041, 1422, 1657, 3087, 3086, 1851, 1428, 1428,
-     1428, 1659, 1659, 1659, 3090, 1660, 3091, 3088, 1661, 3092,
-     1664, 1664, 1664, 3093, 1665, 3094, 1430, 1666, 1438, 1438,
-     1438, 1669, 1669, 1669, 1864, 1864, 1864, 3095, 1865, 1856,
-
-     3096, 1866, 1858, 1447, 1447, 1447, 1440, 3097, 1670, 1872,
-     1872, 1872, 1453, 1453, 1453, 1859, 1460, 1460, 1460, 3098,
-     3099, 1449, 1876, 1876, 1876, 3100, 1873, 1468, 1468, 1468,
-     1455, 1683, 1683, 1683, 1462, 1862, 1153, 1153, 1153, 1877,
-     1721, 1721, 1721, 3101, 1722, 1470, 3102, 1723, 3104, 1684,
-     3105, 3106, 1870, 3107, 1155, 1188, 1188, 1188, 1725, 1725,
-     1725, 1140, 1726, 3108, 3109, 1727, 3110, 3111, 1875, 1198,
-     1198, 1198, 3112, 1190, 1732, 1732, 1732, 3113, 1733, 1874,
-     3114, 1734, 1880, 1214, 1214, 1214, 3103, 1200, 1885, 1878,
-     1736, 1736, 1736, 3115, 1737, 3116, 3117, 1738, 3118, 1881,
-
-     3119, 1216, 1742, 1742, 1742, 3120, 1743, 3121, 3122, 1744,
-     1745, 1745, 1745, 3123, 1931, 1931, 1931, 3125, 1932, 3126,
-     1917, 1933, 1914, 1221, 1221, 1221, 3127, 1746, 1940, 1940,
-     1940, 1940, 1940, 1940, 1901, 1901, 1901, 1763, 1763, 1763,
-     3128, 1223, 1140, 3129, 1921, 1946, 1946, 1946, 3130, 1947,
-     3131, 3132, 1948, 3133, 1764, 1765, 1765, 1765, 3134, 1766,
-     3135, 3124, 1767, 1252, 1252, 1252, 1951, 1951, 1951, 1261,
-     1261, 1261, 3136, 3137, 1934, 1772, 1772, 1772, 3138, 1773,
-     3139, 1254, 1774, 1952, 1269, 1269, 1269, 1263, 3140, 1776,
-     1776, 1776, 1941, 1777, 3141, 1902, 1778, 3142, 1941, 1275,
-
-     1275, 1275, 1271, 1955, 1955, 1955, 3144, 1783, 1783, 1783,
-     1949, 1784, 3145, 3146, 1785, 3147, 1953, 1277, 3148, 3149,
-     1956, 1786, 1786, 1786, 1960, 1960, 1960, 1140, 1961, 3150,
-     3151, 1962, 1963, 1963, 1963, 1789, 1789, 1789, 1787, 1965,
-     1965, 1965, 3152, 1966, 3153, 3154, 1967, 3143, 3155, 1964,
-     1954, 3156, 1790, 1969, 1969, 1969, 1971, 1971, 1971, 3157,
-     1795, 1795, 1795, 1957, 1796, 3158, 3159, 1797, 1798, 1798,
-     1798, 1970, 1800, 1800, 1800, 3160, 1801, 3161, 3163, 1802,
-     1306, 1306, 1306, 1805, 1805, 1805, 1799, 1975, 1975, 1975,
-     3164, 1976, 3165, 1140, 1977, 1978, 1978, 1978, 1308, 3162,
-
-     1806, 1809, 1809, 1809, 3166, 1810, 3167, 3168, 1811, 2078,
-     2078, 2078, 1979, 1814, 1814, 1814, 1983, 1983, 1983, 3169,
-     1984, 3170, 3171, 1985, 3172, 3173, 1973, 1986, 1986, 1986,
-     1815, 1992, 1992, 1992, 1332, 1332, 1332, 1823, 1823, 1823,
-     1998, 1998, 1998, 3174, 1987, 3288, 3288, 3288, 1993, 1995,
-     1995, 1995, 1334, 1996, 1824, 3176, 1997, 1999, 2001, 2001,
-     2001, 3177, 3288, 1348, 1348, 1348, 1830, 1830, 1830, 2005,
-     2005, 2005, 3178, 2006, 3179, 2002, 2007, 2008, 2008, 2008,
-     3180, 1350, 3181, 1831, 1834, 1834, 1834, 3182, 2011, 2011,
-     2011, 3183, 2012, 1140, 2009, 2013, 2015, 2015, 2015, 3185,
-
-     1994, 1835, 3186, 2000, 1371, 1371, 1371, 3175, 1380, 1380,
-     1380, 1846, 1846, 1846, 2016, 3187, 3188, 2025, 2025, 2025,
-     3189, 2026, 1373, 2003, 2027, 3190, 1382, 3191, 1847, 2029,
-     2029, 2029, 1400, 1400, 1400, 2034, 2034, 2034, 3192, 3195,
-     2036, 2036, 2036, 3288, 3288, 3288, 3196, 2030, 3197, 3198,
-     1402, 3199, 2035, 3200, 3209, 2018, 2021, 2037, 1140, 1728,
-     3288, 1412, 1412, 1412, 1420, 1420, 1420, 1428, 1428, 1428,
-     2043, 2043, 2043, 2045, 2045, 2045, 1438, 1438, 1438, 1414,
-     3210, 3211, 1422, 2032, 1140, 1430, 1720, 2044, 1140, 1140,
-     2046, 1864, 1864, 1864, 1440, 1865, 1140, 1140, 1866, 1447,
-
-     1447, 1447, 1872, 1872, 1872, 2400, 2401, 2038, 2402, 1140,
-     2041, 2054, 2054, 2054, 1719, 2055, 2403, 1449, 2056, 1873,
-     1453, 1453, 1453, 2404, 3201, 1460, 1460, 1460, 2039, 1876,
-     1876, 1876, 2042, 2059, 2059, 2059, 1717, 2060, 1455, 3247,
-     2061, 2047, 1716, 1462, 3203, 3202, 1877, 2062, 2062, 2062,
-     2052, 2068, 2068, 2068, 1153, 1153, 1153, 1896, 1896, 1896,
-     2085, 2085, 2085, 1140, 1715, 2063, 1140, 1714, 2069, 1901,
-     1901, 1901, 1155, 2086, 2086, 2086, 1904, 1904, 1904, 2057,
-     2058, 2089, 2089, 2089, 2090, 2090, 2090, 1912, 1912, 1912,
-     1188, 1188, 1188, 2099, 2099, 2099, 2102, 2102, 2102, 1214,
-
-     1214, 1214, 2106, 2106, 2106, 1931, 1931, 1931, 1190, 1932,
-     3215, 2100, 1933, 2103, 3204, 2070, 1140, 1216, 1140, 2107,
-     1221, 1221, 1221, 3285, 2119, 2119, 2119, 1940, 1940, 1940,
-     2126, 2126, 2126, 2128, 2128, 2128, 3285, 1140, 1223, 1140,
-     2096, 2120, 1946, 1946, 1946, 1140, 1947, 1140, 1140, 1948,
-     2129, 1252, 1252, 1252, 2131, 2131, 2131, 3219, 2105, 1951,
-     1951, 1951, 3207, 2133, 2133, 2133, 2118, 2134, 1140, 1254,
-     2135, 2132, 1261, 1261, 1261, 3212, 1952, 2137, 2137, 2137,
-     1955, 1955, 1955, 1140, 2139, 2139, 2139, 3205, 2140, 3208,
-     1263, 2141, 1275, 1275, 1275, 2138, 3206, 1956, 1960, 1960,
-
-     1960, 3213, 1961, 3221, 2130, 1962, 1963, 1963, 1963, 1140,
-     1277, 2145, 2145, 2145, 1140, 2146, 1713, 1140, 2147, 1140,
-     1965, 1965, 1965, 1964, 1966, 2136, 1712, 1967, 1969, 1969,
-     1969, 1971, 1971, 1971, 1306, 1306, 1306, 3214, 1711, 2142,
-     1975, 1975, 1975, 1140, 1976, 1140, 1970, 1977, 1978, 1978,
-     1978, 1140, 1308, 2154, 2154, 2154, 3217, 2155, 3220, 3229,
-     2156, 3216, 1983, 1983, 1983, 1979, 1984, 1140, 1140, 1985,
-     1986, 1986, 1986, 2160, 2160, 2160, 1140, 2161, 3222, 1140,
-     2162, 2163, 2163, 2163, 1992, 1992, 1992, 1987, 3218, 2168,
-     2168, 2168, 2152, 2169, 1140, 1140, 2170, 1140, 2164, 3227,
-
-     1140, 1993, 1332, 1332, 1332, 1995, 1995, 1995, 1140, 1996,
-     1140, 1710, 1997, 1998, 1998, 1998, 3225, 2172, 2172, 2172,
-     1334, 2173, 3223, 1709, 2174, 2175, 2175, 2175, 3241, 3228,
-     1999, 2001, 2001, 2001, 2177, 2177, 2177, 3226, 2178, 1140,
-     3224, 2179, 2176, 1348, 1348, 1348, 3230, 1707, 2002, 3267,
-     2005, 2005, 2005, 2171, 2006, 1140, 3237, 2007, 2008, 2008,
-     2008, 1350, 2182, 2182, 2182, 1140, 2183, 1706, 3253, 2184,
-     2011, 2011, 2011, 1140, 2012, 2009, 1140, 2013, 2015, 2015,
-     2015, 1371, 1371, 1371, 2190, 2190, 2190, 1380, 1380, 1380,
-     2194, 2194, 2194, 1140, 2180, 1140, 2016, 1140, 1140, 1373,
-
-     3231, 2191, 2025, 2025, 2025, 1382, 2026, 2195, 3232, 2027,
-     2029, 2029, 2029, 2202, 2202, 2202, 2034, 2034, 2034, 2205,
-     2205, 2205, 3238, 2206, 1140, 1704, 2207, 3233, 2030, 3234,
-     3242, 2203, 1140, 2035, 1140, 1140, 2196, 2036, 2036, 2036,
-     2208, 2208, 2208, 1140, 2209, 2188, 3281, 2210, 2192, 1412,
-     1412, 1412, 1140, 3254, 2037, 1420, 1420, 1420, 1428, 1428,
-     1428, 2043, 2043, 2043, 2216, 2216, 2216, 1414, 2217, 1140,
-     3239, 2218, 1140, 1422, 1703, 3235, 1430, 3236, 2044, 2045,
-     2045, 2045, 2219, 2219, 2219, 3248, 2220, 3240, 3243, 2221,
-     1438, 1438, 1438, 1447, 1447, 1447, 2046, 1140, 2054, 2054,
-
-     2054, 3244, 2055, 1140, 2214, 2056, 3245, 1140, 1440, 3246,
-     1140, 1449, 1453, 1453, 1453, 2212, 1460, 1460, 1460, 1140,
-     2059, 2059, 2059, 2215, 2060, 1140, 1700, 2061, 1697, 1696,
-     1455, 2062, 2062, 2062, 1462, 2068, 2068, 2068, 2235, 2235,
-     2235, 3255, 2236, 3261, 3268, 2237, 1153, 1153, 1153, 2063,
-     1140, 1140, 2069, 3249, 1695, 2222, 3251, 1694, 2227, 2239,
-     2239, 2239, 3252, 2229, 1155, 2244, 2244, 2244, 1693, 2230,
-     2245, 2245, 2245, 2078, 2078, 2078, 2247, 2247, 2247, 2251,
-     2251, 2251, 2085, 2085, 2085, 2086, 2086, 2086, 2252, 2252,
-     2252, 2089, 2089, 2089, 2090, 2090, 2090, 2255, 2255, 2255,
-
-     2256, 2256, 2256, 2257, 2257, 2257, 2258, 2258, 2258, 1140,
-     2238, 1188, 1188, 1188, 2099, 2099, 2099, 3256, 2102, 2102,
-     2102, 2264, 2264, 2264, 3277, 2265, 1140, 1140, 2266, 1190,
-     1692, 1140, 2100, 1140, 2253, 2103, 2268, 2268, 2268, 2106,
-     2106, 2106, 2270, 2270, 2270, 1691, 2271, 1689, 1688, 2272,
-     1221, 1221, 1221, 1140, 2269, 3250, 2107, 2119, 2119, 2119,
-     1140, 3257, 2260, 2284, 2284, 2284, 3269, 2285, 1223, 1140,
-     2286, 2287, 2287, 2287, 2120, 2126, 2126, 2126, 2292, 2292,
-     2292, 2128, 2128, 2128, 2294, 2294, 2294, 3258, 2295, 1140,
-     1140, 2296, 1252, 1252, 1252, 2131, 2131, 2131, 2129, 2283,
-
-     2298, 2298, 2298, 3262, 2299, 1687, 3259, 2300, 1686, 1679,
-     1254, 1140, 2132, 2133, 2133, 2133, 3263, 2134, 1140, 1140,
-     2135, 1261, 1261, 1261, 2293, 1140, 2137, 2137, 2137, 2139,
-     2139, 2139, 1140, 2140, 1676, 3260, 2141, 3264, 1675, 1263,
-     1275, 1275, 1275, 2297, 2138, 2145, 2145, 2145, 1140, 2146,
-     1140, 1140, 2147, 1306, 1306, 1306, 3265, 1140, 1277, 2154,
-     2154, 2154, 3266, 2155, 3271, 1673, 2156, 2163, 2163, 2163,
-     1140, 1308, 2301, 2160, 2160, 2160, 1672, 2161, 3272, 1671,
-     2162, 2316, 2316, 2316, 2164, 2317, 3270, 3273, 2318, 3275,
-     2168, 2168, 2168, 2302, 2169, 1668, 3282, 2170, 1332, 1332,
-
-     1332, 1663, 2172, 2172, 2172, 1140, 2173, 3274, 2311, 2174,
-     2175, 2175, 2175, 2323, 2323, 2323, 1334, 2324, 1662, 1140,
-     2325, 2177, 2177, 2177, 1140, 2178, 3278, 2176, 2179, 1348,
-     1348, 1348, 2182, 2182, 2182, 1140, 2183, 3276, 1650, 2184,
-     2331, 2331, 2331, 2190, 2190, 2190, 1648, 1350, 2334, 2334,
-     2334, 3279, 2335, 1644, 1643, 2336, 3280, 1140, 2332, 1639,
-     2191, 1637, 2322, 1380, 1380, 1380, 2194, 2194, 2194, 2339,
-     2339, 2339, 1629, 2340, 1628, 1627, 2341, 1140, 2202, 2202,
-     2202, 1382, 1626, 2195, 2205, 2205, 2205, 1624, 2206, 3283,
-     1623, 2207, 1412, 1412, 1412, 2326, 2203, 2208, 2208, 2208,
-
-     1621, 2209, 1619, 1618, 2210, 1614, 1420, 1420, 1420, 3284,
-     1414, 1428, 1428, 1428, 2216, 2216, 2216, 1613, 2217, 1612,
-     1611, 2218, 1609, 2337, 1422, 1608, 2219, 2219, 2219, 1430,
-     2220, 1607, 1606, 2221, 1438, 1438, 1438, 1601, 2357, 2357,
-     2357, 1600, 1599, 2352, 3288, 3288, 3288, 2355, 3288, 3288,
-     3288, 1598, 1440, 1597, 2356, 2358, 3288, 3288, 3288, 1596,
-     1595, 3288, 1447, 1447, 1447, 3288, 1453, 1453, 1453, 2365,
-     2365, 2365, 2354, 3288, 2367, 2367, 2367, 2370, 2370, 2370,
-     1449, 2235, 2235, 2235, 1455, 2236, 1594, 2366, 2237, 1153,
-     1153, 1153, 1140, 1593, 1587, 2359, 2239, 2239, 2239, 2372,
-
-     2372, 2372, 2373, 2373, 2373, 1586, 1585, 1155, 2244, 2244,
-     2244, 1584, 2360, 1577, 1576, 2361, 2245, 2245, 2245, 2247,
-     2247, 2247, 2377, 2377, 2377, 1574, 2364, 2362, 2378, 2378,
-     2378, 2379, 2379, 2379, 2251, 2251, 2251, 2252, 2252, 2252,
-     2255, 2255, 2255, 2256, 2256, 2256, 1573, 1572, 2371, 2257,
-     2257, 2257, 2258, 2258, 2258, 2383, 2383, 2383, 2386, 2386,
-     2386, 2264, 2264, 2264, 1569, 2265, 1568, 1559, 2266, 3288,
-     3288, 3288, 1558, 2384, 1554, 2387, 2268, 2268, 2268, 1553,
-     2270, 2270, 2270, 1552, 2271, 1551, 3288, 2272, 1221, 1221,
-     1221, 2284, 2284, 2284, 2269, 2285, 2405, 2406, 2286, 2407,
-
-     2287, 2287, 2287, 2410, 2410, 2410, 1223, 2408, 2292, 2292,
-     2292, 2294, 2294, 2294, 2409, 2295, 1550, 1549, 2296, 1252,
-     1252, 1252, 2298, 2298, 2298, 1548, 2299, 1547, 1545, 2300,
-     2416, 2416, 2416, 1544, 1542, 2388, 1541, 1254, 1275, 1275,
-     1275, 2426, 2426, 2426, 1306, 1306, 1306, 1540, 2417, 2399,
-     2316, 2316, 2316, 1537, 2317, 1535, 1277, 2318, 2433, 2433,
-     2433, 1532, 1308, 1530, 1527, 2415, 2437, 2437, 2437, 2323,
-     2323, 2323, 1518, 2324, 1516, 2434, 2325, 2439, 2439, 2439,
-     2331, 2331, 2331, 1509, 2438, 2445, 2445, 2445, 1507, 2418,
-     2334, 2334, 2334, 1506, 2335, 2440, 1505, 2336, 2332, 1380,
-
-     1380, 1380, 2446, 1504, 2427, 2448, 2448, 2448, 2339, 2339,
-     2339, 1503, 2340, 1502, 1501, 2341, 1500, 1382, 3288, 3288,
-     3288, 1499, 2449, 3288, 3288, 3288, 3288, 3288, 3288, 2459,
-     2459, 2459, 2463, 2463, 2463, 3288, 2461, 2461, 2461, 1498,
-     3288, 1495, 1494, 3288, 1420, 1420, 1420, 1493, 1492, 2464,
-     2447, 2450, 1491, 1490, 2462, 1489, 1428, 1428, 1428, 2357,
-     2357, 2357, 1422, 1438, 1438, 1438, 1487, 1486, 2468, 2468,
-     2468, 1485, 2469, 2451, 1430, 2470, 2358, 2457, 2471, 2471,
-     2471, 1440, 1484, 1483, 2452, 3288, 3288, 3288, 3288, 3288,
-     3288, 2475, 2475, 2475, 1482, 2472, 2477, 2477, 2477, 1481,
-
-     2467, 1479, 3288, 1478, 2465, 3288, 1453, 1453, 1453, 2476,
-     2365, 2365, 2365, 2367, 2367, 2367, 1477, 2466, 2370, 2370,
-     2370, 2372, 2372, 2372, 1455, 2482, 2482, 2482, 2366, 1476,
-     1475, 1140, 2373, 2373, 2373, 1474, 2473, 1473, 1140, 2474,
-     2486, 2486, 2486, 2483, 2377, 2377, 2377, 2378, 2378, 2378,
-     2379, 2379, 2379, 2383, 2383, 2383, 2386, 2386, 2386, 2491,
-     2491, 2491, 1467, 2492, 1452, 1451, 2493, 1221, 1221, 1221,
-     1446, 2384, 2478, 2387, 1445, 2479, 2410, 2410, 2410, 2520,
-     2520, 2520, 1252, 1252, 1252, 1223, 2416, 2416, 2416, 2523,
-     2523, 2523, 2529, 2529, 2529, 2426, 2426, 2426, 1444, 1443,
-
-     1254, 1306, 1306, 1306, 2417, 1442, 1416, 2524, 1404, 2530,
-     1390, 2433, 2433, 2433, 2537, 2537, 2537, 1389, 2538, 1308,
-     1388, 2539, 2541, 2541, 2541, 1384, 1379, 2505, 2434, 2437,
-     2437, 2437, 2439, 2439, 2439, 2545, 2545, 2545, 1375, 2542,
-     2445, 2445, 2445, 1367, 2551, 2551, 2551, 2438, 2522, 1362,
-     2440, 1361, 2546, 2448, 2448, 2448, 1355, 2446, 2531, 2548,
-     2548, 2548, 2552, 2549, 1352, 1331, 2550, 2553, 2553, 2553,
-     2449, 2554, 1330, 1329, 2555, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 2561, 2561, 2561, 2459, 2459, 2459,
-     1328, 1327, 3288, 1326, 1325, 3288, 1324, 1323, 3288, 1317,
-
-     1310, 2562, 2461, 2461, 2461, 2463, 2463, 2463, 2565, 2565,
-     2565, 1299, 2566, 1294, 1293, 2567, 2568, 2568, 2568, 1292,
-     2462, 1287, 2464, 1428, 1428, 1428, 1286, 2556, 1438, 1438,
-     1438, 2468, 2468, 2468, 2569, 2469, 2557, 1285, 2470, 2558,
-     1281, 1430, 2471, 2471, 2471, 1280, 1440, 2572, 2572, 2572,
-     1279, 2573, 1274, 1273, 2574, 2575, 2575, 2575, 1268, 2472,
-     2577, 2577, 2577, 2475, 2475, 2475, 2477, 2477, 2477, 2579,
-     2579, 2579, 2576, 2482, 2482, 2482, 1260, 2578, 2486, 2486,
-     2486, 2476, 2589, 2589, 2589, 1256, 1251, 2580, 1250, 1246,
-     2570, 2483, 2571, 2491, 2491, 2491, 1245, 2492, 1244, 2590,
-
-     2493, 1221, 1221, 1221, 2520, 2520, 2520, 1252, 1252, 1252,
-     2523, 2523, 2523, 2626, 2626, 2626, 2529, 2529, 2529, 1223,
-     2628, 2628, 2628, 1243, 2629, 1254, 1242, 2630, 2524, 1241,
-     2627, 1240, 1239, 2530, 2631, 2631, 2631, 2636, 2636, 2636,
-     2537, 2537, 2537, 1238, 2538, 1237, 1236, 2539, 2541, 2541,
-     2541, 1235, 2632, 1234, 2637, 2640, 2640, 2640, 1228, 2641,
-     1220, 2608, 2642, 1219, 1218, 2542, 2644, 2644, 2644, 2545,
-     2545, 2545, 2646, 2646, 2646, 1213, 2647, 1212, 2624, 2648,
-     2649, 2649, 2649, 2645, 1211, 1208, 2546, 2548, 2548, 2548,
-     1202, 2549, 1197, 1196, 2550, 1192, 1187, 2650, 2551, 2551,
-
-     2551, 2553, 2553, 2553, 1186, 2554, 1185, 1184, 2555, 3288,
-     3288, 3288, 3288, 3288, 3288, 1183, 2552, 3288, 3288, 3288,
-     2561, 2561, 2561, 2654, 2654, 2654, 3288, 2655, 1182, 3288,
-     2656, 2657, 2657, 2657, 3288, 1181, 1179, 2562, 2659, 2659,
-     2659, 1178, 2565, 2565, 2565, 1177, 2566, 1176, 2658, 2567,
-     2568, 2568, 2568, 1175, 1174, 2660, 1428, 1428, 1428, 1438,
-     1438, 1438, 1173, 2652, 2651, 2575, 2575, 2575, 2569, 2572,
-     2572, 2572, 2653, 2573, 1430, 1172, 2574, 1440, 1171, 2669,
-     2669, 2669, 2576, 2670, 1170, 1169, 2671, 2577, 2577, 2577,
-     2672, 2672, 2672, 1168, 2673, 1167, 1166, 2674, 2579, 2579,
-
-     2579, 2679, 2679, 2679, 2578, 1165, 2589, 2589, 2589, 1164,
-     2683, 2683, 2683, 1163, 2684, 1162, 2580, 2685, 1161, 1160,
-     2668, 1159, 2667, 2590, 1221, 1221, 1221, 2717, 2717, 2717,
-     1252, 1252, 1252, 2720, 2720, 2720, 2626, 2626, 2626, 2723,
-     2723, 2723, 1223, 2724, 1152, 1151, 2725, 1150, 1254, 1149,
-     2721, 1148, 1147, 2627, 2628, 2628, 2628, 1146, 2629, 1143,
-     1141, 2630, 2631, 2631, 2631, 2728, 2728, 2728, 2636, 2636,
-     2636, 1140, 2733, 2733, 2733, 2703, 2679, 2679, 2679, 2722,
-     2632, 1138, 2729, 1136, 1133, 2637, 2730, 2730, 2730, 2734,
-     2731, 1129, 2719, 2732, 2640, 2640, 2640, 1127, 2641, 1126,
-
-     1125, 2642, 2644, 2644, 2644, 2737, 2737, 2737, 1123, 2738,
-     1122, 1121, 2739, 2646, 2646, 2646, 1120, 2647, 1119, 2645,
-     2648, 2649, 2649, 2649, 2740, 2740, 2740, 1118, 2741, 1116,
-     1115, 2742, 3288, 3288, 3288, 2744, 2744, 2744, 2650, 3288,
-     3288, 3288, 1114, 2654, 2654, 2654, 1113, 2655, 1111, 3288,
-     2656, 1110, 2745, 2657, 2657, 2657, 3288, 2747, 2747, 2747,
-     1109, 2748, 1105, 1104, 2749, 2659, 2659, 2659, 1102, 1101,
-     2658, 2750, 2750, 2750, 1100, 2751, 1099, 1098, 2752, 1428,
-     1428, 1428, 2660, 1438, 1438, 1438, 1097, 1095, 2746, 1094,
-     2743, 2669, 2669, 2669, 1093, 2670, 1092, 1430, 2671, 1090,
-
-     1089, 1440, 2672, 2672, 2672, 1088, 2673, 1085, 1084, 2674,
-     2767, 2767, 2767, 2770, 2770, 2770, 2683, 2683, 2683, 1082,
-     2684, 1079, 1078, 2685, 2781, 2781, 2781, 2768, 1684, 1074,
-     2759, 1221, 1221, 1221, 2717, 2717, 2717, 2805, 2805, 2805,
-     1073, 2782, 1252, 1252, 1252, 2720, 2720, 2720, 1071, 1223,
-     2760, 2807, 2807, 2807, 1070, 2808, 1069, 1066, 2809, 1065,
-     1254, 1064, 2721, 2723, 2723, 2723, 1063, 2724, 1061, 1060,
-     2725, 2728, 2728, 2728, 2813, 2813, 2813, 1059, 2814, 1058,
-     2791, 2815, 2730, 2730, 2730, 1057, 2731, 1052, 2729, 2732,
-     2733, 2733, 2733, 2806, 2816, 2816, 2816, 1050, 2817, 1049,
-
-     1048, 2818, 2737, 2737, 2737, 1047, 2738, 2734, 1046, 2739,
-     2740, 2740, 2740, 1045, 2741, 1044, 1043, 2742, 3288, 3288,
-     3288, 2744, 2744, 2744, 2822, 2822, 2822, 1042, 2823, 1041,
-     1038, 2824, 3288, 3288, 3288, 3288, 1035, 1034, 2745, 2747,
-     2747, 2747, 1033, 2748, 1027, 1026, 2749, 1024, 1021, 3288,
-     2750, 2750, 2750, 1019, 2751, 1018, 1017, 2752, 2840, 2840,
-     2840, 1438, 1438, 1438, 2848, 2848, 2848, 1012, 1011, 2821,
-     2767, 2767, 2767, 2850, 2850, 2850, 2841, 2851, 1009, 1440,
-     2852, 2849, 1684, 2853, 2853, 2853, 1008, 2768, 1684, 1007,
-     1005, 1684, 2770, 2770, 2770, 2854, 2854, 2854, 2855, 2855,
-
-     2855, 1002, 1000, 2825, 2781, 2781, 2781, 2864, 2864, 2864,
-      997, 2865,  996,  994, 2866, 1221, 1221, 1221, 2882, 2882,
-     2882, 2782, 2805, 2805, 2805,  993,  990, 2842, 2883, 2883,
-     2883,  985,  984, 1223, 2807, 2807, 2807,  981, 2808,  980,
-      979, 2809,  976, 2813, 2813, 2813, 2884, 2814,  975,  973,
-     2815, 2816, 2816, 2816,  970, 2817,  968,  967, 2818, 2888,
-     2888, 2888, 2891, 2891, 2891, 2822, 2822, 2822,  966, 2823,
-      965,  963, 2824, 2893, 2893, 2893, 2889,  962,  961, 2892,
-      960, 2873, 2840, 2840, 2840, 1438, 1438, 1438,  959,  958,
-     2894, 2848, 2848, 2848, 2913, 2913, 2913,  955, 2914,  954,
-
-     2841, 2915,  953, 1440, 2853, 2853, 2853,  950, 2849, 1684,
-      947,  946, 1684, 2850, 2850, 2850,  944, 2851,  943,  940,
-     2852, 2854, 2854, 2854, 2855, 2855, 2855,  937, 2864, 2864,
-     2864, 1684, 2865,  934,  933, 2866, 2907, 1682, 1682, 1682,
-     1682, 1682, 1682, 1682, 1682, 1682,  925,  924, 1682, 2932,
-     2932, 2932,  923, 1682, 1682, 1682, 1684, 1682, 2882, 2882,
-     2882, 2883, 2883, 2883, 2888, 2888, 2888, 2933, 2943, 2943,
-     2943,  922, 2944,  916,  915, 2945, 2891, 2891, 2891, 2884,
-      914, 2889, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-     1682, 1682, 1682, 2892,  912, 1682, 2893, 2893, 2893,  911,
-
-     1682, 1682, 1682, 1684, 1682, 2947, 2947, 2947,  910, 2948,
-      909,  908, 2949, 2894, 2950, 2950, 2950,  907, 2951,  902,
-      899, 2952, 2965, 2965, 2965, 2932, 2932, 2932,  901, 1682,
-     1682, 2913, 2913, 2913,  896, 2914,  895,  893, 2915,  891,
-     2966,  889,  887, 2933, 2965, 2965, 2965,  885,  882, 1684,
-     1682, 1682, 1682, 1682, 1682, 2977, 1682, 1682, 1682,  881,
-      880, 1682, 2966,  879,  878,  876, 1682, 1682, 1682, 1684,
-     1682, 2943, 2943, 2943,  874, 2944,  873,  872, 2945, 2947,
-     2947, 2947,  870, 2948,  868,  867, 2949, 2950, 2950, 2950,
-      865, 2951,  863,  862, 2952, 1682, 1682, 1682, 1682, 1682,
-
-     1682, 1682, 1682, 1682, 1682, 2977,  860,  856, 1682, 3014,
-     3014, 3014,  855, 1682, 1682, 1682, 1684, 1682, 3023, 3023,
-     3023, 3025, 3025, 3025, 3027, 3027, 3027, 1684, 1685, 3035,
-     3035, 3035, 3045, 3045, 3045, 3024,  853,  848, 3026,  846,
-      842, 3028, 1682, 1682,  841,  840, 3036, 3014, 3014, 3014,
-     1140, 3023, 3023, 3023, 3053, 3053, 3053,  838, 3054,  836,
-      835, 3055, 3025, 3025, 3025, 1684,  834,  832, 3024, 3056,
-     3056, 3056,  830, 3057,  829,  827, 3058,  825,  824, 3026,
-     3027, 3027, 3027, 3059, 3059, 3059,  823, 3060,  822,  821,
-     3061, 3035, 3035, 3035, 3045, 3045, 3045, 3028, 1880, 3068,
-
-     3068, 3068,  820, 3069,  819,  817, 3070,  815, 3036, 3053,
-     3053, 3053, 1140, 3054,  814,  811, 3055, 3056, 3056, 3056,
-      810, 3057,  809,  807, 3058, 3059, 3059, 3059,  795, 3060,
-      794, 3079, 3061, 3068, 3068, 3068,  791, 3069,  789,  787,
-     3070, 3184, 3184, 3184, 3184, 3184, 3184,  786, 3193,  785,
-      783, 3194, 3286, 3286, 3286, 3286, 3286, 3286,  781, 1140,
-      779,  776, 1140,  773,  772,  771,  769,  767,  766,  764,
-     3287,  762,  761, 3287,  254,  254,  254,  254,  254,  254,
-      254,  254,  254,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  260,  260,  260,  260,  260,  260,  260,  260,
-
-      260,  263,  263,  263,  263,  263,  263,  263,  263,  263,
-      266,  266,  266,  266,  266,  266,  266,  266,  266,  269,
-      269,  269,  269,  269,  269,  269,  269,  269,  276,  276,
-      276,  276,  276,  276,  276,  276,  276,  284,  284,  284,
-      284,  284,  284,  284,  284,  284,  288,  288,  288,  288,
-      288,  288,  288,  288,  288,  300,  300,  300,  300,  300,
-      300,  300,  300,  300,  304,  304,  304,  304,  304,  304,
-      304,  304,  304,  311,  311,  311,  311,  311,  311,  311,
-      311,  311,  322,  322,  322,  322,  322,  322,  322,  322,
-      322,  330,  330,  330,  330,  330,  330,  330,  330,  330,
-
-      336,  336,  336,  336,  336,  336,  336,  336,  336,  342,
-      342,  342,  342,  342,  342,  342,  342,  342,  348,  348,
-      348,  348,  348,  348,  348,  348,  348,  353,  353,  353,
-      353,  353,  353,  353,  353,  353,  372,  372,  372,  372,
-      372,  372,  372,  372,  372,  379,  379,  379,  379,  379,
-      379,  379,  379,  379,  386,  386,  386,  386,  386,  386,
-      386,  386,  386,  392,  392,  392,  392,  392,  392,  392,
-      392,  392,  399,  399,  399,  399,  399,  399,  399,  399,
-      399,  404,  404,  404,  404,  404,  404,  404,  404,  404,
-      410,  410,  410,  410,  410,  410,  410,  410,  410,  415,
-
-      415,  415,  415,  415,  415,  415,  415,  415,  421,  421,
-      421,  421,  421,  421,  421,  421,  421,  429,  429,  429,
-      429,  429,  429,  429,  429,  429,  437,  437,  437,  437,
-      437,  437,  437,  437,  437,  441,  441,  441,  441,  441,
-      441,  441,  441,  441,  447,  447,  447,  447,  447,  447,
-      447,  447,  447,  453,  453,  453,  453,  453,  453,  453,
-      453,  453,  470,  470,  470,  470,  470,  470,  470,  470,
-      470,  476,  476,  476,  476,  476,  476,  476,  476,  476,
-      485,  485,  485,  485,  485,  485,  485,  485,  485,  491,
-      491,  491,  491,  491,  491,  491,  491,  491,  501,  501,
-
-      501,  501,  501,  501,  501,  501,  501,  507,  507,  507,
-      507,  507,  507,  507,  507,  507,  512,  512,  512,  512,
-      512,  512,  512,  512,  512,  518,  518,  518,  518,  518,
-      518,  518,  518,  518,  524,  524,  524,  524,  524,  524,
-      524,  524,  524,  530,  530,  530,  530,  530,  530,  530,
-      530,  530,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  544,  544,  544,  544,  544,  544,  544,  544,  544,
-      549,  549,  549,  549,  549,  549,  549,  549,  549,  557,
-      557,  557,  557,  557,  557,  557,  557,  557,  563,  563,
-      563,  563,  563,  563,  563,  563,  563,  570,  570,  570,
-
-      570,  570,  570,  570,  570,  570,  575,  575,  575,  575,
-      575,  575,  575,  575,  575,  581,  581,  581,  581,  581,
-      581,  581,  581,  581,  586,  586,  586,  586,  586,  586,
-      586,  586,  586,  593,  593,  593,  593,  593,  593,  593,
-      593,  593,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  622,
-      622,  622,  622,  622,  622,  622,  622,  622,  626,  626,
-      626,  626,  626,  626,  626,  626,  626,  632,  632,  632,
-      632,  632,  632,  632,  632,  632,  636,  636,  636,  636,
-
-      636,  636,  636,  636,  636,  643,  643,  643,  643,  643,
-      643,  643,  643,  643,  648,  648,  648,  648,  648,  648,
-      648,  648,  648,  668,  668,  668,  759,  757,  756,  668,
-      695,  695,  695,  755,  753,  751,  695,  699,  699,  699,
-      750,  749,  748,  699,  707,  707,  707,  746, 3288,  693,
-      707,  718,  718,  718,  726,  725,  723,  718,  724,  724,
-      724,  721,  720,  719,  724,  747,  747,  747,  717,  713,
-      709,  747,  754,  754,  754,  708,  706,  705,  754,  760,
-      760,  760,  702,  701,  700,  760,  765,  765,  765,  698,
-      697,  696,  765,  770,  770,  770,  694,  689, 3288,  770,
-
-      780,  780,  780,  669,  667,  665,  780,  784,  784,  784,
-      659,  658,  659,  784,  790,  790,  790,  658,  657,  656,
-      790,  808,  808,  808, 3288, 3288, 3288,  808,  818,  818,
-      818, 3288, 3288, 3288,  818,  828,  828,  828, 3288, 3288,
-     3288,  828,  833,  833,  833, 3288, 3288, 3288,  833,  839,
-      839,  839, 3288, 3288, 3288,  839,  847,  847,  847, 3288,
-     3288, 3288,  847,  854,  854,  854, 3288, 3288, 3288,  854,
-      861,  861,  861, 3288, 3288, 3288,  861,  866,  866,  866,
-     3288, 3288, 3288,  866,  871,  871,  871, 3288, 3288, 3288,
-      871,  877,  877,  877, 3288, 3288, 3288,  877,  886,  886,
-
-      886, 3288, 3288, 3288,  886,  890,  890,  890, 3288, 3288,
-     3288,  890,  894,  894,  894, 3288, 3288, 3288,  894,  898,
-      898,  898,  898,  898,  898,  898, 3288,  898,  668,  668,
-      668, 3288, 3288, 3288,  668,  913, 3288, 3288, 3288,  913,
-      695,  695,  695, 3288, 3288, 3288,  695,  945, 3288, 3288,
-     3288,  945,  699,  699,  699, 3288, 3288, 3288,  699,  952,
-     3288, 3288, 3288,  952,  707,  707,  707, 3288, 3288, 3288,
-      707,  964, 3288, 3288, 3288,  964,  718,  718,  718, 3288,
-     3288, 3288,  718,  969, 3288, 3288, 3288,  969,  724,  724,
-      724, 3288, 3288, 3288,  724,  974, 3288, 3288, 3288,  974,
-
-      747,  747,  747, 3288, 3288, 3288,  747,  995, 3288, 3288,
-     3288,  995,  754,  754,  754, 3288, 3288, 3288,  754, 1001,
-     3288, 3288, 3288, 1001,  760,  760,  760, 3288, 3288, 3288,
-      760, 1006, 3288, 3288, 3288, 1006,  765,  765,  765, 3288,
-     3288, 3288,  765, 1010, 3288, 3288, 3288, 1010,  770,  770,
-      770, 3288, 3288, 3288,  770, 1020, 3288, 3288, 3288, 1020,
-      780,  780,  780, 3288, 3288, 3288,  780, 1025, 3288, 3288,
-     3288, 1025,  784,  784,  784, 3288, 3288, 3288,  784, 1032,
-     3288, 3288, 3288, 1032,  790,  790,  790, 3288, 3288, 3288,
-      790, 1051, 3288, 3288, 3288, 1051,  808,  808,  808, 3288,
-
-     3288, 3288,  808, 1062, 3288, 3288, 3288, 1062,  818,  818,
-      818, 3288, 3288, 3288,  818, 1072, 3288, 3288, 3288, 1072,
-      828,  828,  828, 3288, 3288, 3288,  828, 1077, 3288, 3288,
-     3288, 1077,  833,  833,  833, 3288, 3288, 3288,  833, 1083,
-     3288, 3288, 3288, 1083,  839,  839,  839, 3288, 3288, 3288,
-      839, 1091, 3288, 3288, 3288, 1091,  847,  847,  847, 3288,
-     3288, 3288,  847, 1096, 3288, 3288, 3288, 1096,  854,  854,
-      854, 3288, 3288, 3288,  854, 1103, 3288, 3288, 3288, 1103,
-      861,  861,  861, 3288, 3288, 3288,  861, 1108, 3288, 3288,
-     3288, 1108,  866,  866,  866, 3288, 3288, 3288,  866, 1112,
-
-     3288, 3288, 3288, 1112,  871,  871,  871, 3288, 3288, 3288,
-      871, 1117, 3288, 3288, 3288, 1117,  877,  877,  877, 3288,
-     3288, 3288,  877, 1124, 3288, 3288, 3288, 1124,  886,  886,
-      886, 3288, 3288, 3288,  886, 1128, 3288, 3288, 3288, 1128,
-      890,  890,  890, 3288, 3288, 3288,  890, 1132, 3288, 3288,
-     3288, 1132,  894,  894,  894, 3288, 3288, 3288,  894, 1137,
-     3288, 3288, 3288, 1137, 1139, 1139, 1139, 1139, 1139, 1139,
-     1139, 1139, 1139, 1145, 3288, 3288, 3288, 3288, 1145,  668,
-      668,  668, 3288, 3288, 3288,  668, 1154, 1154, 1154, 1154,
-     3288, 3288, 1154, 1154,  695,  695,  695, 3288, 3288, 3288,
-
-      695, 1189, 1189, 1189, 1189, 3288, 3288, 1189, 1189,  699,
-      699,  699, 3288, 3288, 3288,  699, 1199, 1199, 1199, 1199,
-     3288, 3288, 1199, 1199,  707,  707,  707, 3288, 3288, 3288,
-      707, 1215, 1215, 1215, 1215, 3288, 3288, 1215, 1215,  718,
-      718,  718, 3288, 3288, 3288,  718, 1222, 1222, 1222, 1222,
-     3288, 3288, 1222, 1222,  724,  724,  724, 3288, 3288, 3288,
-      724, 1230, 1230, 1230, 1230, 3288, 3288, 1230, 1230,  747,
-      747,  747, 3288, 3288, 3288,  747, 1253, 1253, 1253, 1253,
-     3288, 3288, 1253, 1253,  754,  754,  754, 3288, 3288, 3288,
-      754, 1262, 1262, 1262, 1262, 3288, 3288, 1262, 1262,  760,
-
-      760,  760, 3288, 3288, 3288,  760, 1270, 1270, 1270, 1270,
-     3288, 3288, 1270, 1270,  765,  765,  765, 3288, 3288, 3288,
-      765, 1276, 1276, 1276, 1276, 3288, 3288, 1276, 1276,  770,
-      770,  770, 3288, 3288, 3288,  770, 1289, 1289, 1289, 1289,
-     3288, 3288, 1289, 1289,  780,  780,  780, 3288, 3288, 3288,
-      780, 1296, 1296, 1296, 1296, 3288, 3288, 1296, 1296,  784,
-      784,  784, 3288, 3288, 3288,  784, 1307, 1307, 1307, 1307,
-     3288, 3288, 1307, 1307,  790,  790,  790, 3288, 3288, 3288,
-      790, 1333, 1333, 1333, 1333, 3288, 3288, 1333, 1333,  808,
-      808,  808,  808, 3288,  808, 3288,  808, 1349, 1349, 1349,
-
-     1349, 3288, 3288, 1349, 1349,  818,  818,  818, 3288, 3288,
-     3288,  818, 1364, 1364, 1364, 1364, 3288, 3288, 1364, 1364,
-      828,  828,  828, 3288, 3288, 3288,  828, 1372, 1372, 1372,
-     1372, 3288, 3288, 1372, 1372,  833,  833,  833, 3288, 3288,
-     3288,  833, 1381, 1381, 1381, 1381, 3288, 3288, 1381, 1381,
-      839,  839,  839, 3288, 3288, 3288,  839, 1392, 1392, 1392,
-     1392, 3288, 3288, 1392, 1392,  847,  847,  847,  847, 3288,
-      847, 3288,  847, 1401, 1401, 1401, 1401, 3288, 3288, 1401,
-     1401,  854,  854,  854,  854, 3288,  854, 3288,  854, 1413,
-     1413, 1413, 1413, 3288, 3288, 1413, 1413,  861,  861,  861,
-
-     3288, 3288, 3288,  861, 1421, 1421, 1421, 1421, 3288, 3288,
-     1421, 1421,  866,  866,  866,  866, 3288,  866, 3288,  866,
-     1429, 1429, 1429, 1429, 3288, 3288, 1429, 1429,  871,  871,
-      871,  871, 3288,  871, 3288,  871, 1439, 1439, 1439, 1439,
-     3288, 3288, 1439, 1439,  877,  877,  877, 3288, 3288, 3288,
-      877, 1448, 1448, 1448, 1448, 3288, 3288, 1448, 1448,  886,
-      886,  886, 3288, 3288, 3288,  886, 1454, 1454, 1454, 1454,
-     3288, 3288, 1454, 1454, 1461, 1461, 1461, 1461, 3288, 3288,
-     1461, 1461,  894,  894,  894, 3288, 3288, 3288,  894, 1469,
-     1469, 1469, 1469, 3288, 3288, 1469, 1469, 1139, 1139, 1139,
-
-     1139, 1139, 1139, 1139, 1139, 1139, 1145, 3288, 1145, 3288,
-     3288, 1145,  668,  668,  668, 3288, 3288, 3288,  668, 1154,
-     1154, 1154, 1154, 3288, 3288, 1154, 1154,  695,  695,  695,
-      695, 3288,  695, 3288,  695, 1189, 1189, 1189, 1189, 3288,
-     3288, 1189, 1189,  699,  699,  699,  699, 3288,  699, 3288,
-      699, 1199, 1199, 1199, 1199, 3288, 3288, 1199, 1199,  707,
-      707,  707, 3288, 3288, 3288,  707, 1215, 1215, 1215, 1215,
-     3288, 3288, 1215, 1215,  718,  718,  718, 3288, 3288, 3288,
-      718, 1222, 1222, 1222, 1222, 3288, 3288, 1222, 1222,  724,
-      724,  724, 3288, 3288, 3288,  724, 1230, 1230, 1230, 1230,
-
-     3288, 3288, 1230, 1230,  747,  747,  747, 3288, 3288, 3288,
-      747, 1253, 1253, 1253, 1253, 3288, 3288, 1253, 1253,  754,
-      754,  754, 3288, 3288, 3288,  754, 1262, 1262, 1262, 1262,
-     3288, 3288, 1262, 1262,  760,  760,  760,  760, 3288,  760,
-     3288,  760, 1270, 1270, 1270, 1270, 3288, 3288, 1270, 1270,
-      765,  765,  765,  765, 3288,  765, 3288,  765, 1276, 1276,
-     1276, 1276, 3288, 3288, 1276, 1276,  770,  770,  770, 3288,
-     3288, 3288,  770, 1289, 1289, 1289, 1289, 3288, 3288, 1289,
-     1289,  780,  780,  780,  780, 3288,  780, 3288,  780, 1296,
-     1296, 1296, 1296, 3288, 3288, 1296, 1296,  784,  784,  784,
-
-      784, 3288,  784, 3288,  784, 1307, 1307, 1307, 1307, 3288,
-     3288, 1307, 1307,  790,  790,  790, 3288, 3288, 3288,  790,
-     1333, 1333, 1333, 1333, 3288, 3288, 1333, 1333,  808,  808,
-      808, 3288, 3288, 3288,  808, 1349, 1349, 1349, 1349, 3288,
-     3288, 1349, 1349,  818,  818,  818, 3288, 3288, 3288,  818,
-     1364, 1364, 1364, 1364, 3288, 3288, 1364, 1364,  828,  828,
-      828, 3288, 3288, 3288,  828, 1372, 1372, 1372, 1372, 3288,
-     3288, 1372, 1372,  833,  833,  833, 3288, 3288, 3288,  833,
-     1381, 1381, 1381, 1381, 3288, 3288, 1381, 1381,  839,  839,
-      839, 3288, 3288, 3288,  839, 1392, 1392, 1392, 1392, 3288,
-
-     3288, 1392, 1392,  847,  847,  847, 3288, 3288, 3288,  847,
-     1401, 1401, 1401, 1401, 3288, 3288, 1401, 1401,  854,  854,
-      854, 3288, 3288, 3288,  854, 1413, 1413, 1413, 1413, 3288,
-     3288, 1413, 1413,  861,  861,  861, 3288, 3288, 3288,  861,
-     1421, 1421, 1421, 1421, 3288, 3288, 1421, 1421, 1429, 1429,
-     1429, 1429, 3288, 3288, 1429, 1429,  871,  871,  871, 3288,
-     3288, 3288,  871, 1439, 1439, 1439, 1439, 3288, 3288, 1439,
-     1439,  877,  877,  877, 3288, 3288, 3288,  877, 1448, 1448,
-     1448, 1448, 3288, 3288, 1448, 1448,  886,  886,  886, 3288,
-     3288, 3288,  886, 1454, 1454, 1454, 1454, 3288, 3288, 1454,
-
-     1454, 1461, 1461, 1461, 1461, 3288, 3288, 1461, 1461,  894,
-      894,  894, 3288, 3288, 3288,  894, 1469, 1469, 1469, 1469,
-     3288, 3288, 1469, 1469, 1139, 1139, 1139, 1139, 1139, 1139,
-     1139, 1139, 1139, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-     1682, 1682,  668,  668,  668, 3288, 3288, 3288,  668, 1154,
-     1154, 1154, 1154, 3288, 3288, 1154, 1154, 1189, 1189, 1189,
-     1189, 3288, 3288, 1189, 1189,  699,  699,  699, 3288, 3288,
-     3288,  699, 1199, 1199, 1199, 1199, 3288, 3288, 1199, 1199,
-      707,  707,  707, 3288, 3288, 3288,  707, 1215, 1215, 1215,
-     1215, 3288, 3288, 1215, 1215,  718,  718,  718, 3288, 3288,
-
-     3288,  718, 1222, 1222, 1222, 1222, 3288, 3288, 1222, 1222,
-      724,  724,  724, 3288, 3288, 3288,  724,  747,  747,  747,
-     3288, 3288, 3288,  747, 1253, 1253, 1253, 1253, 3288, 3288,
-     1253, 1253,  754,  754,  754, 3288, 3288, 3288,  754, 1262,
-     1262, 1262, 1262, 3288, 3288, 1262, 1262, 1270, 1270, 1270,
-     1270, 3288, 3288, 1270, 1270,  765,  765,  765, 3288, 3288,
-     3288,  765, 1276, 1276, 1276, 1276, 3288, 3288, 1276, 1276,
-      770,  770,  770, 3288, 3288, 3288,  770, 1289, 1289, 1289,
-     1289, 3288, 3288, 1289, 1289, 1296, 1296, 1296, 1296, 3288,
-     3288, 1296, 1296, 1307, 1307, 1307, 1307, 3288, 3288, 1307,
-
-     1307,  790,  790,  790, 3288, 3288, 3288,  790, 1333, 1333,
-     1333, 1333, 3288, 3288, 1333, 1333,  808,  808,  808,  808,
-     3288,  808, 3288,  808, 1349, 1349, 1349, 1349, 3288, 3288,
-     1349, 1349,  818,  818,  818, 3288, 3288, 3288,  818, 1364,
-     1364, 1364, 1364, 3288, 3288, 1364, 1364,  828,  828,  828,
-     3288, 3288, 3288,  828, 1372, 1372, 1372, 1372, 3288, 3288,
-     1372, 1372,  833,  833,  833, 3288, 3288, 3288,  833, 1381,
-     1381, 1381, 1381, 3288, 3288, 1381, 1381,  839,  839,  839,
-     3288, 3288, 3288,  839, 1392, 1392, 1392, 1392, 3288, 3288,
-     1392, 1392,  847,  847,  847, 3288, 3288, 3288,  847, 1401,
-
-     1401, 1401, 1401, 3288, 3288, 1401, 1401,  854,  854,  854,
-     3288, 3288, 3288,  854, 1413, 1413, 1413, 1413, 3288, 3288,
-     1413, 1413,  861,  861,  861, 3288, 3288, 3288,  861, 1421,
-     1421, 1421, 1421, 3288, 3288, 1421, 1421, 1429, 1429, 1429,
-     1429, 3288, 3288, 1429, 1429,  871,  871,  871, 3288, 3288,
-     3288,  871, 1439, 1439, 1439, 1439, 3288, 3288, 1439, 1439,
-      877,  877,  877, 3288, 3288, 3288,  877, 1448, 1448, 1448,
-     1448, 3288, 3288, 1448, 1448,  886,  886,  886,  886, 3288,
-      886, 3288,  886, 1454, 1454, 1454, 1454, 3288, 3288, 1454,
-     1454, 1461, 1461, 1461, 1461, 3288, 3288, 1461, 1461,  894,
-
-      894,  894,  894, 3288,  894, 3288,  894, 1469, 1469, 1469,
-     1469, 3288, 3288, 1469, 1469, 1139, 1139, 1139, 1139, 1139,
-     1139, 1139, 1139, 1139, 1682, 1682, 1682, 1682, 1682, 1682,
-     1682, 1682, 1682,  668,  668,  668, 3288, 3288, 3288,  668,
-     1154, 1154, 1154, 1154, 3288, 3288, 1154, 1154, 1189, 1189,
-     1189, 1189, 3288, 3288, 1189, 1189,  699,  699,  699, 3288,
-     3288, 3288,  699, 1199, 1199, 1199, 1199, 3288, 3288, 1199,
-     1199,  707,  707,  707, 3288, 3288, 3288,  707, 1215, 1215,
-     1215, 1215, 3288, 3288, 1215, 1215,  718,  718,  718, 3288,
-     3288, 3288,  718, 1222, 1222, 1222, 1222, 3288, 3288, 1222,
-
-     1222,  724,  724,  724, 3288, 3288, 3288,  724,  747,  747,
-      747, 3288, 3288, 3288,  747, 1253, 1253, 1253, 1253, 3288,
-     3288, 1253, 1253,  754,  754,  754, 3288, 3288, 3288,  754,
-     1262, 1262, 1262, 1262, 3288, 3288, 1262, 1262, 1270, 1270,
-     1270, 1270, 3288, 3288, 1270, 1270,  765,  765,  765,  765,
-     3288,  765, 3288,  765, 1276, 1276, 1276, 1276, 3288, 3288,
-     1276, 1276,  770,  770,  770, 3288, 3288, 3288,  770, 1289,
-     1289, 1289, 1289, 3288, 3288, 1289, 1289, 1307, 1307, 1307,
-     1307, 3288, 3288, 1307, 1307,  790,  790,  790, 3288, 3288,
-     3288,  790, 1333, 1333, 1333, 1333, 3288, 3288, 1333, 1333,
-
-      808,  808,  808,  808, 3288,  808, 3288,  808, 1349, 1349,
-     1349, 1349, 3288, 3288, 1349, 1349,  818,  818,  818, 3288,
-     3288, 3288,  818, 1364, 1364, 1364, 1364, 3288, 3288, 1364,
-     1364,  828,  828,  828, 3288, 3288, 3288,  828, 1372, 1372,
-     1372, 1372, 3288, 3288, 1372, 1372,  833,  833,  833, 3288,
-     3288, 3288,  833, 1381, 1381, 1381, 1381, 3288, 3288, 1381,
-     1381,  839,  839,  839, 3288, 3288, 3288,  839, 1392, 1392,
-     1392, 1392, 3288, 3288, 1392, 1392,  847,  847,  847, 3288,
-     3288, 3288,  847, 1401, 1401, 1401, 1401, 3288, 3288, 1401,
-     1401,  854,  854,  854,  854, 3288,  854, 3288,  854, 1413,
-
-     1413, 1413, 1413, 3288, 3288, 1413, 1413,  861,  861,  861,
-     3288, 3288, 3288,  861, 1421, 1421, 1421, 1421, 3288, 3288,
-     1421, 1421, 1429, 1429, 1429, 1429, 3288, 3288, 1429, 1429,
-      871,  871,  871,  871, 3288,  871, 3288,  871, 1439, 1439,
-     1439, 1439, 3288, 3288, 1439, 1439,  877,  877,  877, 3288,
-     3288, 3288,  877, 1448, 1448, 1448, 1448, 3288, 3288, 1448,
-     1448, 1454, 1454, 1454, 1454, 3288, 3288, 1454, 1454, 1461,
-     1461, 1461, 1461, 3288, 3288, 1461, 1461, 1469, 1469, 1469,
-     1469, 3288, 3288, 1469, 1469, 1139, 1139, 1139, 1139, 1139,
-     1139, 1139, 1139, 1139, 1682, 1682, 1682, 1682, 1682, 1682,
-
-     1682, 1682, 1682,  668,  668,  668,  668, 3288,  668, 3288,
-      668, 1154, 1154, 1154, 1154, 3288, 3288, 1154, 1154, 1189,
-     1189, 1189, 1189, 3288, 3288, 1189, 1189,  699,  699,  699,
-     3288, 3288, 3288,  699, 1199, 1199, 1199, 1199, 3288, 3288,
-     1199, 1199,  707,  707,  707, 3288, 3288, 3288,  707, 1215,
-     1215, 1215, 1215, 3288, 3288, 1215, 1215,  718,  718,  718,
-      718, 3288,  718, 3288,  718, 1222, 1222, 1222, 1222, 3288,
-     3288, 1222, 1222,  724,  724,  724,  724, 3288,  724, 3288,
-      724,  747,  747,  747,  747, 3288,  747, 3288,  747, 1253,
-     1253, 1253, 1253, 3288, 3288, 1253, 1253,  754,  754,  754,
-
-      754, 3288,  754, 3288,  754, 1262, 1262, 1262, 1262, 3288,
-     3288, 1262, 1262, 1270, 1270, 1270, 1270, 3288, 3288, 1270,
-     1270, 1276, 1276, 1276, 1276, 3288, 3288, 1276, 1276,  770,
-      770,  770, 3288, 3288, 3288,  770, 1307, 1307, 1307, 1307,
-     3288, 3288, 1307, 1307,  790,  790,  790, 3288, 3288, 3288,
-      790, 1333, 1333, 1333, 1333, 3288, 3288, 1333, 1333,  808,
-      808,  808,  808, 3288,  808, 3288,  808, 1349, 1349, 1349,
-     1349, 3288, 3288, 1349, 1349,  818,  818,  818, 3288, 3288,
-     3288,  818,  828,  828,  828, 3288, 3288, 3288,  828, 1372,
-     1372, 1372, 1372, 3288, 3288, 1372, 1372,  833,  833,  833,
-
-     3288, 3288, 3288,  833, 1381, 1381, 1381, 1381, 3288, 3288,
-     1381, 1381,  839,  839,  839, 3288, 3288, 3288,  839,  847,
-      847,  847, 3288, 3288, 3288,  847, 1401, 1401, 1401, 1401,
-     3288, 3288, 1401, 1401,  854,  854,  854, 3288, 3288, 3288,
-      854, 1413, 1413, 1413, 1413, 3288, 3288, 1413, 1413,  861,
-      861,  861, 3288, 3288, 3288,  861, 1421, 1421, 1421, 1421,
-     3288, 3288, 1421, 1421, 1429, 1429, 1429, 1429, 3288, 3288,
-     1429, 1429, 1439, 1439, 1439, 1439, 3288, 3288, 1439, 1439,
-      877,  877,  877, 3288, 3288, 3288,  877, 1448, 1448, 1448,
-     1448, 3288, 3288, 1448, 1448, 1454, 1454, 1454, 1454, 3288,
-
-     3288, 1454, 1454, 1461, 1461, 1461, 1461, 3288, 3288, 1461,
-     1461, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
-     1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1154,
-     1154, 1154, 1154, 3288, 3288, 1154, 1154, 1189, 1189, 1189,
-     1189, 3288, 3288, 1189, 1189,  699,  699,  699, 3288, 3288,
-     3288,  699,  707,  707,  707, 3288, 3288, 3288,  707, 1215,
-     1215, 1215, 1215, 3288, 3288, 1215, 1215, 1222, 1222, 1222,
-     1222, 3288, 3288, 1222, 1222, 1253, 1253, 1253, 1253, 3288,
-     3288, 1253, 1253, 1262, 1262, 1262, 1262, 3288, 3288, 1262,
-     1262, 1276, 1276, 1276, 1276, 3288, 3288, 1276, 1276,  770,
-
-      770,  770, 3288, 3288, 3288,  770, 1307, 1307, 1307, 1307,
-     3288, 3288, 1307, 1307,  790,  790,  790, 3288, 3288, 3288,
-      790, 1333, 1333, 1333, 1333, 3288, 3288, 1333, 1333, 1349,
-     1349, 1349, 1349, 3288, 3288, 1349, 1349,  818,  818,  818,
-     3288, 3288, 3288,  818,  828,  828,  828, 3288, 3288, 3288,
-      828, 1372, 1372, 1372, 1372, 3288, 3288, 1372, 1372,  833,
-      833,  833, 3288, 3288, 3288,  833, 1381, 1381, 1381, 1381,
-     3288, 3288, 1381, 1381,  839,  839,  839, 3288, 3288, 3288,
-      839,  847,  847,  847, 3288, 3288, 3288,  847,  854,  854,
-      854, 3288, 3288, 3288,  854, 1413, 1413, 1413, 1413, 3288,
-
-     3288, 1413, 1413,  861,  861,  861, 3288, 3288, 3288,  861,
-     1421, 1421, 1421, 1421, 3288, 3288, 1421, 1421, 1429, 1429,
-     1429, 1429, 3288, 3288, 1429, 1429, 1439, 1439, 1439, 1439,
-     3288, 3288, 1439, 1439,  877,  877,  877,  877, 3288,  877,
-     3288,  877, 1448, 1448, 1448, 1448, 3288, 3288, 1448, 1448,
-     1454, 1454, 1454, 1454, 3288, 3288, 1454, 1454, 1461, 1461,
-     1461, 1461, 3288, 3288, 1461, 1461, 1139, 1139, 1139, 1139,
-     1139, 1139, 1139, 1139, 1139, 1682, 1682, 1682, 1682, 1682,
-     1682, 1682, 1682, 1682, 1154, 1154, 1154, 1154, 3288, 3288,
-     1154, 1154, 1189, 1189, 1189, 1189, 3288, 3288, 1189, 1189,
-
-      699,  699,  699, 3288, 3288, 3288,  699,  707,  707,  707,
-      707, 3288,  707, 3288,  707, 1222, 1222, 1222, 1222, 3288,
-     3288, 1222, 1222, 1253, 1253, 1253, 1253, 3288, 3288, 1253,
-     1253, 1262, 1262, 1262, 1262, 3288, 3288, 1262, 1262, 1276,
-     1276, 1276, 1276, 3288, 3288, 1276, 1276,  770,  770,  770,
-     3288, 3288, 3288,  770, 1307, 1307, 1307, 1307, 3288, 3288,
-     1307, 1307,  790,  790,  790, 3288, 3288, 3288,  790, 1333,
-     1333, 1333, 1333, 3288, 3288, 1333, 1333, 1349, 1349, 1349,
-     1349, 3288, 3288, 1349, 1349,  818,  818,  818, 3288, 3288,
-     3288,  818,  828,  828,  828, 3288, 3288, 3288,  828,  833,
-
-      833,  833,  833, 3288,  833, 3288,  833, 1381, 1381, 1381,
-     1381, 3288, 3288, 1381, 1381,  839,  839,  839,  839, 3288,
-      839, 3288,  839,  847,  847,  847, 3288, 3288, 3288,  847,
-      854,  854,  854, 3288, 3288, 3288,  854, 1413, 1413, 1413,
-     1413, 3288, 3288, 1413, 1413,  861,  861,  861,  861, 3288,
-      861, 3288,  861, 1421, 1421, 1421, 1421, 3288, 3288, 1421,
-     1421, 1429, 1429, 1429, 1429, 3288, 3288, 1429, 1429, 1439,
-     1439, 1439, 1439, 3288, 3288, 1439, 1439,  877,  877,  877,
-      877, 3288,  877, 3288,  877, 1448, 1448, 1448, 1448, 3288,
-     3288, 1448, 1448, 1454, 1454, 1454, 1454, 3288, 3288, 1454,
-
-     1454, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
-     1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1154,
-     1154, 1154, 1154, 3288, 3288, 1154, 1154,  699,  699,  699,
-     3288, 3288, 3288,  699,  707,  707,  707, 3288, 3288, 3288,
-      707, 1222, 1222, 1222, 1222, 3288, 3288, 1222, 1222, 1253,
-     1253, 1253, 1253, 3288, 3288, 1253, 1253, 1276, 1276, 1276,
-     1276, 3288, 3288, 1276, 1276,  770,  770,  770, 3288, 3288,
-     3288,  770, 1307, 1307, 1307, 1307, 3288, 3288, 1307, 1307,
-      790,  790,  790, 3288, 3288, 3288,  790, 2916, 2916, 2916,
-     2916, 2916, 2916, 2916, 2916, 2916, 2917, 2917, 2917, 2917,
-
-     2917, 2917, 2917, 2917, 2917, 2972, 2972, 2972, 2972, 2972,
-     2972, 2972, 2972, 2972, 2975, 2975, 2975, 2975, 2975, 2975,
-     2975, 2975, 2975, 3011, 3011, 3011, 3011, 3011, 3011, 3011,
-     3011, 3011, 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
-     3013,  253, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288
+     3285,  262,  263,  262,  262,  263,  262,  262,  263,  262,
+      262,  263,  262,  267,  263,  267,  273,  264,  270,  273,
+      264,  270, 3285,  265, 3285,  271,  265, 3285,  271,  268,
+      267,  263,  267,  659,  274,  276,  277,  274,  276,  277,
+      278,  279,  704,  278,  279,  659,  268,  283,  284,  660,
+      280,  276,  277,  280,  281,  662,  278,  276,  277,  693,
+      281,  661,  278,  283,  284, 1738,  280,  263,  263,  263,
+      849,  661,  280,  263,  263,  263,  295,  263,  295,  295,
+      263,  295,  850,  286,  295,  263,  295,  680, 1742,  286,
+      734,  285,  296, 1357,  696,  296,  658,  658,  658, 1358,
+
+      297,  658,  658,  658,  658,  658,  658,  285,  287,  288,
+      263,  288,  287,  287,  287,  287,  287,  287,  287,  289,
+      287,  287,  287,  691,  287,  291,  287,  292,  287,  295,
+      263,  295,  263,  263,  263,  263,  263,  263,  692,  295,
+      263,  295,  295,  263,  295,  297,  697,  805,  298,  662,
+      806,  298,  923,  287,  287,  296,  662,  662,  296,  295,
+      263,  295,  658,  658,  658,  661,  658,  658,  658,  658,
+      658,  658,  661,  661, 3285,  299,  924,  293,  287,  288,
+      263,  288,  287,  287,  287,  287,  287,  287,  287,  289,
+      287,  287,  287, 1744,  287,  291,  287,  292,  287,  295,
+
+      263,  295,  263,  263,  263,  263,  263,  263,  667,  295,
+      263,  295,  295,  263,  295,  299,  673,  734,  300,  818,
+      983,  300,  819,  287,  287,  297,  743,  735,  297,  263,
+      263,  263,  263,  263,  263,  295,  263,  295,  295,  263,
+      295,  295,  263,  295,  984,  301,  855,  293,  301,  662,
+      668,  299,  798,  856,  299,  747,  669,  302,  295,  263,
+      295,  670,  658,  658,  658,  661,  671,  658,  658,  658,
+      658,  658,  658,  799,  302,  303,  304,  263,  304,  303,
+      303,  303,  303,  303,  303,  303,  305,  303,  303,  303,
+      721,  303,  307,  303,  308,  303,  311,  263,  311,  311,
+
+      263,  311,  263,  263,  263,  722,  263,  263,  263,  311,
+      263,  311,  312,  911,  857,  312,  912, 1751,  300,  717,
+      303,  303,  300,  718,  759,  312,  677,  719,  309,  303,
+      304,  263,  304,  303,  303,  303,  303,  303,  303,  303,
+      305,  303,  303,  303,  662,  303,  307,  303,  308,  303,
+      311,  263,  311,  311,  263,  311,  311,  263,  311,  807,
+      661,  865,  276,  277,  863,  698,  312,  278, 3285,  313,
+      697,  864,  313,  808,  303,  303,  743,  323,  699,  759,
+      692, 1752,  309,  314,  315,  263,  315,  314,  314,  314,
+      314,  314,  314,  314,  316,  314,  314,  314, 1753,  314,
+
+      318,  314,  319,  314, 1754,  662,  324,  691,  337,  263,
+      337,  337,  263,  337,  349,  263,  349,  697,  276,  277,
+      700,  661,  692,  278,  338,  710,  802,  338,  314,  314,
+      350,  696,  711,  323,  803, 1019,  320,  765, 1020,  321,
+      804,  661,  658,  658,  658, 1759,  322,  314,  315,  263,
+      315,  314,  314,  314,  314,  314,  314,  314,  316,  314,
+      314,  314,  324,  314,  318,  314,  319,  314,  349,  263,
+      349,  360,  263,  360,  360,  263,  360, 1760,  360,  263,
+      360,  360,  263,  360,  350,  662,  748,  361,  662,  743,
+      361,  858,  314,  314,  362,  723, 1500,  362, 1761,  697,
+
+      320,  661,  749,  321,  661,  658,  658,  658,  765, 1501,
+      322,  325,  326,  263,  326,  325,  325,  325,  325,  325,
+      325,  325,  327,  325,  325,  325, 1762,  325,  329,  325,
+      330,  325,  263,  263,  263,  263,  263,  263,  360,  263,
+      360,  783,  360,  263,  360,  360,  263,  360,  363, 1763,
+      662,  363,  662,  662,  361, 1764,  325,  325,  361,  729,
+      696,  364,  658,  658,  658,  331,  661,  332,  661,  661,
+      783,  333,  658,  658,  658,  812,  334,  335,  325,  326,
+      263,  326,  325,  325,  325,  325,  325,  325,  325,  327,
+      325,  325,  325,  696,  325,  329,  325,  330,  325,  360,
+
+      263,  360,  263,  263,  263,  263,  263,  263,  890,  360,
+      263,  360,  360,  263,  360,  364,  746, 1765,  365,  784,
+      686,  365,  743,  325,  325,  366,  739,  743,  366,  658,
+      658,  658,  331,  742,  332,  658,  658,  658,  333,  658,
+      658,  658, 1772,  334,  335,  339,  340,  263,  340,  339,
+      339,  339,  339,  339,  339,  339,  341,  339,  339,  339,
+      693,  339,  343,  339,  344,  339,  360,  263,  360,  360,
+      263,  360,  263,  263,  263,  905,  263,  263,  263,  360,
+      263,  360,  367, 1773, 1782,  367,  905,  875,  368,  750,
+      339,  339,  368,  737,  738,  364,  881,  345,  658,  658,
+
+      658,  906,  696,  346,  751,  658,  658,  658,  658,  658,
+      658,  957,  347,  339,  340,  263,  340,  339,  339,  339,
+      339,  339,  339,  339,  341,  339,  339,  339, 1784,  339,
+      343,  339,  344,  339,  360,  263,  360,  263,  263,  263,
+      263,  263,  263,  697,  360,  263,  360,  360,  263,  360,
+      364,  662,  697,  369, 1785,  923,  369,  662,  339,  339,
+      367,  662,  662,  367,  770,  345, 1795,  661,  658,  658,
+      658,  346,  983,  661,  658,  658,  658,  661,  661,  992,
+      347,  351,  352,  263,  352,  351,  351,  351,  351,  351,
+      351,  351,  353,  351,  351,  351,  924,  351,  355,  351,
+
+      356,  351,  360,  263,  360,  360,  263,  360,  263,  263,
+      263, 1796,  263,  263,  263,  360,  263,  360,  370,  662,
+     1806,  370,  662, 1809,  371,  812,  351,  351,  371,  775,
+     1810,  372,  658,  658,  658,  661, 3285,  357,  661,  658,
+      658,  658,  658,  658,  658, 1814,  358,  351,  352,  263,
+      352,  351,  351,  351,  351,  351,  351,  351,  353,  351,
+      351,  351,  983,  351,  355,  351,  356,  351,  360,  263,
+      360,  263,  263,  263,  263,  263,  263,  696,  360,  263,
+      360,  360,  263,  360,  372,  784,  992,  373,  743,  923,
+      373, 1815,  351,  351,  370,  662, 1818,  370,  360,  263,
+
+      360, 1819,  788,  357,  360,  263,  360,  658,  658,  658,
+      851,  661,  358,  993,  374,  658,  658,  658,  734, 1820,
+      374,  375,  376,  263,  376,  375,  375,  375,  375,  375,
+      375,  375,  377,  375,  375,  375,  983,  375,  379,  375,
+      380,  375,  386,  263,  386,  386,  263,  386,  263,  263,
+      263,  932,  263,  263,  263,  933,  752,  662,  387, 1027,
+      993,  387,  743, 1028,  363, 3285,  375,  375,  363,  662,
+      662,  381,  741,  661,  851,  693,  794,  382,  658,  658,
+      658,  383,  658,  658,  658,  661,  661,  384,  375,  376,
+      263,  376,  375,  375,  375,  375,  375,  375,  375,  377,
+
+      375,  375,  375,  680,  375,  379,  375,  380,  375,  386,
+      263,  386,  386,  263,  386,  386,  263,  386,  889,  386,
+      263,  386,  658,  658,  658,  387,  696,  809,  387, 1821,
+     1822,  388, 1823,  375,  375,  388,  662,  662,  381,  810,
+      811,  658,  658,  658,  382,  658,  658,  658,  383,  658,
+      658,  658,  661,  661,  384,  389,  390,  263,  390,  389,
+      389,  389,  389,  389,  389,  389,  391,  389,  389,  389,
+      696,  389,  393,  389,  394,  389,  399,  263,  399,  399,
+      263,  399,  263,  263,  263,  925,  263,  263,  263, 1145,
+      662, 1831,  400, 1476, 1834,  400,  926,  822,  363,  927,
+
+      389,  389,  363,  662,  662,  395,  661,  658,  658,  658,
+      832,  396,  658,  658,  658,  658,  658,  658, 1145,  661,
+      661, 1835,  397,  389,  390,  263,  390,  389,  389,  389,
+      389,  389,  389,  389,  391,  389,  389,  389, 1684,  389,
+      393,  389,  394,  389,  399,  263,  399,  399,  263,  399,
+      399,  263,  399,  937,  399,  263,  399,  658,  658,  658,
+      400,  662,  662,  400,  662, 1838,  401,  938,  389,  389,
+      401,  837, 1840,  395,  658,  658,  658,  661,  661,  396,
+      661,  658,  658,  658,  658,  658,  658,  658,  658,  658,
+      397,  402,  403,  263,  403,  402,  402,  402,  402,  402,
+
+      402,  402,  404,  402,  402,  402, 1842,  402,  406,  402,
+      407,  402,  411,  263,  411,  411,  263,  411,  422,  263,
+      422, 1843,  422,  263,  422,  436,  263,  436,  412,  662,
+      662,  412,  662, 1845,  423,  865,  402,  402,  423,  843,
+      898,  437,  658,  658,  658,  661,  661,  408,  661,  658,
+      658,  658,  409,  402,  403,  263,  403,  402,  402,  402,
+      402,  402,  402,  402,  404,  402,  402,  402, 1846,  402,
+      406,  402,  407,  402,  436,  263,  436,  263,  263,  263,
+      263,  263,  263,  858,  436,  263,  436,  436,  263,  436,
+      437,  697,  743,  438, 1847, 1852,  438,  662,  402,  402,
+
+      437, 1855,  898,  437, 1856,  857,  658,  658,  658,  408,
+      658,  658,  658,  661,  409,  413,  414,  263,  414,  413,
+      413,  413,  413,  413,  413,  413,  415,  413,  413,  413,
+     1857,  413,  417,  413,  418,  413,  436,  263,  436,  436,
+      263,  436,  448,  263,  448,  942,  448,  263,  448,  460,
+      263,  460,  439,  858,  696,  439,  662,  696,  449,  938,
+      413,  413,  449,  870,  662,  461,  658,  658,  658,  658,
+      658,  658,  661,  658,  658,  658,  419,  658,  658,  658,
+      661, 1859,  420,  413,  414,  263,  414,  413,  413,  413,
+      413,  413,  413,  413,  415,  413,  413,  413, 1862,  413,
+
+      417,  413,  418,  413,  460,  263,  460,  477,  263,  477,
+      477,  263,  477, 1863,  263,  263,  263,  263,  263,  263,
+      461, 1865,  662,  478, 1869, 1870,  478,  662,  413,  413,
+      363,  925,  662,  363,  658,  658,  658,  875,  661,  658,
+      658,  658,  926,  661,  419,  941, 1871,  881,  661, 1873,
+      420,  424,  425,  263,  425,  424,  424,  424,  424,  424,
+      424,  424,  426,  424,  424,  424, 1687,  424,  428,  424,
+      429,  424,  477,  263,  477,  477,  263,  477,  477,  263,
+      477, 1884,  477,  263,  477,  858,  662, 1885,  478, 1886,
+     1888,  478, 1889,  697,  479,  858,  424,  424,  479,  430,
+
+      662,  431,  661,  697,  658,  658,  658,  432,  658,  658,
+      658,  658,  658,  658,  433,  889,  661,  434,  424,  425,
+      263,  425,  424,  424,  424,  424,  424,  424,  424,  426,
+      424,  424,  424, 1890,  424,  428,  424,  429,  424,  493,
+      263,  493,  493,  263,  493,  509,  263,  509,  944,  509,
+      263,  509,  890, 1891, 1892,  494, 1145, 1145,  494,  945,
+     1512,  510,  927,  424,  424,  510,  430,  743,  431,  658,
+      658,  658, 1147, 1501,  432,  658,  658,  658,  658,  658,
+      658,  433, 1881, 1893,  434,  440,  441,  263,  441,  440,
+      440,  440,  440,  440,  440,  440,  442,  440,  440,  440,
+
+     1894,  440,  444,  440,  445,  440,  520,  263,  520,  520,
+      263,  520,  532,  263,  532,  942,  532,  263,  532,  545,
+      263,  545,  521, 1895, 1896,  521,  662,  662,  533,  989,
+      440,  440,  533,  894,  903,  546,  658,  658,  658,  658,
+      658,  658,  661,  661, 1897, 1899,  446,  440,  441,  263,
+      441,  440,  440,  440,  440,  440,  440,  440,  442,  440,
+      440,  440, 1900,  440,  444,  440,  445,  440,  545,  263,
+      545,  263,  263,  263,  263,  263,  263,  942,  545,  263,
+      545,  545,  263,  545,  546, 1901, 1902,  363,  934, 1905,
+      363,  994,  440,  440,  546,  935, 1908,  546,  658,  658,
+
+      658,  936,  909,  909,  909, 1162, 1162, 1162,  446,  450,
+      451,  263,  451,  450,  450,  450,  450,  450,  450,  450,
+      452,  450,  450,  450, 1909,  450,  454,  450,  455,  450,
+      545,  263,  545,  545,  263,  545,  557,  263,  557, 1910,
+      557,  263,  557,  263,  263,  263,  547, 1911, 1912,  547,
+      947, 1913,  558,  944,  450,  450,  558,  935,  942,  559,
+      456,  910,  947,  948,  945,  457, 1917,  941, 1918,  935,
+     1920, 1921,  995, 1922, 1924,  936, 1937,  458,  450,  451,
+      263,  451,  450,  450,  450,  450,  450,  450,  450,  452,
+      450,  450,  450, 1938,  450,  454,  450,  455,  450,  263,
+
+      263,  263,  557,  263,  557,  557,  263,  557, 1939,  557,
+      263,  557,  557,  263,  557,  559, 1940, 1941,  558,  934,
+      934,  558, 1512,  450,  450,  560,  935,  935,  560,  456,
+      947,  925,  948,  988,  457, 1550, 1944,  935, 1492, 1492,
+     1492, 1945,  945,  988, 1946,  941,  458,  462,  463,  263,
+      463,  462,  462,  462,  462,  462,  462,  462,  464,  462,
+      462,  462,  465,  462,  466,  462,  467,  462,  465,  465,
+      465,  465,  465,  465,  465,  465,  465,  465,  465,  465,
+      465,  465,  465,  465,  465,  465,  465,  465,  465,  465,
+      465,  465,  462,  462,  465,  468,  469,  470,  465,  465,
+
+      465,  465,  465,  471,  465,  465,  472,  465,  465,  465,
+      473,  465,  474,  475,  465,  465,  465,  465,  465,  465,
+      465,  480,  481,  263,  481,  480,  480,  480,  480,  480,
+      480,  480,  482,  480,  480,  480, 1947,  480,  484,  480,
+      485,  480,  571,  263,  571,  571,  263,  571,  263,  263,
+      263, 1952,  263,  263,  263,  571,  263,  571,  572, 1960,
+     1961,  572, 1968, 1972,  559, 1974,  480,  480,  559, 1980,
+      486,  572,  909,  909,  909, 1981, 1149,  487, 1982, 1988,
+      488, 1162, 1162, 1162,  489, 1989,  490,  491,  480,  481,
+      263,  481,  480,  480,  480,  480,  480,  480,  480,  482,
+
+      480,  480,  480, 1990,  480,  484,  480,  485,  480,  571,
+      263,  571,  571,  263,  571,  571,  263,  571, 1991,  583,
+      263,  583,  583,  263,  583,  572, 2004, 2010,  573, 2014,
+     2017,  573, 2019,  480,  480,  584, 2020,  486,  584, 1198,
+     1198, 1198, 2022, 1199,  487, 1163, 1200,  488, 1185, 1185,
+     1185,  489, 2023,  490,  491,  495,  496,  263,  496,  495,
+      495,  495,  495,  495,  495,  495,  497,  495,  495,  495,
+     2024,  495,  499,  495,  500,  495,  594,  263,  594,  594,
+      263,  594,  263,  263,  263, 2028,  263,  263,  263,  954,
+      954,  954,  595, 2031, 2033,  595, 2040, 2048,  559, 1315,
+
+      495,  495,  559,  501,  502,  503,  955, 2049, 2050, 1316,
+     2051,  504, 1163, 2053,  505, 2067, 1317, 2071,  506, 1687,
+     1145,  507,  495,  496,  263,  496,  495,  495,  495,  495,
+      495,  495,  495,  497,  495,  495,  495, 2064,  495,  499,
+      495,  500,  495,  594,  263,  594,  594,  263,  594,  594,
+      263,  594, 2072,  594,  263,  594,  962,  962,  962,  595,
+     2073, 2065,  595, 2076, 2074,  596, 2077,  495,  495,  596,
+      501,  502,  503,  963, 2079, 1208, 1208, 1208,  504, 1209,
+     2075,  505, 1210, 2080, 2081,  506, 1687, 2082,  507,  511,
+      512,  263,  512,  511,  511,  511,  511,  511,  511,  511,
+
+      513,  511,  511,  511, 2083,  511,  515,  511,  516,  511,
+      607,  263,  607,  607,  263,  607,  263,  263,  263, 2066,
+      263,  263,  263,  977,  977,  977,  608, 2084, 2087,  608,
+     2088, 2091,  559, 2092,  511,  511,  559, 2093, 2094,  517,
+      978, 1185, 1185, 1185, 2095,  518,  511,  512,  263,  512,
+      511,  511,  511,  511,  511,  511,  511,  513,  511,  511,
+      511, 2097,  511,  515,  511,  516,  511,  607,  263,  607,
+      607,  263,  607,  607,  263,  607, 2098,  607,  263,  607,
+      997,  997,  997,  608, 2101, 2104,  608, 2108, 2109,  609,
+     2112,  511,  511,  609, 2113, 2114,  517,  998, 1547, 1547,
+
+     1547, 2117,  518,  522,  523,  263,  523,  522,  522,  522,
+      522,  522,  522,  522,  524,  522,  522,  522, 2121,  522,
+      526,  522,  527,  522,  622,  263,  622,  622,  263,  622,
+      263,  263,  263, 2110,  263,  263,  263,  622,  263,  622,
+      623, 2111, 2122,  623, 2123, 2125,  624, 2127,  522,  522,
+      624, 2143,  528,  623, 1230, 1230, 1230, 2144, 1231,  529,
+     2124, 1232,  530,  522,  523,  263,  523,  522,  522,  522,
+      522,  522,  522,  522,  524,  522,  522,  522, 2145,  522,
+      526,  522,  527,  522,  622,  263,  622,  622,  263,  622,
+      622,  263,  622, 2115,  634,  263,  634,  634,  263,  634,
+
+      623, 2116, 2123,  625, 2074, 2146,  625, 2147,  522,  522,
+      635, 2148,  528,  635, 1162, 1162, 1162, 2150, 2075,  529,
+     2124, 2154,  530,  534,  535,  263,  535,  534,  534,  534,
+      534,  534,  534,  534,  536,  534,  534,  534, 2155,  534,
+      538,  534,  539,  534,  644,  263,  644,  644,  263,  644,
+      263,  263,  263, 2156,  263,  263,  263,  644,  263,  644,
+      645, 2162, 2163,  645, 2164, 2178,  363, 2182,  534,  534,
+      363, 2183,  540,  645, 1185, 1185, 1185, 2184, 1238,  541,
+     2186, 2190,  542, 1492, 1492, 1492, 1701, 1701, 1701,  543,
+      534,  535,  263,  535,  534,  534,  534,  534,  534,  534,
+
+      534,  536,  534,  534,  534, 2194,  534,  538,  534,  539,
+      534,  644,  263,  644,  644,  263,  644,  644,  263,  644,
+     2195,  656,  263,  656,  656,  263,  656,  645, 2196, 2197,
+      646, 2198, 1702,  646, 2201,  534,  534,  657, 1238,  540,
+      657, 3285, 2208,  734,  693, 2210,  541, 2220, 2221,  542,
+     2222,  693, 2223,  744, 2225, 1687,  543,  548,  549,  263,
+      549,  548,  548,  548,  548,  548,  548,  548,  550,  548,
+      548,  548,  748,  548,  552,  548,  553,  548, 2231, 2237,
+      694,  745, 2238, 1004, 1004, 1004,  695, 2239,  749, 1009,
+     1009, 1009, 1145,  696, 2240,  696, 2243,  697, 2228,  690,
+
+     1005, 2230,  548,  548, 2245, 2246, 1010, 2247,  554, 1252,
+     1252, 1252, 2251, 1253, 2256, 2258, 1254, 1704, 1704, 1704,
+     1708, 1708, 1708,  555,  548,  549,  263,  549,  548,  548,
+      548,  548,  548,  548,  548,  550,  548,  548,  548, 2259,
+      548,  552,  548,  553,  548, 1021, 1021, 1021, 1033, 1033,
+     1033, 1035, 1035, 1035, 1041, 1041, 1041, 1044, 1044, 1044,
+     2260, 2264, 1022, 1705, 2270, 1034, 2271, 2272, 1036,  548,
+      548, 1042, 2273, 2274, 1045,  554, 1262, 1262, 1262, 2275,
+     1263, 2276, 2277, 1264, 1711, 1711, 1711, 1721, 1721, 1721,
+      555,  561,  562,  263,  562,  561,  561,  561,  561,  561,
+
+      561,  561,  563,  561,  561,  561, 2278,  561,  565,  561,
+      566,  561, 1058, 1058, 1058, 1060, 1060, 1060, 1072, 1072,
+     1072, 1080, 1080, 1080, 1085, 1085, 1085, 2279, 2285, 1059,
+     2286, 2287, 1061, 2288, 2300, 1073,  561,  561, 1081, 2301,
+     2306, 1086,  567, 2302, 2304,  568, 1270, 1270, 1270, 2307,
+     1271, 2303, 2305, 1272, 1547, 1547, 1547,  569,  561,  562,
+      263,  562,  561,  561,  561,  561,  561,  561,  561,  563,
+      561,  561,  561, 2309,  561,  565,  561,  566,  561, 1091,
+     1091, 1091, 1111, 1111, 1111, 1135, 1135, 1135, 1139, 1139,
+     1139, 1687, 1158, 1158, 1158, 2310, 1092, 2311, 2312, 1112,
+
+     2316, 2317, 1136,  561,  561, 1140,  954,  954,  954,  567,
+     1160, 2318,  568, 1287, 1287, 1287, 2324, 1288, 2325, 2326,
+     1289, 2327, 2229,  955,  569,  574,  575,  263,  575,  574,
+      574,  574,  574,  574,  574,  574,  576,  574,  574,  574,
+     2330,  574,  578,  574,  579,  574, 1158, 1158, 1158, 1193,
+     1193, 1193, 2335, 2339, 1193, 1193, 1193, 1203, 1203, 1203,
+     1203, 1203, 1203, 1925, 1160, 2340, 2341, 1195, 2345, 1926,
+      574,  574, 1195, 1927, 2342, 1205,  580, 1928, 1205, 2346,
+     2347,  581,  574,  575,  263,  575,  574,  574,  574,  574,
+      574,  574,  574,  576,  574,  574,  574, 2348,  574,  578,
+
+      574,  579,  574, 2350, 1161,  962,  962,  962, 1211, 1211,
+     1211, 1219, 1219, 1219, 1196, 1214, 1214, 1214, 1219, 1219,
+     1219, 2360,  963, 2343, 1206, 1212, 2371,  574,  574, 1221,
+     2372, 2344, 1215,  580, 2373, 1687, 1221, 2377,  581,  585,
+      586,  263,  586,  585,  585,  585,  585,  585,  585,  585,
+      587,  585,  585,  585, 2378,  585,  589,  585,  590,  585,
+     1226, 1226, 1226, 2379, 2382, 1222, 2386, 2387, 1226, 1226,
+     1226,  977,  977,  977, 1234, 1234, 1234, 1929, 1228,  997,
+      997,  997, 2366, 1930,  585,  585, 1228, 1931,  978, 2388,
+      591, 1932, 1236, 1304, 1304, 1304,  998, 1305, 2389, 2390,
+
+     1306, 1758, 1758, 1758, 2391,  592,  585,  586,  263,  586,
+      585,  585,  585,  585,  585,  585,  585,  587,  585,  585,
+      585, 2392,  585,  589,  585,  590,  585, 1234, 1234, 1234,
+     2393, 2394, 1229, 2395, 2408, 1257, 1257, 1257, 1257, 1257,
+     1257, 1004, 1004, 1004, 2409, 1236, 2410, 1266, 1266, 1266,
+     2411,  585,  585, 1259, 2416, 2417, 1259,  591, 1005, 1307,
+     1307, 1307, 2418, 1308, 1237, 1268, 1309, 2419, 1755, 1755,
+     1755, 2420,  592,  597,  598,  263,  598,  597,  597,  597,
+      597,  597,  597,  597,  599,  597,  597,  597, 1687,  597,
+      601,  597,  602,  597, 2421, 1266, 1266, 1266, 1009, 1009,
+
+     1009, 1701, 1701, 1701, 1260, 1274, 1274, 1274, 1274, 1274,
+     1274, 2422, 2425, 1268, 1756, 1010, 2426, 2427,  597,  597,
+     1280, 1280, 1280, 1276,  603, 2432, 1276,  604, 1318, 1318,
+     1318, 2365, 1319, 2433, 2438, 1320, 2439, 2440, 1282,  605,
+      597,  598,  263,  598,  597,  597,  597,  597,  597,  597,
+      597,  599,  597,  597,  597, 2441,  597,  601,  597,  602,
+      597, 1269, 2450, 1280, 1280, 1280, 1021, 1021, 1021, 1277,
+     1292, 1292, 1292, 2451, 1292, 1292, 1292, 1299, 1299, 1299,
+     2428, 1282, 2452, 1022, 2453,  597,  597, 2455, 1294, 2457,
+     2429,  603, 1294, 2481,  604, 1301, 1322, 1322, 1322, 2482,
+
+     1323, 2484, 2485, 1324, 2486, 1687,  605,  610,  611,  263,
+      611,  610,  610,  610,  610,  610,  610,  610,  612,  610,
+      610,  610, 2487,  610,  614,  610,  615,  610, 1283, 1033,
+     1033, 1033, 1035, 1035, 1035, 1295, 1299, 1299, 1299, 1310,
+     1310, 1310, 2478, 1310, 1310, 1310, 1034, 2491, 2492, 1036,
+     2493, 2494,  610,  610, 1301, 2495, 2496, 1312, 2497, 2498,
+      616, 1312,  617, 2499, 2500,  618, 1704, 1704, 1704,  619,
+     1898, 1898, 1898,  620,  610,  611,  263,  611,  610,  610,
+      610,  610,  610,  610,  610,  612,  610,  610,  610, 1687,
+      610,  614,  610,  615,  610, 1041, 1041, 1041, 1302, 1044,
+
+     1044, 1044, 2501, 2503, 1313, 1325, 1325, 1325, 1336, 1336,
+     1336, 2504, 1042, 1336, 1336, 1336, 1045, 2507, 2508,  610,
+      610, 2477, 1326, 1708, 1708, 1708, 1338,  616, 2509,  617,
+     2510, 1338,  618, 1711, 1711, 1711,  619, 1721, 1721, 1721,
+      620,  626,  627,  263,  627,  626,  626,  626,  626,  626,
+      626,  626,  628,  626,  626,  626, 2513,  626,  630,  626,
+      631,  626, 1058, 1058, 1058, 1340, 1340, 1340, 2514, 1341,
+     2515, 1339, 1342, 1060, 1060, 1060, 1343, 1343, 1343, 1059,
+     1344, 2516, 2518, 1345, 2522, 2523,  626,  626, 2505, 2524,
+     1061, 1346, 1346, 1346, 1360, 1360, 1360, 2506, 1361, 2525,
+
+     2529, 1362, 1372, 1372, 1372, 2530, 1373, 2531, 1347, 1374,
+      632,  626,  627,  263,  627,  626,  626,  626,  626,  626,
+      626,  626,  628,  626,  626,  626, 2532,  626,  630,  626,
+      631,  626, 1072, 1072, 1072, 1380, 1380, 1380, 2533, 1381,
+     2537, 2540, 1382, 2541, 2544, 3285, 3285, 3285, 2556, 1073,
+     3285, 3285, 3285, 3285, 3285, 3285,  626,  626, 3285, 3285,
+     3285, 2557, 3285, 2560, 1389, 1389, 1389, 3285, 1390, 2511,
+     3285, 1391, 1421, 1421, 1421, 3285, 1422, 2561, 2512, 1423,
+      632,  636,  637,  263,  637,  636,  636,  636,  636,  636,
+      636,  636,  638,  636,  636,  636, 1348,  636,  640,  636,
+
+      641,  636, 1349, 1352, 1352, 1352, 2581, 2582, 1350, 2583,
+     1351, 2584, 1352, 1352, 1352, 1363, 1363, 1363, 1367, 1367,
+     1367, 1354, 1903, 1903, 1903, 2585,  636,  636, 2594, 1687,
+     1354, 2595, 1364, 1757, 1757, 1757, 1369,  642,  636,  637,
+      263,  637,  636,  636,  636,  636,  636,  636,  636,  638,
+      636,  636,  636, 2596,  636,  640,  636,  641,  636, 1355,
+     1080, 1080, 1080, 1375, 1375, 1375, 2579, 1367, 1367, 1367,
+     1375, 1375, 1375, 1085, 1085, 1085, 1145, 1081, 2597, 1705,
+     2598, 1377, 1687,  636,  636, 1369, 1904, 2599, 1377, 2600,
+     1086, 1755, 1755, 1755,  642,  647,  648,  263,  648,  647,
+
+      647,  647,  647,  647,  647,  647,  649,  647,  647,  647,
+     2601,  647,  651,  647,  652,  647, 2578, 2602, 1370, 1384,
+     1384, 1384, 1091, 1091, 1091, 2580, 2603, 1395, 1395, 1395,
+     2604, 1378, 1395, 1395, 1395, 2606, 2607, 1386, 2608, 1092,
+      647,  647, 1384, 1384, 1384, 1397, 1399, 1399, 1399, 2609,
+     1397,  653, 1461, 1461, 1461, 2610, 1462, 2611, 2612, 1463,
+     1386, 2613, 2614, 1400,  654,  647,  648,  263,  648,  647,
+      647,  647,  647,  647,  647,  647,  649,  647,  647,  647,
+     2615,  647,  651,  647,  652,  647, 2616, 1398, 2617, 1387,
+     1401, 1401, 1401, 2618, 2619, 3285, 3285, 3285, 1404, 1404,
+
+     1404, 1404, 1404, 1404, 1416, 1416, 1416, 1402, 2620, 2622,
+      647,  647, 3285, 1409, 1409, 1409, 1406, 2630, 2631, 1406,
+     2632,  653, 1418, 3285, 3285, 3285, 1413, 1413, 1413, 2635,
+     1410, 1416, 1416, 1416,  654,  662, 3285, 3285, 3285, 2636,
+     3285, 2640,  677, 1414, 1111, 1111, 1111, 1687, 2675, 1418,
+     2588,  661,  678, 3285, 1403, 1145, 1424, 1424, 1424, 2677,
+     2589, 1112, 1407, 2590, 1424, 1424, 1424, 2678, 1419, 1757,
+     1757, 1757, 1687, 1411, 1426, 1428, 1428, 1428, 2679,  679,
+      680,  681, 1426, 2683, 2672,  682,  683,  684, 1412, 2673,
+      685,  686, 1429, 2684,  687, 1415,  688,  689,  690,  662,
+
+     1430, 1430, 1430, 1432, 1432, 1432,  734, 1432, 1432, 1432,
+     1436, 1436, 1436, 2685, 2674,  661,  735, 1431, 2687, 1427,
+     2688, 1434, 3285, 3285, 3285, 1434, 2686, 1437, 2691, 1440,
+     1440, 1440, 2692, 2693, 1442, 1442, 1442, 2658, 2694, 3285,
+     1135, 1135, 1135,  679,  736,  691, 1441, 2659, 2695,  737,
+      738,  684, 1444, 2660,  739,  686, 2696, 1136,  740, 2697,
+      741,  742,  690, 1442, 1442, 1442, 1451, 1451, 1451, 1139,
+     1139, 1139, 1438, 1451, 1451, 1451, 2698, 2699, 1435, 2701,
+     2702, 1444, 2703, 2704, 1453, 2705, 1140, 1439, 1457, 1457,
+     1457, 1453, 1457, 1457, 1457, 1464, 1464, 1464, 1464, 1464,
+
+     1464, 1468, 1468, 1468, 2706, 1469, 1459, 2707, 1470, 2708,
+     1459, 2709, 2710, 1466, 2711, 2712, 1466, 1472, 1472, 1472,
+     1472, 1472, 1472, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
+     1158, 1158, 2591, 2689, 1445, 1474, 2713, 1454, 1474, 2715,
+     2723, 1160, 2592, 2724, 1160, 2593, 2690, 1160, 1514, 1514,
+     1514, 1193, 1193, 1193, 2732, 2733, 1460, 2750, 2751, 1467,
+     1193, 1193, 1193, 2752, 2753, 1515, 1517, 1517, 1517, 1195,
+     1193, 1193, 1193, 1198, 1198, 1198, 1484, 1199, 1195, 2754,
+     1200, 2755, 2766, 1518, 1475, 3285, 3285, 3285, 1195, 1203,
+     1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 2758, 1208,
+
+     1208, 1208, 3285, 1209, 2760, 2768, 1210, 1205, 2769, 1687,
+     1205, 2759, 2770, 1205, 1211, 1211, 1211, 2761, 1145, 1516,
+     1523, 1523, 1523, 2771, 1524, 2661, 2772, 1525, 1526, 1526,
+     1526, 1212, 1214, 1214, 1214, 2662, 1528, 1528, 1528, 2773,
+     1529, 2663, 1521, 1530, 2763, 1527, 1519, 2774, 2775, 1215,
+     1532, 1532, 1532, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
+     1219, 1219, 1537, 1537, 1537, 2776, 2762, 1533, 1226, 1226,
+     1226, 1221, 2777, 2780, 1221, 2781, 2782, 1221, 2783, 1538,
+     1226, 1226, 1226, 1226, 1226, 1226, 1228, 1230, 1230, 1230,
+     2784, 1231, 2785, 2786, 1232, 1234, 1234, 1234, 1228, 2787,
+
+     2789, 1228, 1234, 1234, 1234, 1542, 1542, 1542, 1252, 1252,
+     1252, 2790, 1253, 1236, 2791, 1254, 1559, 1559, 1559, 1535,
+     1236, 2792, 2793, 1543, 1257, 1257, 1257, 1257, 1257, 1257,
+     1540, 2794, 2795, 1560, 1257, 1257, 1257, 1262, 1262, 1262,
+     2796, 1263, 1259, 2797, 1264, 1259, 1266, 1266, 1266, 1266,
+     1266, 1266, 1259, 1266, 1266, 1266, 1270, 1270, 1270, 2798,
+     1271, 2799, 2800, 1272, 1268, 2801, 2807, 1268, 1565, 1565,
+     1565, 1268, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274,
+     1274, 1568, 1568, 1568, 2808, 1566, 2809, 3285, 3285, 3285,
+     1276, 2816, 2817, 1276, 2831, 1561, 1276, 2832, 1569, 1280,
+
+     1280, 1280, 2833, 2834, 3285, 1280, 1280, 1280, 1280, 1280,
+     1280, 1574, 1574, 1574, 1564, 1570, 2835, 1282, 1287, 1287,
+     1287, 2836, 1288, 1282, 2840, 1289, 1282, 2841, 1575, 1292,
+     1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1581, 1581,
+     1581, 1299, 1299, 1299, 2823, 1567, 2842, 1294, 2843, 2853,
+     1294, 1145, 2854, 1294, 2824, 1582, 1584, 1584, 1584, 1301,
+     1299, 1299, 1299, 1299, 1299, 1299, 2825, 2827, 1304, 1304,
+     1304, 2855, 1305, 1585, 1571, 1306, 2826, 2828, 1301, 2856,
+     2857, 1301, 1307, 1307, 1307, 2844, 1308, 2858, 2859, 1309,
+     1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 2860,
+
+     1578, 2864, 1318, 1318, 1318, 2865, 1319, 2866, 1312, 1320,
+     2867, 1312, 2868, 2829, 1312, 1591, 1591, 1591, 1322, 1322,
+     1322, 2869, 1323, 2830, 2871, 1324, 1325, 1325, 1325, 2872,
+     1583, 2873, 1592, 1593, 1593, 1593, 2874, 1594, 2875, 2876,
+     1595, 2877, 2878, 1326, 1336, 1336, 1336, 1336, 1336, 1336,
+     1336, 1336, 1336, 1340, 1340, 1340, 2882, 1341, 2883, 2884,
+     1342, 1586, 1338, 2887, 2892, 1338, 2893, 2894, 1338, 1343,
+     1343, 1343, 2895, 1344, 2896, 2897, 1345, 1346, 1346, 1346,
+     1606, 1606, 1606, 2898, 1607, 2899, 2900, 1608, 1352, 1352,
+     1352, 1352, 1352, 1352, 1347, 1352, 1352, 1352, 1360, 1360,
+
+     1360, 2901, 1361, 2902, 2903, 1362, 1354, 2905, 2906, 1354,
+     1363, 1363, 1363, 1354, 1618, 1618, 1618, 1605, 1619, 2907,
+     2908, 1620, 1367, 1367, 1367, 2915, 1145, 1364, 1367, 1367,
+     1367, 1367, 1367, 1367, 1372, 1372, 1372, 2916, 1373, 2917,
+     1369, 1374, 2918, 1613, 2919, 2920, 1369, 2921, 2922, 1369,
+     1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1380,
+     1380, 1380, 2923, 1381, 2924, 2925, 1382, 2926, 1377, 2909,
+     2927, 1377, 2928, 2931, 1377, 1384, 1384, 1384, 1384, 1384,
+     1384, 2932, 1623, 1384, 1384, 1384, 2933, 1389, 1389, 1389,
+     2934, 1390, 2935, 1386, 1391, 2936, 1386, 1395, 1395, 1395,
+
+     2937, 1386, 1395, 1395, 1395, 2938, 1395, 1395, 1395, 1399,
+     1399, 1399, 1634, 1634, 1634, 1397, 1635, 2939, 2943, 1636,
+     1397, 2950, 2951, 1625, 1397, 2952, 1400, 1401, 1401, 1401,
+     2953, 2954, 1628, 1637, 1637, 1637, 2955, 1638, 2956, 2957,
+     1639, 1404, 1404, 1404, 1402, 1404, 1404, 1404, 2958, 1404,
+     1404, 1404, 1409, 1409, 1409, 2959, 1413, 1413, 1413, 1406,
+     1704, 1704, 1704, 1406, 2960, 2961, 1633, 1406, 2964, 1410,
+     1643, 1643, 1643, 1414, 1644, 2965, 2966, 1645, 1648, 1648,
+     1648, 2967, 1649, 2975, 2970, 1650, 1416, 1416, 1416, 1416,
+     1416, 1416, 1416, 1416, 1416, 1421, 1421, 1421, 2971, 1422,
+
+     2976, 1145, 1423, 2970, 1418, 2977, 1854, 1418, 2978, 2979,
+     1418, 1424, 1424, 1424, 2973, 2980, 1641, 1424, 1424, 1424,
+     1424, 1424, 1424, 1428, 1428, 1428, 1655, 1655, 1655, 1426,
+     1656, 2981, 2982, 1657, 2983, 1426, 2984, 2985, 1426, 2986,
+     1429, 1430, 1430, 1430, 1658, 1658, 1658, 2968, 1659, 2987,
+     2988, 1660, 1432, 1432, 1432, 2989, 1652, 2990, 1431, 1432,
+     1432, 1432, 2991, 1432, 1432, 1432, 1436, 1436, 1436, 2996,
+     1434, 1662, 1662, 1662, 3001, 1663, 3002, 1434, 1664, 3003,
+     1654, 1434, 3004, 1437, 1440, 1440, 1440, 1667, 1667, 1667,
+     3005, 1668, 3006, 1145, 1669, 1442, 1442, 1442, 1442, 1442,
+
+     1442, 1441, 1442, 1442, 1442, 1672, 1672, 1672, 1451, 1451,
+     1451, 2992, 2994, 1444, 1687, 1688, 1444, 1451, 1451, 1451,
+     1444, 2997, 1673, 2993, 2995, 1661, 1453, 1451, 1451, 1451,
+     1457, 1457, 1457, 2998, 3007, 1453, 1457, 1457, 1457, 1457,
+     1457, 1457, 1461, 1461, 1461, 1453, 1462, 3009, 1459, 1463,
+     1464, 1464, 1464, 3009, 1459, 3012, 2970, 1459, 1464, 1464,
+     1464, 1464, 1464, 1464, 1670, 1468, 1468, 1468, 1466, 1469,
+     2971, 3013, 1470, 1472, 1472, 1472, 1466, 2999, 3014, 1466,
+     1472, 1472, 1472, 1472, 1472, 1472, 2970, 3015, 1677, 3000,
+     3028, 1474, 1680, 1686, 1686, 1686, 3031, 2973, 1474, 3036,
+
+     3039, 1474, 1158, 1158, 1158, 1514, 1514, 1514, 1193, 1193,
+     1193, 1687, 1688, 3018, 1517, 1517, 1517, 1542, 1542, 1542,
+     1160, 1681, 1515, 1724, 1724, 1724, 1195, 1725, 3019, 3026,
+     1726, 1518, 1728, 1728, 1728, 1543, 1729, 3040, 3016, 1730,
+     1203, 1203, 1203, 3041, 1683, 1523, 1523, 1523, 3027, 1524,
+     3029, 3009, 1525, 1526, 1526, 1526, 3017, 3034, 1205, 3043,
+     1735, 1735, 1735, 3037, 1736, 3009, 1727, 1737, 1693, 3030,
+     1527, 1528, 1528, 1528, 3044, 1529, 3035, 3045, 1530, 1532,
+     1532, 1532, 3038, 1739, 1739, 1739, 3046, 1740, 3047, 1733,
+     1741, 1219, 1219, 1219, 3048, 3049, 1533, 1537, 1537, 1537,
+
+     1745, 1745, 1745, 3059, 1746, 3060, 3061, 1747, 3062, 1221,
+     1748, 1748, 1748, 3063, 1538, 1226, 1226, 1226, 1766, 1766,
+     1766, 1559, 1559, 1559, 1768, 1768, 1768, 1749, 1769, 3064,
+     3068, 1770, 3069, 1228, 3070, 1767, 3071, 3072, 1560, 3073,
+     3074, 1743, 1257, 1257, 1257, 1266, 1266, 1266, 1565, 1565,
+     1565, 1775, 1775, 1775, 3075, 1776, 3077, 3078, 1777, 3079,
+     1259, 3080, 3081, 1268, 1750, 1566, 1274, 1274, 1274, 1568,
+     1568, 1568, 1779, 1779, 1779, 3086, 1780, 3087, 3088, 1781,
+     1280, 1280, 1280, 3082, 1276, 3089, 1569, 1574, 1574, 1574,
+     1786, 1786, 1786, 3084, 1787, 3083, 3090, 1788, 1282, 1789,
+
+     1789, 1789, 3091, 3092, 1575, 3085, 1771, 3093, 3094, 1774,
+     1791, 1791, 1791, 1292, 1292, 1292, 1790, 1581, 1581, 1581,
+     3095, 1797, 1797, 1797, 3096, 1798, 1778, 1792, 1799, 3097,
+     3098, 1294, 3099, 3101, 1582, 1800, 1800, 1800, 1584, 1584,
+     1584, 1783, 1802, 1802, 1802, 3102, 1803, 3103, 3104, 1804,
+     1310, 1310, 1310, 1801, 3105, 1585, 1793, 1807, 1807, 1807,
+     1591, 1591, 1591, 1811, 1811, 1811, 1145, 1812, 1312, 3106,
+     1813, 1593, 1593, 1593, 1808, 1594, 3107, 1592, 1595, 1794,
+     1816, 1816, 1816, 1336, 1336, 1336, 1606, 1606, 1606, 3108,
+     1607, 3100, 3109, 1608, 1825, 1825, 1825, 1817, 3285, 3285,
+
+     3285, 1338, 3285, 3285, 3285, 3285, 3285, 3285, 1352, 1352,
+     1352, 1826, 1832, 1832, 1832, 3285, 1805, 3110, 3111, 3285,
+     3112, 3113, 3285, 1618, 1618, 1618, 1354, 1619, 3114, 1833,
+     1620, 3115, 3116, 1836, 1836, 1836, 1367, 1367, 1367, 1375,
+     1375, 1375, 1384, 1384, 1384, 1848, 1848, 1848, 1824, 1828,
+     1837, 1395, 1395, 1395, 1369, 3117, 3118, 1377, 3119, 3120,
+     1386, 3122, 1849, 1830, 3123, 1404, 1404, 1404, 1827, 1397,
+     1634, 1634, 1634, 1145, 1635, 1829, 3124, 1636, 1637, 1637,
+     1637, 3125, 1638, 1406, 3126, 1639, 1643, 1643, 1643, 3127,
+     1644, 1850, 3121, 1645, 1648, 1648, 1648, 3128, 1649, 1844,
+
+     1839, 1650, 1416, 1416, 1416, 1841, 3129, 3130, 1851, 1424,
+     1424, 1424, 1655, 1655, 1655, 3131, 1656, 3132, 3133, 1657,
+     1418, 1658, 1658, 1658, 3134, 1659, 3135, 1426, 1660, 3136,
+     3137, 1853, 1432, 1432, 1432, 1662, 1662, 1662, 3138, 1663,
+     3139, 1145, 1664, 3141, 1667, 1667, 1667, 3142, 1668, 3143,
+     1434, 1669, 1442, 1442, 1442, 1672, 1672, 1672, 1866, 1866,
+     1866, 3140, 1867, 1858, 3144, 1868, 1860, 1451, 1451, 1451,
+     1444, 3145, 1673, 1874, 1874, 1874, 1457, 1457, 1457, 1861,
+     1464, 1464, 1464, 3146, 3147, 1453, 1878, 1878, 1878, 3148,
+     1875, 1472, 1472, 1472, 1459, 1686, 1686, 1686, 1466, 1864,
+
+     1158, 1158, 1158, 1879, 1906, 1906, 1906, 3149, 3150, 1474,
+     1914, 1914, 1914, 1687, 3151, 3152, 1872, 3153, 1160, 1724,
+     1724, 1724, 3154, 1725, 3155, 3156, 1726, 1193, 1193, 1193,
+     3157, 3158, 1877, 1728, 1728, 1728, 1145, 1729, 3160, 3161,
+     1730, 3162, 3159, 1876, 3163, 1195, 1882, 1203, 1203, 1203,
+     1907, 3164, 1887, 1880, 3165, 3166, 1915, 1735, 1735, 1735,
+     3167, 1736, 3168, 1883, 1737, 1205, 1739, 1739, 1739, 3169,
+     1740, 3170, 3171, 1741, 1219, 1219, 1219, 1745, 1745, 1745,
+     3173, 1746, 3174, 1145, 1747, 1748, 1748, 1748, 3175, 1933,
+     1933, 1933, 1221, 1934, 1916, 3176, 1935, 3172, 1919, 1226,
+
+     1226, 1226, 1749, 1758, 1758, 1758, 1942, 1942, 1942, 1942,
+     1942, 1942, 1903, 1903, 1903, 3177, 3178, 1228, 3179, 1766,
+     1766, 1766, 1948, 1948, 1948, 3180, 1949, 3182, 3183, 1950,
+     1768, 1768, 1768, 3184, 1769, 1923, 1767, 1770, 1257, 1257,
+     1257, 1953, 1953, 1953, 1266, 1266, 1266, 1775, 1775, 1775,
+     1936, 1776, 3185, 3186, 1777, 3187, 1259, 3188, 1954, 1274,
+     1274, 1274, 1268, 3189, 1779, 1779, 1779, 3192, 1780, 3193,
+     1943, 1781, 3194, 1904, 3195, 3196, 1943, 1276, 1957, 1957,
+     1957, 1280, 1280, 1280, 3197, 1951, 1786, 1786, 1786, 1734,
+     1787, 1955, 3282, 1788, 1145, 1958, 1789, 1789, 1789, 1282,
+
+     1962, 1962, 1962, 1145, 1963, 1145, 1145, 1964, 1145, 1791,
+     1791, 1791, 1732, 1790, 1965, 1965, 1965, 1731, 1966, 1145,
+     1145, 1967, 1969, 1969, 1969, 1956, 1792, 1971, 1971, 1971,
+     1797, 1797, 1797, 1145, 1798, 1145, 1145, 1799, 3204, 3198,
+     1970, 1800, 1800, 1800, 3199, 1959, 1802, 1802, 1802, 3205,
+     1803, 3224, 1145, 1804, 1310, 1310, 1310, 1145, 3208, 1801,
+     1807, 1807, 1807, 1975, 1975, 1975, 1145, 1976, 3200, 1723,
+     1977, 1145, 1312, 1978, 1978, 1978, 1145, 1808, 1811, 1811,
+     1811, 3201, 1812, 3202, 3203, 1813, 1816, 1816, 1816, 3225,
+     1979, 1983, 1983, 1983, 3209, 1984, 1722, 3206, 1985, 3212,
+
+     1973, 1145, 1145, 1817, 1986, 1986, 1986, 1992, 1992, 1992,
+     1336, 1336, 1336, 1825, 1825, 1825, 1995, 1995, 1995, 3278,
+     1996, 1987, 3220, 1997, 1993, 1998, 1998, 1998, 1338, 1145,
+     1826, 3285, 3285, 3285, 2001, 2001, 2001, 1352, 1352, 1352,
+     1145, 3210, 1999, 1832, 1832, 1832, 3207, 1145, 3285, 1145,
+     1145, 2002, 2005, 2005, 2005, 1354, 2006, 1145, 1145, 2007,
+     1833, 2008, 2008, 2008, 1836, 1836, 1836, 2011, 2011, 2011,
+     3216, 2012, 3211, 1145, 2013, 1720, 1994, 3214, 2009, 1145,
+     1145, 1837, 2015, 2015, 2015, 1375, 1375, 1375, 3217, 2000,
+     1384, 1384, 1384, 1848, 1848, 1848, 1145, 2003, 1145, 1145,
+
+     2016, 3232, 1145, 1377, 3213, 2025, 2025, 2025, 1386, 2026,
+     1849, 3272, 2027, 2029, 2029, 2029, 1404, 1404, 1404, 3221,
+     2034, 2034, 2034, 2036, 2036, 2036, 3285, 3285, 3285, 1145,
+     1719, 2030, 3226, 3215, 1406, 3222, 2018, 2035, 2021, 3223,
+     2037, 1145, 3233, 3285, 1416, 1416, 1416, 1424, 1424, 1424,
+     1432, 1432, 1432, 2043, 2043, 2043, 2045, 2045, 2045, 1442,
+     1442, 1442, 1418, 1145, 3218, 1426, 1718, 2032, 1434, 1717,
+     2044, 3227, 1145, 2046, 1866, 1866, 1866, 1444, 1867, 1145,
+     1145, 1868, 1451, 1451, 1451, 1874, 1874, 1874, 2397, 2398,
+     2038, 2399, 1145, 2041, 2054, 2054, 2054, 3230, 2055, 2400,
+
+     1453, 2056, 1875, 1457, 1457, 1457, 2401, 3219, 1464, 1464,
+     1464, 2039, 1878, 1878, 1878, 2042, 2059, 2059, 2059, 3240,
+     2060, 1459, 1716, 2061, 2047, 3234, 1466, 3228, 1145, 1879,
+     2062, 2062, 2062, 2052, 2068, 2068, 2068, 1158, 1158, 1158,
+     2078, 2078, 2078, 1898, 1898, 1898, 1715, 1714, 2063, 1145,
+     1713, 2069, 2085, 2085, 2085, 1160, 1903, 1903, 1903, 2086,
+     2086, 2086, 2057, 2058, 1906, 1906, 1906, 2089, 2089, 2089,
+     2090, 2090, 2090, 1914, 1914, 1914, 1193, 1193, 1193, 2099,
+     2099, 2099, 2102, 2102, 2102, 1219, 1219, 1219, 2106, 2106,
+     2106, 1226, 1226, 1226, 1195, 3235, 1145, 2100, 2070, 2103,
+
+     1933, 1933, 1933, 1221, 1934, 2107, 1712, 1935, 1710, 1228,
+     2119, 2119, 2119, 1942, 1942, 1942, 2126, 2126, 2126, 2128,
+     2128, 2128, 1257, 1257, 1257, 3241, 2096, 2120, 1948, 1948,
+     1948, 3229, 1949, 1709, 1145, 1950, 2129, 2118, 1145, 1145,
+     1259, 2131, 2131, 2131, 2105, 1953, 1953, 1953, 2133, 2133,
+     2133, 1145, 2134, 1145, 1145, 2135, 1145, 1145, 2132, 1266,
+     1266, 1266, 1954, 2137, 2137, 2137, 1957, 1957, 1957, 2139,
+     2139, 2139, 3231, 2140, 3236, 2130, 2141, 1268, 1280, 1280,
+     1280, 2138, 3250, 1958, 1962, 1962, 1962, 1145, 1963, 3237,
+     3238, 1964, 3264, 1965, 1965, 1965, 1282, 1966, 3244, 1145,
+
+     1967, 1969, 1969, 1969, 1971, 1971, 1971, 1145, 1310, 1310,
+     1310, 1145, 2136, 1975, 1975, 1975, 1145, 1976, 1145, 1970,
+     1977, 1978, 1978, 1978, 3242, 2142, 1312, 2151, 2151, 2151,
+     1145, 2152, 3239, 1145, 2153, 1983, 1983, 1983, 1979, 1984,
+     3251, 1707, 1985, 1986, 1986, 1986, 2157, 2157, 2157, 3245,
+     2158, 3266, 1145, 2159, 2160, 2160, 2160, 1992, 1992, 1992,
+     1987, 2165, 2165, 2165, 3246, 2166, 2149, 3243, 2167, 1706,
+     3248, 2161, 3252, 1145, 1993, 1336, 1336, 1336, 1995, 1995,
+     1995, 1145, 1996, 1703, 1700, 1997, 1998, 1998, 1998, 3249,
+     2169, 2169, 2169, 1338, 2170, 1145, 1145, 2171, 2172, 2172,
+
+     2172, 3253, 3282, 1999, 2001, 2001, 2001, 2174, 2174, 2174,
+     1145, 2175, 1145, 1145, 2176, 2173, 1352, 1352, 1352, 3247,
+     1145, 2002, 1145, 2005, 2005, 2005, 2168, 2006, 3273, 3254,
+     2007, 2008, 2008, 2008, 1354, 2179, 2179, 2179, 1699, 2180,
+     1698, 3258, 2181, 2011, 2011, 2011, 3255, 2012, 2009, 1145,
+     2013, 2015, 2015, 2015, 1375, 1375, 1375, 2187, 2187, 2187,
+     1384, 1384, 1384, 2191, 2191, 2191, 3256, 2177, 3257, 2016,
+     1145, 1145, 1377, 3259, 2188, 2025, 2025, 2025, 1386, 2026,
+     2192, 1145, 2027, 2029, 2029, 2029, 2199, 2199, 2199, 2034,
+     2034, 2034, 2202, 2202, 2202, 1145, 2203, 1697, 1145, 2204,
+
+     1696, 2030, 1145, 1695, 2200, 1694, 2035, 3262, 3263, 2193,
+     2036, 2036, 2036, 2205, 2205, 2205, 1145, 2206, 2185, 1692,
+     2207, 2189, 1416, 1416, 1416, 1145, 1145, 2037, 1424, 1424,
+     1424, 1432, 1432, 1432, 2043, 2043, 2043, 2213, 2213, 2213,
+     1418, 2214, 3260, 3265, 2215, 3261, 1426, 1145, 3276, 1434,
+     1145, 2044, 2045, 2045, 2045, 2216, 2216, 2216, 3277, 2217,
+     3267, 1145, 2218, 1442, 1442, 1442, 1451, 1451, 1451, 2046,
+     1145, 2054, 2054, 2054, 3274, 2055, 1145, 2211, 2056, 3280,
+     1145, 1444, 3281, 1145, 1453, 1457, 1457, 1457, 2209, 1464,
+     1464, 1464, 1145, 2059, 2059, 2059, 2212, 2060, 3270, 1691,
+
+     2061, 1690, 1689, 1459, 2062, 2062, 2062, 1466, 2068, 2068,
+     2068, 2232, 2232, 2232, 3275, 2233, 3268, 1682, 2234, 1158,
+     1158, 1158, 2063, 1145, 3279, 2069, 3269, 1679, 2219, 3271,
+     1678, 2224, 2236, 2236, 2236, 1676, 2226, 1160, 2241, 2241,
+     2241, 1675, 2227, 2242, 2242, 2242, 2078, 2078, 2078, 2244,
+     2244, 2244, 2248, 2248, 2248, 2085, 2085, 2085, 2086, 2086,
+     2086, 2249, 2249, 2249, 2089, 2089, 2089, 2090, 2090, 2090,
+     2252, 2252, 2252, 2253, 2253, 2253, 2254, 2254, 2254, 2255,
+     2255, 2255, 1674, 2235, 1193, 1193, 1193, 2099, 2099, 2099,
+     1671, 2102, 2102, 2102, 2261, 2261, 2261, 1666, 2262, 1665,
+
+     1653, 2263, 1195, 1651, 1647, 2100, 1646, 2250, 2103, 2265,
+     2265, 2265, 2106, 2106, 2106, 2267, 2267, 2267, 1642, 2268,
+     1640, 1632, 2269, 1226, 1226, 1226, 1631, 2266, 1630, 2107,
+     2119, 2119, 2119, 1629, 1627, 2257, 2281, 2281, 2281, 1626,
+     2282, 1228, 1624, 2283, 2284, 2284, 2284, 2120, 2126, 2126,
+     2126, 2289, 2289, 2289, 2128, 2128, 2128, 2291, 2291, 2291,
+     1622, 2292, 1621, 1617, 2293, 1257, 1257, 1257, 2131, 2131,
+     2131, 2129, 2280, 2295, 2295, 2295, 1616, 2296, 1615, 1614,
+     2297, 1612, 1611, 1259, 1610, 2132, 2133, 2133, 2133, 1609,
+     2134, 1604, 1603, 2135, 1266, 1266, 1266, 2290, 1602, 2137,
+
+     2137, 2137, 2139, 2139, 2139, 1601, 2140, 1600, 1599, 2141,
+     1598, 1597, 1268, 1280, 1280, 1280, 2294, 2138, 1310, 1310,
+     1310, 2151, 2151, 2151, 1596, 2152, 1590, 1589, 2153, 1588,
+     1587, 1282, 1580, 2157, 2157, 2157, 1312, 2158, 1579, 1577,
+     2159, 2160, 2160, 2160, 1576, 2298, 2313, 2313, 2313, 1573,
+     2314, 1572, 1563, 2315, 1562, 2165, 2165, 2165, 2161, 2166,
+     1558, 1557, 2167, 1336, 1336, 1336, 2299, 2169, 2169, 2169,
+     1556, 2170, 1555, 2308, 2171, 2172, 2172, 2172, 2320, 2320,
+     2320, 1338, 2321, 1554, 1553, 2322, 2174, 2174, 2174, 1552,
+     2175, 1551, 2173, 2176, 1352, 1352, 1352, 2179, 2179, 2179,
+
+     1549, 2180, 1548, 1546, 2181, 2328, 2328, 2328, 2187, 2187,
+     2187, 1545, 1354, 2331, 2331, 2331, 1544, 2332, 1541, 1539,
+     2333, 1536, 1534, 2329, 1531, 2188, 1522, 2319, 1384, 1384,
+     1384, 2191, 2191, 2191, 2336, 2336, 2336, 1520, 2337, 1513,
+     1511, 2338, 1510, 2199, 2199, 2199, 1386, 1509, 2192, 2202,
+     2202, 2202, 1508, 2203, 1507, 1506, 2204, 1416, 1416, 1416,
+     2323, 2200, 2205, 2205, 2205, 1505, 2206, 1504, 1503, 2207,
+     1502, 1424, 1424, 1424, 1499, 1418, 1432, 1432, 1432, 2213,
+     2213, 2213, 1498, 2214, 1497, 1496, 2215, 1495, 2334, 1426,
+     1494, 2216, 2216, 2216, 1434, 2217, 1493, 1491, 2218, 1442,
+
+     1442, 1442, 1490, 2354, 2354, 2354, 1489, 1488, 2349, 3285,
+     3285, 3285, 2352, 3285, 3285, 3285, 1487, 1444, 1486, 2353,
+     2355, 3285, 3285, 3285, 1485, 1483, 3285, 1451, 1451, 1451,
+     3285, 1457, 1457, 1457, 2362, 2362, 2362, 2351, 3285, 2364,
+     2364, 2364, 2367, 2367, 2367, 1453, 2232, 2232, 2232, 1459,
+     2233, 1482, 2363, 2234, 1158, 1158, 1158, 1145, 1481, 1480,
+     2356, 2236, 2236, 2236, 2369, 2369, 2369, 2370, 2370, 2370,
+     1479, 1478, 1160, 2241, 2241, 2241, 1477, 2357, 1145, 1471,
+     2358, 2242, 2242, 2242, 2244, 2244, 2244, 2374, 2374, 2374,
+     1456, 2361, 2359, 2375, 2375, 2375, 2376, 2376, 2376, 2248,
+
+     2248, 2248, 2249, 2249, 2249, 2252, 2252, 2252, 2253, 2253,
+     2253, 1455, 1450, 2368, 2254, 2254, 2254, 2255, 2255, 2255,
+     2380, 2380, 2380, 2383, 2383, 2383, 2261, 2261, 2261, 1449,
+     2262, 1448, 1447, 2263, 3285, 3285, 3285, 1446, 2381, 1420,
+     2384, 2265, 2265, 2265, 1408, 2267, 2267, 2267, 1394, 2268,
+     1393, 3285, 2269, 1226, 1226, 1226, 2281, 2281, 2281, 2266,
+     2282, 2402, 2403, 2283, 2404, 2284, 2284, 2284, 2407, 2407,
+     2407, 1228, 2405, 2289, 2289, 2289, 2291, 2291, 2291, 2406,
+     2292, 1392, 1388, 2293, 1257, 1257, 1257, 2295, 2295, 2295,
+     1383, 2296, 1379, 1371, 2297, 2413, 2413, 2413, 1366, 1365,
+
+     2385, 1359, 1259, 1280, 1280, 1280, 2423, 2423, 2423, 1310,
+     1310, 1310, 1356, 2414, 2396, 2313, 2313, 2313, 1335, 2314,
+     1334, 1282, 2315, 2430, 2430, 2430, 1333, 1312, 1332, 1331,
+     2412, 2434, 2434, 2434, 2320, 2320, 2320, 1330, 2321, 1329,
+     2431, 2322, 2436, 2436, 2436, 2328, 2328, 2328, 1328, 2435,
+     2442, 2442, 2442, 1327, 2415, 2331, 2331, 2331, 1321, 2332,
+     2437, 1314, 2333, 2329, 1384, 1384, 1384, 2443, 1303, 2424,
+     2445, 2445, 2445, 2336, 2336, 2336, 1298, 2337, 1297, 1296,
+     2338, 1291, 1386, 3285, 3285, 3285, 1290, 2446, 3285, 3285,
+     3285, 3285, 3285, 3285, 2456, 2456, 2456, 2460, 2460, 2460,
+
+     3285, 2458, 2458, 2458, 1286, 3285, 1285, 1284, 3285, 1424,
+     1424, 1424, 1279, 1278, 2461, 2444, 2447, 1273, 1265, 2459,
+     1261, 1432, 1432, 1432, 2354, 2354, 2354, 1426, 1442, 1442,
+     1442, 1256, 1255, 2465, 2465, 2465, 1251, 2466, 2448, 1434,
+     2467, 2355, 2454, 2468, 2468, 2468, 1444, 1250, 1249, 2449,
+     3285, 3285, 3285, 3285, 3285, 3285, 2472, 2472, 2472, 1248,
+     2469, 2474, 2474, 2474, 1247, 2464, 1246, 3285, 1245, 2462,
+     3285, 1457, 1457, 1457, 2473, 2362, 2362, 2362, 2364, 2364,
+     2364, 1244, 2463, 2367, 2367, 2367, 2369, 2369, 2369, 1459,
+     2479, 2479, 2479, 2363, 1243, 1242, 1145, 2370, 2370, 2370,
+
+     1241, 2470, 1240, 1239, 2471, 2483, 2483, 2483, 2480, 2374,
+     2374, 2374, 2375, 2375, 2375, 2376, 2376, 2376, 2380, 2380,
+     2380, 2383, 2383, 2383, 2488, 2488, 2488, 1233, 2489, 1225,
+     1224, 2490, 1226, 1226, 1226, 1223, 2381, 2475, 2384, 1218,
+     2476, 2407, 2407, 2407, 2517, 2517, 2517, 1257, 1257, 1257,
+     1228, 2413, 2413, 2413, 2520, 2520, 2520, 2526, 2526, 2526,
+     2423, 2423, 2423, 1217, 1216, 1259, 1310, 1310, 1310, 2414,
+     1213, 1207, 2521, 1202, 2527, 1201, 2430, 2430, 2430, 2534,
+     2534, 2534, 1197, 2535, 1312, 1192, 2536, 2538, 2538, 2538,
+     1191, 1190, 2502, 2431, 2434, 2434, 2434, 2436, 2436, 2436,
+
+     2542, 2542, 2542, 1189, 2539, 2442, 2442, 2442, 1188, 2548,
+     2548, 2548, 2435, 2519, 1187, 2437, 1186, 2543, 2445, 2445,
+     2445, 1184, 2443, 2528, 2545, 2545, 2545, 2549, 2546, 1183,
+     1182, 2547, 2550, 2550, 2550, 2446, 2551, 1181, 1180, 2552,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 2558,
+     2558, 2558, 2456, 2456, 2456, 1179, 1178, 3285, 1177, 1176,
+     3285, 1175, 1174, 3285, 1173, 1172, 2559, 2458, 2458, 2458,
+     2460, 2460, 2460, 2562, 2562, 2562, 1171, 2563, 1170, 1169,
+     2564, 2565, 2565, 2565, 1168, 2459, 1167, 2461, 1432, 1432,
+     1432, 1166, 2553, 1442, 1442, 1442, 2465, 2465, 2465, 2566,
+
+     2466, 2554, 1165, 2467, 2555, 1164, 1434, 2468, 2468, 2468,
+     1157, 1444, 2569, 2569, 2569, 1156, 2570, 1155, 1154, 2571,
+     2572, 2572, 2572, 1153, 2469, 2574, 2574, 2574, 2472, 2472,
+     2472, 2474, 2474, 2474, 2576, 2576, 2576, 2573, 2479, 2479,
+     2479, 1152, 2575, 2483, 2483, 2483, 2473, 2586, 2586, 2586,
+     1151, 1148, 2577, 1146, 1145, 2567, 2480, 2568, 2488, 2488,
+     2488, 1143, 2489, 1141, 2587, 2490, 1226, 1226, 1226, 2517,
+     2517, 2517, 1257, 1257, 1257, 2520, 2520, 2520, 2623, 2623,
+     2623, 2526, 2526, 2526, 1228, 2625, 2625, 2625, 1138, 2626,
+     1259, 1134, 2627, 2521, 1132, 2624, 1131, 1130, 2527, 2628,
+
+     2628, 2628, 2633, 2633, 2633, 2534, 2534, 2534, 1128, 2535,
+     1127, 1126, 2536, 2538, 2538, 2538, 1125, 2629, 1124, 2634,
+     2637, 2637, 2637, 1123, 2638, 1121, 2605, 2639, 1120, 1119,
+     2539, 2641, 2641, 2641, 2542, 2542, 2542, 2643, 2643, 2643,
+     1118, 2644, 1116, 2621, 2645, 2646, 2646, 2646, 2642, 1115,
+     1114, 2543, 2545, 2545, 2545, 1110, 2546, 1109, 1107, 2547,
+     1106, 1105, 2647, 2548, 2548, 2548, 2550, 2550, 2550, 1104,
+     2551, 1103, 1102, 2552, 3285, 3285, 3285, 3285, 3285, 3285,
+     1100, 2549, 3285, 3285, 3285, 2558, 2558, 2558, 2651, 2651,
+     2651, 3285, 2652, 1099, 3285, 2653, 2654, 2654, 2654, 3285,
+
+     1098, 1097, 2559, 2656, 2656, 2656, 1095, 2562, 2562, 2562,
+     1094, 2563, 1093, 2655, 2564, 2565, 2565, 2565, 1090, 1089,
+     2657, 1432, 1432, 1432, 1442, 1442, 1442, 1087, 2649, 2648,
+     2572, 2572, 2572, 2566, 2569, 2569, 2569, 2650, 2570, 1434,
+     1084, 2571, 1444, 1083, 2666, 2666, 2666, 2573, 2667, 1079,
+     1078, 2668, 2574, 2574, 2574, 2669, 2669, 2669, 1076, 2670,
+     1075, 1074, 2671, 2576, 2576, 2576, 2676, 2676, 2676, 2575,
+     1071, 2586, 2586, 2586, 1070, 2680, 2680, 2680, 1069, 2681,
+     1068, 2577, 2682, 1066, 1065, 2665, 1064, 2664, 2587, 1226,
+     1226, 1226, 2714, 2714, 2714, 1257, 1257, 1257, 2717, 2717,
+
+     2717, 2623, 2623, 2623, 2720, 2720, 2720, 1228, 2721, 1063,
+     1062, 2722, 1057, 1259, 1055, 2718, 1054, 1053, 2624, 2625,
+     2625, 2625, 1052, 2626, 1051, 1050, 2627, 2628, 2628, 2628,
+     2725, 2725, 2725, 2633, 2633, 2633, 1049, 2730, 2730, 2730,
+     2700, 2676, 2676, 2676, 2719, 2629, 1048, 2726, 1047, 1046,
+     2634, 2727, 2727, 2727, 2731, 2728, 1043, 2716, 2729, 2637,
+     2637, 2637, 1040, 2638, 1039, 1038, 2639, 2641, 2641, 2641,
+     2734, 2734, 2734, 1032, 2735, 1031, 1029, 2736, 2643, 2643,
+     2643, 1026, 2644, 1024, 2642, 2645, 2646, 2646, 2646, 2737,
+     2737, 2737, 1023, 2738, 1018, 1017, 2739, 3285, 3285, 3285,
+
+     2741, 2741, 2741, 2647, 3285, 3285, 3285, 1015, 2651, 2651,
+     2651, 1014, 2652, 1013, 3285, 2653, 1011, 2742, 2654, 2654,
+     2654, 3285, 2744, 2744, 2744, 1008, 2745, 1006, 1003, 2746,
+     2656, 2656, 2656, 1002, 1000, 2655, 2747, 2747, 2747,  999,
+     2748,  996,  991, 2749, 1432, 1432, 1432, 2657, 1442, 1442,
+     1442,  990,  987, 2743,  986, 2740, 2666, 2666, 2666,  985,
+     2667,  982, 1434, 2668,  981,  979, 1444, 2669, 2669, 2669,
+      976, 2670,  974,  973, 2671, 2764, 2764, 2764, 2767, 2767,
+     2767, 2680, 2680, 2680,  972, 2681,  971,  969, 2682, 2778,
+     2778, 2778, 2765, 1687,  968, 2756, 1226, 1226, 1226, 2714,
+
+     2714, 2714, 2802, 2802, 2802,  967, 2779, 1257, 1257, 1257,
+     2717, 2717, 2717,  966, 1228, 2757, 2804, 2804, 2804,  965,
+     2805,  964,  961, 2806,  960, 1259,  959, 2718, 2720, 2720,
+     2720,  956, 2721,  953,  952, 2722, 2725, 2725, 2725, 2810,
+     2810, 2810,  950, 2811,  949, 2788, 2812, 2727, 2727, 2727,
+      946, 2728,  943, 2726, 2729, 2730, 2730, 2730, 2803, 2813,
+     2813, 2813,  940, 2814,  939,  931, 2815, 2734, 2734, 2734,
+      930, 2735, 2731,  929, 2736, 2737, 2737, 2737,  928, 2738,
+      922,  921, 2739, 3285, 3285, 3285, 2741, 2741, 2741, 2819,
+     2819, 2819,  920, 2820,  918,  917, 2821, 3285, 3285, 3285,
+
+     3285,  916,  915, 2742, 2744, 2744, 2744,  914, 2745,  913,
+      908, 2746,  905,  907, 3285, 2747, 2747, 2747,  902, 2748,
+      901,  899, 2749, 2837, 2837, 2837, 1442, 1442, 1442, 2845,
+     2845, 2845,  897,  895, 2818, 2764, 2764, 2764, 2847, 2847,
+     2847, 2838, 2848,  893, 1444, 2849, 2846, 1687, 2850, 2850,
+     2850,  891, 2765, 1687,  888,  887, 1687, 2767, 2767, 2767,
+     2851, 2851, 2851, 2852, 2852, 2852,  886,  885, 2822, 2778,
+     2778, 2778, 2861, 2861, 2861,  884, 2862,  882,  880, 2863,
+     1226, 1226, 1226, 2879, 2879, 2879, 2779, 2802, 2802, 2802,
+      879,  878, 2839, 2880, 2880, 2880,  876,  874, 1228, 2804,
+
+     2804, 2804,  873, 2805,  871,  869, 2806,  868, 2810, 2810,
+     2810, 2881, 2811,  866,  862, 2812, 2813, 2813, 2813,  861,
+     2814,  859,  854, 2815, 2885, 2885, 2885, 2888, 2888, 2888,
+     2819, 2819, 2819,  852, 2820,  848,  847, 2821, 2890, 2890,
+     2890, 2886,  846,  844, 2889,  842, 2870, 2837, 2837, 2837,
+     1442, 1442, 1442,  841,  840, 2891, 2845, 2845, 2845, 2910,
+     2910, 2910,  838, 2911,  836, 2838, 2912,  835, 1444, 2850,
+     2850, 2850,  833, 2846, 1687,  831,  830, 1687, 2847, 2847,
+     2847,  829, 2848,  828,  827, 2849, 2851, 2851, 2851, 2852,
+     2852, 2852,  826, 2861, 2861, 2861, 1687, 2862,  825,  823,
+
+     2863, 2904, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+     1685,  821,  820, 1685, 2929, 2929, 2929,  817, 1685, 1685,
+     1685, 1687, 1685, 2879, 2879, 2879, 2880, 2880, 2880, 2885,
+     2885, 2885, 2930, 2940, 2940, 2940,  816, 2941,  815,  813,
+     2942, 2888, 2888, 2888, 2881,  801, 2886, 1685, 1685, 1685,
+     1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 2889,  800,
+     1685, 2890, 2890, 2890,  797, 1685, 1685, 1685, 1687, 1685,
+     2944, 2944, 2944,  795, 2945,  793,  792, 2946, 2891, 2947,
+     2947, 2947,  791, 2948,  789,  787, 2949, 2962, 2962, 2962,
+     2929, 2929, 2929,  785, 1685, 1685, 2910, 2910, 2910,  782,
+
+     2911,  781,  780, 2912,  779, 2963,  778,  776, 2930, 2962,
+     2962, 2962,  774,  773, 1687, 1685, 1685, 1685, 1685, 1685,
+     2974, 1685, 1685, 1685,  771,  769, 1685, 2963,  768,  766,
+      764, 1685, 1685, 1685, 1687, 1685, 2940, 2940, 2940,  763,
+     2941,  762,  760, 2942, 2944, 2944, 2944,  758, 2945,  757,
+      756, 2946, 2947, 2947, 2947,  755, 2948,  753, 3285, 2949,
+     1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+     2974,  700,  733, 1685, 3011, 3011, 3011,  732, 1685, 1685,
+     1685, 1687, 1685, 3020, 3020, 3020, 3022, 3022, 3022, 3024,
+     3024, 3024, 1687, 1688, 3032, 3032, 3032, 3042, 3042, 3042,
+
+     3021,  730,  728, 3023,  727,  726, 3025, 1685, 1685,  724,
+      720, 3033, 3011, 3011, 3011, 1145, 3020, 3020, 3020, 3050,
+     3050, 3050,  716, 3051,  715,  713, 3052, 3022, 3022, 3022,
+     1687,  712,  709, 3021, 3053, 3053, 3053,  708, 3054,  707,
+      705, 3055,  704,  703, 3023, 3024, 3024, 3024, 3056, 3056,
+     3056,  701, 3057,  696, 3285, 3058, 3032, 3032, 3032, 3042,
+     3042, 3042, 3025, 1882, 3065, 3065, 3065,  676, 3066,  674,
+      672, 3067,  666, 3033, 3050, 3050, 3050, 1145, 3051,  665,
+      666, 3052, 3053, 3053, 3053,  665, 3054,  664,  663, 3055,
+     3056, 3056, 3056, 3285, 3057, 3285, 3076, 3058, 3065, 3065,
+
+     3065, 3285, 3066, 3285, 3285, 3067, 3181, 3181, 3181, 3181,
+     3181, 3181, 3285, 3190, 3285, 3285, 3191, 3283, 3283, 3283,
+     3283, 3283, 3283, 3285, 1145, 3285, 3285, 1145, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3284, 3285, 3285, 3284,  260,
+      260,  260,  260,  260,  260,  260,  260,  260,  261,  261,
+      261,  261,  261,  261,  261,  261,  261,  266,  266,  266,
+      266,  266,  266,  266,  266,  266,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  272,  272,  272,  272,  272,
+      272,  272,  272,  272,  275,  275,  275,  275,  275,  275,
+      275,  275,  275,  282,  282,  282,  282,  282,  282,  282,
+
+      282,  282,  290,  290,  290,  290,  290,  290,  290,  290,
+      290,  294,  294,  294,  294,  294,  294,  294,  294,  294,
+      306,  306,  306,  306,  306,  306,  306,  306,  306,  310,
+      310,  310,  310,  310,  310,  310,  310,  310,  317,  317,
+      317,  317,  317,  317,  317,  317,  317,  328,  328,  328,
+      328,  328,  328,  328,  328,  328,  336,  336,  336,  336,
+      336,  336,  336,  336,  336,  342,  342,  342,  342,  342,
+      342,  342,  342,  342,  348,  348,  348,  348,  348,  348,
+      348,  348,  348,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  359,  359,  359,  359,  359,  359,  359,  359,
+
+      359,  378,  378,  378,  378,  378,  378,  378,  378,  378,
+      385,  385,  385,  385,  385,  385,  385,  385,  385,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  398,  398,
+      398,  398,  398,  398,  398,  398,  398,  405,  405,  405,
+      405,  405,  405,  405,  405,  405,  410,  410,  410,  410,
+      410,  410,  410,  410,  410,  416,  416,  416,  416,  416,
+      416,  416,  416,  416,  421,  421,  421,  421,  421,  421,
+      421,  421,  421,  427,  427,  427,  427,  427,  427,  427,
+      427,  427,  435,  435,  435,  435,  435,  435,  435,  435,
+      435,  443,  443,  443,  443,  443,  443,  443,  443,  443,
+
+      447,  447,  447,  447,  447,  447,  447,  447,  447,  453,
+      453,  453,  453,  453,  453,  453,  453,  453,  459,  459,
+      459,  459,  459,  459,  459,  459,  459,  476,  476,  476,
+      476,  476,  476,  476,  476,  476,  483,  483,  483,  483,
+      483,  483,  483,  483,  483,  492,  492,  492,  492,  492,
+      492,  492,  492,  492,  498,  498,  498,  498,  498,  498,
+      498,  498,  498,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  514,  514,  514,  514,  514,  514,  514,  514,
+      514,  519,  519,  519,  519,  519,  519,  519,  519,  519,
+      525,  525,  525,  525,  525,  525,  525,  525,  525,  531,
+
+      531,  531,  531,  531,  531,  531,  531,  531,  537,  537,
+      537,  537,  537,  537,  537,  537,  537,  544,  544,  544,
+      544,  544,  544,  544,  544,  544,  551,  551,  551,  551,
+      551,  551,  551,  551,  551,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  564,  564,  564,  564,  564,  564,
+      564,  564,  564,  570,  570,  570,  570,  570,  570,  570,
+      570,  570,  577,  577,  577,  577,  577,  577,  577,  577,
+      577,  582,  582,  582,  582,  582,  582,  582,  582,  582,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  593,
+      593,  593,  593,  593,  593,  593,  593,  593,  600,  600,
+
+      600,  600,  600,  600,  600,  600,  600,  606,  606,  606,
+      606,  606,  606,  606,  606,  606,  613,  613,  613,  613,
+      613,  613,  613,  613,  613,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  629,  629,  629,  629,  629,  629,
+      629,  629,  629,  633,  633,  633,  633,  633,  633,  633,
+      633,  633,  639,  639,  639,  639,  639,  639,  639,  639,
+      639,  643,  643,  643,  643,  643,  643,  643,  643,  643,
+      650,  650,  650,  650,  650,  650,  650,  650,  650,  655,
+      655,  655,  655,  655,  655,  655,  655,  655,  675,  675,
+      675, 3285, 3285, 3285,  675,  702,  702,  702, 3285, 3285,
+
+     3285,  702,  706,  706,  706, 3285, 3285, 3285,  706,  714,
+      714,  714, 3285, 3285, 3285,  714,  725,  725,  725, 3285,
+     3285, 3285,  725,  731,  731,  731, 3285, 3285, 3285,  731,
+      754,  754,  754, 3285, 3285, 3285,  754,  761,  761,  761,
+     3285, 3285, 3285,  761,  767,  767,  767, 3285, 3285, 3285,
+      767,  772,  772,  772, 3285, 3285, 3285,  772,  777,  777,
+      777, 3285, 3285, 3285,  777,  786,  786,  786, 3285, 3285,
+     3285,  786,  790,  790,  790, 3285, 3285, 3285,  790,  796,
+      796,  796, 3285, 3285, 3285,  796,  814,  814,  814, 3285,
+     3285, 3285,  814,  824,  824,  824, 3285, 3285, 3285,  824,
+
+      834,  834,  834, 3285, 3285, 3285,  834,  839,  839,  839,
+     3285, 3285, 3285,  839,  845,  845,  845, 3285, 3285, 3285,
+      845,  853,  853,  853, 3285, 3285, 3285,  853,  860,  860,
+      860, 3285, 3285, 3285,  860,  867,  867,  867, 3285, 3285,
+     3285,  867,  872,  872,  872, 3285, 3285, 3285,  872,  877,
+      877,  877, 3285, 3285, 3285,  877,  883,  883,  883, 3285,
+     3285, 3285,  883,  892,  892,  892, 3285, 3285, 3285,  892,
+      896,  896,  896, 3285, 3285, 3285,  896,  900,  900,  900,
+     3285, 3285, 3285,  900,  904,  904,  904,  904,  904,  904,
+      904, 3285,  904,  675,  675,  675, 3285, 3285, 3285,  675,
+
+      919, 3285, 3285, 3285,  919,  702,  702,  702, 3285, 3285,
+     3285,  702,  951, 3285, 3285, 3285,  951,  706,  706,  706,
+     3285, 3285, 3285,  706,  958, 3285, 3285, 3285,  958,  714,
+      714,  714, 3285, 3285, 3285,  714,  970, 3285, 3285, 3285,
+      970,  725,  725,  725, 3285, 3285, 3285,  725,  975, 3285,
+     3285, 3285,  975,  731,  731,  731, 3285, 3285, 3285,  731,
+      980, 3285, 3285, 3285,  980,  754,  754,  754, 3285, 3285,
+     3285,  754, 1001, 3285, 3285, 3285, 1001,  761,  761,  761,
+     3285, 3285, 3285,  761, 1007, 3285, 3285, 3285, 1007,  767,
+      767,  767, 3285, 3285, 3285,  767, 1012, 3285, 3285, 3285,
+
+     1012,  772,  772,  772, 3285, 3285, 3285,  772, 1016, 3285,
+     3285, 3285, 1016,  777,  777,  777, 3285, 3285, 3285,  777,
+     1025, 3285, 3285, 3285, 1025,  786,  786,  786, 3285, 3285,
+     3285,  786, 1030, 3285, 3285, 3285, 1030,  790,  790,  790,
+     3285, 3285, 3285,  790, 1037, 3285, 3285, 3285, 1037,  796,
+      796,  796, 3285, 3285, 3285,  796, 1056, 3285, 3285, 3285,
+     1056,  814,  814,  814, 3285, 3285, 3285,  814, 1067, 3285,
+     3285, 3285, 1067,  824,  824,  824, 3285, 3285, 3285,  824,
+     1077, 3285, 3285, 3285, 1077,  834,  834,  834, 3285, 3285,
+     3285,  834, 1082, 3285, 3285, 3285, 1082,  839,  839,  839,
+
+     3285, 3285, 3285,  839, 1088, 3285, 3285, 3285, 1088,  845,
+      845,  845, 3285, 3285, 3285,  845, 1096, 3285, 3285, 3285,
+     1096,  853,  853,  853, 3285, 3285, 3285,  853, 1101, 3285,
+     3285, 3285, 1101,  860,  860,  860, 3285, 3285, 3285,  860,
+     1108, 3285, 3285, 3285, 1108,  867,  867,  867, 3285, 3285,
+     3285,  867, 1113, 3285, 3285, 3285, 1113,  872,  872,  872,
+     3285, 3285, 3285,  872, 1117, 3285, 3285, 3285, 1117,  877,
+      877,  877, 3285, 3285, 3285,  877, 1122, 3285, 3285, 3285,
+     1122,  883,  883,  883, 3285, 3285, 3285,  883, 1129, 3285,
+     3285, 3285, 1129,  892,  892,  892, 3285, 3285, 3285,  892,
+
+     1133, 3285, 3285, 3285, 1133,  896,  896,  896, 3285, 3285,
+     3285,  896, 1137, 3285, 3285, 3285, 1137,  900,  900,  900,
+     3285, 3285, 3285,  900, 1142, 3285, 3285, 3285, 1142, 1144,
+     1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1150, 3285,
+     3285, 3285, 3285, 1150,  675,  675,  675, 3285, 3285, 3285,
+      675, 1159, 1159, 1159, 1159, 3285, 3285, 1159, 1159,  702,
+      702,  702, 3285, 3285, 3285,  702, 1194, 1194, 1194, 1194,
+     3285, 3285, 1194, 1194,  706,  706,  706, 3285, 3285, 3285,
+      706, 1204, 1204, 1204, 1204, 3285, 3285, 1204, 1204,  714,
+      714,  714, 3285, 3285, 3285,  714, 1220, 1220, 1220, 1220,
+
+     3285, 3285, 1220, 1220,  725,  725,  725, 3285, 3285, 3285,
+      725, 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227,  731,
+      731,  731, 3285, 3285, 3285,  731, 1235, 1235, 1235, 1235,
+     3285, 3285, 1235, 1235,  754,  754,  754, 3285, 3285, 3285,
+      754, 1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258,  761,
+      761,  761, 3285, 3285, 3285,  761, 1267, 1267, 1267, 1267,
+     3285, 3285, 1267, 1267,  767,  767,  767, 3285, 3285, 3285,
+      767, 1275, 1275, 1275, 1275, 3285, 3285, 1275, 1275,  772,
+      772,  772, 3285, 3285, 3285,  772, 1281, 1281, 1281, 1281,
+     3285, 3285, 1281, 1281,  777,  777,  777, 3285, 3285, 3285,
+
+      777, 1293, 1293, 1293, 1293, 3285, 3285, 1293, 1293,  786,
+      786,  786, 3285, 3285, 3285,  786, 1300, 1300, 1300, 1300,
+     3285, 3285, 1300, 1300,  790,  790,  790, 3285, 3285, 3285,
+      790, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311,  796,
+      796,  796, 3285, 3285, 3285,  796, 1337, 1337, 1337, 1337,
+     3285, 3285, 1337, 1337,  814,  814,  814,  814, 3285,  814,
+     3285,  814, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353,
+      824,  824,  824, 3285, 3285, 3285,  824, 1368, 1368, 1368,
+     1368, 3285, 3285, 1368, 1368,  834,  834,  834, 3285, 3285,
+     3285,  834, 1376, 1376, 1376, 1376, 3285, 3285, 1376, 1376,
+
+      839,  839,  839, 3285, 3285, 3285,  839, 1385, 1385, 1385,
+     1385, 3285, 3285, 1385, 1385,  845,  845,  845, 3285, 3285,
+     3285,  845, 1396, 1396, 1396, 1396, 3285, 3285, 1396, 1396,
+      853,  853,  853,  853, 3285,  853, 3285,  853, 1405, 1405,
+     1405, 1405, 3285, 3285, 1405, 1405,  860,  860,  860,  860,
+     3285,  860, 3285,  860, 1417, 1417, 1417, 1417, 3285, 3285,
+     1417, 1417,  867,  867,  867, 3285, 3285, 3285,  867, 1425,
+     1425, 1425, 1425, 3285, 3285, 1425, 1425,  872,  872,  872,
+      872, 3285,  872, 3285,  872, 1433, 1433, 1433, 1433, 3285,
+     3285, 1433, 1433,  877,  877,  877,  877, 3285,  877, 3285,
+
+      877, 1443, 1443, 1443, 1443, 3285, 3285, 1443, 1443,  883,
+      883,  883, 3285, 3285, 3285,  883, 1452, 1452, 1452, 1452,
+     3285, 3285, 1452, 1452,  892,  892,  892, 3285, 3285, 3285,
+      892, 1458, 1458, 1458, 1458, 3285, 3285, 1458, 1458, 1465,
+     1465, 1465, 1465, 3285, 3285, 1465, 1465,  900,  900,  900,
+     3285, 3285, 3285,  900, 1473, 1473, 1473, 1473, 3285, 3285,
+     1473, 1473, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144,
+     1144, 1150, 3285, 1150, 3285, 3285, 1150,  675,  675,  675,
+     3285, 3285, 3285,  675, 1159, 1159, 1159, 1159, 3285, 3285,
+     1159, 1159,  702,  702,  702,  702, 3285,  702, 3285,  702,
+
+     1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194,  706,  706,
+      706,  706, 3285,  706, 3285,  706, 1204, 1204, 1204, 1204,
+     3285, 3285, 1204, 1204,  714,  714,  714, 3285, 3285, 3285,
+      714, 1220, 1220, 1220, 1220, 3285, 3285, 1220, 1220,  725,
+      725,  725, 3285, 3285, 3285,  725, 1227, 1227, 1227, 1227,
+     3285, 3285, 1227, 1227,  731,  731,  731, 3285, 3285, 3285,
+      731, 1235, 1235, 1235, 1235, 3285, 3285, 1235, 1235,  754,
+      754,  754, 3285, 3285, 3285,  754, 1258, 1258, 1258, 1258,
+     3285, 3285, 1258, 1258,  761,  761,  761, 3285, 3285, 3285,
+      761, 1267, 1267, 1267, 1267, 3285, 3285, 1267, 1267,  767,
+
+      767,  767,  767, 3285,  767, 3285,  767, 1275, 1275, 1275,
+     1275, 3285, 3285, 1275, 1275,  772,  772,  772,  772, 3285,
+      772, 3285,  772, 1281, 1281, 1281, 1281, 3285, 3285, 1281,
+     1281,  777,  777,  777, 3285, 3285, 3285,  777, 1293, 1293,
+     1293, 1293, 3285, 3285, 1293, 1293,  786,  786,  786,  786,
+     3285,  786, 3285,  786, 1300, 1300, 1300, 1300, 3285, 3285,
+     1300, 1300,  790,  790,  790,  790, 3285,  790, 3285,  790,
+     1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311,  796,  796,
+      796, 3285, 3285, 3285,  796, 1337, 1337, 1337, 1337, 3285,
+     3285, 1337, 1337,  814,  814,  814, 3285, 3285, 3285,  814,
+
+     1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353,  824,  824,
+      824, 3285, 3285, 3285,  824, 1368, 1368, 1368, 1368, 3285,
+     3285, 1368, 1368,  834,  834,  834, 3285, 3285, 3285,  834,
+     1376, 1376, 1376, 1376, 3285, 3285, 1376, 1376,  839,  839,
+      839, 3285, 3285, 3285,  839, 1385, 1385, 1385, 1385, 3285,
+     3285, 1385, 1385,  845,  845,  845, 3285, 3285, 3285,  845,
+     1396, 1396, 1396, 1396, 3285, 3285, 1396, 1396,  853,  853,
+      853, 3285, 3285, 3285,  853, 1405, 1405, 1405, 1405, 3285,
+     3285, 1405, 1405,  860,  860,  860, 3285, 3285, 3285,  860,
+     1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417,  867,  867,
+
+      867, 3285, 3285, 3285,  867, 1425, 1425, 1425, 1425, 3285,
+     3285, 1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433,
+     1433,  877,  877,  877, 3285, 3285, 3285,  877, 1443, 1443,
+     1443, 1443, 3285, 3285, 1443, 1443,  883,  883,  883, 3285,
+     3285, 3285,  883, 1452, 1452, 1452, 1452, 3285, 3285, 1452,
+     1452,  892,  892,  892, 3285, 3285, 3285,  892, 1458, 1458,
+     1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465,
+     3285, 3285, 1465, 1465,  900,  900,  900, 3285, 3285, 3285,
+      900, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473, 1144,
+     1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685, 1685,
+
+     1685, 1685, 1685, 1685, 1685, 1685, 1685,  675,  675,  675,
+     3285, 3285, 3285,  675, 1159, 1159, 1159, 1159, 3285, 3285,
+     1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194,
+      706,  706,  706, 3285, 3285, 3285,  706, 1204, 1204, 1204,
+     1204, 3285, 3285, 1204, 1204,  714,  714,  714, 3285, 3285,
+     3285,  714, 1220, 1220, 1220, 1220, 3285, 3285, 1220, 1220,
+      725,  725,  725, 3285, 3285, 3285,  725, 1227, 1227, 1227,
+     1227, 3285, 3285, 1227, 1227,  731,  731,  731, 3285, 3285,
+     3285,  731,  754,  754,  754, 3285, 3285, 3285,  754, 1258,
+     1258, 1258, 1258, 3285, 3285, 1258, 1258,  761,  761,  761,
+
+     3285, 3285, 3285,  761, 1267, 1267, 1267, 1267, 3285, 3285,
+     1267, 1267, 1275, 1275, 1275, 1275, 3285, 3285, 1275, 1275,
+      772,  772,  772, 3285, 3285, 3285,  772, 1281, 1281, 1281,
+     1281, 3285, 3285, 1281, 1281,  777,  777,  777, 3285, 3285,
+     3285,  777, 1293, 1293, 1293, 1293, 3285, 3285, 1293, 1293,
+     1300, 1300, 1300, 1300, 3285, 3285, 1300, 1300, 1311, 1311,
+     1311, 1311, 3285, 3285, 1311, 1311,  796,  796,  796, 3285,
+     3285, 3285,  796, 1337, 1337, 1337, 1337, 3285, 3285, 1337,
+     1337,  814,  814,  814,  814, 3285,  814, 3285,  814, 1353,
+     1353, 1353, 1353, 3285, 3285, 1353, 1353,  824,  824,  824,
+
+     3285, 3285, 3285,  824, 1368, 1368, 1368, 1368, 3285, 3285,
+     1368, 1368,  834,  834,  834, 3285, 3285, 3285,  834, 1376,
+     1376, 1376, 1376, 3285, 3285, 1376, 1376,  839,  839,  839,
+     3285, 3285, 3285,  839, 1385, 1385, 1385, 1385, 3285, 3285,
+     1385, 1385,  845,  845,  845, 3285, 3285, 3285,  845, 1396,
+     1396, 1396, 1396, 3285, 3285, 1396, 1396,  853,  853,  853,
+     3285, 3285, 3285,  853, 1405, 1405, 1405, 1405, 3285, 3285,
+     1405, 1405,  860,  860,  860, 3285, 3285, 3285,  860, 1417,
+     1417, 1417, 1417, 3285, 3285, 1417, 1417,  867,  867,  867,
+     3285, 3285, 3285,  867, 1425, 1425, 1425, 1425, 3285, 3285,
+
+     1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433, 1433,
+      877,  877,  877, 3285, 3285, 3285,  877, 1443, 1443, 1443,
+     1443, 3285, 3285, 1443, 1443,  883,  883,  883, 3285, 3285,
+     3285,  883, 1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452,
+      892,  892,  892,  892, 3285,  892, 3285,  892, 1458, 1458,
+     1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465,
+     3285, 3285, 1465, 1465,  900,  900,  900,  900, 3285,  900,
+     3285,  900, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473,
+     1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685,
+     1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,  675,  675,
+
+      675, 3285, 3285, 3285,  675, 1159, 1159, 1159, 1159, 3285,
+     3285, 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194,
+     1194,  706,  706,  706, 3285, 3285, 3285,  706, 1204, 1204,
+     1204, 1204, 3285, 3285, 1204, 1204,  714,  714,  714, 3285,
+     3285, 3285,  714, 1220, 1220, 1220, 1220, 3285, 3285, 1220,
+     1220,  725,  725,  725, 3285, 3285, 3285,  725, 1227, 1227,
+     1227, 1227, 3285, 3285, 1227, 1227,  731,  731,  731, 3285,
+     3285, 3285,  731,  754,  754,  754, 3285, 3285, 3285,  754,
+     1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258,  761,  761,
+      761, 3285, 3285, 3285,  761, 1267, 1267, 1267, 1267, 3285,
+
+     3285, 1267, 1267, 1275, 1275, 1275, 1275, 3285, 3285, 1275,
+     1275,  772,  772,  772,  772, 3285,  772, 3285,  772, 1281,
+     1281, 1281, 1281, 3285, 3285, 1281, 1281,  777,  777,  777,
+     3285, 3285, 3285,  777, 1293, 1293, 1293, 1293, 3285, 3285,
+     1293, 1293, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311,
+      796,  796,  796, 3285, 3285, 3285,  796, 1337, 1337, 1337,
+     1337, 3285, 3285, 1337, 1337,  814,  814,  814,  814, 3285,
+      814, 3285,  814, 1353, 1353, 1353, 1353, 3285, 3285, 1353,
+     1353,  824,  824,  824, 3285, 3285, 3285,  824, 1368, 1368,
+     1368, 1368, 3285, 3285, 1368, 1368,  834,  834,  834, 3285,
+
+     3285, 3285,  834, 1376, 1376, 1376, 1376, 3285, 3285, 1376,
+     1376,  839,  839,  839, 3285, 3285, 3285,  839, 1385, 1385,
+     1385, 1385, 3285, 3285, 1385, 1385,  845,  845,  845, 3285,
+     3285, 3285,  845, 1396, 1396, 1396, 1396, 3285, 3285, 1396,
+     1396,  853,  853,  853, 3285, 3285, 3285,  853, 1405, 1405,
+     1405, 1405, 3285, 3285, 1405, 1405,  860,  860,  860,  860,
+     3285,  860, 3285,  860, 1417, 1417, 1417, 1417, 3285, 3285,
+     1417, 1417,  867,  867,  867, 3285, 3285, 3285,  867, 1425,
+     1425, 1425, 1425, 3285, 3285, 1425, 1425, 1433, 1433, 1433,
+     1433, 3285, 3285, 1433, 1433,  877,  877,  877,  877, 3285,
+
+      877, 3285,  877, 1443, 1443, 1443, 1443, 3285, 3285, 1443,
+     1443,  883,  883,  883, 3285, 3285, 3285,  883, 1452, 1452,
+     1452, 1452, 3285, 3285, 1452, 1452, 1458, 1458, 1458, 1458,
+     3285, 3285, 1458, 1458, 1465, 1465, 1465, 1465, 3285, 3285,
+     1465, 1465, 1473, 1473, 1473, 1473, 3285, 3285, 1473, 1473,
+     1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1685,
+     1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,  675,  675,
+      675,  675, 3285,  675, 3285,  675, 1159, 1159, 1159, 1159,
+     3285, 3285, 1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285,
+     1194, 1194,  706,  706,  706, 3285, 3285, 3285,  706, 1204,
+
+     1204, 1204, 1204, 3285, 3285, 1204, 1204,  714,  714,  714,
+     3285, 3285, 3285,  714, 1220, 1220, 1220, 1220, 3285, 3285,
+     1220, 1220,  725,  725,  725,  725, 3285,  725, 3285,  725,
+     1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227,  731,  731,
+      731,  731, 3285,  731, 3285,  731,  754,  754,  754,  754,
+     3285,  754, 3285,  754, 1258, 1258, 1258, 1258, 3285, 3285,
+     1258, 1258,  761,  761,  761,  761, 3285,  761, 3285,  761,
+     1267, 1267, 1267, 1267, 3285, 3285, 1267, 1267, 1275, 1275,
+     1275, 1275, 3285, 3285, 1275, 1275, 1281, 1281, 1281, 1281,
+     3285, 3285, 1281, 1281,  777,  777,  777, 3285, 3285, 3285,
+
+      777, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311,  796,
+      796,  796, 3285, 3285, 3285,  796, 1337, 1337, 1337, 1337,
+     3285, 3285, 1337, 1337,  814,  814,  814,  814, 3285,  814,
+     3285,  814, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353,
+      824,  824,  824, 3285, 3285, 3285,  824,  834,  834,  834,
+     3285, 3285, 3285,  834, 1376, 1376, 1376, 1376, 3285, 3285,
+     1376, 1376,  839,  839,  839, 3285, 3285, 3285,  839, 1385,
+     1385, 1385, 1385, 3285, 3285, 1385, 1385,  845,  845,  845,
+     3285, 3285, 3285,  845,  853,  853,  853, 3285, 3285, 3285,
+      853, 1405, 1405, 1405, 1405, 3285, 3285, 1405, 1405,  860,
+
+      860,  860, 3285, 3285, 3285,  860, 1417, 1417, 1417, 1417,
+     3285, 3285, 1417, 1417,  867,  867,  867, 3285, 3285, 3285,
+      867, 1425, 1425, 1425, 1425, 3285, 3285, 1425, 1425, 1433,
+     1433, 1433, 1433, 3285, 3285, 1433, 1433, 1443, 1443, 1443,
+     1443, 3285, 3285, 1443, 1443,  883,  883,  883, 3285, 3285,
+     3285,  883, 1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452,
+     1458, 1458, 1458, 1458, 3285, 3285, 1458, 1458, 1465, 1465,
+     1465, 1465, 3285, 3285, 1465, 1465, 1144, 1144, 1144, 1144,
+     1144, 1144, 1144, 1144, 1144, 1685, 1685, 1685, 1685, 1685,
+     1685, 1685, 1685, 1685, 1159, 1159, 1159, 1159, 3285, 3285,
+
+     1159, 1159, 1194, 1194, 1194, 1194, 3285, 3285, 1194, 1194,
+      706,  706,  706, 3285, 3285, 3285,  706,  714,  714,  714,
+     3285, 3285, 3285,  714, 1220, 1220, 1220, 1220, 3285, 3285,
+     1220, 1220, 1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227,
+     1258, 1258, 1258, 1258, 3285, 3285, 1258, 1258, 1267, 1267,
+     1267, 1267, 3285, 3285, 1267, 1267, 1281, 1281, 1281, 1281,
+     3285, 3285, 1281, 1281,  777,  777,  777, 3285, 3285, 3285,
+      777, 1311, 1311, 1311, 1311, 3285, 3285, 1311, 1311,  796,
+      796,  796, 3285, 3285, 3285,  796, 1337, 1337, 1337, 1337,
+     3285, 3285, 1337, 1337, 1353, 1353, 1353, 1353, 3285, 3285,
+
+     1353, 1353,  824,  824,  824, 3285, 3285, 3285,  824,  834,
+      834,  834, 3285, 3285, 3285,  834, 1376, 1376, 1376, 1376,
+     3285, 3285, 1376, 1376,  839,  839,  839, 3285, 3285, 3285,
+      839, 1385, 1385, 1385, 1385, 3285, 3285, 1385, 1385,  845,
+      845,  845, 3285, 3285, 3285,  845,  853,  853,  853, 3285,
+     3285, 3285,  853,  860,  860,  860, 3285, 3285, 3285,  860,
+     1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417,  867,  867,
+      867, 3285, 3285, 3285,  867, 1425, 1425, 1425, 1425, 3285,
+     3285, 1425, 1425, 1433, 1433, 1433, 1433, 3285, 3285, 1433,
+     1433, 1443, 1443, 1443, 1443, 3285, 3285, 1443, 1443,  883,
+
+      883,  883,  883, 3285,  883, 3285,  883, 1452, 1452, 1452,
+     1452, 3285, 3285, 1452, 1452, 1458, 1458, 1458, 1458, 3285,
+     3285, 1458, 1458, 1465, 1465, 1465, 1465, 3285, 3285, 1465,
+     1465, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144,
+     1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1159,
+     1159, 1159, 1159, 3285, 3285, 1159, 1159, 1194, 1194, 1194,
+     1194, 3285, 3285, 1194, 1194,  706,  706,  706, 3285, 3285,
+     3285,  706,  714,  714,  714,  714, 3285,  714, 3285,  714,
+     1227, 1227, 1227, 1227, 3285, 3285, 1227, 1227, 1258, 1258,
+     1258, 1258, 3285, 3285, 1258, 1258, 1267, 1267, 1267, 1267,
+
+     3285, 3285, 1267, 1267, 1281, 1281, 1281, 1281, 3285, 3285,
+     1281, 1281,  777,  777,  777, 3285, 3285, 3285,  777, 1311,
+     1311, 1311, 1311, 3285, 3285, 1311, 1311,  796,  796,  796,
+     3285, 3285, 3285,  796, 1337, 1337, 1337, 1337, 3285, 3285,
+     1337, 1337, 1353, 1353, 1353, 1353, 3285, 3285, 1353, 1353,
+      824,  824,  824, 3285, 3285, 3285,  824,  834,  834,  834,
+     3285, 3285, 3285,  834,  839,  839,  839,  839, 3285,  839,
+     3285,  839, 1385, 1385, 1385, 1385, 3285, 3285, 1385, 1385,
+      845,  845,  845,  845, 3285,  845, 3285,  845,  853,  853,
+      853, 3285, 3285, 3285,  853,  860,  860,  860, 3285, 3285,
+
+     3285,  860, 1417, 1417, 1417, 1417, 3285, 3285, 1417, 1417,
+      867,  867,  867,  867, 3285,  867, 3285,  867, 1425, 1425,
+     1425, 1425, 3285, 3285, 1425, 1425, 1433, 1433, 1433, 1433,
+     3285, 3285, 1433, 1433, 1443, 1443, 1443, 1443, 3285, 3285,
+     1443, 1443,  883,  883,  883,  883, 3285,  883, 3285,  883,
+     1452, 1452, 1452, 1452, 3285, 3285, 1452, 1452, 1458, 1458,
+     1458, 1458, 3285, 3285, 1458, 1458, 1144, 1144, 1144, 1144,
+     1144, 1144, 1144, 1144, 1144, 1685, 1685, 1685, 1685, 1685,
+     1685, 1685, 1685, 1685, 1159, 1159, 1159, 1159, 3285, 3285,
+     1159, 1159,  706,  706,  706, 3285, 3285, 3285,  706,  714,
+
+      714,  714, 3285, 3285, 3285,  714, 1227, 1227, 1227, 1227,
+     3285, 3285, 1227, 1227, 1258, 1258, 1258, 1258, 3285, 3285,
+     1258, 1258, 1281, 1281, 1281, 1281, 3285, 3285, 1281, 1281,
+      777,  777,  777, 3285, 3285, 3285,  777, 1311, 1311, 1311,
+     1311, 3285, 3285, 1311, 1311,  796,  796,  796, 3285, 3285,
+     3285,  796, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913,
+     2913, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914,
+     2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2972,
+     2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 3008, 3008,
+     3008, 3008, 3008, 3008, 3008, 3008, 3008, 3010, 3010, 3010,
+
+     3010, 3010, 3010, 3010, 3010, 3010,  259, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285
     } ;
 
-static yyconst flex_int16_t yy_chk[12117] =
+static yyconst flex_int16_t yy_chk[12182] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
         6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
-        4,   10, 1516,    5,    0,    9,    6,    0,   10,    7,
-        8,    8,    8,  258,   11,   13,   13,   12,   14,   14,
-       13,   13,  307,   14,   14,  259,    8,   17,   17,  258,
-       13,   15,   15,   14,   15,  262,   15,   16,   16,  361,
-       16,  259,   16,   18,   18, 1518,   15,   19,   19,   19,
-      536,  262,   16,   20,   20,   20,   23,   23,   23,   24,
-       24,   24,  536,   19,   25,   25,   25,  361, 1527,   20,
-      368,   17,   23, 1065,  307,   24,  256,  256,  256, 1065,
-
-       25,  257,  257,  257,  261,  261,  261,   18,   21,   21,
+        4,   10,    0,    5,    0,    9,    6,    0,   10,    7,
+        8,    8,    8,  264,   11,   13,   13,   12,   14,   14,
+       13,   13,  313,   14,   14,  265,    8,   17,   17,  264,
+       13,   15,   15,   14,   15,  268,   15,   16,   16,  367,
+       16,  265,   16,   18,   18, 1531,   15,   19,   19,   19,
+      543,  268,   16,   20,   20,   20,   23,   23,   23,   24,
+       24,   24,  543,   19,   25,   25,   25,  367, 1534,   20,
+      374,   17,   23, 1070,  313,   24,  262,  262,  262, 1070,
+
+       25,  263,  263,  263,  267,  267,  267,   18,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,  291,   21,   21,   21,   21,   21,   26,
-       26,   26,   27,   27,   27,   28,   28,   28,  291,   29,
-       29,   29,   30,   30,   30,   26,  368,  467,   27,  285,
-      467,   28,  673,   21,   21,   29,  301,  280,   30,   31,
-       31,   31,  282,  282,  282,  285,  289,  289,  289,  298,
-      298,  298,  301,  280,  357,   31,  673,   21,   22,   22,
+       21,   21,   21,  297,   21,   21,   21,   21,   21,   26,
+       26,   26,   27,   27,   27,   28,   28,   28,  297,   29,
+       29,   29,   30,   30,   30,   26,  374,  473,   27,  291,
+      473,   28,  680,   21,   21,   29,  307,  286,   30,   31,
+       31,   31,  288,  288,  288,  291,  295,  295,  295,  304,
+      304,  304,  307,  286,  363,   31,  680,   21,   22,   22,
        22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22, 1530,   22,   22,   22,   22,   22,   32,
+       22,   22,   22, 1536,   22,   22,   22,   22,   22,   32,
 
-       32,   32,   33,   33,   33,   34,   34,   34,  272,   35,
-       35,   35,   36,   36,   36,   32,  280,  360,   33,  482,
-      729,   34,  482,   22,   22,   35,  357,  360,   36,   37,
+       32,   32,   33,   33,   33,   34,   34,   34,  278,   35,
+       35,   35,   36,   36,   36,   32,  286,  366,   33,  489,
+      736,   34,  489,   22,   22,   35,  363,  366,   36,   37,
        37,   37,   38,   38,   38,   39,   39,   39,   40,   40,
-       40,   41,   41,   41,  729,   37,  548,   22,   38,  312,
-      272,   39,  463,  548,   40,  360,  272,   41,   42,   42,
-       42,  272,  305,  305,  305,  312,  272,  309,  309,  309,
-      320,  320,  320,  463,   42,   43,   43,   43,   43,   43,
+       40,   41,   41,   41,  736,   37,  555,   22,   38,  318,
+      278,   39,  469,  555,   40,  366,  278,   41,   42,   42,
+       42,  278,  311,  311,  311,  318,  278,  315,  315,  315,
+      326,  326,  326,  469,   42,   43,   43,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-      329,   43,   43,   43,   43,   43,   45,   45,   45,   46,
+      335,   43,   43,   43,   43,   43,   45,   45,   45,   46,
 
-       46,   46,   47,   47,   47,  329,   48,   48,   48,   49,
-       49,   49,   45,  427,  553,   46, 1532,  427,   47,  327,
-       43,   43,   48,  327,  381,   49,  293,  327,   43,   44,
+       46,   46,   47,   47,   47,  335,   48,   48,   48,   49,
+       49,   49,   45,  668,  560,   46,  668, 1541,   47,  333,
+       43,   43,   48,  333,  387,   49,  299,  333,   43,   44,
        44,   44,   44,   44,   44,   44,   44,   44,   44,   44,
-       44,   44,   44,   44,  323,   44,   44,   44,   44,   44,
-       50,   50,   50,   51,   51,   51,   52,   52,   52,  468,
-      323,  566,   55,   55,  562,  293,   50,   55,  294,   51,
-      553,  562,   52,  468,   44,   44,  381,   55,  293,  382,
-      293, 1537,   44,   53,   53,   53,   53,   53,   53,   53,
-       53,   53,   53,   53,   53,   53,   53,   53, 1540,   53,
-
-       53,   53,   53,   53, 1541,  337,   55,  294,   59,   59,
-       59,   60,   60,   60,   63,   63,   63,  566,   56,   56,
-      294,  337,  294,   56,   59,  317,  466,   60,   53,   53,
-       63,  382,  317,   56,  466,  661,   53,  394,  661,   53,
-      466,  317,  331,  331,  331, 1542,   53,   54,   54,   54,
+       44,   44,   44,   44,  329,   44,   44,   44,   44,   44,
+       50,   50,   50,   51,   51,   51,   52,   52,   52,  474,
+      329,  573,   55,   55,  569,  299,   50,   55,  300,   51,
+      560,  569,   52,  474,   44,   44,  387,   55,  299,  388,
+      299, 1544,   44,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53, 1545,   53,
+
+       53,   53,   53,   53, 1546,  343,   55,  300,   59,   59,
+       59,   60,   60,   60,   63,   63,   63,  573,   56,   56,
+      300,  343,  300,   56,   59,  323,  472,   60,   53,   53,
+       63,  388,  323,   56,  472,  779,   53,  400,  779,   53,
+      472,  323,  337,  337,  337, 1551,   53,   54,   54,   54,
        54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
        54,   54,   56,   54,   54,   54,   54,   54,   64,   64,
-       64,   67,   67,   67,   68,   68,   68, 1547,   69,   69,
-       69,   70,   70,   70,   64,  349,  367,   67,  332,  394,
-       68,  552,   54,   54,   69,  332, 1173,   70, 1548,  552,
+       64,   67,   67,   67,   68,   68,   68, 1552,   69,   69,
+       69,   70,   70,   70,   64,  355,  373,   67,  338,  400,
+       68,  559,   54,   54,   69,  338, 1178,   70, 1553,  559,
 
-       54,  349,  367,   54,  332,  334,  334,  334,  395, 1173,
+       54,  355,  373,   54,  338,  340,  340,  340,  401, 1178,
        54,   57,   57,   57,   57,   57,   57,   57,   57,   57,
-       57,   57,   57,   57,   57,   57, 1549,   57,   57,   57,
+       57,   57,   57,   57,   57,   57, 1554,   57,   57,   57,
        57,   57,   71,   71,   71,   72,   72,   72,   73,   73,
-       73,  433,   74,   74,   74,   75,   75,   75,   71, 1550,
-      373,   72,  344,  387,   73, 1551,   57,   57,   74,  344,
-      395,   75,  343,  343,  343,   57,  373,   57,  344,  387,
-      431,   57,  346,  346,  346,  539,   57,   57,   58,   58,
+       73,  439,   74,   74,   74,   75,   75,   75,   71, 1555,
+      379,   72,  350,  393,   73, 1556,   57,   57,   74,  350,
+      401,   75,  349,  349,  349,   57,  379,   57,  350,  393,
+      437,   57,  352,  352,  352,  478,   57,   57,   58,   58,
        58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,  433,   58,   58,   58,   58,   58,   76,
+       58,   58,   58,  439,   58,   58,   58,   58,   58,   76,
 
-       76,   76,   77,   77,   77,   78,   78,   78,  617,   79,
-       79,   79,   80,   80,   80,   76,  359, 1552,   77,  431,
-      617,   78,  431,   58,   58,   79,  359,  539,   80,  354,
-      354,  354,   58,  359,   58,  370,  370,  370,   58,  380,
-      380,  380, 1553,   58,   58,   61,   61,   61,   61,   61,
+       76,   76,   77,   77,   77,   78,   78,   78,  624,   79,
+       79,   79,   80,   80,   80,   76,  365, 1557,   77,  437,
+      624,   78,  437,   58,   58,   79,  365,  478,   80,  360,
+      360,  360,   58,  365,   58,  376,  376,  376,   58,  386,
+      386,  386, 1562,   58,   58,   61,   61,   61,   61,   61,
        61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
-      365,   61,   61,   61,   61,   61,   81,   81,   81,   82,
-       82,   82,   83,   83,   83,  703,   84,   84,   84,   85,
-       85,   85,   81, 1558, 1559,   82,  652,  589,   83,  365,
-       61,   61,   84,  365,  365,   85,  602,   61,  384,  384,
-
-      384,  652,  365,   61,  365,  393,  393,  393,  397,  397,
-      397,  703,   61,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62, 1566,   62,
+      371,   61,   61,   61,   61,   61,   81,   81,   81,   82,
+       82,   82,   83,   83,   83,  710,   84,   84,   84,   85,
+       85,   85,   81, 1563, 1570,   82,  659,  596,   83,  371,
+       61,   61,   84,  371,  371,   85,  609,   61,  390,  390,
+
+      390,  659,  371,   61,  371,  399,  399,  399,  403,  403,
+      403,  710,   61,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62, 1572,   62,
        62,   62,   62,   62,   86,   86,   86,   87,   87,   87,
-       88,   88,   88,  589,   89,   89,   89,   90,   90,   90,
-       86,  400,  602,   87, 1568,  738,   88,  406,   62,   62,
-       89,  411,  422,   90,  406,   62, 1569,  400,  405,  405,
-      405,   62,  739,  406,  408,  408,  408,  411,  422,  738,
+       88,   88,   88,  596,   89,   89,   89,   90,   90,   90,
+       86,  406,  609,   87, 1573,  745,   88,  412,   62,   62,
+       89,  417,  428,   90,  412,   62, 1579,  406,  411,  411,
+      411,   62,  746,  412,  414,  414,  414,  417,  428,  745,
        62,   65,   65,   65,   65,   65,   65,   65,   65,   65,
-       65,   65,   65,   65,   65,   65,  739,   65,   65,   65,
+       65,   65,   65,   65,   65,   65,  746,   65,   65,   65,
 
        65,   65,   91,   91,   91,   92,   92,   92,   93,   93,
-       93, 1573,   94,   94,   94,   95,   95,   95,   91,  438,
-      772,   92,  417,  772,   93,  540,   65,   65,   94,  417,
-     1576,   95,  416,  416,  416,  438,  432,   65,  417,  419,
-      419,  419,  430,  430,  430, 1577,   65,   66,   66,   66,
+       93, 1580,   94,   94,   94,   95,   95,   95,   91,  444,
+     1587,   92,  423, 1589,   93,  479,   65,   65,   94,  423,
+     1590,   95,  422,  422,  422,  444,  438,   65,  423,  425,
+      425,  425,  436,  436,  436, 1596,   65,   66,   66,   66,
        66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,  740,   66,   66,   66,   66,   66,   96,   96,
-       96,   97,   97,   97,   98,   98,   98,  540,   99,   99,
-       99,  100,  100,  100,   96,  432,  740,   97,  432,  741,
-       98, 1584,   66,   66,   99,  443, 1586,  100,  101,  101,
+       66,   66,  747,   66,   66,   66,   66,   66,   96,   96,
+       96,   97,   97,   97,   98,   98,   98,  479,   99,   99,
+       99,  100,  100,  100,   96,  438,  747,   97,  438,  748,
+       98, 1597,   66,   66,   99,  449, 1599,  100,  101,  101,
 
-      101, 1587,  443,   66,  102,  102,  102,  435,  435,  435,
-      618,  443,   66,  741,  101,  442,  442,  442,  366, 1593,
+      101, 1600,  449,   66,  102,  102,  102,  441,  441,  441,
+      546,  449,   66,  748,  101,  448,  448,  448,  372, 1601,
       102,  103,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  745,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  752,  103,  103,  103,
       103,  103,  105,  105,  105,  106,  106,  106,  107,  107,
-      107,  679,  108,  108,  108,  679,  366,  448,  105,  778,
-      745,  106,  618,  778,  107,  363,  103,  103,  108,  455,
-      460,  103,  366,  448,  638,  363,  455,  103,  445,  445,
-      445,  103,  454,  454,  454,  455,  460,  103,  104,  104,
+      107,  686,  108,  108,  108,  686,  372,  454,  105,  784,
+      752,  106,  546,  784,  107,  369,  103,  103,  108,  461,
+      466,  103,  372,  454,  547,  369,  461,  103,  451,  451,
+      451,  103,  460,  460,  460,  461,  466,  103,  104,  104,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
 
-      104,  104,  104,  363,  104,  104,  104,  104,  104,  109,
-      109,  109,  110,  110,  110,  111,  111,  111,  639,  112,
-      112,  112,  457,  457,  457,  109,  638,  469,  110,  472,
-      477,  111, 1472,  104,  104,  112,  472,  492,  104,  469,
-      469,  471,  471,  471,  104,  472,  477, 1594,  104,  474,
-      474,  474, 1472,  492,  104,  113,  113,  113,  113,  113,
+      104,  104,  104,  369,  104,  104,  104,  104,  104,  109,
+      109,  109,  110,  110,  110,  111,  111,  111,  625,  112,
+      112,  112,  463,  463,  463,  109,  547,  475,  110, 1602,
+     1603,  111, 1604,  104,  104,  112,  484,  499,  104,  475,
+      475,  477,  477,  477,  104,  481,  481,  481,  104,  493,
+      493,  493,  484,  499,  104,  113,  113,  113,  113,  113,
       113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
-      639,  113,  113,  113,  113,  113,  115,  115,  115,  116,
-      116,  116,  117,  117,  117,  681,  118,  118,  118,  486,
-      486,  486,  115,  508,  519,  116,  487, 1596,  117,  681,
-
-      113,  113,  118,  487, 1597,  113,  489,  489,  489,  508,
-      519,  113,  487,  502,  502,  502,  505,  505,  505,  513,
-      513,  513,  113,  114,  114,  114,  114,  114,  114,  114,
-      114,  114,  114,  114,  114,  114,  114,  114, 1598,  114,
+      625,  113,  113,  113,  113,  113,  115,  115,  115,  116,
+      116,  116,  117,  117,  117,  681,  118,  118,  118, 1147,
+      494, 1614,  115, 1147, 1616,  116,  681,  494,  117,  681,
+
+      113,  113,  118,  510,  515,  113,  494,  496,  496,  496,
+      510,  113,  509,  509,  509,  512,  512,  512, 1476,  510,
+      515, 1617,  113,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114, 1476,  114,
       114,  114,  114,  114,  119,  119,  119,  120,  120,  120,
-      121,  121,  121,  685,  122,  122,  122, 1142,  503, 1185,
-      119, 1142,  531,  120,  514,  503,  121,  685,  114,  114,
-      122,  514, 1185,  114,  503,  516,  516,  516,  531,  114,
-      514,  525,  525,  525,  528,  528,  528,  538,  538,  538,
+      121,  121,  121,  688,  122,  122,  122,  520,  520,  520,
+      119,  526,  538,  120,  521, 1622,  121,  688,  114,  114,
+      122,  521, 1624,  114,  523,  523,  523,  526,  538,  114,
+      521,  532,  532,  532,  535,  535,  535,  545,  545,  545,
       114,  123,  123,  123,  123,  123,  123,  123,  123,  123,
 
-      123,  123,  123,  123,  123,  123, 1599,  123,  123,  123,
+      123,  123,  123,  123,  123,  123, 1626,  123,  123,  123,
       123,  123,  125,  125,  125,  126,  126,  126,  129,  129,
-      129, 1600,  130,  130,  130,  133,  133,  133,  125,  545,
-      558,  126,  526, 1601,  129,  565,  123,  123,  130,  526,
-     1611,  133,  542,  542,  542,  545,  558,  123,  526,  550,
-      550,  550,  123,  124,  124,  124,  124,  124,  124,  124,
-      124,  124,  124,  124,  124,  124,  124,  124, 1613,  124,
+      129, 1627,  130,  130,  130,  133,  133,  133,  125,  552,
+      565,  126,  533, 1629,  129,  572,  123,  123,  130,  533,
+      645,  133,  549,  549,  549,  552,  565,  123,  533,  557,
+      557,  557,  123,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124, 1630,  124,
       124,  124,  124,  124,  134,  134,  134,  135,  135,  135,
-      136,  136,  136,  565,  137,  137,  137,  138,  138,  138,
-      134,  565, 1614,  135, 1619, 1621,  136,  571,  124,  124,
+      136,  136,  136,  572,  137,  137,  137,  138,  138,  138,
+      134,  572,  645,  135, 1631, 1640,  136,  578,  124,  124,
 
-      137, 1623, 1624,  138, 1626,  551,  555,  555,  555,  124,
-      564,  564,  564,  571,  124,  127,  127,  127,  127,  127,
+      137, 1646,  646,  138, 1647,  558,  562,  562,  562,  124,
+      571,  571,  571,  578,  124,  127,  127,  127,  127,  127,
       127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
-     1627,  127,  127,  127,  127,  127,  139,  139,  139,  140,
-      140,  140,  143,  143,  143,  734,  144,  144,  144,  147,
-      147,  147,  139,  551, 1628,  140,  577,  551,  143,  734,
-      127,  127,  144,  577,  582,  147,  568,  568,  568,  576,
-      576,  576,  577,  579,  579,  579,  127,  587,  587,  587,
-      582, 1637,  127,  128,  128,  128,  128,  128,  128,  128,
-      128,  128,  128,  128,  128,  128,  128,  128, 1643,  128,
+     1651,  127,  127,  127,  127,  127,  139,  139,  139,  140,
+      140,  140,  143,  143,  143,  692,  144,  144,  144,  147,
+      147,  147,  139,  558,  646,  140,  584,  558,  143,  692,
+      127,  127,  144,  584,  589,  147,  575,  575,  575,  583,
+      583,  583,  584,  586,  586,  586,  127,  594,  594,  594,
+      589, 1653,  127,  128,  128,  128,  128,  128,  128,  128,
+      128,  128,  128,  128,  128,  128,  128,  128, 1665,  128,
 
       128,  128,  128,  128,  148,  148,  148,  151,  151,  151,
-      152,  152,  152, 1644,  155,  155,  155,  156,  156,  156,
-      148, 1648,  594,  151, 1650, 1662,  152,  607,  128,  128,
-      155,  674,  623,  156,  591,  591,  591,  588,  594,  600,
-      600,  600,  674,  607,  128,  674, 1663,  601,  623, 1668,
+      152,  152,  152, 1666,  153,  153,  153,  154,  154,  154,
+      148, 1671,  601,  151, 1674, 1675,  152,  614,  128,  128,
+      153,  691,  630,  154,  598,  598,  598,  595,  601,  607,
+      607,  607,  691,  614,  128,  691, 1676,  608,  630, 1678,
       128,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131, 1671,  131,  131,  131,
-      131,  131,  159,  159,  159,  160,  160,  160,  163,  163,
-      163, 1672,  164,  164,  164,  588,  633, 1673,  159, 1675,
-     1682,  160, 1685,  588,  163,  601,  131,  131,  164,  131,
+      131,  131,  131,  131,  131,  131, 1685,  131,  131,  131,
+      131,  131,  155,  155,  155,  156,  156,  156,  157,  157,
+      157, 1688,  158,  158,  158,  595,  640, 1691,  155, 1692,
+     1694,  156, 1695,  595,  157,  608,  131,  131,  158,  131,
 
-      644,  131,  633,  601,  604,  604,  604,  131,  615,  615,
-      615,  620,  620,  620,  131,  616,  644,  131,  132,  132,
+      651,  131,  640,  608,  611,  611,  611,  131,  622,  622,
+      622,  627,  627,  627,  131,  623,  651,  131,  132,  132,
       132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
-      132,  132,  132, 1688,  132,  132,  132,  132,  132,  167,
-      167,  167,  168,  168,  168,  171,  171,  171,  684,  172,
-      172,  172,  616, 1689, 1691,  167,  900, 1681,  168,  684,
-     1239,  171,  684,  132,  132,  172,  132,  616,  132,  627,
-      627,  627,  900, 1239,  132,  630,  630,  630,  637,  637,
-      637,  132, 1681, 1692,  132,  141,  141,  141,  141,  141,
+      132,  132,  132, 1696,  132,  132,  132,  132,  132,  161,
+      161,  161,  162,  162,  162,  165,  165,  165,  694,  166,
+      166,  166,  623, 1697, 1698,  161,  906, 1684,  162,  694,
+     1190,  165,  694,  132,  132,  166,  132,  623,  132,  634,
+      634,  634,  906, 1190,  132,  637,  637,  637,  644,  644,
+      644,  132, 1684, 1699,  132,  141,  141,  141,  141,  141,
       141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
 
-     1693,  141,  141,  141,  141,  141,  173,  173,  173,  174,
-      174,  174,  175,  175,  175,  742,  176,  176,  176,  177,
-      177,  177,  173, 1694, 1695,  174,  628,  650,  175,  742,
-      141,  141,  176,  628,  650,  177,  641,  641,  641,  649,
-      649,  649,  628,  650, 1696, 1697,  141,  142,  142,  142,
+     1700,  141,  141,  141,  141,  141,  169,  169,  169,  170,
+      170,  170,  173,  173,  173,  741,  174,  174,  174,  177,
+      177,  177,  169, 1702, 1703,  170,  635,  657,  173,  741,
+      141,  141,  174,  635,  657,  177,  648,  648,  648,  656,
+      656,  656,  635,  657, 1705, 1707,  141,  142,  142,  142,
       142,  142,  142,  142,  142,  142,  142,  142,  142,  142,
-      142,  142, 1699,  142,  142,  142,  142,  142,  178,  178,
-      178,  181,  181,  181,  182,  182,  182,  744,  183,  183,
-      183,  184,  184,  184,  178, 1700, 1702,  181,  680, 1704,
-      182,  744,  142,  142,  183,  680, 1706,  184,  651,  651,
+      142,  142, 1709,  142,  142,  142,  142,  142,  178,  178,
+      178,  179,  179,  179,  180,  180,  180,  749,  181,  181,
+      181,  182,  182,  182,  178, 1710, 1712,  179,  687, 1714,
+      180,  749,  142,  142,  181,  687, 1716,  182,  658,  658,
 
-      651,  680,  660,  660,  660, 1157, 1157, 1157,  142,  145,
+      658,  687,  667,  667,  667, 1162, 1162, 1162,  142,  145,
       145,  145,  145,  145,  145,  145,  145,  145,  145,  145,
-      145,  145,  145,  145, 1707,  145,  145,  145,  145,  145,
-      185,  185,  185,  186,  186,  186,  187,  187,  187,  687,
-      188,  188,  188,  191,  191,  191,  185, 1709, 1711,  186,
-      687,  689,  187,  687,  145,  145,  188,  691,  689,  191,
-      145,  660,  692,  693,  689,  145, 1713, 1714,  691,  692,
-      693,  691, 1165, 1165, 1165,  692,  693,  145,  146,  146,
+      145,  145,  145,  145, 1717,  145,  145,  145,  145,  145,
+      183,  183,  183,  184,  184,  184,  187,  187,  187, 1718,
+      188,  188,  188,  189,  189,  189,  183, 1719, 1720,  184,
+      696, 1722,  187,  698,  145,  145,  188,  696,  751,  189,
+      145,  667,  699,  696,  698,  145, 1731,  698, 1732,  699,
+     1734, 1738,  751, 1742, 1744,  699, 1751,  145,  146,  146,
       146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
-      146,  146,  146, 1715,  146,  146,  146,  146,  146,  192,
+      146,  146,  146, 1752,  146,  146,  146,  146,  146,  190,
 
-      192,  192,  193,  193,  193,  194,  194,  194, 1716,  195,
-      195,  195,  196,  196,  196,  192, 1717, 1719,  193,  733,
-      736,  194, 1728,  146,  146,  195,  733,  736,  196,  146,
-      743, 1729,  733,  736,  146,  903,  903,  903, 1731,  903,
-     1735,  743, 1739, 1741,  743, 1748,  146,  149,  149,  149,
+      190,  190,  191,  191,  191,  192,  192,  192, 1753,  193,
+      193,  193,  194,  194,  194,  190, 1754, 1756,  191,  700,
+      740,  192, 1244,  146,  146,  193,  700,  740,  194,  146,
+      743,  750,  700,  740,  146, 1244, 1760,  743, 1170, 1170,
+     1170, 1761,  750,  743, 1762,  750,  146,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
@@ -3207,1132 +3214,1139 @@ static yyconst flex_int16_t yy_chk[12117] =
 
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  153,  153,  153,  153,  153,  153,  153,  153,  153,
-      153,  153,  153,  153,  153,  153, 1749,  153,  153,  153,
-      153,  153,  197,  197,  197,  198,  198,  198,  201,  201,
-      201, 1750,  202,  202,  202,  205,  205,  205,  197, 1035,
-     1751,  198, 1753, 1757,  201, 1758,  153,  153,  202, 1035,
-      153,  205,  915,  915,  915, 1759, 1035,  153, 1762, 1769,
-      153,  937,  937,  937,  153, 1781,  153,  153,  154,  154,
-      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
-
-      154,  154,  154, 1782,  154,  154,  154,  154,  154,  206,
-      206,  206,  207,  207,  207,  208,  208,  208, 1791,  209,
-      209,  209,  210,  210,  210,  206, 1794, 1804,  207, 1808,
-     1812,  208, 1813,  154,  154,  209,  915,  154,  210,  949,
-      949,  949, 1817,  949,  154,  937,  949,  154, 1180, 1180,
-     1180,  154, 1818,  154,  154,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-     1819,  157,  157,  157,  157,  157,  211,  211,  211,  212,
-      212,  212,  215,  215,  215, 1820,  216,  216,  216,  701,
-      701,  701,  211, 1829, 1833,  212, 1836, 1838,  215, 1840,
-
-      157,  157,  216,  157,  157,  157,  701, 1841,  957,  957,
-      957,  157,  957, 1843,  157,  957, 1844, 1845,  157, 1848,
-     1850,  157,  158,  158,  158,  158,  158,  158,  158,  158,
-      158,  158,  158,  158,  158,  158,  158, 1852,  158,  158,
-      158,  158,  158,  217,  217,  217,  218,  218,  218,  219,
-      219,  219, 1857,  220,  220,  220,  709,  709,  709,  217,
-     1863, 1867,  218, 1868, 1869,  219, 1871,  158,  158,  220,
-      158,  158,  158,  709, 1883,  972,  972,  972,  158,  972,
-     1886,  158,  972, 1887, 1888,  158, 1880, 1879,  158,  161,
-      161,  161,  161,  161,  161,  161,  161,  161,  161,  161,
-
-      161,  161,  161,  161, 1879,  161,  161,  161,  161,  161,
-      221,  221,  221,  222,  222,  222,  225,  225,  225, 1890,
-      226,  226,  226,  725,  725,  725,  221, 1891, 1880,  222,
-     1893, 1894,  225, 1895,  161,  161,  226, 1897, 1898,  161,
-      725, 1236, 1236, 1236, 1899,  161,  162,  162,  162,  162,
-      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
-      162, 1881,  162,  162,  162,  162,  162,  227,  227,  227,
-      228,  228,  228,  229,  229,  229, 1903,  230,  230,  230,
-      749,  749,  749,  227, 1905, 1889,  228, 1908, 1909,  229,
-     1910,  162,  162,  230, 1881, 1911,  162,  749, 1488, 1488,
-
-     1488, 1889,  162,  165,  165,  165,  165,  165,  165,  165,
-      165,  165,  165,  165,  165,  165,  165,  165, 1913,  165,
-      165,  165,  165,  165,  231,  231,  231,  232,  232,  232,
-      235,  235,  235, 1915,  236,  236,  236,  239,  239,  239,
-      231, 1916, 1918,  232, 1920, 1923,  235, 1924,  165,  165,
-      236, 1926,  165,  239,  976,  976,  976, 1927, 1928,  165,
-     1930, 1936,  165,  166,  166,  166,  166,  166,  166,  166,
-      166,  166,  166,  166,  166,  166,  166,  166, 1937,  166,
-      166,  166,  166,  166,  240,  240,  240,  241,  241,  241,
-      242,  242,  242, 1925,  243,  243,  243,  244,  244,  244,
-
-      240, 1925, 1939,  241, 1938, 1942,  242, 1958,  166,  166,
-      243, 1959,  166,  244,  985,  985,  985, 1966,  976,  166,
-     1938, 1967,  166,  169,  169,  169,  169,  169,  169,  169,
-      169,  169,  169,  169,  169,  169,  169,  169, 1968,  169,
-      169,  169,  169,  169,  245,  245,  245,  246,  246,  246,
-      249,  249,  249, 1929,  250,  250,  250,  756,  756,  756,
-      245, 1929, 1972,  246, 1943, 1944,  249,  358,  169,  169,
-      250, 1974,  169,  292,  756, 1980, 1981,  358,  985,  169,
-     1943, 1944,  169,  292, 1982, 1989,  364, 1990, 1991,  169,
-      170,  170,  170,  170,  170,  170,  170,  170,  170,  170,
-
-      170,  170,  170,  170,  170,  358,  170,  170,  170,  170,
-      170, 2004,  292, 2010,  364,  761,  761,  761,  292,  358,
-      773,  773,  773,  358, 2014,  292,  786,  786,  786,  292,
-      364, 2017,  761, 2019, 2022,  170,  170,  773, 2024,  170,
-      992,  992,  992,  786,  992, 2026,  170,  992, 2027,  170,
-     1489, 1489, 1489, 1491, 1491, 1491,  170,  179,  179,  179,
-      179,  179,  179,  179,  179,  179,  179,  179,  179,  179,
-      179,  179, 2028,  179,  179,  179,  179,  179,  787,  787,
-      787,  793,  793,  793,  795,  795,  795,  809,  809,  809,
-      810,  810,  810, 2031, 2033,  787, 1489, 2038,  793, 1491,
-
-     2040,  795,  179,  179,  809, 2048, 2049,  810,  179,  999,
-      999,  999, 2050,  999, 2051, 2053,  999, 1494, 1494, 1494,
-     1497, 1497, 1497,  179,  180,  180,  180,  180,  180,  180,
-      180,  180,  180,  180,  180,  180,  180,  180,  180, 2067,
-      180,  180,  180,  180,  180,  822,  822,  822,  830,  830,
-      830,  835,  835,  835,  841,  841,  841,  863,  863,  863,
-     2064, 2072,  822, 2073, 2074,  830, 2064, 2075,  835,  180,
-      180,  841, 2079, 2066,  863,  180, 1004, 1004, 1004, 2081,
-     1004, 2082, 2083, 1004, 1507, 1507, 1507, 1543, 1543, 1543,
-      180,  189,  189,  189,  189,  189,  189,  189,  189,  189,
-
-      189,  189,  189,  189,  189,  189, 2088,  189,  189,  189,
-      189,  189,  891,  891,  891,  895,  895,  895, 2065, 2066,
-      913,  913,  913,  914,  914,  914,  945,  945,  945,  891,
-     2095, 2097,  895,  946,  946,  946,  189,  189,  913, 2098,
-     2101,  914,  189, 2104,  945,  189, 1016, 1016, 1016, 2065,
-     1016,  946, 2108, 1016, 1546, 1546, 1546,  189,  190,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  190,  190,
-      190,  190,  190, 2109,  190,  190,  190,  190,  190, 2110,
-     2111,  914,  948,  948,  948, 2112, 2113,  952,  952,  952,
-      953,  953,  953,  946,  956,  956,  956, 2114, 2115,  948,
-
-      958,  958,  958,  190,  190,  952, 2116, 2117,  953,  190,
-     2122,  956,  190, 2123, 1029, 1029, 1029,  958, 1029, 2124,
-     2125, 1029, 2143, 2144,  190,  199,  199,  199,  199,  199,
-      199,  199,  199,  199,  199,  199,  199,  199,  199,  199,
-     2150,  199,  199,  199,  199,  199,  960,  960,  960,  964,
-      964,  964, 2151, 2153,  953, 2157,  965,  965,  965,  969,
-      969,  969, 2158,  960, 1544, 1544, 1544,  964, 2159, 2165,
-      199,  199, 2166, 2167,  965, 2181,  199,  969, 1698, 1698,
-     1698,  199,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200, 2185,  200,  200,
-
-      200,  200,  200,  965,  970,  970,  970,  971,  971,  971,
-     1544,  974,  974,  974,  991,  991,  991,  975,  975,  975,
-     1743, 2186,  970, 2187,  971, 2189, 1743,  200,  200,  974,
-     1743,  991, 2193,  200, 1743,  975, 2196, 2197,  200,  203,
-      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  203,  203,  203,  975,  203,  203,  203,  203,  203,
-      995,  995,  995,  996,  996,  996, 1744, 2200,  970,  998,
-      998,  998, 1744, 1001, 1001, 1001, 1744, 2201,  995, 2204,
-     1744,  996, 2211, 2213,  203,  203,  998, 1003, 1003, 1003,
-      203, 1001, 1031, 1031, 1031, 2228, 1031, 2242, 2243, 1031,
-
-     2246, 1545, 1545, 1545, 1003,  203,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204, 2253,  204,  204,  204,  204,  204, 2254, 2232,  996,
-     1002, 1002, 1002, 2259, 2261, 1006, 1006, 1006, 1007, 1007,
-     1007, 1010, 1010, 1010, 1011, 1011, 1011, 1545, 1002, 2273,
-     2148,  204,  204, 1006, 2274, 2275, 1007,  204, 2148, 1010,
-     2149, 2198, 1011, 1037, 1037, 1037, 2276, 1037, 2149, 2198,
-     1037, 2232,  204,  213,  213,  213,  213,  213,  213,  213,
-      213,  213,  213,  213,  213,  213,  213,  213, 2233,  213,
-      213,  213,  213,  213, 2277, 2278, 1002, 2279, 2280, 1007,
-
-     1015, 1015, 1015, 1020, 1020, 1020, 1028, 1028, 1028, 1011,
-     1021, 1021, 1021, 1025, 1025, 1025, 2281, 1015,  213,  213,
-     2282, 1020, 2199, 1028,  213, 2289, 2290,  213, 1021, 2291,
-     2199, 1025, 1701, 1701, 1701, 2233, 1639, 1639, 1639,  213,
-      214,  214,  214,  214,  214,  214,  214,  214,  214,  214,
-      214,  214,  214,  214,  214, 2293,  214,  214,  214,  214,
-      214, 1030, 1030, 1030, 2303, 2304, 1026, 1026, 1026, 2305,
-     2306, 1021, 1032, 1032, 1032, 1033, 1033, 1033, 1030, 1036,
-     1036, 1036, 1639, 2307, 1026,  214,  214, 1039, 1039, 1039,
-     1032,  214, 2308, 1033,  214, 2309, 1036, 2312, 1040, 1040,
-
-     1040, 2313, 1040, 2314, 1039, 1040,  214,  223,  223,  223,
-      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
-      223,  223, 2320,  223,  223,  223,  223,  223, 1026, 1041,
-     1041, 1041, 1051, 1051, 1051, 2321, 1033, 1052, 1052, 1052,
-     1053, 1053, 1053, 1062, 1062, 1062, 1041, 1054, 1054, 1054,
-     1051, 1054,  223,  223, 1054, 1052, 2327, 1053, 2328, 2329,
-      223, 1062,  223, 2330, 2344,  223, 1703, 1703, 1703,  223,
-     1705, 1705, 1705,  223,  224,  224,  224,  224,  224,  224,
-      224,  224,  224,  224,  224,  224,  224,  224,  224, 2345,
-      224,  224,  224,  224,  224, 1052, 1055, 1055, 1055, 1056,
-
-     1056, 1056, 2346, 1056, 2347, 2349, 1056, 1057, 1057, 1057,
-     1072, 1072, 1072, 1055, 1058, 1058, 1058, 2351, 2374,  224,
-      224, 1059, 1059, 1059, 1057, 2375, 2380,  224, 1072,  224,
-     2381, 1058,  224, 1708, 1708, 1708,  224, 2382, 1059, 2385,
-      224,  233,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233, 2369,  233,  233,  233,
-      233,  233, 1063, 1063, 1063, 1058, 1067, 1067, 1067, 1718,
-     1718, 1718, 2315, 1059, 1061, 1061, 1061, 1060, 1060, 1060,
-     1063, 2388, 2315, 1067, 2389, 2390,  233,  233, 1068, 1068,
-     1068, 1061, 1068, 2369, 1060, 1068, 1076, 1076, 1076, 2391,
-
-     1076, 2392, 2393, 1076, 2394, 1710, 1710, 1710, 2395, 1063,
-      233,  234,  234,  234,  234,  234,  234,  234,  234,  234,
-      234,  234,  234,  234,  234,  234, 1061,  234,  234,  234,
-      234,  234, 1060, 1069, 1069, 1069, 1075, 1075, 1075, 2396,
-     1077, 1077, 1077, 2368, 2397, 1073, 1073, 1073, 2398, 2400,
-     1069, 2401, 2403, 1075, 2404, 2405,  234,  234, 1077, 1078,
-     1078, 1078, 2406, 1073, 1081, 1081, 1081, 2408, 1081, 1710,
-     2409, 1081, 1087, 1087, 1087, 2368, 1087, 1078, 2411, 1087,
-      234,  237,  237,  237,  237,  237,  237,  237,  237,  237,
-      237,  237,  237,  237,  237,  237, 1073,  237,  237,  237,
-
-      237,  237, 1080, 1080, 1080, 1083, 1083, 1083, 1086, 1086,
-     1086, 2412, 1084, 1084, 1084, 1091, 1091, 1091, 2414, 1080,
-     1078, 2419, 2402, 1083, 2420, 1086,  237,  237, 2421, 2423,
-     1084, 2402, 2428, 1091, 1712, 1712, 1712,  237,  238,  238,
-      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
-      238,  238,  238, 2429,  238,  238,  238,  238,  238, 1084,
-     2430, 1092, 1092, 1092, 1093, 1093, 1093, 2431, 1094, 1094,
-     1094, 1095, 1095, 1095, 1096, 1096, 1096, 2407, 2432, 1092,
-     1712, 1093, 2435,  238,  238, 1094, 2407, 2441, 1095, 1752,
-     1752, 1752, 1096, 2442,  238,  247,  247,  247,  247,  247,
-
-      247,  247,  247,  247,  247,  247,  247,  247,  247,  247,
-     2444,  247,  247,  247,  247,  247, 1092, 2453, 2455, 1097,
-     1097, 1097, 1099, 1099, 1099, 1754, 1754, 1754, 2458, 2460,
-     1095, 1101, 1101, 1101, 1103, 1103, 1103, 1097, 2484, 1099,
-      247,  247, 1100, 1100, 1100, 1102, 1102, 1102, 1101, 2480,
-     2479,  247, 1103, 1107, 1107, 1107, 2485, 1107, 2487, 1100,
-     1107, 2488, 1102, 2481,  247,  248,  248,  248,  248,  248,
-      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,
-     1097,  248,  248,  248,  248,  248, 2480, 1104, 1104, 1104,
-     2479, 2489, 1100, 2494, 2495, 1106, 1106, 1106, 1108, 1108,
-
-     1108, 1109, 1109, 1109, 1102, 1104, 2481, 1100, 2496, 2497,
-      248,  248, 1106, 1110, 1110, 1110, 1108, 2498, 2499, 1109,
-     2500,  248, 2501, 2502, 1104, 2503, 1111, 1111, 1111, 2504,
-     1110, 1112, 1112, 1112,  248,  290, 1113, 1113, 1113, 1117,
-     1117, 1117,  290, 1111, 1114, 1114, 1114, 2506, 2507, 1112,
-     2508,  290,  290, 2509, 1113, 2510, 1109, 1117, 1115, 1115,
-     1115, 1114, 1755, 1755, 1755, 1116, 1116, 1116, 2511, 2512,
-     1118, 1118, 1118, 2513, 2514, 1115, 1130, 1130, 1130,  290,
-      290,  290, 1116, 2515, 2516,  290,  290,  290, 1118, 2517,
-      290,  290, 2518, 1130,  290, 2519,  290,  290,  290,  355,
-
-     1124, 1124, 1124, 1125, 1125, 1125,  355, 1113, 1115, 1128,
-     1128, 1128, 1129, 1129, 1129,  355,  355, 2521, 1124, 2492,
-     2525, 1125, 2532, 1115, 1131, 1131, 1131, 1128, 1131, 2492,
-     1129, 1131, 2492, 2533, 1132, 1132, 1132, 2534, 1133, 1133,
-     1133, 1118, 2536,  355,  355,  355, 1134, 1134, 1134,  355,
-      355,  355, 1132, 2540,  355,  355, 1133, 2543,  355, 2566,
-      355,  355,  355, 1134, 1135, 1135, 1135, 1125, 1135, 2566,
-     2584, 1135, 1137, 1137, 1137, 2566, 1129, 1138, 1138, 1138,
-     1153, 1153, 1153, 1154, 1154, 1154, 1156, 1156, 1156, 2582,
-     1137, 1187, 1187, 1187, 2586, 1138, 2587, 2581, 1153, 1133,
-
-     2588, 1154, 2591, 2592, 1156, 1188, 1188, 1188, 1187, 1189,
-     1189, 1189, 1191, 1191, 1191, 1192, 1192, 1192, 1193, 1193,
-     1193, 2594, 1193, 1188, 2595, 1193, 2581, 1189, 2597, 2583,
-     1191, 2582, 1192, 1156, 1196, 1196, 1196, 1198, 1198, 1198,
-     2598, 1138, 1199, 1199, 1199, 1201, 1201, 1201, 1206, 1206,
-     1206, 1196, 1203, 1203, 1203, 1198, 1203, 2599, 2600, 1203,
-     1199, 1191, 2601, 1201, 2603, 1206, 1207, 1207, 1207, 2604,
-     1207, 2583, 2593, 1207, 1208, 1208, 1208, 1209, 1209, 1209,
-     1210, 1210, 1210, 2605, 1210, 2593, 2606, 1210, 1212, 1212,
-     1212, 1208, 1201, 2609, 1209, 1196, 1214, 1214, 1214, 1215,
-
-     1215, 1215, 1217, 1217, 1217, 1212, 1219, 1219, 1219, 1221,
-     1221, 1221, 2610, 2611, 1214, 2612, 2613, 1215, 2614, 2615,
-     1217, 2596, 2616, 1219, 1222, 1222, 1222, 1221, 1224, 1224,
-     1224, 1225, 1225, 1225, 2596, 1225, 2617, 2618, 1225, 1229,
-     1229, 1229, 1222, 1230, 1230, 1230, 1224, 1232, 1232, 1232,
-     2493, 1247, 1247, 1247, 2619, 1247, 2620, 1229, 1247, 2621,
-     2493, 1230, 1217, 2493, 2623, 1232, 1251, 1251, 1251, 1252,
-     1252, 1252, 1253, 1253, 1253, 1224, 1255, 1255, 1255, 1261,
-     1261, 1261, 2633, 1251, 1257, 1257, 1257, 1252, 1257, 2634,
-     1253, 1257, 2639, 2643, 1255, 2661, 2662, 1261, 1262, 1262,
-
-     1262, 1264, 1264, 1264, 1265, 1265, 1265, 2663, 1265, 2664,
-     2665, 1265, 1268, 1268, 1268, 2666, 1262, 2678, 2681, 1264,
-     1269, 1269, 1269, 1270, 1270, 1270, 1272, 1272, 1272, 1268,
-     1273, 1273, 1273, 1274, 1274, 1274, 2670, 1255, 1269, 2676,
-     2682, 1270, 2686, 2687, 1272, 2688, 2689, 1273, 2690, 2670,
-     1274, 1275, 1275, 1275, 1276, 1276, 1276, 1278, 1278, 1278,
-     2691, 1274, 1264, 1281, 1281, 1281, 1282, 1282, 1282, 1275,
-     1282, 2675, 1276, 1282, 2676, 1278, 1288, 1288, 1288, 2692,
-     1281, 1289, 1289, 1289, 1291, 1291, 1291, 1294, 1294, 1294,
-     1295, 1295, 1295, 1272, 1288, 1296, 1296, 1296, 2693, 1289,
-
-     2695, 2696, 1291, 2697, 1294, 1299, 1299, 1299, 1295, 1298,
-     1298, 1298, 2698, 1296, 1300, 1300, 1300, 2671, 1300, 2675,
-     2699, 1300, 1299, 1278, 1303, 1303, 1303, 1298, 1303, 2700,
-     2671, 1303, 1306, 1306, 1306, 1307, 1307, 1307, 1309, 1309,
-     1309, 1314, 1314, 1314, 2701, 1314, 2702, 2704, 1314, 1291,
-     1306, 2705, 2706, 1307, 2707, 2708, 1309, 1317, 1317, 1317,
-     1318, 1318, 1318, 2709, 1318, 2710, 2711, 1318, 1321, 1321,
-     1321, 1322, 1322, 1322, 1317, 1322, 1298, 2712, 1322, 1332,
-     1332, 1332, 1333, 1333, 1333, 1321, 1335, 1335, 1335, 1336,
-     1336, 1336, 2567, 1336, 2713, 2714, 1336, 1332, 2715, 2716,
-
-     1333, 2722, 2567, 1309, 1335, 1339, 1339, 1339, 2567, 1339,
-     2726, 2727, 1339, 1342, 1342, 1342, 1343, 1343, 1343, 2735,
-     1343, 2736, 2753, 1343, 1348, 1348, 1348, 1349, 1349, 1349,
-     1342, 1351, 1351, 1351, 1356, 1356, 1356, 2754, 1356, 2755,
-     2756, 1356, 1348, 2757, 2758, 1349, 1359, 1359, 1359, 1351,
-     1360, 1360, 1360, 1335, 1360, 2761, 2762, 1360, 1363, 1363,
-     1363, 2763, 2764, 1359, 1364, 1364, 1364, 1366, 1366, 1366,
-     1368, 1368, 1368, 2748, 1368, 2765, 1363, 1368, 2773, 1351,
-     2774, 2775, 1364, 2748, 2776, 1366, 1371, 1371, 1371, 1372,
-     1372, 1372, 1374, 1374, 1374, 1376, 1376, 1376, 2749, 1376,
-
-     2777, 2778, 1376, 2779, 1371, 2780, 2783, 1372, 2749, 2765,
-     1374, 1380, 1380, 1380, 1381, 1381, 1381, 2784, 1366, 1383,
-     1383, 1383, 2786, 1385, 1385, 1385, 2751, 1385, 2787, 1380,
-     1385, 2752, 1381, 1391, 1391, 1391, 2751, 1383, 1392, 1392,
-     1392, 2752, 1394, 1394, 1394, 1395, 1395, 1395, 1396, 1396,
-     1396, 1391, 1396, 2788, 2790, 1396, 1392, 2792, 2793, 1374,
-     1394, 2794, 1395, 1397, 1397, 1397, 2797, 2798, 1383, 1398,
-     1398, 1398, 2799, 1398, 2800, 2803, 1398, 1400, 1400, 1400,
-     1397, 1401, 1401, 1401, 2810, 1403, 1403, 1403, 1405, 1405,
-     1405, 2811, 1409, 1409, 1409, 1400, 1720, 1720, 1720, 1401,
-
-     2812, 2820, 1394, 1403, 2826, 1405, 1406, 1406, 1406, 1409,
-     1406, 2827, 2828, 1406, 1410, 1410, 1410, 2829, 1410, 2830,
-     2831, 1410, 1412, 1412, 1412, 1413, 1413, 1413, 1415, 1415,
-     1415, 1417, 1417, 1417, 2832, 1417, 2833, 2834, 1417, 2835,
-     1412, 2837, 1720, 1413, 2838, 2843, 1415, 1420, 1420, 1420,
-     2844, 2845, 1403, 1421, 1421, 1421, 1423, 1423, 1423, 1424,
-     1424, 1424, 1425, 1425, 1425, 1420, 1425, 2846, 2856, 1425,
-     2857, 1421, 2847, 2858, 1423, 2859, 1424, 1426, 1426, 1426,
-     1427, 1427, 1427, 2860, 1427, 2861, 2862, 1427, 1428, 1428,
-     1428, 2863, 1415, 2867, 1426, 1429, 1429, 1429, 2868, 1431,
-
-     1431, 1431, 1432, 1432, 1432, 2869, 1428, 1433, 1433, 1433,
-     2870, 1433, 2871, 1429, 1433, 2847, 1423, 1431, 2872, 1432,
-     1436, 1436, 1436, 1437, 1437, 1437, 2874, 1437, 2875, 2877,
-     1437, 1438, 1438, 1438, 1439, 1439, 1439, 1436, 1441, 1441,
-     1441, 1443, 1443, 1443, 1447, 1447, 1447, 2878, 2879, 1438,
-     2881, 2885, 1439, 1448, 1448, 1448, 1441, 2886, 1443, 2887,
-     2890, 1431, 1447, 1450, 1450, 1450, 1453, 1453, 1453, 2895,
-     2896, 1448, 1454, 1454, 1454, 1456, 1456, 1456, 1457, 1457,
-     1457, 1450, 1457, 2897, 1453, 1457, 1460, 1460, 1460, 2898,
-     1454, 2899, 2900, 1456, 1461, 1461, 1461, 1463, 1463, 1463,
-
-     1441, 1464, 1464, 1464, 1460, 1464, 2901, 2902, 1464, 1468,
-     1468, 1468, 1461, 2903, 2904, 1463, 1469, 1469, 1469, 1471,
-     1471, 1471, 2905, 2906, 1450, 2908, 2909, 1468, 1456, 1473,
-     1473, 1473, 2910, 2911, 1469, 2918, 2921, 1471, 1480, 1480,
-     1480, 1510, 1510, 1510, 1512, 1512, 1512, 1473, 1473, 2912,
-     1513, 1513, 1513, 1538, 1538, 1538, 1480, 1463, 1510, 1511,
-     1511, 1511, 1512, 1511, 2922, 2914, 1511, 1513, 1514, 1514,
-     1514, 1538, 1514, 2915, 2925, 1514, 1517, 1517, 1517, 2914,
-     1471, 1519, 1519, 1519, 2915, 1519, 2927, 2928, 1519, 1522,
-     1522, 1522, 2930, 2931, 1517, 2912, 1523, 1523, 1523, 2934,
-
-     1523, 2935, 1512, 1523, 1480, 2936, 1522, 1524, 1524, 1524,
-     2937, 1524, 2938, 2939, 1524, 1528, 1528, 1528, 2940, 1529,
-     1529, 1529, 2941, 1529, 2942, 1517, 1529, 1531, 1531, 1531,
-     2944, 2946, 1528, 1533, 1533, 1533, 1534, 1534, 1534, 2954,
-     1534, 2956, 2944, 1534, 2958, 1531, 1535, 1535, 1535, 2960,
-     1533, 1536, 1536, 1536, 1554, 1554, 1554, 1555, 1555, 1555,
-     1556, 1556, 1556, 1535, 1556, 2968, 2970, 1556, 2974, 1536,
-     2971, 1554, 2973, 2973, 1555, 2976, 2972, 1531, 1557, 1557,
-     1557, 1560, 1560, 1560, 1561, 1561, 1561, 1562, 1562, 1562,
-     2972, 1562, 2978, 2979, 1562, 2980, 1557, 2981, 2990, 1560,
-
-     1536, 1561, 1563, 1563, 1563, 1564, 1564, 1564, 1565, 1565,
-     1565, 2971, 1565, 2990, 2996, 1565, 1567, 1567, 1567, 2945,
-     1563, 2987, 1564, 1570, 1570, 1570, 1571, 1571, 1571, 2951,
-     1571, 2945, 2952, 1571, 1567, 1572, 1572, 1572, 2998, 2987,
-     1570, 2951, 1557, 3001, 2952, 1560, 1574, 1574, 1574, 1575,
-     1575, 1575, 1572, 1578, 1578, 1578, 3003, 1579, 1579, 1579,
-     3008, 1579, 1563, 1574, 1579, 2995, 3009, 1575, 3011, 3012,
-     1578, 1580, 1580, 1580, 1581, 1581, 1581, 1567, 1582, 1582,
-     1582, 3013, 1582, 2997, 2995, 1582, 1583, 1583, 1583, 1580,
-     3015, 1581, 1574, 1585, 1585, 1585, 1588, 1588, 1588, 1589,
-
-     1589, 1589, 2997, 1589, 1583, 3016, 1589, 1590, 1590, 1590,
-     1585, 1590, 3017, 1588, 1590, 1575, 1595, 1595, 1595, 1602,
-     1602, 1602, 1603, 1603, 1603, 3018, 1603, 3020, 3022, 1603,
-     1606, 1606, 1606, 1595, 1607, 1607, 1607, 1602, 1608, 1608,
-     1608, 1609, 1609, 1609, 1610, 1610, 1610, 1606, 1612, 1612,
-     1612, 1607, 1583, 2975, 3029, 1608, 3030, 3031, 1609, 1615,
-     1615, 1615, 1610, 1615, 2975, 1612, 1615, 3032, 3033, 1618,
-     1618, 1618, 1620, 1620, 1620, 1622, 1622, 1622, 1625, 1625,
-     1625, 1629, 1629, 1629, 1602, 1608, 1618, 1630, 1630, 1630,
-     1620, 3034, 3037, 1622, 3038, 3039, 1625, 3040, 1629, 1610,
-
-     3041, 1638, 1638, 1638, 1607, 1630, 1631, 1631, 1631, 3000,
-     1631, 1609, 3042, 1631, 1634, 1634, 1634, 3043, 1634, 1638,
-     3044, 1634, 1640, 1640, 1640, 3046, 1640, 1629, 3000, 1640,
-     1645, 1645, 1645, 3048, 1645, 1625, 1620, 1645, 1649, 1649,
-     1649, 1622, 3050, 3002, 1630, 1651, 1651, 1651, 1652, 1652,
-     1652, 3051, 1652, 3052, 3060, 1652, 1649, 1655, 1655, 1655,
-     3062, 1655, 3002, 1651, 1655, 3061, 3060, 1638, 1658, 1658,
-     1658, 1659, 1659, 1659, 3063, 1659, 3064, 3061, 1659, 3065,
-     1664, 1664, 1664, 3066, 1664, 3067, 1658, 1664, 1667, 1667,
-     1667, 1669, 1669, 1669, 1670, 1670, 1670, 3071, 1670, 1649,
-
-     3072, 1670, 1651, 1674, 1674, 1674, 1667, 3073, 1669, 1676,
-     1676, 1676, 1677, 1677, 1677, 1658, 1678, 1678, 1678, 3074,
-     3075, 1674, 1679, 1679, 1679, 3076, 1676, 1680, 1680, 1680,
-     1677, 1683, 1683, 1683, 1678, 1667, 1690, 1690, 1690, 1679,
-     1721, 1721, 1721, 3077, 1721, 1680, 3078, 1721, 3081, 1683,
-     3082, 3083, 1674, 3084, 1690, 1724, 1724, 1724, 1725, 1725,
-     1725, 3079, 1725, 3085, 3086, 1725, 3087, 3088, 1678, 1730,
-     1730, 1730, 3089, 1724, 1732, 1732, 1732, 3090, 1732, 1677,
-     3091, 1732, 1683, 1740, 1740, 1740, 3079, 1730, 1690, 1680,
-     1736, 1736, 1736, 3092, 1736, 3093, 3094, 1736, 3095, 1683,
-
-     3096, 1740, 1742, 1742, 1742, 3097, 1742, 3098, 3099, 1742,
-     1745, 1745, 1745, 3100, 1746, 1746, 1746, 3106, 1746, 3107,
-     1730, 1746, 1724, 1747, 1747, 1747, 3108, 1745, 1756, 1756,
-     1756, 1760, 1760, 1760, 1761, 1761, 1761, 1763, 1763, 1763,
-     3109, 1747, 3103, 3110, 1740, 1764, 1764, 1764, 3111, 1764,
-     3112, 3113, 1764, 3114, 1763, 1765, 1765, 1765, 3115, 1765,
-     3116, 3103, 1765, 1768, 1768, 1768, 1770, 1770, 1770, 1771,
-     1771, 1771, 3117, 3118, 1747, 1772, 1772, 1772, 3119, 1772,
-     3120, 1768, 1772, 1770, 1775, 1775, 1775, 1771, 3121, 1776,
-     1776, 1776, 1756, 1776, 3122, 1760, 1776, 3123, 1761, 1780,
-
-     1780, 1780, 1775, 1779, 1779, 1779, 3125, 1783, 1783, 1783,
-     1768, 1783, 3126, 3127, 1783, 3128, 1771, 1780, 3129, 3130,
-     1779, 1786, 1786, 1786, 1787, 1787, 1787, 3124, 1787, 3131,
-     3132, 1787, 1788, 1788, 1788, 1789, 1789, 1789, 1786, 1790,
-     1790, 1790, 3133, 1790, 3134, 3135, 1790, 3124, 3136, 1788,
-     1775, 3137, 1789, 1792, 1792, 1792, 1793, 1793, 1793, 3138,
-     1795, 1795, 1795, 1780, 1795, 3139, 3140, 1795, 1798, 1798,
-     1798, 1792, 1800, 1800, 1800, 3141, 1800, 3142, 3146, 1800,
-     1803, 1803, 1803, 1805, 1805, 1805, 1798, 1806, 1806, 1806,
-     3147, 1806, 3148, 3143, 1806, 1807, 1807, 1807, 1803, 3143,
-
-     1805, 1809, 1809, 1809, 3149, 1809, 3150, 3151, 1809, 1892,
-     1892, 1892, 1807, 1814, 1814, 1814, 1815, 1815, 1815, 3153,
-     1815, 3154, 3156, 1815, 3157, 3159, 1803, 1816, 1816, 1816,
-     1814, 1821, 1821, 1821, 1822, 1822, 1822, 1823, 1823, 1823,
-     1825, 1825, 1825, 3160, 1816, 1826, 1826, 1826, 1821, 1824,
-     1824, 1824, 1822, 1824, 1823, 3163, 1824, 1825, 1827, 1827,
-     1827, 3164, 1826, 1828, 1828, 1828, 1830, 1830, 1830, 1831,
-     1831, 1831, 3165, 1831, 3166, 1827, 1831, 1832, 1832, 1832,
-     3168, 1828, 3170, 1830, 1834, 1834, 1834, 3172, 1835, 1835,
-     1835, 3174, 1835, 3162, 1832, 1835, 1837, 1837, 1837, 3176,
-
-     1822, 1834, 3177, 1826, 1839, 1839, 1839, 3162, 1842, 1842,
-     1842, 1846, 1846, 1846, 1837, 3178, 3179, 1847, 1847, 1847,
-     3180, 1847, 1839, 1828, 1847, 3181, 1842, 3182, 1846, 1849,
-     1849, 1849, 1851, 1851, 1851, 1853, 1853, 1853, 3183, 3185,
-     1854, 1854, 1854, 1855, 1855, 1855, 3187, 1849, 3189, 3190,
-     1851, 3191, 1853, 3192, 3207, 1839, 1842, 1854, 3207, 1515,
-     1855, 1856, 1856, 1856, 1858, 1858, 1858, 1859, 1859, 1859,
-     1860, 1860, 1860, 1861, 1861, 1861, 1862, 1862, 1862, 1856,
-     3208, 3209, 1858, 1851, 3208, 1859, 1509, 1860, 3193, 3209,
-     1861, 1864, 1864, 1864, 1862, 1864, 3201, 3245, 1864, 1870,
-
-     1870, 1870, 1872, 1872, 1872, 2285, 2285, 1855, 2285, 3194,
-     1858, 1873, 1873, 1873, 1508, 1873, 2285, 1870, 1873, 1872,
-     1874, 1874, 1874, 2285, 3193, 1875, 1875, 1875, 1856, 1876,
-     1876, 1876, 1859, 1877, 1877, 1877, 1506, 1877, 1874, 3245,
-     1877, 1862, 1505, 1875, 3201, 3194, 1876, 1878, 1878, 1878,
-     1870, 1884, 1884, 1884, 1885, 1885, 1885, 1896, 1896, 1896,
-     1900, 1900, 1900, 3213, 1504, 1878, 3202, 1503, 1884, 1901,
-     1901, 1901, 1885, 1902, 1902, 1902, 1904, 1904, 1904, 1874,
-     1875, 1906, 1906, 1906, 1907, 1907, 1907, 1912, 1912, 1912,
-     1914, 1914, 1914, 1917, 1917, 1917, 1919, 1919, 1919, 1921,
-
-     1921, 1921, 1922, 1922, 1922, 1931, 1931, 1931, 1914, 1931,
-     3213, 1917, 1931, 1919, 3202, 1885, 3217, 1921, 3205, 1922,
-     1934, 1934, 1934, 3283, 1935, 1935, 1935, 1940, 1940, 1940,
-     1941, 1941, 1941, 1945, 1945, 1945, 3284, 3283, 1934, 3203,
-     1914, 1935, 1946, 1946, 1946, 3206, 1946, 3284, 3204, 1946,
-     1945, 1949, 1949, 1949, 1950, 1950, 1950, 3217, 1921, 1951,
-     1951, 1951, 3205, 1952, 1952, 1952, 1934, 1952, 3219, 1949,
-     1952, 1950, 1953, 1953, 1953, 3210, 1951, 1954, 1954, 1954,
-     1955, 1955, 1955, 3210, 1956, 1956, 1956, 3203, 1956, 3206,
-     1953, 1956, 1957, 1957, 1957, 1954, 3204, 1955, 1960, 1960,
-
-     1960, 3211, 1960, 3219, 1949, 1960, 1963, 1963, 1963, 3211,
-     1957, 1964, 1964, 1964, 3214, 1964, 1502, 3218, 1964, 3215,
-     1965, 1965, 1965, 1963, 1965, 1953, 1501, 1965, 1969, 1969,
-     1969, 1971, 1971, 1971, 1973, 1973, 1973, 3212, 1500, 1957,
-     1975, 1975, 1975, 3220, 1975, 3212, 1969, 1975, 1978, 1978,
-     1978, 3216, 1973, 1979, 1979, 1979, 3215, 1979, 3218, 3227,
-     1979, 3214, 1983, 1983, 1983, 1978, 1983, 3225, 3227, 1983,
-     1986, 1986, 1986, 1987, 1987, 1987, 3221, 1987, 3220, 3223,
-     1987, 1988, 1988, 1988, 1992, 1992, 1992, 1986, 3216, 1993,
-     1993, 1993, 1973, 1993, 3222, 3239, 1993, 3226, 1988, 3225,
-
-     3224, 1992, 1994, 1994, 1994, 1995, 1995, 1995, 3265, 1995,
-     3235, 1499, 1995, 1998, 1998, 1998, 3223, 1999, 1999, 1999,
-     1994, 1999, 3221, 1498, 1999, 2000, 2000, 2000, 3239, 3226,
-     1998, 2001, 2001, 2001, 2002, 2002, 2002, 3224, 2002, 3251,
-     3222, 2002, 2000, 2003, 2003, 2003, 3228, 1496, 2001, 3265,
-     2005, 2005, 2005, 1994, 2005, 3228, 3235, 2005, 2008, 2008,
-     2008, 2003, 2009, 2009, 2009, 3229, 2009, 1495, 3251, 2009,
-     2011, 2011, 2011, 3230, 2011, 2008, 3236, 2011, 2015, 2015,
-     2015, 2018, 2018, 2018, 2020, 2020, 2020, 2021, 2021, 2021,
-     2023, 2023, 2023, 3231, 2003, 3232, 2015, 3240, 3279, 2018,
-
-     3229, 2020, 2025, 2025, 2025, 2021, 2025, 2023, 3230, 2025,
-     2029, 2029, 2029, 2032, 2032, 2032, 2034, 2034, 2034, 2035,
-     2035, 2035, 3236, 2035, 3252, 1493, 2035, 3231, 2029, 3232,
-     3240, 2032, 3233, 2034, 3234, 3237, 2023, 2036, 2036, 2036,
-     2037, 2037, 2037, 3246, 2037, 2018, 3279, 2037, 2021, 2039,
-     2039, 2039, 3238, 3252, 2036, 2041, 2041, 2041, 2042, 2042,
-     2042, 2043, 2043, 2043, 2044, 2044, 2044, 2039, 2044, 3243,
-     3237, 2044, 3244, 2041, 1492, 3233, 2042, 3234, 2043, 2045,
-     2045, 2045, 2046, 2046, 2046, 3246, 2046, 3238, 3241, 2046,
-     2047, 2047, 2047, 2052, 2052, 2052, 2045, 3241, 2054, 2054,
-
-     2054, 3242, 2054, 3266, 2041, 2054, 3243, 3247, 2047, 3244,
-     3242, 2052, 2057, 2057, 2057, 2039, 2058, 2058, 2058, 3249,
-     2059, 2059, 2059, 2042, 2059, 3250, 1490, 2059, 1487, 1486,
-     2057, 2062, 2062, 2062, 2058, 2068, 2068, 2068, 2069, 2069,
-     2069, 3253, 2069, 3259, 3266, 2069, 2070, 2070, 2070, 2062,
-     3253, 3259, 2068, 3247, 1485, 2047, 3249, 1484, 2052, 2071,
-     2071, 2071, 3250, 2057, 2070, 2076, 2076, 2076, 1483, 2058,
-     2077, 2077, 2077, 2078, 2078, 2078, 2080, 2080, 2080, 2084,
-     2084, 2084, 2085, 2085, 2085, 2086, 2086, 2086, 2087, 2087,
-     2087, 2089, 2089, 2089, 2090, 2090, 2090, 2091, 2091, 2091,
-
-     2092, 2092, 2092, 2093, 2093, 2093, 2094, 2094, 2094, 3248,
-     2070, 2096, 2096, 2096, 2099, 2099, 2099, 3254, 2102, 2102,
-     2102, 2103, 2103, 2103, 3275, 2103, 3254, 3255, 2103, 2096,
-     1482, 3267, 2099, 3275, 2087, 2102, 2105, 2105, 2105, 2106,
-     2106, 2106, 2107, 2107, 2107, 1481, 2107, 1479, 1478, 2107,
-     2118, 2118, 2118, 3256, 2105, 3248, 2106, 2119, 2119, 2119,
-     3257, 3255, 2096, 2120, 2120, 2120, 3267, 2120, 2118, 3261,
-     2120, 2121, 2121, 2121, 2119, 2126, 2126, 2126, 2127, 2127,
-     2127, 2128, 2128, 2128, 2129, 2129, 2129, 3256, 2129, 3258,
-     3262, 2129, 2130, 2130, 2130, 2131, 2131, 2131, 2128, 2118,
-
-     2132, 2132, 2132, 3260, 2132, 1477, 3257, 2132, 1476, 1467,
-     2130, 3260, 2131, 2133, 2133, 2133, 3261, 2133, 3269, 3263,
-     2133, 2136, 2136, 2136, 2127, 3264, 2137, 2137, 2137, 2139,
-     2139, 2139, 3270, 2139, 1452, 3258, 2139, 3262, 1451, 2136,
-     2142, 2142, 2142, 2130, 2137, 2145, 2145, 2145, 3280, 2145,
-     3271, 3268, 2145, 2152, 2152, 2152, 3263, 3273, 2142, 2154,
-     2154, 2154, 3264, 2154, 3269, 1446, 2154, 2163, 2163, 2163,
-     3272, 2152, 2136, 2160, 2160, 2160, 1445, 2160, 3270, 1444,
-     2160, 2164, 2164, 2164, 2163, 2164, 3268, 3271, 2164, 3273,
-     2168, 2168, 2168, 2142, 2168, 1442, 3280, 2168, 2171, 2171,
-
-     2171, 1435, 2172, 2172, 2172, 3274, 2172, 3272, 2152, 2172,
-     2175, 2175, 2175, 2176, 2176, 2176, 2171, 2176, 1434, 3277,
-     2176, 2177, 2177, 2177, 3278, 2177, 3276, 2175, 2177, 2180,
-     2180, 2180, 2182, 2182, 2182, 3276, 2182, 3274, 1416, 2182,
-     2188, 2188, 2188, 2190, 2190, 2190, 1411, 2180, 2191, 2191,
-     2191, 3277, 2191, 1408, 1407, 2191, 3278, 3281, 2188, 1404,
-     2190, 1399, 2171, 2192, 2192, 2192, 2194, 2194, 2194, 2195,
-     2195, 2195, 1390, 2195, 1389, 1388, 2195, 3282, 2202, 2202,
-     2202, 2192, 1384, 2194, 2205, 2205, 2205, 1379, 2205, 3281,
-     1375, 2205, 2212, 2212, 2212, 2180, 2202, 2208, 2208, 2208,
-
-     1367, 2208, 1362, 1361, 2208, 1355, 2214, 2214, 2214, 3282,
-     2212, 2215, 2215, 2215, 2216, 2216, 2216, 1354, 2216, 1353,
-     1352, 2216, 1347, 2192, 2214, 1346, 2219, 2219, 2219, 2215,
-     2219, 1345, 1344, 2219, 2222, 2222, 2222, 1331, 2223, 2223,
-     2223, 1330, 1329, 2212, 2224, 2224, 2224, 2215, 2225, 2225,
-     2225, 1328, 2222, 1327, 2222, 2223, 2226, 2226, 2226, 1326,
-     1325, 2224, 2227, 2227, 2227, 2225, 2229, 2229, 2229, 2230,
-     2230, 2230, 2214, 2226, 2231, 2231, 2231, 2234, 2234, 2234,
-     2227, 2235, 2235, 2235, 2229, 2235, 1324, 2230, 2235, 2238,
-     2238, 2238, 2231, 1323, 1313, 2224, 2239, 2239, 2239, 2240,
-
-     2240, 2240, 2241, 2241, 2241, 1312, 1311, 2238, 2244, 2244,
-     2244, 1310, 2225, 1293, 1292, 2226, 2245, 2245, 2245, 2247,
-     2247, 2247, 2248, 2248, 2248, 1287, 2229, 2227, 2249, 2249,
-     2249, 2250, 2250, 2250, 2251, 2251, 2251, 2252, 2252, 2252,
-     2255, 2255, 2255, 2256, 2256, 2256, 1286, 1285, 2238, 2257,
-     2257, 2257, 2258, 2258, 2258, 2260, 2260, 2260, 2263, 2263,
-     2263, 2264, 2264, 2264, 1280, 2264, 1279, 1260, 2264, 2267,
-     2267, 2267, 1256, 2260, 1250, 2263, 2268, 2268, 2268, 1246,
-     2270, 2270, 2270, 1245, 2270, 1244, 2267, 2270, 2283, 2283,
-     2283, 2284, 2284, 2284, 2268, 2284, 2286, 2286, 2284, 2286,
-
-     2287, 2287, 2287, 2288, 2288, 2288, 2283, 2286, 2292, 2292,
-     2292, 2294, 2294, 2294, 2286, 2294, 1243, 1242, 2294, 2297,
-     2297, 2297, 2298, 2298, 2298, 1241, 2298, 1240, 1238, 2298,
-     2301, 2301, 2301, 1237, 1235, 2267, 1234, 2297, 2302, 2302,
-     2302, 2310, 2310, 2310, 2311, 2311, 2311, 1233, 2301, 2283,
-     2316, 2316, 2316, 1228, 2316, 1220, 2302, 2316, 2319, 2319,
-     2319, 1218, 2311, 1213, 1211, 2297, 2322, 2322, 2322, 2323,
-     2323, 2323, 1202, 2323, 1197, 2319, 2323, 2326, 2326, 2326,
-     2331, 2331, 2331, 1186, 2322, 2333, 2333, 2333, 1184, 2302,
-     2334, 2334, 2334, 1183, 2334, 2326, 1182, 2334, 2331, 2337,
-
-     2337, 2337, 2333, 1181, 2311, 2338, 2338, 2338, 2339, 2339,
-     2339, 1179, 2339, 1178, 1177, 2339, 1176, 2337, 2342, 2342,
-     2342, 1175, 2338, 2343, 2343, 2343, 2348, 2348, 2348, 2350,
-     2350, 2350, 2353, 2353, 2353, 2342, 2352, 2352, 2352, 1174,
-     2343, 1172, 1171, 2348, 2354, 2354, 2354, 1170, 1169, 2353,
-     2337, 2338, 1168, 1167, 2352, 1166, 2355, 2355, 2355, 2357,
-     2357, 2357, 2354, 2356, 2356, 2356, 1164, 1163, 2358, 2358,
-     2358, 1162, 2358, 2342, 2355, 2358, 2357, 2348, 2359, 2359,
-     2359, 2356, 1161, 1160, 2343, 2360, 2360, 2360, 2361, 2361,
-     2361, 2362, 2362, 2362, 1159, 2359, 2363, 2363, 2363, 1158,
-
-     2356, 1152, 2360, 1151, 2354, 2361, 2364, 2364, 2364, 2362,
-     2365, 2365, 2365, 2367, 2367, 2367, 1150, 2355, 2370, 2370,
-     2370, 2372, 2372, 2372, 2364, 2371, 2371, 2371, 2365, 1147,
-     1146, 2367, 2373, 2373, 2373, 1145, 2360, 1143, 1139, 2361,
-     2376, 2376, 2376, 2371, 2377, 2377, 2377, 2378, 2378, 2378,
-     2379, 2379, 2379, 2383, 2383, 2383, 2386, 2386, 2386, 2387,
-     2387, 2387, 1136, 2387, 1127, 1126, 2387, 2399, 2399, 2399,
-     1123, 2383, 2364, 2386, 1122, 2367, 2410, 2410, 2410, 2413,
-     2413, 2413, 2415, 2415, 2415, 2399, 2416, 2416, 2416, 2418,
-     2418, 2418, 2425, 2425, 2425, 2426, 2426, 2426, 1121, 1120,
-
-     2415, 2427, 2427, 2427, 2416, 1119, 1105, 2418, 1098, 2425,
-     1090, 2433, 2433, 2433, 2434, 2434, 2434, 1089, 2434, 2427,
-     1088, 2434, 2436, 2436, 2436, 1085, 1082, 2399, 2433, 2437,
-     2437, 2437, 2439, 2439, 2439, 2443, 2443, 2443, 1079, 2436,
-     2445, 2445, 2445, 1074, 2447, 2447, 2447, 2437, 2415, 1071,
-     2439, 1070, 2443, 2448, 2448, 2448, 1066, 2445, 2427, 2446,
-     2446, 2446, 2447, 2446, 1064, 1050, 2446, 2449, 2449, 2449,
-     2448, 2449, 1049, 1048, 2449, 2450, 2450, 2450, 2451, 2451,
-     2451, 2452, 2452, 2452, 2457, 2457, 2457, 2459, 2459, 2459,
-     1047, 1046, 2450, 1045, 1044, 2451, 1043, 1042, 2452, 1038,
-
-     1034, 2457, 2461, 2461, 2461, 2463, 2463, 2463, 2464, 2464,
-     2464, 1027, 2464, 1024, 1023, 2464, 2465, 2465, 2465, 1022,
-     2461, 1019, 2463, 2466, 2466, 2466, 1018, 2450, 2467, 2467,
-     2467, 2468, 2468, 2468, 2465, 2468, 2451, 1017, 2468, 2452,
-     1014, 2466, 2471, 2471, 2471, 1013, 2467, 2472, 2472, 2472,
-     1012, 2472, 1009, 1008, 2472, 2473, 2473, 2473, 1005, 2471,
-     2474, 2474, 2474, 2475, 2475, 2475, 2477, 2477, 2477, 2478,
-     2478, 2478, 2473, 2482, 2482, 2482, 1000, 2474, 2486, 2486,
-     2486, 2475, 2490, 2490, 2490,  997,  994, 2478,  993,  990,
-     2466, 2482, 2467, 2491, 2491, 2491,  989, 2491,  988, 2490,
-
-     2491, 2505, 2505, 2505, 2520, 2520, 2520, 2522, 2522, 2522,
-     2523, 2523, 2523, 2526, 2526, 2526, 2529, 2529, 2529, 2505,
-     2530, 2530, 2530,  987, 2530, 2522,  986, 2530, 2523,  984,
-     2526,  983,  982, 2529, 2531, 2531, 2531, 2535, 2535, 2535,
-     2537, 2537, 2537,  981, 2537,  980,  979, 2537, 2541, 2541,
-     2541,  978, 2531,  977, 2535, 2542, 2542, 2542,  973, 2542,
-      968, 2505, 2542,  967,  966, 2541, 2544, 2544, 2544, 2545,
-     2545, 2545, 2546, 2546, 2546,  963, 2546,  962, 2522, 2546,
-     2547, 2547, 2547, 2544,  961,  959, 2545, 2548, 2548, 2548,
-      955, 2548,  951,  950, 2548,  947,  944, 2547, 2551, 2551,
-
-     2551, 2553, 2553, 2553,  943, 2553,  942,  941, 2553, 2556,
-     2556, 2556, 2557, 2557, 2557,  940, 2551, 2558, 2558, 2558,
-     2561, 2561, 2561, 2562, 2562, 2562, 2556, 2562,  939, 2557,
-     2562, 2563, 2563, 2563, 2558,  938,  936, 2561, 2564, 2564,
-     2564,  935, 2565, 2565, 2565,  934, 2565,  933, 2563, 2565,
-     2568, 2568, 2568,  932,  931, 2564, 2570, 2570, 2570, 2571,
-     2571, 2571,  930, 2557, 2556, 2575, 2575, 2575, 2568, 2572,
-     2572, 2572, 2558, 2572, 2570,  929, 2572, 2571,  928, 2576,
-     2576, 2576, 2575, 2576,  927,  926, 2576, 2577, 2577, 2577,
-     2578, 2578, 2578,  925, 2578,  924,  923, 2578, 2579, 2579,
-
-     2579, 2585, 2585, 2585, 2577,  922, 2589, 2589, 2589,  921,
-     2590, 2590, 2590,  920, 2590,  919, 2579, 2590,  918,  917,
-     2571,  916, 2570, 2589, 2608, 2608, 2608, 2622, 2622, 2622,
-     2624, 2624, 2624, 2625, 2625, 2625, 2626, 2626, 2626, 2627,
-     2627, 2627, 2608, 2627,  912,  911, 2627,  909, 2624,  908,
-     2625,  907,  906, 2626, 2628, 2628, 2628,  905, 2628,  901,
-      899, 2628, 2631, 2631, 2631, 2635, 2635, 2635, 2636, 2636,
-     2636,  898, 2638, 2638, 2638, 2608, 2679, 2679, 2679, 2625,
-     2631,  897, 2635,  896,  892, 2636, 2637, 2637, 2637, 2638,
-     2637,  888, 2624, 2637, 2640, 2640, 2640,  887, 2640,  884,
-
-      883, 2640, 2644, 2644, 2644, 2645, 2645, 2645,  882, 2645,
-      881,  880, 2645, 2646, 2646, 2646,  879, 2646,  878, 2644,
-     2646, 2649, 2649, 2649, 2650, 2650, 2650,  875, 2650,  874,
-      873, 2650, 2651, 2651, 2651, 2652, 2652, 2652, 2649, 2653,
-     2653, 2653,  872, 2654, 2654, 2654,  869, 2654,  868, 2651,
-     2654,  867, 2652, 2657, 2657, 2657, 2653, 2658, 2658, 2658,
-      864, 2658,  862,  859, 2658, 2659, 2659, 2659,  858,  857,
-     2657, 2660, 2660, 2660,  856, 2660,  855,  852, 2660, 2667,
-     2667, 2667, 2659, 2668, 2668, 2668,  851,  850, 2653,  849,
-     2651, 2669, 2669, 2669,  848, 2669,  845, 2667, 2669,  844,
-
-      843, 2668, 2672, 2672, 2672,  842, 2672,  840,  837, 2672,
-     2677, 2677, 2677, 2680, 2680, 2680, 2683, 2683, 2683,  836,
-     2683,  834,  831, 2683, 2694, 2694, 2694, 2677, 2677,  829,
-     2667, 2703, 2703, 2703, 2717, 2717, 2717, 2718, 2718, 2718,
-      826, 2694, 2719, 2719, 2719, 2720, 2720, 2720,  825, 2703,
-     2668, 2721, 2721, 2721,  824, 2721,  823,  821, 2721,  820,
-     2719,  819, 2720, 2723, 2723, 2723,  816, 2723,  815,  814,
-     2723, 2728, 2728, 2728, 2729, 2729, 2729,  813, 2729,  812,
-     2703, 2729, 2730, 2730, 2730,  811, 2730,  806, 2728, 2730,
-     2733, 2733, 2733, 2719, 2734, 2734, 2734,  805, 2734,  804,
-
-      803, 2734, 2737, 2737, 2737,  802, 2737, 2733,  801, 2737,
-     2740, 2740, 2740,  800, 2740,  799,  798, 2740, 2743, 2743,
-     2743, 2744, 2744, 2744, 2745, 2745, 2745,  797, 2745,  796,
-      794, 2745, 2746, 2746, 2746, 2743,  792,  791, 2744, 2747,
-     2747, 2747,  788, 2747,  785,  782, 2747,  781,  777, 2746,
-     2750, 2750, 2750,  776, 2750,  775,  774, 2750, 2759, 2759,
-     2759, 2760, 2760, 2760, 2766, 2766, 2766,  771,  768, 2743,
-     2767, 2767, 2767, 2768, 2768, 2768, 2759, 2768,  767, 2760,
-     2768, 2766, 2766, 2769, 2769, 2769,  766, 2767, 2767,  763,
-      762, 2768, 2770, 2770, 2770, 2771, 2771, 2771, 2772, 2772,
-
-     2772,  758,  757, 2746, 2781, 2781, 2781, 2782, 2782, 2782,
-      755, 2782,  752,  751, 2782, 2791, 2791, 2791, 2804, 2804,
-     2804, 2781, 2805, 2805, 2805,  750,  748, 2760, 2806, 2806,
-     2806,  737,  735, 2791, 2807, 2807, 2807,  732, 2807,  731,
-      730, 2807,  728, 2813, 2813, 2813, 2806, 2813,  727,  726,
-     2813, 2816, 2816, 2816,  722, 2816,  721,  720, 2816, 2819,
-     2819, 2819, 2821, 2821, 2821, 2822, 2822, 2822,  719, 2822,
-      716,  715, 2822, 2825, 2825, 2825, 2819,  714,  713, 2821,
-      712, 2791, 2840, 2840, 2840, 2842, 2842, 2842,  711,  710,
-     2825, 2848, 2848, 2848, 2849, 2849, 2849,  708, 2849,  705,
-
-     2840, 2849,  704, 2842, 2853, 2853, 2853,  702, 2848, 2848,
-      700,  697, 2849, 2850, 2850, 2850,  696, 2850,  690,  688,
-     2850, 2854, 2854, 2854, 2855, 2855, 2855,  686, 2864, 2864,
-     2864, 2850, 2864,  683,  682, 2864, 2842, 2851, 2851, 2851,
-     2851, 2851, 2851, 2851, 2851, 2851,  678,  677, 2851, 2873,
-     2873, 2873,  676, 2851, 2851, 2851, 2851, 2851, 2882, 2882,
-     2882, 2883, 2883, 2883, 2888, 2888, 2888, 2873, 2889, 2889,
-     2889,  675, 2889,  672,  671, 2889, 2891, 2891, 2891, 2883,
-      670, 2888, 2851, 2851, 2852, 2852, 2852, 2852, 2852, 2852,
-     2852, 2852, 2852, 2891,  669, 2852, 2893, 2893, 2893,  666,
-
-     2852, 2852, 2852, 2852, 2852, 2892, 2892, 2892,  665, 2892,
-      664,  663, 2892, 2893, 2894, 2894, 2894,  662, 2894,  656,
-      655, 2894, 2907, 2907, 2907, 2932, 2932, 2932,  653, 2852,
-     2852, 2913, 2913, 2913,  647, 2913,  646,  642, 2913,  635,
-     2907,  631,  625, 2932, 2965, 2965, 2965,  621,  613, 2913,
-     2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916,  612,
-      611, 2916, 2965,  610,  609,  605, 2916, 2916, 2916, 2916,
-     2916, 2943, 2943, 2943,  598, 2943,  597,  596, 2943, 2947,
-     2947, 2947,  592, 2947,  585,  584, 2947, 2950, 2950, 2950,
-      580, 2950,  574,  573, 2950, 2916, 2916, 2917, 2917, 2917,
-
-     2917, 2917, 2917, 2917, 2917, 2917,  569,  561, 2917, 2977,
-     2977, 2977,  560, 2917, 2917, 2917, 2917, 2917, 2992, 2992,
-     2992, 2993, 2993, 2993, 2994, 2994, 2994, 2977, 2977, 2999,
-     2999, 2999, 3010, 3010, 3010, 2992,  556,  547, 2993,  543,
-      535, 2994, 2917, 2917,  534,  533, 2999, 3014, 3014, 3014,
-     3010, 3023, 3023, 3023, 3024, 3024, 3024,  529, 3024,  523,
-      522, 3024, 3025, 3025, 3025, 3014,  521,  517, 3023, 3026,
-     3026, 3026,  511, 3026,  510,  506, 3026,  500,  499, 3025,
-     3027, 3027, 3027, 3028, 3028, 3028,  498, 3028,  497,  496,
-     3028, 3035, 3035, 3035, 3045, 3045, 3045, 3027, 3014, 3036,
-
-     3036, 3036,  495, 3036,  494,  490, 3036,  484, 3035, 3053,
-     3053, 3053, 3045, 3053,  483,  481, 3053, 3056, 3056, 3056,
-      480, 3056,  479,  475, 3056, 3059, 3059, 3059,  465, 3059,
-      464, 3045, 3059, 3068, 3068, 3068,  462, 3068,  458,  452,
-     3068, 3175, 3175, 3175, 3184, 3184, 3184,  451, 3184,  450,
-      446, 3184, 3285, 3285, 3285, 3286, 3286, 3286,  440, 3175,
-      436,  428, 3184,  426,  425,  424,  420,  414,  413,  409,
-     3285,  403,  402, 3286, 3289, 3289, 3289, 3289, 3289, 3289,
-     3289, 3289, 3289, 3290, 3290, 3290, 3290, 3290, 3290, 3290,
-     3290, 3290, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291,
-
-     3291, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292,
-     3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3294,
-     3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3295, 3295,
-     3295, 3295, 3295, 3295, 3295, 3295, 3295, 3296, 3296, 3296,
-     3296, 3296, 3296, 3296, 3296, 3296, 3297, 3297, 3297, 3297,
-     3297, 3297, 3297, 3297, 3297, 3298, 3298, 3298, 3298, 3298,
-     3298, 3298, 3298, 3298, 3299, 3299, 3299, 3299, 3299, 3299,
-     3299, 3299, 3299, 3300, 3300, 3300, 3300, 3300, 3300, 3300,
-     3300, 3300, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301,
-     3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
-
-     3303, 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3304,
-     3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3305, 3305,
-     3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306, 3306, 3306,
-     3306, 3306, 3306, 3306, 3306, 3306, 3307, 3307, 3307, 3307,
-     3307, 3307, 3307, 3307, 3307, 3308, 3308, 3308, 3308, 3308,
-     3308, 3308, 3308, 3308, 3309, 3309, 3309, 3309, 3309, 3309,
-     3309, 3309, 3309, 3310, 3310, 3310, 3310, 3310, 3310, 3310,
-     3310, 3310, 3311, 3311, 3311, 3311, 3311, 3311, 3311, 3311,
-     3311, 3312, 3312, 3312, 3312, 3312, 3312, 3312, 3312, 3312,
-     3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3314,
-
-     3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3315, 3315,
-     3315, 3315, 3315, 3315, 3315, 3315, 3315, 3316, 3316, 3316,
-     3316, 3316, 3316, 3316, 3316, 3316, 3317, 3317, 3317, 3317,
-     3317, 3317, 3317, 3317, 3317, 3318, 3318, 3318, 3318, 3318,
-     3318, 3318, 3318, 3318, 3319, 3319, 3319, 3319, 3319, 3319,
-     3319, 3319, 3319, 3320, 3320, 3320, 3320, 3320, 3320, 3320,
-     3320, 3320, 3321, 3321, 3321, 3321, 3321, 3321, 3321, 3321,
-     3321, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3324,
-     3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3325, 3325,
-
-     3325, 3325, 3325, 3325, 3325, 3325, 3325, 3326, 3326, 3326,
-     3326, 3326, 3326, 3326, 3326, 3326, 3327, 3327, 3327, 3327,
-     3327, 3327, 3327, 3327, 3327, 3328, 3328, 3328, 3328, 3328,
-     3328, 3328, 3328, 3328, 3329, 3329, 3329, 3329, 3329, 3329,
-     3329, 3329, 3329, 3330, 3330, 3330, 3330, 3330, 3330, 3330,
-     3330, 3330, 3331, 3331, 3331, 3331, 3331, 3331, 3331, 3331,
-     3331, 3332, 3332, 3332, 3332, 3332, 3332, 3332, 3332, 3332,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3334,
-     3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3335, 3335,
-     3335, 3335, 3335, 3335, 3335, 3335, 3335, 3336, 3336, 3336,
-
-     3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337, 3337, 3337,
-     3337, 3337, 3337, 3337, 3337, 3338, 3338, 3338, 3338, 3338,
-     3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339, 3339, 3339,
-     3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
-     3340, 3340, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
-     3341, 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3342,
-     3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3344,
-     3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3345, 3345,
-     3345, 3345, 3345, 3345, 3345, 3345, 3345, 3346, 3346, 3346,
-     3346, 3346, 3346, 3346, 3346, 3346, 3347, 3347, 3347, 3347,
-
-     3347, 3347, 3347, 3347, 3347, 3348, 3348, 3348, 3348, 3348,
-     3348, 3348, 3348, 3348, 3349, 3349, 3349, 3349, 3349, 3349,
-     3349, 3349, 3349, 3350, 3350, 3350,  398,  391,  390, 3350,
-     3351, 3351, 3351,  389,  385,  378, 3351, 3352, 3352, 3352,
-      377,  376,  375, 3352, 3353, 3353, 3353,  371,  362,  356,
-     3353, 3354, 3354, 3354,  352,  351,  347, 3354, 3355, 3355,
-     3355,  341,  340,  339, 3355, 3356, 3356, 3356,  335,  328,
-      326, 3356, 3357, 3357, 3357,  325,  321,  318, 3357, 3358,
-     3358, 3358,  316,  315,  314, 3358, 3359, 3359, 3359,  310,
-      306,  303, 3359, 3360, 3360, 3360,  299,  296,  295, 3360,
-
-     3361, 3361, 3361,  287,  283,  279, 3361, 3362, 3362, 3362,
-      278,  277,  271, 3362, 3363, 3363, 3363,  270,  268,  265,
-     3363, 3364, 3364, 3364,  253,    0,    0, 3364, 3365, 3365,
-     3365,    0,    0,    0, 3365, 3366, 3366, 3366,    0,    0,
-        0, 3366, 3367, 3367, 3367,    0,    0,    0, 3367, 3368,
-     3368, 3368,    0,    0,    0, 3368, 3369, 3369, 3369,    0,
-        0,    0, 3369, 3370, 3370, 3370,    0,    0,    0, 3370,
-     3371, 3371, 3371,    0,    0,    0, 3371, 3372, 3372, 3372,
-        0,    0,    0, 3372, 3373, 3373, 3373,    0,    0,    0,
-     3373, 3374, 3374, 3374,    0,    0,    0, 3374, 3375, 3375,
-
-     3375,    0,    0,    0, 3375, 3376, 3376, 3376,    0,    0,
-        0, 3376, 3377, 3377, 3377,    0,    0,    0, 3377, 3378,
-     3378, 3378, 3378, 3378, 3378, 3378,    0, 3378, 3379, 3379,
-     3379,    0,    0,    0, 3379, 3380,    0,    0,    0, 3380,
-     3381, 3381, 3381,    0,    0,    0, 3381, 3382,    0,    0,
-        0, 3382, 3383, 3383, 3383,    0,    0,    0, 3383, 3384,
-        0,    0,    0, 3384, 3385, 3385, 3385,    0,    0,    0,
-     3385, 3386,    0,    0,    0, 3386, 3387, 3387, 3387,    0,
-        0,    0, 3387, 3388,    0,    0,    0, 3388, 3389, 3389,
-     3389,    0,    0,    0, 3389, 3390,    0,    0,    0, 3390,
-
-     3391, 3391, 3391,    0,    0,    0, 3391, 3392,    0,    0,
-        0, 3392, 3393, 3393, 3393,    0,    0,    0, 3393, 3394,
-        0,    0,    0, 3394, 3395, 3395, 3395,    0,    0,    0,
-     3395, 3396,    0,    0,    0, 3396, 3397, 3397, 3397,    0,
-        0,    0, 3397, 3398,    0,    0,    0, 3398, 3399, 3399,
-     3399,    0,    0,    0, 3399, 3400,    0,    0,    0, 3400,
-     3401, 3401, 3401,    0,    0,    0, 3401, 3402,    0,    0,
-        0, 3402, 3403, 3403, 3403,    0,    0,    0, 3403, 3404,
-        0,    0,    0, 3404, 3405, 3405, 3405,    0,    0,    0,
-     3405, 3406,    0,    0,    0, 3406, 3407, 3407, 3407,    0,
-
-        0,    0, 3407, 3408,    0,    0,    0, 3408, 3409, 3409,
-     3409,    0,    0,    0, 3409, 3410,    0,    0,    0, 3410,
-     3411, 3411, 3411,    0,    0,    0, 3411, 3412,    0,    0,
-        0, 3412, 3413, 3413, 3413,    0,    0,    0, 3413, 3414,
-        0,    0,    0, 3414, 3415, 3415, 3415,    0,    0,    0,
-     3415, 3416,    0,    0,    0, 3416, 3417, 3417, 3417,    0,
-        0,    0, 3417, 3418,    0,    0,    0, 3418, 3419, 3419,
-     3419,    0,    0,    0, 3419, 3420,    0,    0,    0, 3420,
-     3421, 3421, 3421,    0,    0,    0, 3421, 3422,    0,    0,
-        0, 3422, 3423, 3423, 3423,    0,    0,    0, 3423, 3424,
-
-        0,    0,    0, 3424, 3425, 3425, 3425,    0,    0,    0,
-     3425, 3426,    0,    0,    0, 3426, 3427, 3427, 3427,    0,
-        0,    0, 3427, 3428,    0,    0,    0, 3428, 3429, 3429,
-     3429,    0,    0,    0, 3429, 3430,    0,    0,    0, 3430,
-     3431, 3431, 3431,    0,    0,    0, 3431, 3432,    0,    0,
-        0, 3432, 3433, 3433, 3433,    0,    0,    0, 3433, 3434,
-        0,    0,    0, 3434, 3435, 3435, 3435, 3435, 3435, 3435,
-     3435, 3435, 3435, 3436,    0,    0,    0,    0, 3436, 3437,
-     3437, 3437,    0,    0,    0, 3437, 3438, 3438, 3438, 3438,
-        0,    0, 3438, 3438, 3439, 3439, 3439,    0,    0,    0,
-
-     3439, 3440, 3440, 3440, 3440,    0,    0, 3440, 3440, 3441,
-     3441, 3441,    0,    0,    0, 3441, 3442, 3442, 3442, 3442,
-        0,    0, 3442, 3442, 3443, 3443, 3443,    0,    0,    0,
-     3443, 3444, 3444, 3444, 3444,    0,    0, 3444, 3444, 3445,
-     3445, 3445,    0,    0,    0, 3445, 3446, 3446, 3446, 3446,
-        0,    0, 3446, 3446, 3447, 3447, 3447,    0,    0,    0,
-     3447, 3448, 3448, 3448, 3448,    0,    0, 3448, 3448, 3449,
-     3449, 3449,    0,    0,    0, 3449, 3450, 3450, 3450, 3450,
-        0,    0, 3450, 3450, 3451, 3451, 3451,    0,    0,    0,
-     3451, 3452, 3452, 3452, 3452,    0,    0, 3452, 3452, 3453,
-
-     3453, 3453,    0,    0,    0, 3453, 3454, 3454, 3454, 3454,
-        0,    0, 3454, 3454, 3455, 3455, 3455,    0,    0,    0,
-     3455, 3456, 3456, 3456, 3456,    0,    0, 3456, 3456, 3457,
-     3457, 3457,    0,    0,    0, 3457, 3458, 3458, 3458, 3458,
-        0,    0, 3458, 3458, 3459, 3459, 3459,    0,    0,    0,
-     3459, 3460, 3460, 3460, 3460,    0,    0, 3460, 3460, 3461,
-     3461, 3461,    0,    0,    0, 3461, 3462, 3462, 3462, 3462,
-        0,    0, 3462, 3462, 3463, 3463, 3463,    0,    0,    0,
-     3463, 3464, 3464, 3464, 3464,    0,    0, 3464, 3464, 3465,
-     3465, 3465, 3465,    0, 3465,    0, 3465, 3466, 3466, 3466,
-
-     3466,    0,    0, 3466, 3466, 3467, 3467, 3467,    0,    0,
-        0, 3467, 3468, 3468, 3468, 3468,    0,    0, 3468, 3468,
-     3469, 3469, 3469,    0,    0,    0, 3469, 3470, 3470, 3470,
-     3470,    0,    0, 3470, 3470, 3471, 3471, 3471,    0,    0,
-        0, 3471, 3472, 3472, 3472, 3472,    0,    0, 3472, 3472,
-     3473, 3473, 3473,    0,    0,    0, 3473, 3474, 3474, 3474,
-     3474,    0,    0, 3474, 3474, 3475, 3475, 3475, 3475,    0,
-     3475,    0, 3475, 3476, 3476, 3476, 3476,    0,    0, 3476,
-     3476, 3477, 3477, 3477, 3477,    0, 3477,    0, 3477, 3478,
-     3478, 3478, 3478,    0,    0, 3478, 3478, 3479, 3479, 3479,
-
-        0,    0,    0, 3479, 3480, 3480, 3480, 3480,    0,    0,
-     3480, 3480, 3481, 3481, 3481, 3481,    0, 3481,    0, 3481,
-     3482, 3482, 3482, 3482,    0,    0, 3482, 3482, 3483, 3483,
-     3483, 3483,    0, 3483,    0, 3483, 3484, 3484, 3484, 3484,
-        0,    0, 3484, 3484, 3485, 3485, 3485,    0,    0,    0,
-     3485, 3486, 3486, 3486, 3486,    0,    0, 3486, 3486, 3487,
-     3487, 3487,    0,    0,    0, 3487, 3488, 3488, 3488, 3488,
-        0,    0, 3488, 3488, 3489, 3489, 3489, 3489,    0,    0,
-     3489, 3489, 3490, 3490, 3490,    0,    0,    0, 3490, 3491,
-     3491, 3491, 3491,    0,    0, 3491, 3491, 3492, 3492, 3492,
-
-     3492, 3492, 3492, 3492, 3492, 3492, 3493,    0, 3493,    0,
-        0, 3493, 3494, 3494, 3494,    0,    0,    0, 3494, 3495,
-     3495, 3495, 3495,    0,    0, 3495, 3495, 3496, 3496, 3496,
-     3496,    0, 3496,    0, 3496, 3497, 3497, 3497, 3497,    0,
-        0, 3497, 3497, 3498, 3498, 3498, 3498,    0, 3498,    0,
-     3498, 3499, 3499, 3499, 3499,    0,    0, 3499, 3499, 3500,
-     3500, 3500,    0,    0,    0, 3500, 3501, 3501, 3501, 3501,
-        0,    0, 3501, 3501, 3502, 3502, 3502,    0,    0,    0,
-     3502, 3503, 3503, 3503, 3503,    0,    0, 3503, 3503, 3504,
-     3504, 3504,    0,    0,    0, 3504, 3505, 3505, 3505, 3505,
-
-        0,    0, 3505, 3505, 3506, 3506, 3506,    0,    0,    0,
-     3506, 3507, 3507, 3507, 3507,    0,    0, 3507, 3507, 3508,
-     3508, 3508,    0,    0,    0, 3508, 3509, 3509, 3509, 3509,
-        0,    0, 3509, 3509, 3510, 3510, 3510, 3510,    0, 3510,
-        0, 3510, 3511, 3511, 3511, 3511,    0,    0, 3511, 3511,
-     3512, 3512, 3512, 3512,    0, 3512,    0, 3512, 3513, 3513,
-     3513, 3513,    0,    0, 3513, 3513, 3514, 3514, 3514,    0,
-        0,    0, 3514, 3515, 3515, 3515, 3515,    0,    0, 3515,
-     3515, 3516, 3516, 3516, 3516,    0, 3516,    0, 3516, 3517,
-     3517, 3517, 3517,    0,    0, 3517, 3517, 3518, 3518, 3518,
-
-     3518,    0, 3518,    0, 3518, 3519, 3519, 3519, 3519,    0,
-        0, 3519, 3519, 3520, 3520, 3520,    0,    0,    0, 3520,
-     3521, 3521, 3521, 3521,    0,    0, 3521, 3521, 3522, 3522,
-     3522,    0,    0,    0, 3522, 3523, 3523, 3523, 3523,    0,
-        0, 3523, 3523, 3524, 3524, 3524,    0,    0,    0, 3524,
-     3525, 3525, 3525, 3525,    0,    0, 3525, 3525, 3526, 3526,
-     3526,    0,    0,    0, 3526, 3527, 3527, 3527, 3527,    0,
-        0, 3527, 3527, 3528, 3528, 3528,    0,    0,    0, 3528,
-     3529, 3529, 3529, 3529,    0,    0, 3529, 3529, 3530, 3530,
-     3530,    0,    0,    0, 3530, 3531, 3531, 3531, 3531,    0,
-
-        0, 3531, 3531, 3532, 3532, 3532,    0,    0,    0, 3532,
-     3533, 3533, 3533, 3533,    0,    0, 3533, 3533, 3534, 3534,
-     3534,    0,    0,    0, 3534, 3535, 3535, 3535, 3535,    0,
-        0, 3535, 3535, 3536, 3536, 3536,    0,    0,    0, 3536,
-     3537, 3537, 3537, 3537,    0,    0, 3537, 3537, 3538, 3538,
-     3538, 3538,    0,    0, 3538, 3538, 3539, 3539, 3539,    0,
-        0,    0, 3539, 3540, 3540, 3540, 3540,    0,    0, 3540,
-     3540, 3541, 3541, 3541,    0,    0,    0, 3541, 3542, 3542,
-     3542, 3542,    0,    0, 3542, 3542, 3543, 3543, 3543,    0,
-        0,    0, 3543, 3544, 3544, 3544, 3544,    0,    0, 3544,
-
-     3544, 3545, 3545, 3545, 3545,    0,    0, 3545, 3545, 3546,
-     3546, 3546,    0,    0,    0, 3546, 3547, 3547, 3547, 3547,
-        0,    0, 3547, 3547, 3548, 3548, 3548, 3548, 3548, 3548,
-     3548, 3548, 3548, 3549, 3549, 3549, 3549, 3549, 3549, 3549,
-     3549, 3549, 3550, 3550, 3550,    0,    0,    0, 3550, 3551,
-     3551, 3551, 3551,    0,    0, 3551, 3551, 3552, 3552, 3552,
-     3552,    0,    0, 3552, 3552, 3553, 3553, 3553,    0,    0,
-        0, 3553, 3554, 3554, 3554, 3554,    0,    0, 3554, 3554,
-     3555, 3555, 3555,    0,    0,    0, 3555, 3556, 3556, 3556,
-     3556,    0,    0, 3556, 3556, 3557, 3557, 3557,    0,    0,
-
-        0, 3557, 3558, 3558, 3558, 3558,    0,    0, 3558, 3558,
-     3559, 3559, 3559,    0,    0,    0, 3559, 3560, 3560, 3560,
-        0,    0,    0, 3560, 3561, 3561, 3561, 3561,    0,    0,
-     3561, 3561, 3562, 3562, 3562,    0,    0,    0, 3562, 3563,
-     3563, 3563, 3563,    0,    0, 3563, 3563, 3564, 3564, 3564,
-     3564,    0,    0, 3564, 3564, 3565, 3565, 3565,    0,    0,
-        0, 3565, 3566, 3566, 3566, 3566,    0,    0, 3566, 3566,
-     3567, 3567, 3567,    0,    0,    0, 3567, 3568, 3568, 3568,
-     3568,    0,    0, 3568, 3568, 3569, 3569, 3569, 3569,    0,
-        0, 3569, 3569, 3570, 3570, 3570, 3570,    0,    0, 3570,
-
-     3570, 3571, 3571, 3571,    0,    0,    0, 3571, 3572, 3572,
-     3572, 3572,    0,    0, 3572, 3572, 3573, 3573, 3573, 3573,
-        0, 3573,    0, 3573, 3574, 3574, 3574, 3574,    0,    0,
-     3574, 3574, 3575, 3575, 3575,    0,    0,    0, 3575, 3576,
-     3576, 3576, 3576,    0,    0, 3576, 3576, 3577, 3577, 3577,
-        0,    0,    0, 3577, 3578, 3578, 3578, 3578,    0,    0,
-     3578, 3578, 3579, 3579, 3579,    0,    0,    0, 3579, 3580,
-     3580, 3580, 3580,    0,    0, 3580, 3580, 3581, 3581, 3581,
-        0,    0,    0, 3581, 3582, 3582, 3582, 3582,    0,    0,
-     3582, 3582, 3583, 3583, 3583,    0,    0,    0, 3583, 3584,
-
-     3584, 3584, 3584,    0,    0, 3584, 3584, 3585, 3585, 3585,
-        0,    0,    0, 3585, 3586, 3586, 3586, 3586,    0,    0,
-     3586, 3586, 3587, 3587, 3587,    0,    0,    0, 3587, 3588,
-     3588, 3588, 3588,    0,    0, 3588, 3588, 3589, 3589, 3589,
-     3589,    0,    0, 3589, 3589, 3590, 3590, 3590,    0,    0,
-        0, 3590, 3591, 3591, 3591, 3591,    0,    0, 3591, 3591,
-     3592, 3592, 3592,    0,    0,    0, 3592, 3593, 3593, 3593,
-     3593,    0,    0, 3593, 3593, 3594, 3594, 3594, 3594,    0,
-     3594,    0, 3594, 3595, 3595, 3595, 3595,    0,    0, 3595,
-     3595, 3596, 3596, 3596, 3596,    0,    0, 3596, 3596, 3597,
-
-     3597, 3597, 3597,    0, 3597,    0, 3597, 3598, 3598, 3598,
-     3598,    0,    0, 3598, 3598, 3599, 3599, 3599, 3599, 3599,
-     3599, 3599, 3599, 3599, 3600, 3600, 3600, 3600, 3600, 3600,
-     3600, 3600, 3600, 3601, 3601, 3601,    0,    0,    0, 3601,
-     3602, 3602, 3602, 3602,    0,    0, 3602, 3602, 3603, 3603,
-     3603, 3603,    0,    0, 3603, 3603, 3604, 3604, 3604,    0,
-        0,    0, 3604, 3605, 3605, 3605, 3605,    0,    0, 3605,
-     3605, 3606, 3606, 3606,    0,    0,    0, 3606, 3607, 3607,
-     3607, 3607,    0,    0, 3607, 3607, 3608, 3608, 3608,    0,
-        0,    0, 3608, 3609, 3609, 3609, 3609,    0,    0, 3609,
-
-     3609, 3610, 3610, 3610,    0,    0,    0, 3610, 3611, 3611,
-     3611,    0,    0,    0, 3611, 3612, 3612, 3612, 3612,    0,
-        0, 3612, 3612, 3613, 3613, 3613,    0,    0,    0, 3613,
-     3614, 3614, 3614, 3614,    0,    0, 3614, 3614, 3615, 3615,
-     3615, 3615,    0,    0, 3615, 3615, 3616, 3616, 3616, 3616,
-        0, 3616,    0, 3616, 3617, 3617, 3617, 3617,    0,    0,
-     3617, 3617, 3618, 3618, 3618,    0,    0,    0, 3618, 3619,
-     3619, 3619, 3619,    0,    0, 3619, 3619, 3620, 3620, 3620,
-     3620,    0,    0, 3620, 3620, 3621, 3621, 3621,    0,    0,
-        0, 3621, 3622, 3622, 3622, 3622,    0,    0, 3622, 3622,
-
-     3623, 3623, 3623, 3623,    0, 3623,    0, 3623, 3624, 3624,
-     3624, 3624,    0,    0, 3624, 3624, 3625, 3625, 3625,    0,
-        0,    0, 3625, 3626, 3626, 3626, 3626,    0,    0, 3626,
-     3626, 3627, 3627, 3627,    0,    0,    0, 3627, 3628, 3628,
-     3628, 3628,    0,    0, 3628, 3628, 3629, 3629, 3629,    0,
-        0,    0, 3629, 3630, 3630, 3630, 3630,    0,    0, 3630,
-     3630, 3631, 3631, 3631,    0,    0,    0, 3631, 3632, 3632,
-     3632, 3632,    0,    0, 3632, 3632, 3633, 3633, 3633,    0,
-        0,    0, 3633, 3634, 3634, 3634, 3634,    0,    0, 3634,
-     3634, 3635, 3635, 3635, 3635,    0, 3635,    0, 3635, 3636,
-
-     3636, 3636, 3636,    0,    0, 3636, 3636, 3637, 3637, 3637,
-        0,    0,    0, 3637, 3638, 3638, 3638, 3638,    0,    0,
-     3638, 3638, 3639, 3639, 3639, 3639,    0,    0, 3639, 3639,
-     3640, 3640, 3640, 3640,    0, 3640,    0, 3640, 3641, 3641,
-     3641, 3641,    0,    0, 3641, 3641, 3642, 3642, 3642,    0,
-        0,    0, 3642, 3643, 3643, 3643, 3643,    0,    0, 3643,
-     3643, 3644, 3644, 3644, 3644,    0,    0, 3644, 3644, 3645,
-     3645, 3645, 3645,    0,    0, 3645, 3645, 3646, 3646, 3646,
-     3646,    0,    0, 3646, 3646, 3647, 3647, 3647, 3647, 3647,
-     3647, 3647, 3647, 3647, 3648, 3648, 3648, 3648, 3648, 3648,
-
-     3648, 3648, 3648, 3649, 3649, 3649, 3649,    0, 3649,    0,
-     3649, 3650, 3650, 3650, 3650,    0,    0, 3650, 3650, 3651,
-     3651, 3651, 3651,    0,    0, 3651, 3651, 3652, 3652, 3652,
-        0,    0,    0, 3652, 3653, 3653, 3653, 3653,    0,    0,
-     3653, 3653, 3654, 3654, 3654,    0,    0,    0, 3654, 3655,
-     3655, 3655, 3655,    0,    0, 3655, 3655, 3656, 3656, 3656,
-     3656,    0, 3656,    0, 3656, 3657, 3657, 3657, 3657,    0,
-        0, 3657, 3657, 3658, 3658, 3658, 3658,    0, 3658,    0,
-     3658, 3659, 3659, 3659, 3659,    0, 3659,    0, 3659, 3660,
-     3660, 3660, 3660,    0,    0, 3660, 3660, 3661, 3661, 3661,
-
-     3661,    0, 3661,    0, 3661, 3662, 3662, 3662, 3662,    0,
-        0, 3662, 3662, 3663, 3663, 3663, 3663,    0,    0, 3663,
-     3663, 3664, 3664, 3664, 3664,    0,    0, 3664, 3664, 3665,
-     3665, 3665,    0,    0,    0, 3665, 3666, 3666, 3666, 3666,
-        0,    0, 3666, 3666, 3667, 3667, 3667,    0,    0,    0,
-     3667, 3668, 3668, 3668, 3668,    0,    0, 3668, 3668, 3669,
-     3669, 3669, 3669,    0, 3669,    0, 3669, 3670, 3670, 3670,
-     3670,    0,    0, 3670, 3670, 3671, 3671, 3671,    0,    0,
-        0, 3671, 3672, 3672, 3672,    0,    0,    0, 3672, 3673,
-     3673, 3673, 3673,    0,    0, 3673, 3673, 3674, 3674, 3674,
-
-        0,    0,    0, 3674, 3675, 3675, 3675, 3675,    0,    0,
-     3675, 3675, 3676, 3676, 3676,    0,    0,    0, 3676, 3677,
-     3677, 3677,    0,    0,    0, 3677, 3678, 3678, 3678, 3678,
-        0,    0, 3678, 3678, 3679, 3679, 3679,    0,    0,    0,
-     3679, 3680, 3680, 3680, 3680,    0,    0, 3680, 3680, 3681,
-     3681, 3681,    0,    0,    0, 3681, 3682, 3682, 3682, 3682,
-        0,    0, 3682, 3682, 3683, 3683, 3683, 3683,    0,    0,
-     3683, 3683, 3684, 3684, 3684, 3684,    0,    0, 3684, 3684,
-     3685, 3685, 3685,    0,    0,    0, 3685, 3686, 3686, 3686,
-     3686,    0,    0, 3686, 3686, 3687, 3687, 3687, 3687,    0,
-
-        0, 3687, 3687, 3688, 3688, 3688, 3688,    0,    0, 3688,
-     3688, 3689, 3689, 3689, 3689, 3689, 3689, 3689, 3689, 3689,
-     3690, 3690, 3690, 3690, 3690, 3690, 3690, 3690, 3690, 3691,
-     3691, 3691, 3691,    0,    0, 3691, 3691, 3692, 3692, 3692,
-     3692,    0,    0, 3692, 3692, 3693, 3693, 3693,    0,    0,
-        0, 3693, 3694, 3694, 3694,    0,    0,    0, 3694, 3695,
-     3695, 3695, 3695,    0,    0, 3695, 3695, 3696, 3696, 3696,
-     3696,    0,    0, 3696, 3696, 3697, 3697, 3697, 3697,    0,
-        0, 3697, 3697, 3698, 3698, 3698, 3698,    0,    0, 3698,
-     3698, 3699, 3699, 3699, 3699,    0,    0, 3699, 3699, 3700,
-
-     3700, 3700,    0,    0,    0, 3700, 3701, 3701, 3701, 3701,
-        0,    0, 3701, 3701, 3702, 3702, 3702,    0,    0,    0,
-     3702, 3703, 3703, 3703, 3703,    0,    0, 3703, 3703, 3704,
-     3704, 3704, 3704,    0,    0, 3704, 3704, 3705, 3705, 3705,
-        0,    0,    0, 3705, 3706, 3706, 3706,    0,    0,    0,
-     3706, 3707, 3707, 3707, 3707,    0,    0, 3707, 3707, 3708,
-     3708, 3708,    0,    0,    0, 3708, 3709, 3709, 3709, 3709,
-        0,    0, 3709, 3709, 3710, 3710, 3710,    0,    0,    0,
-     3710, 3711, 3711, 3711,    0,    0,    0, 3711, 3712, 3712,
-     3712,    0,    0,    0, 3712, 3713, 3713, 3713, 3713,    0,
-
-        0, 3713, 3713, 3714, 3714, 3714,    0,    0,    0, 3714,
-     3715, 3715, 3715, 3715,    0,    0, 3715, 3715, 3716, 3716,
-     3716, 3716,    0,    0, 3716, 3716, 3717, 3717, 3717, 3717,
-        0,    0, 3717, 3717, 3718, 3718, 3718, 3718,    0, 3718,
-        0, 3718, 3719, 3719, 3719, 3719,    0,    0, 3719, 3719,
-     3720, 3720, 3720, 3720,    0,    0, 3720, 3720, 3721, 3721,
-     3721, 3721,    0,    0, 3721, 3721, 3722, 3722, 3722, 3722,
-     3722, 3722, 3722, 3722, 3722, 3723, 3723, 3723, 3723, 3723,
-     3723, 3723, 3723, 3723, 3724, 3724, 3724, 3724,    0,    0,
-     3724, 3724, 3725, 3725, 3725, 3725,    0,    0, 3725, 3725,
-
-     3726, 3726, 3726,    0,    0,    0, 3726, 3727, 3727, 3727,
-     3727,    0, 3727,    0, 3727, 3728, 3728, 3728, 3728,    0,
-        0, 3728, 3728, 3729, 3729, 3729, 3729,    0,    0, 3729,
-     3729, 3730, 3730, 3730, 3730,    0,    0, 3730, 3730, 3731,
-     3731, 3731, 3731,    0,    0, 3731, 3731, 3732, 3732, 3732,
-        0,    0,    0, 3732, 3733, 3733, 3733, 3733,    0,    0,
-     3733, 3733, 3734, 3734, 3734,    0,    0,    0, 3734, 3735,
-     3735, 3735, 3735,    0,    0, 3735, 3735, 3736, 3736, 3736,
-     3736,    0,    0, 3736, 3736, 3737, 3737, 3737,    0,    0,
-        0, 3737, 3738, 3738, 3738,    0,    0,    0, 3738, 3739,
-
-     3739, 3739, 3739,    0, 3739,    0, 3739, 3740, 3740, 3740,
-     3740,    0,    0, 3740, 3740, 3741, 3741, 3741, 3741,    0,
-     3741,    0, 3741, 3742, 3742, 3742,    0,    0,    0, 3742,
-     3743, 3743, 3743,    0,    0,    0, 3743, 3744, 3744, 3744,
-     3744,    0,    0, 3744, 3744, 3745, 3745, 3745, 3745,    0,
-     3745,    0, 3745, 3746, 3746, 3746, 3746,    0,    0, 3746,
-     3746, 3747, 3747, 3747, 3747,    0,    0, 3747, 3747, 3748,
-     3748, 3748, 3748,    0,    0, 3748, 3748, 3749, 3749, 3749,
-     3749,    0, 3749,    0, 3749, 3750, 3750, 3750, 3750,    0,
-        0, 3750, 3750, 3751, 3751, 3751, 3751,    0,    0, 3751,
-
-     3751, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
-     3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3754,
-     3754, 3754, 3754,    0,    0, 3754, 3754, 3755, 3755, 3755,
-        0,    0,    0, 3755, 3756, 3756, 3756,    0,    0,    0,
-     3756, 3757, 3757, 3757, 3757,    0,    0, 3757, 3757, 3758,
-     3758, 3758, 3758,    0,    0, 3758, 3758, 3759, 3759, 3759,
-     3759,    0,    0, 3759, 3759, 3760, 3760, 3760,    0,    0,
-        0, 3760, 3761, 3761, 3761, 3761,    0,    0, 3761, 3761,
-     3762, 3762, 3762,    0,    0,    0, 3762, 3763, 3763, 3763,
-     3763, 3763, 3763, 3763, 3763, 3763, 3764, 3764, 3764, 3764,
-
-     3764, 3764, 3764, 3764, 3764, 3765, 3765, 3765, 3765, 3765,
-     3765, 3765, 3765, 3765, 3766, 3766, 3766, 3766, 3766, 3766,
-     3766, 3766, 3766, 3767, 3767, 3767, 3767, 3767, 3767, 3767,
-     3767, 3767, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768,
-     3768, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-
-     3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
-     3288, 3288, 3288, 3288, 3288, 3288
+      149,  159,  159,  159,  159,  159,  159,  159,  159,  159,
+      159,  159,  159,  159,  159,  159, 1765,  159,  159,  159,
+      159,  159,  197,  197,  197,  198,  198,  198,  199,  199,
+      199, 1772,  200,  200,  200,  201,  201,  201,  197, 1784,
+     1785,  198, 1793, 1796,  199, 1806,  159,  159,  200, 1810,
+      159,  201,  909,  909,  909, 1814,  909,  159, 1815, 1819,
+      159,  921,  921,  921,  159, 1820,  159,  159,  160,  160,
+      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
+
+      160,  160,  160, 1821,  160,  160,  160,  160,  160,  202,
+      202,  202,  203,  203,  203,  204,  204,  204, 1822,  207,
+      207,  207,  208,  208,  208,  202, 1831, 1835,  203, 1838,
+     1840,  204, 1842,  160,  160,  207, 1843,  160,  208,  955,
+      955,  955, 1845,  955,  160,  921,  955,  160,  943,  943,
+      943,  160, 1846,  160,  160,  163,  163,  163,  163,  163,
+      163,  163,  163,  163,  163,  163,  163,  163,  163,  163,
+     1847,  163,  163,  163,  163,  163,  211,  211,  211,  212,
+      212,  212,  213,  213,  213, 1850,  214,  214,  214,  708,
+      708,  708,  211, 1852, 1854,  212, 1859, 1865,  213, 1040,
+
+      163,  163,  214,  163,  163,  163,  708, 1869, 1870, 1040,
+     1871,  163,  943, 1873,  163, 1885, 1040, 1888,  163, 1882,
+     1881,  163,  164,  164,  164,  164,  164,  164,  164,  164,
+      164,  164,  164,  164,  164,  164,  164, 1881,  164,  164,
+      164,  164,  164,  215,  215,  215,  216,  216,  216,  217,
+      217,  217, 1889,  218,  218,  218,  716,  716,  716,  215,
+     1890, 1882,  216, 1892, 1891,  217, 1893,  164,  164,  218,
+      164,  164,  164,  716, 1895,  963,  963,  963,  164,  963,
+     1891,  164,  963, 1896, 1897,  164, 1883, 1899,  164,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+
+      167,  167,  167,  167, 1900,  167,  167,  167,  167,  167,
+      221,  221,  221,  222,  222,  222,  223,  223,  223, 1883,
+      224,  224,  224,  732,  732,  732,  221, 1901, 1905,  222,
+     1907, 1910,  223, 1911,  167,  167,  224, 1912, 1913,  167,
+      732, 1185, 1185, 1185, 1915,  167,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168, 1917,  168,  168,  168,  168,  168,  225,  225,  225,
+      226,  226,  226,  227,  227,  227, 1918,  228,  228,  228,
+      756,  756,  756,  225, 1920, 1922,  226, 1925, 1926,  227,
+     1928,  168,  168,  228, 1929, 1930,  168,  756, 1241, 1241,
+
+     1241, 1932,  168,  171,  171,  171,  171,  171,  171,  171,
+      171,  171,  171,  171,  171,  171,  171,  171, 1938,  171,
+      171,  171,  171,  171,  231,  231,  231,  232,  232,  232,
+      233,  233,  233, 1927,  234,  234,  234,  235,  235,  235,
+      231, 1927, 1939,  232, 1940, 1941,  233, 1944,  171,  171,
+      234, 1960,  171,  235,  978,  978,  978, 1961,  978,  171,
+     1940,  978,  171,  172,  172,  172,  172,  172,  172,  172,
+      172,  172,  172,  172,  172,  172,  172,  172, 1966,  172,
+      172,  172,  172,  172,  236,  236,  236,  237,  237,  237,
+      238,  238,  238, 1931,  241,  241,  241,  242,  242,  242,
+
+      236, 1931, 1945,  237, 1946, 1967,  238, 1968,  172,  172,
+      241, 1972,  172,  242,  982,  982,  982, 1974, 1945,  172,
+     1946, 1980,  172,  175,  175,  175,  175,  175,  175,  175,
+      175,  175,  175,  175,  175,  175,  175,  175, 1981,  175,
+      175,  175,  175,  175,  245,  245,  245,  246,  246,  246,
+      247,  247,  247, 1982,  248,  248,  248,  249,  249,  249,
+      245, 1989, 1990,  246, 1991, 2004,  247, 2010,  175,  175,
+      248, 2014,  175,  249,  991,  991,  991, 2017,  982,  175,
+     2019, 2022,  175, 1492, 1492, 1492, 1493, 1493, 1493,  175,
+      176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
+
+      176,  176,  176,  176,  176, 2024,  176,  176,  176,  176,
+      176,  250,  250,  250,  251,  251,  251,  252,  252,  252,
+     2026,  255,  255,  255,  256,  256,  256,  250, 2027, 2028,
+      251, 2031, 1493,  252, 2033,  176,  176,  255,  991,  176,
+      256,  298, 2038,  364,  370, 2040,  176, 2048, 2049,  176,
+     2050,  298, 2051,  364, 2053, 2066,  176,  185,  185,  185,
+      185,  185,  185,  185,  185,  185,  185,  185,  185,  185,
+      185,  185,  370,  185,  185,  185,  185,  185, 2067, 2072,
+      298,  364, 2073,  763,  763,  763,  298, 2074,  370,  768,
+      768,  768, 2064,  298, 2075,  364, 2079,  298, 2064,  364,
+
+      763, 2066,  185,  185, 2081, 2082,  768, 2083,  185,  998,
+      998,  998, 2088,  998, 2095, 2097,  998, 1495, 1495, 1495,
+     1498, 1498, 1498,  185,  186,  186,  186,  186,  186,  186,
+      186,  186,  186,  186,  186,  186,  186,  186,  186, 2098,
+      186,  186,  186,  186,  186,  780,  780,  780,  792,  792,
+      792,  793,  793,  793,  799,  799,  799,  801,  801,  801,
+     2101, 2104,  780, 1495, 2108,  792, 2109, 2110,  793,  186,
+      186,  799, 2111, 2112,  801,  186, 1005, 1005, 1005, 2113,
+     1005, 2114, 2115, 1005, 1501, 1501, 1501, 1511, 1511, 1511,
+      186,  195,  195,  195,  195,  195,  195,  195,  195,  195,
+
+      195,  195,  195,  195,  195,  195, 2116,  195,  195,  195,
+      195,  195,  815,  815,  815,  816,  816,  816,  828,  828,
+      828,  836,  836,  836,  841,  841,  841, 2117, 2122,  815,
+     2123, 2124,  816, 2125, 2143,  828,  195,  195,  836, 2144,
+     2147,  841,  195, 2145, 2146,  195, 1010, 1010, 1010, 2148,
+     1010, 2145, 2146, 1010, 1547, 1547, 1547,  195,  196,  196,
+      196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
+      196,  196,  196, 2150,  196,  196,  196,  196,  196,  847,
+      847,  847,  869,  869,  869,  897,  897,  897,  901,  901,
+      901, 2065,  919,  919,  919, 2154,  847, 2155, 2156,  869,
+
+     2162, 2163,  897,  196,  196,  901,  954,  954,  954,  196,
+      919, 2164,  196, 1022, 1022, 1022, 2178, 1022, 2182, 2183,
+     1022, 2184, 2065,  954,  196,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+     2186,  205,  205,  205,  205,  205,  920,  920,  920,  951,
+      951,  951, 2190, 2193,  952,  952,  952,  958,  958,  958,
+      959,  959,  959, 1746,  920, 2194, 2195,  951, 2197, 1746,
+      205,  205,  952, 1746, 2195,  958,  205, 1746,  959, 2198,
+     2201,  205,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  206, 2208,  206,  206,
+
+      206,  206,  206, 2210,  920,  962,  962,  962,  964,  964,
+      964,  970,  970,  970,  952,  966,  966,  966,  971,  971,
+      971, 2225,  962, 2196,  959,  964, 2239,  206,  206,  970,
+     2240, 2196,  966,  206, 2243, 2230,  971, 2250,  206,  209,
+      209,  209,  209,  209,  209,  209,  209,  209,  209,  209,
+      209,  209,  209,  209, 2251,  209,  209,  209,  209,  209,
+      975,  975,  975, 2256, 2258,  971, 2270, 2271,  976,  976,
+      976,  977,  977,  977,  980,  980,  980, 1747,  975,  997,
+      997,  997, 2230, 1747,  209,  209,  976, 1747,  977, 2272,
+      209, 1747,  980, 1034, 1034, 1034,  997, 1034, 2273, 2274,
+
+     1034, 1550, 1550, 1550, 2275,  209,  210,  210,  210,  210,
+      210,  210,  210,  210,  210,  210,  210,  210,  210,  210,
+      210, 2276,  210,  210,  210,  210,  210,  981,  981,  981,
+     2277, 2278,  976, 2279, 2286, 1001, 1001, 1001, 1002, 1002,
+     1002, 1004, 1004, 1004, 2287,  981, 2288, 1007, 1007, 1007,
+     2290,  210,  210, 1001, 2300, 2301, 1002,  210, 1004, 1036,
+     1036, 1036, 2302, 1036,  981, 1007, 1036, 2303, 1548, 1548,
+     1548, 2304,  210,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219, 2229,  219,
+      219,  219,  219,  219, 2305, 1008, 1008, 1008, 1009, 1009,
+
+     1009, 1701, 1701, 1701, 1002, 1012, 1012, 1012, 1013, 1013,
+     1013, 2306, 2309, 1008, 1548, 1009, 2310, 2311,  219,  219,
+     1016, 1016, 1016, 1012,  219, 2317, 1013,  219, 1042, 1042,
+     1042, 2229, 1042, 2318, 2324, 1042, 2325, 2326, 1016,  219,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
+      220,  220,  220,  220,  220, 2327,  220,  220,  220,  220,
+      220, 1008, 2341, 1017, 1017, 1017, 1021, 1021, 1021, 1013,
+     1025, 1025, 1025, 2342, 1026, 1026, 1026, 1030, 1030, 1030,
+     2312, 1017, 2343, 1021, 2344,  220,  220, 2346, 1025, 2348,
+     2312,  220, 1026, 2371,  220, 1030, 1045, 1045, 1045, 2372,
+
+     1045, 2377, 2378, 1045, 2379, 2366,  220,  229,  229,  229,
+      229,  229,  229,  229,  229,  229,  229,  229,  229,  229,
+      229,  229, 2382,  229,  229,  229,  229,  229, 1017, 1033,
+     1033, 1033, 1035, 1035, 1035, 1026, 1031, 1031, 1031, 1037,
+     1037, 1037, 2366, 1038, 1038, 1038, 1033, 2385, 2386, 1035,
+     2387, 2388,  229,  229, 1031, 2389, 2390, 1037, 2391, 2392,
+      229, 1038,  229, 2393, 2394,  229, 1704, 1704, 1704,  229,
+     1706, 1706, 1706,  229,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  230,  230, 2365,
+      230,  230,  230,  230,  230, 1041, 1041, 1041, 1031, 1044,
+
+     1044, 1044, 2395, 2397, 1038, 1046, 1046, 1046, 1056, 1056,
+     1056, 2398, 1041, 1057, 1057, 1057, 1044, 2400, 2401,  230,
+      230, 2365, 1046, 1708, 1708, 1708, 1056,  230, 2402,  230,
+     2403, 1057,  230, 1711, 1711, 1711,  230, 1721, 1721, 1721,
+      230,  239,  239,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  239, 2405,  239,  239,  239,
+      239,  239, 1058, 1058, 1058, 1059, 1059, 1059, 2406, 1059,
+     2408, 1057, 1059, 1060, 1060, 1060, 1061, 1061, 1061, 1058,
+     1061, 2409, 2411, 1061, 2416, 2417,  239,  239, 2399, 2418,
+     1060, 1062, 1062, 1062, 1073, 1073, 1073, 2399, 1073, 2420,
+
+     2425, 1073, 1081, 1081, 1081, 2426, 1081, 2427, 1062, 1081,
+      239,  240,  240,  240,  240,  240,  240,  240,  240,  240,
+      240,  240,  240,  240,  240,  240, 2428,  240,  240,  240,
+      240,  240, 1072, 1072, 1072, 1086, 1086, 1086, 2429, 1086,
+     2432, 2438, 1086, 2439, 2441, 1063, 1063, 1063, 2450, 1072,
+     1064, 1064, 1064, 1065, 1065, 1065,  240,  240, 1066, 1066,
+     1066, 2452, 1063, 2455, 1092, 1092, 1092, 1064, 1092, 2404,
+     1065, 1092, 1112, 1112, 1112, 1066, 1112, 2457, 2404, 1112,
+      240,  243,  243,  243,  243,  243,  243,  243,  243,  243,
+      243,  243,  243,  243,  243,  243, 1063,  243,  243,  243,
+
+      243,  243, 1064, 1067, 1067, 1067, 2481, 2482, 1065, 2484,
+     1066, 2485, 1068, 1068, 1068, 1074, 1074, 1074, 1077, 1077,
+     1077, 1067, 1713, 1713, 1713, 2486,  243,  243, 2491, 2477,
+     1068, 2492, 1074, 1549, 1549, 1549, 1077,  243,  244,  244,
+      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
+      244,  244,  244, 2493,  244,  244,  244,  244,  244, 1068,
+     1080, 1080, 1080, 1082, 1082, 1082, 2477, 1078, 1078, 1078,
+     1083, 1083, 1083, 1085, 1085, 1085, 2476, 1080, 2494, 1549,
+     2495, 1082, 2478,  244,  244, 1078, 1713, 2496, 1083, 2497,
+     1085, 1755, 1755, 1755,  244,  253,  253,  253,  253,  253,
+
+      253,  253,  253,  253,  253,  253,  253,  253,  253,  253,
+     2498,  253,  253,  253,  253,  253, 2476, 2499, 1078, 1088,
+     1088, 1088, 1091, 1091, 1091, 2478, 2500, 1096, 1096, 1096,
+     2501, 1083, 1097, 1097, 1097, 2503, 2504, 1088, 2505, 1091,
+      253,  253, 1089, 1089, 1089, 1096, 1098, 1098, 1098, 2506,
+     1097,  253, 1136, 1136, 1136, 2507, 1136, 2508, 2509, 1136,
+     1089, 2510, 2511, 1098,  253,  254,  254,  254,  254,  254,
+      254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
+     2512,  254,  254,  254,  254,  254, 2513, 1097, 2514, 1089,
+     1099, 1099, 1099, 2515, 2516, 1100, 1100, 1100, 1101, 1101,
+
+     1101, 1102, 1102, 1102, 1108, 1108, 1108, 1099, 2518, 2522,
+      254,  254, 1100, 1104, 1104, 1104, 1101, 2529, 2530, 1102,
+     2531,  254, 1108, 1105, 1105, 1105, 1106, 1106, 1106, 2533,
+     1104, 1109, 1109, 1109,  254,  296, 1107, 1107, 1107, 2537,
+     1105, 2540,  296, 1106, 1111, 1111, 1111, 2579, 2581, 1109,
+     2489,  296,  296, 1107, 1100, 2578, 1113, 1113, 1113, 2583,
+     2489, 1111, 1102, 2489, 1114, 1114, 1114, 2584, 1109, 1757,
+     1757, 1757, 2580, 1105, 1113, 1115, 1115, 1115, 2585,  296,
+      296,  296, 1114, 2588, 2578,  296,  296,  296, 1105, 2579,
+      296,  296, 1115, 2589,  296, 1107,  296,  296,  296,  361,
+
+     1116, 1116, 1116, 1117, 1117, 1117,  361, 1118, 1118, 1118,
+     1119, 1119, 1119, 2590, 2580,  361,  361, 1116, 2591, 1114,
+     2592, 1117, 1120, 1120, 1120, 1118, 2590, 1119, 2594, 1121,
+     1121, 1121, 2595, 2596, 1122, 1122, 1122, 2563, 2597, 1120,
+     1135, 1135, 1135,  361,  361,  361, 1121, 2563, 2598,  361,
+      361,  361, 1122, 2563,  361,  361, 2600, 1135,  361, 2601,
+      361,  361,  361, 1123, 1123, 1123, 1129, 1129, 1129, 1139,
+     1139, 1139, 1120, 1130, 1130, 1130, 2602, 2603, 1118, 2606,
+     2607, 1123, 2608, 2609, 1129, 2610, 1139, 1120, 1133, 1133,
+     1133, 1130, 1134, 1134, 1134, 1137, 1137, 1137, 1138, 1138,
+
+     1138, 1140, 1140, 1140, 2611, 1140, 1133, 2612, 1140, 2613,
+     1134, 2614, 2615, 1137, 2616, 2617, 1138, 1142, 1142, 1142,
+     1143, 1143, 1143, 1158, 1158, 1158, 1159, 1159, 1159, 1161,
+     1161, 1161, 2490, 2593, 1123, 1142, 2618, 1130, 1143, 2620,
+     2630, 1158, 2490, 2631, 1159, 2490, 2593, 1161, 1192, 1192,
+     1192, 1193, 1193, 1193, 2636, 2640, 1134, 2658, 2659, 1138,
+     1194, 1194, 1194, 2660, 2661, 1192, 1197, 1197, 1197, 1193,
+     1196, 1196, 1196, 1198, 1198, 1198, 1161, 1198, 1194, 2662,
+     1198, 2663, 2675, 1197, 1143, 1201, 1201, 1201, 1196, 1203,
+     1203, 1203, 1204, 1204, 1204, 1206, 1206, 1206, 2667, 1208,
+
+     1208, 1208, 1201, 1208, 2668, 2678, 1208, 1203, 2679, 2673,
+     1204, 2667, 2683, 1206, 1211, 1211, 1211, 2668, 2672, 1196,
+     1212, 1212, 1212, 2684, 1212, 2564, 2685, 1212, 1213, 1213,
+     1213, 1211, 1214, 1214, 1214, 2564, 1215, 1215, 1215, 2686,
+     1215, 2564, 1206, 1215, 2673, 1213, 1201, 2687, 2688, 1214,
+     1217, 1217, 1217, 1219, 1219, 1219, 1220, 1220, 1220, 1222,
+     1222, 1222, 1224, 1224, 1224, 2689, 2672, 1217, 1226, 1226,
+     1226, 1219, 2690, 2692, 1220, 2693, 2694, 1222, 2695, 1224,
+     1227, 1227, 1227, 1229, 1229, 1229, 1226, 1230, 1230, 1230,
+     2696, 1230, 2697, 2698, 1230, 1234, 1234, 1234, 1227, 2699,
+
+     2701, 1229, 1235, 1235, 1235, 1237, 1237, 1237, 1252, 1252,
+     1252, 2702, 1252, 1234, 2703, 1252, 1256, 1256, 1256, 1222,
+     1235, 2704, 2705, 1237, 1257, 1257, 1257, 1258, 1258, 1258,
+     1229, 2706, 2707, 1256, 1260, 1260, 1260, 1262, 1262, 1262,
+     2708, 1262, 1257, 2709, 1262, 1258, 1266, 1266, 1266, 1267,
+     1267, 1267, 1260, 1269, 1269, 1269, 1270, 1270, 1270, 2710,
+     1270, 2711, 2712, 1270, 1266, 2713, 2719, 1267, 1273, 1273,
+     1273, 1269, 1274, 1274, 1274, 1275, 1275, 1275, 1277, 1277,
+     1277, 1278, 1278, 1278, 2723, 1273, 2724, 1279, 1279, 1279,
+     1274, 2732, 2733, 1275, 2750, 1260, 1277, 2751, 1278, 1280,
+
+     1280, 1280, 2752, 2753, 1279, 1281, 1281, 1281, 1283, 1283,
+     1283, 1286, 1286, 1286, 1269, 1279, 2754, 1280, 1287, 1287,
+     1287, 2755, 1287, 1281, 2758, 1287, 1283, 2759, 1286, 1292,
+     1292, 1292, 1293, 1293, 1293, 1295, 1295, 1295, 1298, 1298,
+     1298, 1299, 1299, 1299, 2745, 1277, 2760, 1292, 2761, 2770,
+     1293, 2762, 2771, 1295, 2745, 1298, 1303, 1303, 1303, 1299,
+     1300, 1300, 1300, 1302, 1302, 1302, 2746, 2748, 1304, 1304,
+     1304, 2772, 1304, 1303, 1283, 1304, 2746, 2748, 1300, 2773,
+     2774, 1302, 1307, 1307, 1307, 2762, 1307, 2775, 2776, 1307,
+     1310, 1310, 1310, 1311, 1311, 1311, 1313, 1313, 1313, 2777,
+
+     1295, 2780, 1318, 1318, 1318, 2781, 1318, 2783, 1310, 1318,
+     2784, 1311, 2785, 2749, 1313, 1321, 1321, 1321, 1322, 1322,
+     1322, 2787, 1322, 2749, 2789, 1322, 1325, 1325, 1325, 2790,
+     1302, 2791, 1321, 1326, 1326, 1326, 2794, 1326, 2795, 2796,
+     1326, 2797, 2800, 1325, 1336, 1336, 1336, 1337, 1337, 1337,
+     1339, 1339, 1339, 1340, 1340, 1340, 2807, 1340, 2808, 2809,
+     1340, 1313, 1336, 2817, 2823, 1337, 2824, 2825, 1339, 1343,
+     1343, 1343, 2826, 1343, 2827, 2828, 1343, 1346, 1346, 1346,
+     1347, 1347, 1347, 2829, 1347, 2830, 2831, 1347, 1352, 1352,
+     1352, 1353, 1353, 1353, 1346, 1355, 1355, 1355, 1360, 1360,
+
+     1360, 2832, 1360, 2834, 2835, 1360, 1352, 2840, 2841, 1353,
+     1363, 1363, 1363, 1355, 1364, 1364, 1364, 1339, 1364, 2842,
+     2843, 1364, 1367, 1367, 1367, 2853, 2844, 1363, 1368, 1368,
+     1368, 1370, 1370, 1370, 1372, 1372, 1372, 2854, 1372, 2855,
+     1367, 1372, 2856, 1355, 2857, 2858, 1368, 2859, 2860, 1370,
+     1375, 1375, 1375, 1376, 1376, 1376, 1378, 1378, 1378, 1380,
+     1380, 1380, 2864, 1380, 2865, 2866, 1380, 2867, 1375, 2844,
+     2868, 1376, 2869, 2871, 1378, 1384, 1384, 1384, 1385, 1385,
+     1385, 2872, 1370, 1387, 1387, 1387, 2874, 1389, 1389, 1389,
+     2875, 1389, 2876, 1384, 1389, 2878, 1385, 1395, 1395, 1395,
+
+     2882, 1387, 1396, 1396, 1396, 2883, 1398, 1398, 1398, 1399,
+     1399, 1399, 1400, 1400, 1400, 1395, 1400, 2884, 2887, 1400,
+     1396, 2892, 2893, 1378, 1398, 2894, 1399, 1401, 1401, 1401,
+     2895, 2896, 1387, 1402, 1402, 1402, 2897, 1402, 2898, 2899,
+     1402, 1404, 1404, 1404, 1401, 1405, 1405, 1405, 2900, 1407,
+     1407, 1407, 1409, 1409, 1409, 2901, 1413, 1413, 1413, 1404,
+     1642, 1642, 1642, 1405, 2902, 2903, 1398, 1407, 2905, 1409,
+     1410, 1410, 1410, 1413, 1410, 2906, 2907, 1410, 1414, 1414,
+     1414, 2908, 1414, 2915, 2911, 1414, 1416, 1416, 1416, 1417,
+     1417, 1417, 1419, 1419, 1419, 1421, 1421, 1421, 2911, 1421,
+
+     2918, 2909, 1421, 2912, 1416, 2919, 1642, 1417, 2922, 2924,
+     1419, 1424, 1424, 1424, 2912, 2925, 1407, 1425, 1425, 1425,
+     1427, 1427, 1427, 1428, 1428, 1428, 1429, 1429, 1429, 1424,
+     1429, 2927, 2928, 1429, 2931, 1425, 2932, 2933, 1427, 2934,
+     1428, 1430, 1430, 1430, 1431, 1431, 1431, 2909, 1431, 2935,
+     2936, 1431, 1432, 1432, 1432, 2937, 1419, 2938, 1430, 1433,
+     1433, 1433, 2939, 1435, 1435, 1435, 1436, 1436, 1436, 2943,
+     1432, 1437, 1437, 1437, 2951, 1437, 2953, 1433, 1437, 2955,
+     1427, 1435, 2957, 1436, 1440, 1440, 1440, 1441, 1441, 1441,
+     2965, 1441, 2967, 2968, 1441, 1442, 1442, 1442, 1443, 1443,
+
+     1443, 1440, 1445, 1445, 1445, 1447, 1447, 1447, 1451, 1451,
+     1451, 2941, 2942, 1442, 2970, 2970, 1443, 1452, 1452, 1452,
+     1445, 2948, 1447, 2941, 2942, 1435, 1451, 1454, 1454, 1454,
+     1457, 1457, 1457, 2948, 2968, 1452, 1458, 1458, 1458, 1460,
+     1460, 1460, 1461, 1461, 1461, 1454, 1461, 2971, 1457, 1461,
+     1464, 1464, 1464, 2973, 1458, 2975, 2969, 1460, 1465, 1465,
+     1465, 1467, 1467, 1467, 1445, 1468, 1468, 1468, 1464, 1468,
+     2969, 2976, 1468, 1472, 1472, 1472, 1465, 2949, 2977, 1467,
+     1473, 1473, 1473, 1475, 1475, 1475, 2972, 2978, 1454, 2949,
+     2993, 1472, 1460, 1477, 1477, 1477, 2995, 2972, 1473, 2998,
+
+     3000, 1475, 1484, 1484, 1484, 1514, 1514, 1514, 1516, 1516,
+     1516, 1477, 1477, 2987, 1517, 1517, 1517, 1542, 1542, 1542,
+     1484, 1467, 1514, 1515, 1515, 1515, 1516, 1515, 2987, 2992,
+     1515, 1517, 1518, 1518, 1518, 1542, 1518, 3005, 2984, 1518,
+     1521, 1521, 1521, 3006, 1475, 1523, 1523, 1523, 2992, 1523,
+     2994, 3008, 1523, 1526, 1526, 1526, 2984, 2997, 1521, 3009,
+     1527, 1527, 1527, 2999, 1527, 3010, 1516, 1527, 1484, 2994,
+     1526, 1528, 1528, 1528, 3012, 1528, 2997, 3013, 1528, 1532,
+     1532, 1532, 2999, 1533, 1533, 1533, 3014, 1533, 3015, 1521,
+     1533, 1535, 1535, 1535, 3017, 3019, 1532, 1537, 1537, 1537,
+
+     1538, 1538, 1538, 3026, 1538, 3027, 3028, 1538, 3029, 1535,
+     1539, 1539, 1539, 3030, 1537, 1540, 1540, 1540, 1558, 1558,
+     1558, 1559, 1559, 1559, 1560, 1560, 1560, 1539, 1560, 3031,
+     3034, 1560, 3035, 1540, 3036, 1558, 3037, 3038, 1559, 3039,
+     3040, 1535, 1561, 1561, 1561, 1564, 1564, 1564, 1565, 1565,
+     1565, 1566, 1566, 1566, 3041, 1566, 3043, 3045, 1566, 3047,
+     1561, 3048, 3049, 1564, 1540, 1565, 1567, 1567, 1567, 1568,
+     1568, 1568, 1569, 1569, 1569, 3059, 1569, 3060, 3061, 1569,
+     1571, 1571, 1571, 3057, 1567, 3062, 1568, 1574, 1574, 1574,
+     1575, 1575, 1575, 3058, 1575, 3057, 3063, 1575, 1571, 1576,
+
+     1576, 1576, 3064, 3068, 1574, 3058, 1561, 3069, 3070, 1564,
+     1577, 1577, 1577, 1578, 1578, 1578, 1576, 1581, 1581, 1581,
+     3071, 1582, 1582, 1582, 3072, 1582, 1567, 1577, 1582, 3073,
+     3074, 1578, 3075, 3078, 1581, 1583, 1583, 1583, 1584, 1584,
+     1584, 1571, 1585, 1585, 1585, 3079, 1585, 3080, 3081, 1585,
+     1586, 1586, 1586, 1583, 3082, 1584, 1577, 1588, 1588, 1588,
+     1591, 1591, 1591, 1592, 1592, 1592, 3076, 1592, 1586, 3083,
+     1592, 1593, 1593, 1593, 1588, 1593, 3084, 1591, 1593, 1578,
+     1598, 1598, 1598, 1605, 1605, 1605, 1606, 1606, 1606, 3085,
+     1606, 3076, 3086, 1606, 1609, 1609, 1609, 1598, 1610, 1610,
+
+     1610, 1605, 1611, 1611, 1611, 1612, 1612, 1612, 1613, 1613,
+     1613, 1609, 1615, 1615, 1615, 1610, 1586, 3087, 3088, 1611,
+     3089, 3090, 1612, 1618, 1618, 1618, 1613, 1618, 3091, 1615,
+     1618, 3092, 3093, 1621, 1621, 1621, 1623, 1623, 1623, 1625,
+     1625, 1625, 1628, 1628, 1628, 1632, 1632, 1632, 1605, 1611,
+     1621, 1633, 1633, 1633, 1623, 3094, 3095, 1625, 3096, 3097,
+     1628, 3103, 1632, 1613, 3104, 1641, 1641, 1641, 1610, 1633,
+     1634, 1634, 1634, 3100, 1634, 1612, 3105, 1634, 1637, 1637,
+     1637, 3106, 1637, 1641, 3107, 1637, 1643, 1643, 1643, 3108,
+     1643, 1632, 3100, 1643, 1648, 1648, 1648, 3109, 1648, 1628,
+
+     1623, 1648, 1652, 1652, 1652, 1625, 3110, 3111, 1633, 1654,
+     1654, 1654, 1655, 1655, 1655, 3112, 1655, 3113, 3114, 1655,
+     1652, 1658, 1658, 1658, 3115, 1658, 3116, 1654, 1658, 3117,
+     3118, 1641, 1661, 1661, 1661, 1662, 1662, 1662, 3119, 1662,
+     3120, 3121, 1662, 3122, 1667, 1667, 1667, 3123, 1667, 3124,
+     1661, 1667, 1670, 1670, 1670, 1672, 1672, 1672, 1673, 1673,
+     1673, 3121, 1673, 1652, 3125, 1673, 1654, 1677, 1677, 1677,
+     1670, 3126, 1672, 1679, 1679, 1679, 1680, 1680, 1680, 1661,
+     1681, 1681, 1681, 3127, 3128, 1677, 1682, 1682, 1682, 3129,
+     1679, 1683, 1683, 1683, 1680, 1686, 1686, 1686, 1681, 1670,
+
+     1693, 1693, 1693, 1682, 1715, 1715, 1715, 3130, 3131, 1683,
+     1723, 1723, 1723, 1686, 3132, 3133, 1677, 3134, 1693, 1724,
+     1724, 1724, 3135, 1724, 3136, 3137, 1724, 1727, 1727, 1727,
+     3138, 3139, 1681, 1728, 1728, 1728, 3140, 1728, 3143, 3144,
+     1728, 3145, 3140, 1680, 3146, 1727, 1686, 1733, 1733, 1733,
+     1715, 3147, 1693, 1683, 3148, 3150, 1723, 1735, 1735, 1735,
+     3151, 1735, 3153, 1686, 1735, 1733, 1739, 1739, 1739, 3154,
+     1739, 3156, 3157, 1739, 1743, 1743, 1743, 1745, 1745, 1745,
+     3160, 1745, 3161, 3159, 1745, 1748, 1748, 1748, 3162, 1749,
+     1749, 1749, 1743, 1749, 1727, 3163, 1749, 3159, 1733, 1750,
+
+     1750, 1750, 1748, 1758, 1758, 1758, 1759, 1759, 1759, 1763,
+     1763, 1763, 1764, 1764, 1764, 3165, 3167, 1750, 3169, 1766,
+     1766, 1766, 1767, 1767, 1767, 3171, 1767, 3173, 3174, 1767,
+     1768, 1768, 1768, 3175, 1768, 1743, 1766, 1768, 1771, 1771,
+     1771, 1773, 1773, 1773, 1774, 1774, 1774, 1775, 1775, 1775,
+     1750, 1775, 3176, 3177, 1775, 3178, 1771, 3179, 1773, 1778,
+     1778, 1778, 1774, 3180, 1779, 1779, 1779, 3182, 1779, 3184,
+     1759, 1779, 3186, 1763, 3187, 3188, 1764, 1778, 1782, 1782,
+     1782, 1783, 1783, 1783, 3189, 1771, 1786, 1786, 1786, 1522,
+     1786, 1774, 3280, 1786, 3202, 1782, 1789, 1789, 1789, 1783,
+
+     1790, 1790, 1790, 3190, 1790, 3203, 3280, 1790, 3191, 1791,
+     1791, 1791, 1520, 1789, 1792, 1792, 1792, 1519, 1792, 3222,
+     3198, 1792, 1794, 1794, 1794, 1778, 1791, 1795, 1795, 1795,
+     1797, 1797, 1797, 3199, 1797, 3200, 3201, 1797, 3202, 3190,
+     1794, 1800, 1800, 1800, 3191, 1783, 1802, 1802, 1802, 3203,
+     1802, 3222, 3210, 1802, 1805, 1805, 1805, 3223, 3206, 1800,
+     1807, 1807, 1807, 1808, 1808, 1808, 3206, 1808, 3198, 1513,
+     1808, 3276, 1805, 1809, 1809, 1809, 3218, 1807, 1811, 1811,
+     1811, 3199, 1811, 3200, 3201, 1811, 1816, 1816, 1816, 3223,
+     1809, 1817, 1817, 1817, 3207, 1817, 1512, 3204, 1817, 3210,
+
+     1805, 3204, 3207, 1816, 1818, 1818, 1818, 1823, 1823, 1823,
+     1824, 1824, 1824, 1825, 1825, 1825, 1826, 1826, 1826, 3276,
+     1826, 1818, 3218, 1826, 1823, 1827, 1827, 1827, 1824, 3214,
+     1825, 1828, 1828, 1828, 1829, 1829, 1829, 1830, 1830, 1830,
+     3212, 3208, 1827, 1832, 1832, 1832, 3205, 3215, 1828, 3208,
+     3205, 1829, 1833, 1833, 1833, 1830, 1833, 3211, 3230, 1833,
+     1832, 1834, 1834, 1834, 1836, 1836, 1836, 1837, 1837, 1837,
+     3214, 1837, 3209, 3219, 1837, 1510, 1824, 3212, 1834, 3270,
+     3209, 1836, 1839, 1839, 1839, 1841, 1841, 1841, 3215, 1828,
+     1844, 1844, 1844, 1848, 1848, 1848, 3213, 1830, 3220, 3231,
+
+     1839, 3230, 3221, 1841, 3211, 1849, 1849, 1849, 1844, 1849,
+     1848, 3270, 1849, 1851, 1851, 1851, 1853, 1853, 1853, 3219,
+     1855, 1855, 1855, 1856, 1856, 1856, 1857, 1857, 1857, 3216,
+     1509, 1851, 3224, 3213, 1853, 3220, 1841, 1855, 1844, 3221,
+     1856, 3224, 3231, 1857, 1858, 1858, 1858, 1860, 1860, 1860,
+     1861, 1861, 1861, 1862, 1862, 1862, 1863, 1863, 1863, 1864,
+     1864, 1864, 1858, 3228, 3216, 1860, 1508, 1853, 1861, 1507,
+     1862, 3225, 3217, 1863, 1866, 1866, 1866, 1864, 1866, 3232,
+     3225, 1866, 1872, 1872, 1872, 1874, 1874, 1874, 2282, 2282,
+     1857, 2282, 3226, 1860, 1875, 1875, 1875, 3228, 1875, 2282,
+
+     1872, 1875, 1874, 1876, 1876, 1876, 2282, 3217, 1877, 1877,
+     1877, 1858, 1878, 1878, 1878, 1861, 1879, 1879, 1879, 3238,
+     1879, 1876, 1506, 1879, 1864, 3232, 1877, 3226, 3238, 1878,
+     1880, 1880, 1880, 1872, 1886, 1886, 1886, 1887, 1887, 1887,
+     1894, 1894, 1894, 1898, 1898, 1898, 1505, 1504, 1880, 3233,
+     1503, 1886, 1902, 1902, 1902, 1887, 1903, 1903, 1903, 1904,
+     1904, 1904, 1876, 1877, 1906, 1906, 1906, 1908, 1908, 1908,
+     1909, 1909, 1909, 1914, 1914, 1914, 1916, 1916, 1916, 1919,
+     1919, 1919, 1921, 1921, 1921, 1923, 1923, 1923, 1924, 1924,
+     1924, 1936, 1936, 1936, 1916, 3233, 3227, 1919, 1887, 1921,
+
+     1933, 1933, 1933, 1923, 1933, 1924, 1502, 1933, 1500, 1936,
+     1937, 1937, 1937, 1942, 1942, 1942, 1943, 1943, 1943, 1947,
+     1947, 1947, 1951, 1951, 1951, 3239, 1916, 1937, 1948, 1948,
+     1948, 3227, 1948, 1499, 3239, 1948, 1947, 1936, 3229, 3234,
+     1951, 1952, 1952, 1952, 1923, 1953, 1953, 1953, 1954, 1954,
+     1954, 3262, 1954, 3248, 3235, 1954, 3242, 3236, 1952, 1955,
+     1955, 1955, 1953, 1956, 1956, 1956, 1957, 1957, 1957, 1958,
+     1958, 1958, 3229, 1958, 3234, 1951, 1958, 1955, 1959, 1959,
+     1959, 1956, 3248, 1957, 1962, 1962, 1962, 3240, 1962, 3235,
+     3236, 1962, 3262, 1965, 1965, 1965, 1959, 1965, 3242, 3237,
+
+     1965, 1969, 1969, 1969, 1971, 1971, 1971, 3243, 1973, 1973,
+     1973, 3249, 1955, 1975, 1975, 1975, 3264, 1975, 3244, 1969,
+     1975, 1978, 1978, 1978, 3240, 1959, 1973, 1979, 1979, 1979,
+     3241, 1979, 3237, 3246, 1979, 1983, 1983, 1983, 1978, 1983,
+     3249, 1497, 1983, 1986, 1986, 1986, 1987, 1987, 1987, 3243,
+     1987, 3264, 3247, 1987, 1988, 1988, 1988, 1992, 1992, 1992,
+     1986, 1993, 1993, 1993, 3244, 1993, 1973, 3241, 1993, 1496,
+     3246, 1988, 3250, 3245, 1992, 1994, 1994, 1994, 1995, 1995,
+     1995, 3250, 1995, 1494, 1491, 1995, 1998, 1998, 1998, 3247,
+     1999, 1999, 1999, 1994, 1999, 3252, 3271, 1999, 2000, 2000,
+
+     2000, 3251, 3281, 1998, 2001, 2001, 2001, 2002, 2002, 2002,
+     3251, 2002, 3253, 3281, 2002, 2000, 2003, 2003, 2003, 3245,
+     3254, 2001, 3255, 2005, 2005, 2005, 1994, 2005, 3271, 3252,
+     2005, 2008, 2008, 2008, 2003, 2009, 2009, 2009, 1490, 2009,
+     1489, 3256, 2009, 2011, 2011, 2011, 3253, 2011, 2008, 3256,
+     2011, 2015, 2015, 2015, 2018, 2018, 2018, 2020, 2020, 2020,
+     2021, 2021, 2021, 2023, 2023, 2023, 3254, 2003, 3255, 2015,
+     3260, 3261, 2018, 3257, 2020, 2025, 2025, 2025, 2021, 2025,
+     2023, 3257, 2025, 2029, 2029, 2029, 2032, 2032, 2032, 2034,
+     2034, 2034, 2035, 2035, 2035, 3258, 2035, 1488, 3259, 2035,
+
+     1487, 2029, 3263, 1486, 2032, 1485, 2034, 3260, 3261, 2023,
+     2036, 2036, 2036, 2037, 2037, 2037, 3274, 2037, 2018, 1483,
+     2037, 2021, 2039, 2039, 2039, 3265, 3275, 2036, 2041, 2041,
+     2041, 2042, 2042, 2042, 2043, 2043, 2043, 2044, 2044, 2044,
+     2039, 2044, 3258, 3263, 2044, 3259, 2041, 3278, 3274, 2042,
+     3279, 2043, 2045, 2045, 2045, 2046, 2046, 2046, 3275, 2046,
+     3265, 3268, 2046, 2047, 2047, 2047, 2052, 2052, 2052, 2045,
+     3266, 2054, 2054, 2054, 3272, 2054, 3277, 2041, 2054, 3278,
+     3267, 2047, 3279, 3272, 2052, 2057, 2057, 2057, 2039, 2058,
+     2058, 2058, 3269, 2059, 2059, 2059, 2042, 2059, 3268, 1482,
+
+     2059, 1481, 1480, 2057, 2062, 2062, 2062, 2058, 2068, 2068,
+     2068, 2069, 2069, 2069, 3273, 2069, 3266, 1471, 2069, 2070,
+     2070, 2070, 2062, 3273, 3277, 2068, 3267, 1456, 2047, 3269,
+     1455, 2052, 2071, 2071, 2071, 1450, 2057, 2070, 2076, 2076,
+     2076, 1449, 2058, 2077, 2077, 2077, 2078, 2078, 2078, 2080,
+     2080, 2080, 2084, 2084, 2084, 2085, 2085, 2085, 2086, 2086,
+     2086, 2087, 2087, 2087, 2089, 2089, 2089, 2090, 2090, 2090,
+     2091, 2091, 2091, 2092, 2092, 2092, 2093, 2093, 2093, 2094,
+     2094, 2094, 1448, 2070, 2096, 2096, 2096, 2099, 2099, 2099,
+     1446, 2102, 2102, 2102, 2103, 2103, 2103, 1439, 2103, 1438,
+
+     1420, 2103, 2096, 1415, 1412, 2099, 1411, 2087, 2102, 2105,
+     2105, 2105, 2106, 2106, 2106, 2107, 2107, 2107, 1408, 2107,
+     1403, 1394, 2107, 2118, 2118, 2118, 1393, 2105, 1392, 2106,
+     2119, 2119, 2119, 1388, 1383, 2096, 2120, 2120, 2120, 1379,
+     2120, 2118, 1371, 2120, 2121, 2121, 2121, 2119, 2126, 2126,
+     2126, 2127, 2127, 2127, 2128, 2128, 2128, 2129, 2129, 2129,
+     1366, 2129, 1365, 1359, 2129, 2130, 2130, 2130, 2131, 2131,
+     2131, 2128, 2118, 2132, 2132, 2132, 1358, 2132, 1357, 1356,
+     2132, 1351, 1350, 2130, 1349, 2131, 2133, 2133, 2133, 1348,
+     2133, 1335, 1334, 2133, 2136, 2136, 2136, 2127, 1333, 2137,
+
+     2137, 2137, 2139, 2139, 2139, 1332, 2139, 1331, 1330, 2139,
+     1329, 1328, 2136, 2142, 2142, 2142, 2130, 2137, 2149, 2149,
+     2149, 2151, 2151, 2151, 1327, 2151, 1317, 1316, 2151, 1315,
+     1314, 2142, 1297, 2157, 2157, 2157, 2149, 2157, 1296, 1291,
+     2157, 2160, 2160, 2160, 1290, 2136, 2161, 2161, 2161, 1285,
+     2161, 1284, 1265, 2161, 1261, 2165, 2165, 2165, 2160, 2165,
+     1255, 1251, 2165, 2168, 2168, 2168, 2142, 2169, 2169, 2169,
+     1250, 2169, 1249, 2149, 2169, 2172, 2172, 2172, 2173, 2173,
+     2173, 2168, 2173, 1248, 1247, 2173, 2174, 2174, 2174, 1246,
+     2174, 1245, 2172, 2174, 2177, 2177, 2177, 2179, 2179, 2179,
+
+     1243, 2179, 1242, 1240, 2179, 2185, 2185, 2185, 2187, 2187,
+     2187, 1239, 2177, 2188, 2188, 2188, 1238, 2188, 1233, 1225,
+     2188, 1223, 1218, 2185, 1216, 2187, 1207, 2168, 2189, 2189,
+     2189, 2191, 2191, 2191, 2192, 2192, 2192, 1202, 2192, 1191,
+     1189, 2192, 1188, 2199, 2199, 2199, 2189, 1187, 2191, 2202,
+     2202, 2202, 1186, 2202, 1184, 1183, 2202, 2209, 2209, 2209,
+     2177, 2199, 2205, 2205, 2205, 1182, 2205, 1181, 1180, 2205,
+     1179, 2211, 2211, 2211, 1177, 2209, 2212, 2212, 2212, 2213,
+     2213, 2213, 1176, 2213, 1175, 1174, 2213, 1173, 2189, 2211,
+     1172, 2216, 2216, 2216, 2212, 2216, 1171, 1169, 2216, 2219,
+
+     2219, 2219, 1168, 2220, 2220, 2220, 1167, 1166, 2209, 2221,
+     2221, 2221, 2212, 2222, 2222, 2222, 1165, 2219, 1164, 2219,
+     2220, 2223, 2223, 2223, 1163, 1157, 2221, 2224, 2224, 2224,
+     2222, 2226, 2226, 2226, 2227, 2227, 2227, 2211, 2223, 2228,
+     2228, 2228, 2231, 2231, 2231, 2224, 2232, 2232, 2232, 2226,
+     2232, 1156, 2227, 2232, 2235, 2235, 2235, 2228, 1155, 1152,
+     2221, 2236, 2236, 2236, 2237, 2237, 2237, 2238, 2238, 2238,
+     1151, 1150, 2235, 2241, 2241, 2241, 1148, 2222, 1144, 1141,
+     2223, 2242, 2242, 2242, 2244, 2244, 2244, 2245, 2245, 2245,
+     1132, 2226, 2224, 2246, 2246, 2246, 2247, 2247, 2247, 2248,
+
+     2248, 2248, 2249, 2249, 2249, 2252, 2252, 2252, 2253, 2253,
+     2253, 1131, 1128, 2235, 2254, 2254, 2254, 2255, 2255, 2255,
+     2257, 2257, 2257, 2260, 2260, 2260, 2261, 2261, 2261, 1127,
+     2261, 1126, 1125, 2261, 2264, 2264, 2264, 1124, 2257, 1110,
+     2260, 2265, 2265, 2265, 1103, 2267, 2267, 2267, 1095, 2267,
+     1094, 2264, 2267, 2280, 2280, 2280, 2281, 2281, 2281, 2265,
+     2281, 2283, 2283, 2281, 2283, 2284, 2284, 2284, 2285, 2285,
+     2285, 2280, 2283, 2289, 2289, 2289, 2291, 2291, 2291, 2283,
+     2291, 1093, 1090, 2291, 2294, 2294, 2294, 2295, 2295, 2295,
+     1087, 2295, 1084, 1079, 2295, 2298, 2298, 2298, 1076, 1075,
+
+     2264, 1071, 2294, 2299, 2299, 2299, 2307, 2307, 2307, 2308,
+     2308, 2308, 1069, 2298, 2280, 2313, 2313, 2313, 1055, 2313,
+     1054, 2299, 2313, 2316, 2316, 2316, 1053, 2308, 1052, 1051,
+     2294, 2319, 2319, 2319, 2320, 2320, 2320, 1050, 2320, 1049,
+     2316, 2320, 2323, 2323, 2323, 2328, 2328, 2328, 1048, 2319,
+     2330, 2330, 2330, 1047, 2299, 2331, 2331, 2331, 1043, 2331,
+     2323, 1039, 2331, 2328, 2334, 2334, 2334, 2330, 1032, 2308,
+     2335, 2335, 2335, 2336, 2336, 2336, 1029, 2336, 1028, 1027,
+     2336, 1024, 2334, 2339, 2339, 2339, 1023, 2335, 2340, 2340,
+     2340, 2345, 2345, 2345, 2347, 2347, 2347, 2350, 2350, 2350,
+
+     2339, 2349, 2349, 2349, 1020, 2340, 1019, 1018, 2345, 2351,
+     2351, 2351, 1015, 1014, 2350, 2334, 2335, 1011, 1006, 2349,
+     1003, 2352, 2352, 2352, 2354, 2354, 2354, 2351, 2353, 2353,
+     2353, 1000,  999, 2355, 2355, 2355,  996, 2355, 2339, 2352,
+     2355, 2354, 2345, 2356, 2356, 2356, 2353,  995,  994, 2340,
+     2357, 2357, 2357, 2358, 2358, 2358, 2359, 2359, 2359,  993,
+     2356, 2360, 2360, 2360,  992, 2353,  990, 2357,  989, 2351,
+     2358, 2361, 2361, 2361, 2359, 2362, 2362, 2362, 2364, 2364,
+     2364,  988, 2352, 2367, 2367, 2367, 2369, 2369, 2369, 2361,
+     2368, 2368, 2368, 2362,  987,  986, 2364, 2370, 2370, 2370,
+
+      985, 2357,  984,  983, 2358, 2373, 2373, 2373, 2368, 2374,
+     2374, 2374, 2375, 2375, 2375, 2376, 2376, 2376, 2380, 2380,
+     2380, 2383, 2383, 2383, 2384, 2384, 2384,  979, 2384,  974,
+      973, 2384, 2396, 2396, 2396,  972, 2380, 2361, 2383,  969,
+     2364, 2407, 2407, 2407, 2410, 2410, 2410, 2412, 2412, 2412,
+     2396, 2413, 2413, 2413, 2415, 2415, 2415, 2422, 2422, 2422,
+     2423, 2423, 2423,  968,  967, 2412, 2424, 2424, 2424, 2413,
+      965,  961, 2415,  957, 2422,  956, 2430, 2430, 2430, 2431,
+     2431, 2431,  953, 2431, 2424,  950, 2431, 2433, 2433, 2433,
+      949,  948, 2396, 2430, 2434, 2434, 2434, 2436, 2436, 2436,
+
+     2440, 2440, 2440,  947, 2433, 2442, 2442, 2442,  946, 2444,
+     2444, 2444, 2434, 2412,  945, 2436,  944, 2440, 2445, 2445,
+     2445,  942, 2442, 2424, 2443, 2443, 2443, 2444, 2443,  941,
+      940, 2443, 2446, 2446, 2446, 2445, 2446,  939,  938, 2446,
+     2447, 2447, 2447, 2448, 2448, 2448, 2449, 2449, 2449, 2454,
+     2454, 2454, 2456, 2456, 2456,  937,  936, 2447,  935,  934,
+     2448,  933,  932, 2449,  931,  930, 2454, 2458, 2458, 2458,
+     2460, 2460, 2460, 2461, 2461, 2461,  929, 2461,  928,  927,
+     2461, 2462, 2462, 2462,  926, 2458,  925, 2460, 2463, 2463,
+     2463,  924, 2447, 2464, 2464, 2464, 2465, 2465, 2465, 2462,
+
+     2465, 2448,  923, 2465, 2449,  922, 2463, 2468, 2468, 2468,
+      918, 2464, 2469, 2469, 2469,  917, 2469,  915,  914, 2469,
+     2470, 2470, 2470,  913, 2468, 2471, 2471, 2471, 2472, 2472,
+     2472, 2474, 2474, 2474, 2475, 2475, 2475, 2470, 2479, 2479,
+     2479,  912, 2471, 2483, 2483, 2483, 2472, 2487, 2487, 2487,
+      911,  907, 2475,  905,  904, 2463, 2479, 2464, 2488, 2488,
+     2488,  903, 2488,  902, 2487, 2488, 2502, 2502, 2502, 2517,
+     2517, 2517, 2519, 2519, 2519, 2520, 2520, 2520, 2523, 2523,
+     2523, 2526, 2526, 2526, 2502, 2527, 2527, 2527,  898, 2527,
+     2519,  894, 2527, 2520,  893, 2523,  890,  889, 2526, 2528,
+
+     2528, 2528, 2532, 2532, 2532, 2534, 2534, 2534,  888, 2534,
+      887,  886, 2534, 2538, 2538, 2538,  885, 2528,  884, 2532,
+     2539, 2539, 2539,  881, 2539,  880, 2502, 2539,  879,  878,
+     2538, 2541, 2541, 2541, 2542, 2542, 2542, 2543, 2543, 2543,
+      875, 2543,  874, 2519, 2543, 2544, 2544, 2544, 2541,  873,
+      870, 2542, 2545, 2545, 2545,  868, 2545,  865,  864, 2545,
+      863,  862, 2544, 2548, 2548, 2548, 2550, 2550, 2550,  861,
+     2550,  858,  857, 2550, 2553, 2553, 2553, 2554, 2554, 2554,
+      856, 2548, 2555, 2555, 2555, 2558, 2558, 2558, 2559, 2559,
+     2559, 2553, 2559,  855, 2554, 2559, 2560, 2560, 2560, 2555,
+
+      854,  851, 2558, 2561, 2561, 2561,  850, 2562, 2562, 2562,
+      849, 2562,  848, 2560, 2562, 2565, 2565, 2565,  846,  843,
+     2561, 2567, 2567, 2567, 2568, 2568, 2568,  842, 2554, 2553,
+     2572, 2572, 2572, 2565, 2569, 2569, 2569, 2555, 2569, 2567,
+      840, 2569, 2568,  837, 2573, 2573, 2573, 2572, 2573,  835,
+      832, 2573, 2574, 2574, 2574, 2575, 2575, 2575,  831, 2575,
+      830,  829, 2575, 2576, 2576, 2576, 2582, 2582, 2582, 2574,
+      827, 2586, 2586, 2586,  826, 2587, 2587, 2587,  825, 2587,
+      822, 2576, 2587,  821,  820, 2568,  819, 2567, 2586, 2605,
+     2605, 2605, 2619, 2619, 2619, 2621, 2621, 2621, 2622, 2622,
+
+     2622, 2623, 2623, 2623, 2624, 2624, 2624, 2605, 2624,  818,
+      817, 2624,  812, 2621,  811, 2622,  810,  809, 2623, 2625,
+     2625, 2625,  808, 2625,  807,  806, 2625, 2628, 2628, 2628,
+     2632, 2632, 2632, 2633, 2633, 2633,  805, 2635, 2635, 2635,
+     2605, 2676, 2676, 2676, 2622, 2628,  804, 2632,  803,  802,
+     2633, 2634, 2634, 2634, 2635, 2634,  800, 2621, 2634, 2637,
+     2637, 2637,  798, 2637,  797,  794, 2637, 2641, 2641, 2641,
+     2642, 2642, 2642,  791, 2642,  788,  787, 2642, 2643, 2643,
+     2643,  783, 2643,  782, 2641, 2643, 2646, 2646, 2646, 2647,
+     2647, 2647,  781, 2647,  778,  775, 2647, 2648, 2648, 2648,
+
+     2649, 2649, 2649, 2646, 2650, 2650, 2650,  774, 2651, 2651,
+     2651,  773, 2651,  770, 2648, 2651,  769, 2649, 2654, 2654,
+     2654, 2650, 2655, 2655, 2655,  765, 2655,  764,  762, 2655,
+     2656, 2656, 2656,  759,  758, 2654, 2657, 2657, 2657,  757,
+     2657,  755,  744, 2657, 2664, 2664, 2664, 2656, 2665, 2665,
+     2665,  742,  739, 2650,  738, 2648, 2666, 2666, 2666,  737,
+     2666,  735, 2664, 2666,  734,  733, 2665, 2669, 2669, 2669,
+      729, 2669,  728,  727, 2669, 2674, 2674, 2674, 2677, 2677,
+     2677, 2680, 2680, 2680,  726, 2680,  723,  722, 2680, 2691,
+     2691, 2691, 2674, 2674,  721, 2664, 2700, 2700, 2700, 2714,
+
+     2714, 2714, 2715, 2715, 2715,  720, 2691, 2716, 2716, 2716,
+     2717, 2717, 2717,  719, 2700, 2665, 2718, 2718, 2718,  718,
+     2718,  717,  715, 2718,  712, 2716,  711, 2717, 2720, 2720,
+     2720,  709, 2720,  707,  704, 2720, 2725, 2725, 2725, 2726,
+     2726, 2726,  703, 2726,  697, 2700, 2726, 2727, 2727, 2727,
+      695, 2727,  693, 2725, 2727, 2730, 2730, 2730, 2716, 2731,
+     2731, 2731,  690, 2731,  689,  685, 2731, 2734, 2734, 2734,
+      684, 2734, 2730,  683, 2734, 2737, 2737, 2737,  682, 2737,
+      679,  678, 2737, 2740, 2740, 2740, 2741, 2741, 2741, 2742,
+     2742, 2742,  677, 2742,  676,  673, 2742, 2743, 2743, 2743,
+
+     2740,  672,  671, 2741, 2744, 2744, 2744,  670, 2744,  669,
+      663, 2744,  662,  660, 2743, 2747, 2747, 2747,  654, 2747,
+      653,  649, 2747, 2756, 2756, 2756, 2757, 2757, 2757, 2763,
+     2763, 2763,  642,  638, 2740, 2764, 2764, 2764, 2765, 2765,
+     2765, 2756, 2765,  632, 2757, 2765, 2763, 2763, 2766, 2766,
+     2766,  628, 2764, 2764,  620,  619, 2765, 2767, 2767, 2767,
+     2768, 2768, 2768, 2769, 2769, 2769,  618,  617, 2743, 2778,
+     2778, 2778, 2779, 2779, 2779,  616, 2779,  612,  605, 2779,
+     2788, 2788, 2788, 2801, 2801, 2801, 2778, 2802, 2802, 2802,
+      604,  603, 2757, 2803, 2803, 2803,  599,  592, 2788, 2804,
+
+     2804, 2804,  591, 2804,  587,  581, 2804,  580, 2810, 2810,
+     2810, 2803, 2810,  576,  568, 2810, 2813, 2813, 2813,  567,
+     2813,  563,  554, 2813, 2816, 2816, 2816, 2818, 2818, 2818,
+     2819, 2819, 2819,  550, 2819,  542,  541, 2819, 2822, 2822,
+     2822, 2816,  540,  536, 2818,  530, 2788, 2837, 2837, 2837,
+     2839, 2839, 2839,  529,  528, 2822, 2845, 2845, 2845, 2846,
+     2846, 2846,  524, 2846,  518, 2837, 2846,  517, 2839, 2850,
+     2850, 2850,  513, 2845, 2845,  507,  506, 2846, 2847, 2847,
+     2847,  505, 2847,  504,  503, 2847, 2851, 2851, 2851, 2852,
+     2852, 2852,  502, 2861, 2861, 2861, 2847, 2861,  501,  497,
+
+     2861, 2839, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
+     2848,  491,  490, 2848, 2870, 2870, 2870,  488, 2848, 2848,
+     2848, 2848, 2848, 2879, 2879, 2879, 2880, 2880, 2880, 2885,
+     2885, 2885, 2870, 2886, 2886, 2886,  487, 2886,  486,  482,
+     2886, 2888, 2888, 2888, 2880,  471, 2885, 2848, 2848, 2849,
+     2849, 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2888,  470,
+     2849, 2890, 2890, 2890,  468, 2849, 2849, 2849, 2849, 2849,
+     2889, 2889, 2889,  464, 2889,  458,  457, 2889, 2890, 2891,
+     2891, 2891,  456, 2891,  452,  446, 2891, 2904, 2904, 2904,
+     2929, 2929, 2929,  442, 2849, 2849, 2910, 2910, 2910,  434,
+
+     2910,  433,  432, 2910,  431, 2904,  430,  426, 2929, 2962,
+     2962, 2962,  420,  419, 2910, 2913, 2913, 2913, 2913, 2913,
+     2913, 2913, 2913, 2913,  415,  409, 2913, 2962,  408,  404,
+      397, 2913, 2913, 2913, 2913, 2913, 2940, 2940, 2940,  396,
+     2940,  395,  391, 2940, 2944, 2944, 2944,  384, 2944,  383,
+      382, 2944, 2947, 2947, 2947,  381, 2947,  377,  368, 2947,
+     2913, 2913, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914,
+     2914,  362,  358, 2914, 2974, 2974, 2974,  357, 2914, 2914,
+     2914, 2914, 2914, 2989, 2989, 2989, 2990, 2990, 2990, 2991,
+     2991, 2991, 2974, 2974, 2996, 2996, 2996, 3007, 3007, 3007,
+
+     2989,  353,  347, 2990,  346,  345, 2991, 2914, 2914,  341,
+      334, 2996, 3011, 3011, 3011, 3007, 3020, 3020, 3020, 3021,
+     3021, 3021,  332, 3021,  331,  327, 3021, 3022, 3022, 3022,
+     3011,  324,  322, 3020, 3023, 3023, 3023,  321, 3023,  320,
+      316, 3023,  312,  309, 3022, 3024, 3024, 3024, 3025, 3025,
+     3025,  305, 3025,  302,  301, 3025, 3032, 3032, 3032, 3042,
+     3042, 3042, 3024, 3011, 3033, 3033, 3033,  293, 3033,  289,
+      285, 3033,  284, 3032, 3050, 3050, 3050, 3042, 3050,  283,
+      277, 3050, 3053, 3053, 3053,  276, 3053,  274,  271, 3053,
+     3056, 3056, 3056,  259, 3056,    0, 3042, 3056, 3065, 3065,
+
+     3065,    0, 3065,    0,    0, 3065, 3172, 3172, 3172, 3181,
+     3181, 3181,    0, 3181,    0,    0, 3181, 3282, 3282, 3282,
+     3283, 3283, 3283,    0, 3172,    0,    0, 3181,    0,    0,
+        0,    0,    0,    0,    0, 3282,    0,    0, 3283, 3286,
+     3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3287, 3287,
+     3287, 3287, 3287, 3287, 3287, 3287, 3287, 3288, 3288, 3288,
+     3288, 3288, 3288, 3288, 3288, 3288, 3289, 3289, 3289, 3289,
+     3289, 3289, 3289, 3289, 3289, 3290, 3290, 3290, 3290, 3290,
+     3290, 3290, 3290, 3290, 3291, 3291, 3291, 3291, 3291, 3291,
+     3291, 3291, 3291, 3292, 3292, 3292, 3292, 3292, 3292, 3292,
+
+     3292, 3292, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293,
+     3293, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294,
+     3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3296,
+     3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3297, 3297,
+     3297, 3297, 3297, 3297, 3297, 3297, 3297, 3298, 3298, 3298,
+     3298, 3298, 3298, 3298, 3298, 3298, 3299, 3299, 3299, 3299,
+     3299, 3299, 3299, 3299, 3299, 3300, 3300, 3300, 3300, 3300,
+     3300, 3300, 3300, 3300, 3301, 3301, 3301, 3301, 3301, 3301,
+     3301, 3301, 3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+     3302, 3302, 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3303,
+
+     3303, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304,
+     3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306,
+     3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3307, 3307,
+     3307, 3307, 3307, 3307, 3307, 3307, 3307, 3308, 3308, 3308,
+     3308, 3308, 3308, 3308, 3308, 3308, 3309, 3309, 3309, 3309,
+     3309, 3309, 3309, 3309, 3309, 3310, 3310, 3310, 3310, 3310,
+     3310, 3310, 3310, 3310, 3311, 3311, 3311, 3311, 3311, 3311,
+     3311, 3311, 3311, 3312, 3312, 3312, 3312, 3312, 3312, 3312,
+     3312, 3312, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313,
+     3313, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314,
+
+     3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3316,
+     3316, 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3317, 3317,
+     3317, 3317, 3317, 3317, 3317, 3317, 3317, 3318, 3318, 3318,
+     3318, 3318, 3318, 3318, 3318, 3318, 3319, 3319, 3319, 3319,
+     3319, 3319, 3319, 3319, 3319, 3320, 3320, 3320, 3320, 3320,
+     3320, 3320, 3320, 3320, 3321, 3321, 3321, 3321, 3321, 3321,
+     3321, 3321, 3321, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
+     3322, 3322, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323,
+     3323, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324,
+     3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3326,
+
+     3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3327, 3327,
+     3327, 3327, 3327, 3327, 3327, 3327, 3327, 3328, 3328, 3328,
+     3328, 3328, 3328, 3328, 3328, 3328, 3329, 3329, 3329, 3329,
+     3329, 3329, 3329, 3329, 3329, 3330, 3330, 3330, 3330, 3330,
+     3330, 3330, 3330, 3330, 3331, 3331, 3331, 3331, 3331, 3331,
+     3331, 3331, 3331, 3332, 3332, 3332, 3332, 3332, 3332, 3332,
+     3332, 3332, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
+     3333, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334,
+     3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3336,
+     3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337,
+
+     3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338, 3338, 3338,
+     3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339,
+     3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340,
+     3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, 3341, 3341,
+     3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342, 3342, 3342,
+     3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343,
+     3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344,
+     3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3346,
+     3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3347, 3347,
+     3347,    0,    0,    0, 3347, 3348, 3348, 3348,    0,    0,
+
+        0, 3348, 3349, 3349, 3349,    0,    0,    0, 3349, 3350,
+     3350, 3350,    0,    0,    0, 3350, 3351, 3351, 3351,    0,
+        0,    0, 3351, 3352, 3352, 3352,    0,    0,    0, 3352,
+     3353, 3353, 3353,    0,    0,    0, 3353, 3354, 3354, 3354,
+        0,    0,    0, 3354, 3355, 3355, 3355,    0,    0,    0,
+     3355, 3356, 3356, 3356,    0,    0,    0, 3356, 3357, 3357,
+     3357,    0,    0,    0, 3357, 3358, 3358, 3358,    0,    0,
+        0, 3358, 3359, 3359, 3359,    0,    0,    0, 3359, 3360,
+     3360, 3360,    0,    0,    0, 3360, 3361, 3361, 3361,    0,
+        0,    0, 3361, 3362, 3362, 3362,    0,    0,    0, 3362,
+
+     3363, 3363, 3363,    0,    0,    0, 3363, 3364, 3364, 3364,
+        0,    0,    0, 3364, 3365, 3365, 3365,    0,    0,    0,
+     3365, 3366, 3366, 3366,    0,    0,    0, 3366, 3367, 3367,
+     3367,    0,    0,    0, 3367, 3368, 3368, 3368,    0,    0,
+        0, 3368, 3369, 3369, 3369,    0,    0,    0, 3369, 3370,
+     3370, 3370,    0,    0,    0, 3370, 3371, 3371, 3371,    0,
+        0,    0, 3371, 3372, 3372, 3372,    0,    0,    0, 3372,
+     3373, 3373, 3373,    0,    0,    0, 3373, 3374, 3374, 3374,
+        0,    0,    0, 3374, 3375, 3375, 3375, 3375, 3375, 3375,
+     3375,    0, 3375, 3376, 3376, 3376,    0,    0,    0, 3376,
+
+     3377,    0,    0,    0, 3377, 3378, 3378, 3378,    0,    0,
+        0, 3378, 3379,    0,    0,    0, 3379, 3380, 3380, 3380,
+        0,    0,    0, 3380, 3381,    0,    0,    0, 3381, 3382,
+     3382, 3382,    0,    0,    0, 3382, 3383,    0,    0,    0,
+     3383, 3384, 3384, 3384,    0,    0,    0, 3384, 3385,    0,
+        0,    0, 3385, 3386, 3386, 3386,    0,    0,    0, 3386,
+     3387,    0,    0,    0, 3387, 3388, 3388, 3388,    0,    0,
+        0, 3388, 3389,    0,    0,    0, 3389, 3390, 3390, 3390,
+        0,    0,    0, 3390, 3391,    0,    0,    0, 3391, 3392,
+     3392, 3392,    0,    0,    0, 3392, 3393,    0,    0,    0,
+
+     3393, 3394, 3394, 3394,    0,    0,    0, 3394, 3395,    0,
+        0,    0, 3395, 3396, 3396, 3396,    0,    0,    0, 3396,
+     3397,    0,    0,    0, 3397, 3398, 3398, 3398,    0,    0,
+        0, 3398, 3399,    0,    0,    0, 3399, 3400, 3400, 3400,
+        0,    0,    0, 3400, 3401,    0,    0,    0, 3401, 3402,
+     3402, 3402,    0,    0,    0, 3402, 3403,    0,    0,    0,
+     3403, 3404, 3404, 3404,    0,    0,    0, 3404, 3405,    0,
+        0,    0, 3405, 3406, 3406, 3406,    0,    0,    0, 3406,
+     3407,    0,    0,    0, 3407, 3408, 3408, 3408,    0,    0,
+        0, 3408, 3409,    0,    0,    0, 3409, 3410, 3410, 3410,
+
+        0,    0,    0, 3410, 3411,    0,    0,    0, 3411, 3412,
+     3412, 3412,    0,    0,    0, 3412, 3413,    0,    0,    0,
+     3413, 3414, 3414, 3414,    0,    0,    0, 3414, 3415,    0,
+        0,    0, 3415, 3416, 3416, 3416,    0,    0,    0, 3416,
+     3417,    0,    0,    0, 3417, 3418, 3418, 3418,    0,    0,
+        0, 3418, 3419,    0,    0,    0, 3419, 3420, 3420, 3420,
+        0,    0,    0, 3420, 3421,    0,    0,    0, 3421, 3422,
+     3422, 3422,    0,    0,    0, 3422, 3423,    0,    0,    0,
+     3423, 3424, 3424, 3424,    0,    0,    0, 3424, 3425,    0,
+        0,    0, 3425, 3426, 3426, 3426,    0,    0,    0, 3426,
+
+     3427,    0,    0,    0, 3427, 3428, 3428, 3428,    0,    0,
+        0, 3428, 3429,    0,    0,    0, 3429, 3430, 3430, 3430,
+        0,    0,    0, 3430, 3431,    0,    0,    0, 3431, 3432,
+     3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3433,    0,
+        0,    0,    0, 3433, 3434, 3434, 3434,    0,    0,    0,
+     3434, 3435, 3435, 3435, 3435,    0,    0, 3435, 3435, 3436,
+     3436, 3436,    0,    0,    0, 3436, 3437, 3437, 3437, 3437,
+        0,    0, 3437, 3437, 3438, 3438, 3438,    0,    0,    0,
+     3438, 3439, 3439, 3439, 3439,    0,    0, 3439, 3439, 3440,
+     3440, 3440,    0,    0,    0, 3440, 3441, 3441, 3441, 3441,
+
+        0,    0, 3441, 3441, 3442, 3442, 3442,    0,    0,    0,
+     3442, 3443, 3443, 3443, 3443,    0,    0, 3443, 3443, 3444,
+     3444, 3444,    0,    0,    0, 3444, 3445, 3445, 3445, 3445,
+        0,    0, 3445, 3445, 3446, 3446, 3446,    0,    0,    0,
+     3446, 3447, 3447, 3447, 3447,    0,    0, 3447, 3447, 3448,
+     3448, 3448,    0,    0,    0, 3448, 3449, 3449, 3449, 3449,
+        0,    0, 3449, 3449, 3450, 3450, 3450,    0,    0,    0,
+     3450, 3451, 3451, 3451, 3451,    0,    0, 3451, 3451, 3452,
+     3452, 3452,    0,    0,    0, 3452, 3453, 3453, 3453, 3453,
+        0,    0, 3453, 3453, 3454, 3454, 3454,    0,    0,    0,
+
+     3454, 3455, 3455, 3455, 3455,    0,    0, 3455, 3455, 3456,
+     3456, 3456,    0,    0,    0, 3456, 3457, 3457, 3457, 3457,
+        0,    0, 3457, 3457, 3458, 3458, 3458,    0,    0,    0,
+     3458, 3459, 3459, 3459, 3459,    0,    0, 3459, 3459, 3460,
+     3460, 3460,    0,    0,    0, 3460, 3461, 3461, 3461, 3461,
+        0,    0, 3461, 3461, 3462, 3462, 3462, 3462,    0, 3462,
+        0, 3462, 3463, 3463, 3463, 3463,    0,    0, 3463, 3463,
+     3464, 3464, 3464,    0,    0,    0, 3464, 3465, 3465, 3465,
+     3465,    0,    0, 3465, 3465, 3466, 3466, 3466,    0,    0,
+        0, 3466, 3467, 3467, 3467, 3467,    0,    0, 3467, 3467,
+
+     3468, 3468, 3468,    0,    0,    0, 3468, 3469, 3469, 3469,
+     3469,    0,    0, 3469, 3469, 3470, 3470, 3470,    0,    0,
+        0, 3470, 3471, 3471, 3471, 3471,    0,    0, 3471, 3471,
+     3472, 3472, 3472, 3472,    0, 3472,    0, 3472, 3473, 3473,
+     3473, 3473,    0,    0, 3473, 3473, 3474, 3474, 3474, 3474,
+        0, 3474,    0, 3474, 3475, 3475, 3475, 3475,    0,    0,
+     3475, 3475, 3476, 3476, 3476,    0,    0,    0, 3476, 3477,
+     3477, 3477, 3477,    0,    0, 3477, 3477, 3478, 3478, 3478,
+     3478,    0, 3478,    0, 3478, 3479, 3479, 3479, 3479,    0,
+        0, 3479, 3479, 3480, 3480, 3480, 3480,    0, 3480,    0,
+
+     3480, 3481, 3481, 3481, 3481,    0,    0, 3481, 3481, 3482,
+     3482, 3482,    0,    0,    0, 3482, 3483, 3483, 3483, 3483,
+        0,    0, 3483, 3483, 3484, 3484, 3484,    0,    0,    0,
+     3484, 3485, 3485, 3485, 3485,    0,    0, 3485, 3485, 3486,
+     3486, 3486, 3486,    0,    0, 3486, 3486, 3487, 3487, 3487,
+        0,    0,    0, 3487, 3488, 3488, 3488, 3488,    0,    0,
+     3488, 3488, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489,
+     3489, 3490,    0, 3490,    0,    0, 3490, 3491, 3491, 3491,
+        0,    0,    0, 3491, 3492, 3492, 3492, 3492,    0,    0,
+     3492, 3492, 3493, 3493, 3493, 3493,    0, 3493,    0, 3493,
+
+     3494, 3494, 3494, 3494,    0,    0, 3494, 3494, 3495, 3495,
+     3495, 3495,    0, 3495,    0, 3495, 3496, 3496, 3496, 3496,
+        0,    0, 3496, 3496, 3497, 3497, 3497,    0,    0,    0,
+     3497, 3498, 3498, 3498, 3498,    0,    0, 3498, 3498, 3499,
+     3499, 3499,    0,    0,    0, 3499, 3500, 3500, 3500, 3500,
+        0,    0, 3500, 3500, 3501, 3501, 3501,    0,    0,    0,
+     3501, 3502, 3502, 3502, 3502,    0,    0, 3502, 3502, 3503,
+     3503, 3503,    0,    0,    0, 3503, 3504, 3504, 3504, 3504,
+        0,    0, 3504, 3504, 3505, 3505, 3505,    0,    0,    0,
+     3505, 3506, 3506, 3506, 3506,    0,    0, 3506, 3506, 3507,
+
+     3507, 3507, 3507,    0, 3507,    0, 3507, 3508, 3508, 3508,
+     3508,    0,    0, 3508, 3508, 3509, 3509, 3509, 3509,    0,
+     3509,    0, 3509, 3510, 3510, 3510, 3510,    0,    0, 3510,
+     3510, 3511, 3511, 3511,    0,    0,    0, 3511, 3512, 3512,
+     3512, 3512,    0,    0, 3512, 3512, 3513, 3513, 3513, 3513,
+        0, 3513,    0, 3513, 3514, 3514, 3514, 3514,    0,    0,
+     3514, 3514, 3515, 3515, 3515, 3515,    0, 3515,    0, 3515,
+     3516, 3516, 3516, 3516,    0,    0, 3516, 3516, 3517, 3517,
+     3517,    0,    0,    0, 3517, 3518, 3518, 3518, 3518,    0,
+        0, 3518, 3518, 3519, 3519, 3519,    0,    0,    0, 3519,
+
+     3520, 3520, 3520, 3520,    0,    0, 3520, 3520, 3521, 3521,
+     3521,    0,    0,    0, 3521, 3522, 3522, 3522, 3522,    0,
+        0, 3522, 3522, 3523, 3523, 3523,    0,    0,    0, 3523,
+     3524, 3524, 3524, 3524,    0,    0, 3524, 3524, 3525, 3525,
+     3525,    0,    0,    0, 3525, 3526, 3526, 3526, 3526,    0,
+        0, 3526, 3526, 3527, 3527, 3527,    0,    0,    0, 3527,
+     3528, 3528, 3528, 3528,    0,    0, 3528, 3528, 3529, 3529,
+     3529,    0,    0,    0, 3529, 3530, 3530, 3530, 3530,    0,
+        0, 3530, 3530, 3531, 3531, 3531,    0,    0,    0, 3531,
+     3532, 3532, 3532, 3532,    0,    0, 3532, 3532, 3533, 3533,
+
+     3533,    0,    0,    0, 3533, 3534, 3534, 3534, 3534,    0,
+        0, 3534, 3534, 3535, 3535, 3535, 3535,    0,    0, 3535,
+     3535, 3536, 3536, 3536,    0,    0,    0, 3536, 3537, 3537,
+     3537, 3537,    0,    0, 3537, 3537, 3538, 3538, 3538,    0,
+        0,    0, 3538, 3539, 3539, 3539, 3539,    0,    0, 3539,
+     3539, 3540, 3540, 3540,    0,    0,    0, 3540, 3541, 3541,
+     3541, 3541,    0,    0, 3541, 3541, 3542, 3542, 3542, 3542,
+        0,    0, 3542, 3542, 3543, 3543, 3543,    0,    0,    0,
+     3543, 3544, 3544, 3544, 3544,    0,    0, 3544, 3544, 3545,
+     3545, 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3546, 3546,
+
+     3546, 3546, 3546, 3546, 3546, 3546, 3546, 3547, 3547, 3547,
+        0,    0,    0, 3547, 3548, 3548, 3548, 3548,    0,    0,
+     3548, 3548, 3549, 3549, 3549, 3549,    0,    0, 3549, 3549,
+     3550, 3550, 3550,    0,    0,    0, 3550, 3551, 3551, 3551,
+     3551,    0,    0, 3551, 3551, 3552, 3552, 3552,    0,    0,
+        0, 3552, 3553, 3553, 3553, 3553,    0,    0, 3553, 3553,
+     3554, 3554, 3554,    0,    0,    0, 3554, 3555, 3555, 3555,
+     3555,    0,    0, 3555, 3555, 3556, 3556, 3556,    0,    0,
+        0, 3556, 3557, 3557, 3557,    0,    0,    0, 3557, 3558,
+     3558, 3558, 3558,    0,    0, 3558, 3558, 3559, 3559, 3559,
+
+        0,    0,    0, 3559, 3560, 3560, 3560, 3560,    0,    0,
+     3560, 3560, 3561, 3561, 3561, 3561,    0,    0, 3561, 3561,
+     3562, 3562, 3562,    0,    0,    0, 3562, 3563, 3563, 3563,
+     3563,    0,    0, 3563, 3563, 3564, 3564, 3564,    0,    0,
+        0, 3564, 3565, 3565, 3565, 3565,    0,    0, 3565, 3565,
+     3566, 3566, 3566, 3566,    0,    0, 3566, 3566, 3567, 3567,
+     3567, 3567,    0,    0, 3567, 3567, 3568, 3568, 3568,    0,
+        0,    0, 3568, 3569, 3569, 3569, 3569,    0,    0, 3569,
+     3569, 3570, 3570, 3570, 3570,    0, 3570,    0, 3570, 3571,
+     3571, 3571, 3571,    0,    0, 3571, 3571, 3572, 3572, 3572,
+
+        0,    0,    0, 3572, 3573, 3573, 3573, 3573,    0,    0,
+     3573, 3573, 3574, 3574, 3574,    0,    0,    0, 3574, 3575,
+     3575, 3575, 3575,    0,    0, 3575, 3575, 3576, 3576, 3576,
+        0,    0,    0, 3576, 3577, 3577, 3577, 3577,    0,    0,
+     3577, 3577, 3578, 3578, 3578,    0,    0,    0, 3578, 3579,
+     3579, 3579, 3579,    0,    0, 3579, 3579, 3580, 3580, 3580,
+        0,    0,    0, 3580, 3581, 3581, 3581, 3581,    0,    0,
+     3581, 3581, 3582, 3582, 3582,    0,    0,    0, 3582, 3583,
+     3583, 3583, 3583,    0,    0, 3583, 3583, 3584, 3584, 3584,
+        0,    0,    0, 3584, 3585, 3585, 3585, 3585,    0,    0,
+
+     3585, 3585, 3586, 3586, 3586, 3586,    0,    0, 3586, 3586,
+     3587, 3587, 3587,    0,    0,    0, 3587, 3588, 3588, 3588,
+     3588,    0,    0, 3588, 3588, 3589, 3589, 3589,    0,    0,
+        0, 3589, 3590, 3590, 3590, 3590,    0,    0, 3590, 3590,
+     3591, 3591, 3591, 3591,    0, 3591,    0, 3591, 3592, 3592,
+     3592, 3592,    0,    0, 3592, 3592, 3593, 3593, 3593, 3593,
+        0,    0, 3593, 3593, 3594, 3594, 3594, 3594,    0, 3594,
+        0, 3594, 3595, 3595, 3595, 3595,    0,    0, 3595, 3595,
+     3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3597,
+     3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3598, 3598,
+
+     3598,    0,    0,    0, 3598, 3599, 3599, 3599, 3599,    0,
+        0, 3599, 3599, 3600, 3600, 3600, 3600,    0,    0, 3600,
+     3600, 3601, 3601, 3601,    0,    0,    0, 3601, 3602, 3602,
+     3602, 3602,    0,    0, 3602, 3602, 3603, 3603, 3603,    0,
+        0,    0, 3603, 3604, 3604, 3604, 3604,    0,    0, 3604,
+     3604, 3605, 3605, 3605,    0,    0,    0, 3605, 3606, 3606,
+     3606, 3606,    0,    0, 3606, 3606, 3607, 3607, 3607,    0,
+        0,    0, 3607, 3608, 3608, 3608,    0,    0,    0, 3608,
+     3609, 3609, 3609, 3609,    0,    0, 3609, 3609, 3610, 3610,
+     3610,    0,    0,    0, 3610, 3611, 3611, 3611, 3611,    0,
+
+        0, 3611, 3611, 3612, 3612, 3612, 3612,    0,    0, 3612,
+     3612, 3613, 3613, 3613, 3613,    0, 3613,    0, 3613, 3614,
+     3614, 3614, 3614,    0,    0, 3614, 3614, 3615, 3615, 3615,
+        0,    0,    0, 3615, 3616, 3616, 3616, 3616,    0,    0,
+     3616, 3616, 3617, 3617, 3617, 3617,    0,    0, 3617, 3617,
+     3618, 3618, 3618,    0,    0,    0, 3618, 3619, 3619, 3619,
+     3619,    0,    0, 3619, 3619, 3620, 3620, 3620, 3620,    0,
+     3620,    0, 3620, 3621, 3621, 3621, 3621,    0,    0, 3621,
+     3621, 3622, 3622, 3622,    0,    0,    0, 3622, 3623, 3623,
+     3623, 3623,    0,    0, 3623, 3623, 3624, 3624, 3624,    0,
+
+        0,    0, 3624, 3625, 3625, 3625, 3625,    0,    0, 3625,
+     3625, 3626, 3626, 3626,    0,    0,    0, 3626, 3627, 3627,
+     3627, 3627,    0,    0, 3627, 3627, 3628, 3628, 3628,    0,
+        0,    0, 3628, 3629, 3629, 3629, 3629,    0,    0, 3629,
+     3629, 3630, 3630, 3630,    0,    0,    0, 3630, 3631, 3631,
+     3631, 3631,    0,    0, 3631, 3631, 3632, 3632, 3632, 3632,
+        0, 3632,    0, 3632, 3633, 3633, 3633, 3633,    0,    0,
+     3633, 3633, 3634, 3634, 3634,    0,    0,    0, 3634, 3635,
+     3635, 3635, 3635,    0,    0, 3635, 3635, 3636, 3636, 3636,
+     3636,    0,    0, 3636, 3636, 3637, 3637, 3637, 3637,    0,
+
+     3637,    0, 3637, 3638, 3638, 3638, 3638,    0,    0, 3638,
+     3638, 3639, 3639, 3639,    0,    0,    0, 3639, 3640, 3640,
+     3640, 3640,    0,    0, 3640, 3640, 3641, 3641, 3641, 3641,
+        0,    0, 3641, 3641, 3642, 3642, 3642, 3642,    0,    0,
+     3642, 3642, 3643, 3643, 3643, 3643,    0,    0, 3643, 3643,
+     3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3645,
+     3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3646, 3646,
+     3646, 3646,    0, 3646,    0, 3646, 3647, 3647, 3647, 3647,
+        0,    0, 3647, 3647, 3648, 3648, 3648, 3648,    0,    0,
+     3648, 3648, 3649, 3649, 3649,    0,    0,    0, 3649, 3650,
+
+     3650, 3650, 3650,    0,    0, 3650, 3650, 3651, 3651, 3651,
+        0,    0,    0, 3651, 3652, 3652, 3652, 3652,    0,    0,
+     3652, 3652, 3653, 3653, 3653, 3653,    0, 3653,    0, 3653,
+     3654, 3654, 3654, 3654,    0,    0, 3654, 3654, 3655, 3655,
+     3655, 3655,    0, 3655,    0, 3655, 3656, 3656, 3656, 3656,
+        0, 3656,    0, 3656, 3657, 3657, 3657, 3657,    0,    0,
+     3657, 3657, 3658, 3658, 3658, 3658,    0, 3658,    0, 3658,
+     3659, 3659, 3659, 3659,    0,    0, 3659, 3659, 3660, 3660,
+     3660, 3660,    0,    0, 3660, 3660, 3661, 3661, 3661, 3661,
+        0,    0, 3661, 3661, 3662, 3662, 3662,    0,    0,    0,
+
+     3662, 3663, 3663, 3663, 3663,    0,    0, 3663, 3663, 3664,
+     3664, 3664,    0,    0,    0, 3664, 3665, 3665, 3665, 3665,
+        0,    0, 3665, 3665, 3666, 3666, 3666, 3666,    0, 3666,
+        0, 3666, 3667, 3667, 3667, 3667,    0,    0, 3667, 3667,
+     3668, 3668, 3668,    0,    0,    0, 3668, 3669, 3669, 3669,
+        0,    0,    0, 3669, 3670, 3670, 3670, 3670,    0,    0,
+     3670, 3670, 3671, 3671, 3671,    0,    0,    0, 3671, 3672,
+     3672, 3672, 3672,    0,    0, 3672, 3672, 3673, 3673, 3673,
+        0,    0,    0, 3673, 3674, 3674, 3674,    0,    0,    0,
+     3674, 3675, 3675, 3675, 3675,    0,    0, 3675, 3675, 3676,
+
+     3676, 3676,    0,    0,    0, 3676, 3677, 3677, 3677, 3677,
+        0,    0, 3677, 3677, 3678, 3678, 3678,    0,    0,    0,
+     3678, 3679, 3679, 3679, 3679,    0,    0, 3679, 3679, 3680,
+     3680, 3680, 3680,    0,    0, 3680, 3680, 3681, 3681, 3681,
+     3681,    0,    0, 3681, 3681, 3682, 3682, 3682,    0,    0,
+        0, 3682, 3683, 3683, 3683, 3683,    0,    0, 3683, 3683,
+     3684, 3684, 3684, 3684,    0,    0, 3684, 3684, 3685, 3685,
+     3685, 3685,    0,    0, 3685, 3685, 3686, 3686, 3686, 3686,
+     3686, 3686, 3686, 3686, 3686, 3687, 3687, 3687, 3687, 3687,
+     3687, 3687, 3687, 3687, 3688, 3688, 3688, 3688,    0,    0,
+
+     3688, 3688, 3689, 3689, 3689, 3689,    0,    0, 3689, 3689,
+     3690, 3690, 3690,    0,    0,    0, 3690, 3691, 3691, 3691,
+        0,    0,    0, 3691, 3692, 3692, 3692, 3692,    0,    0,
+     3692, 3692, 3693, 3693, 3693, 3693,    0,    0, 3693, 3693,
+     3694, 3694, 3694, 3694,    0,    0, 3694, 3694, 3695, 3695,
+     3695, 3695,    0,    0, 3695, 3695, 3696, 3696, 3696, 3696,
+        0,    0, 3696, 3696, 3697, 3697, 3697,    0,    0,    0,
+     3697, 3698, 3698, 3698, 3698,    0,    0, 3698, 3698, 3699,
+     3699, 3699,    0,    0,    0, 3699, 3700, 3700, 3700, 3700,
+        0,    0, 3700, 3700, 3701, 3701, 3701, 3701,    0,    0,
+
+     3701, 3701, 3702, 3702, 3702,    0,    0,    0, 3702, 3703,
+     3703, 3703,    0,    0,    0, 3703, 3704, 3704, 3704, 3704,
+        0,    0, 3704, 3704, 3705, 3705, 3705,    0,    0,    0,
+     3705, 3706, 3706, 3706, 3706,    0,    0, 3706, 3706, 3707,
+     3707, 3707,    0,    0,    0, 3707, 3708, 3708, 3708,    0,
+        0,    0, 3708, 3709, 3709, 3709,    0,    0,    0, 3709,
+     3710, 3710, 3710, 3710,    0,    0, 3710, 3710, 3711, 3711,
+     3711,    0,    0,    0, 3711, 3712, 3712, 3712, 3712,    0,
+        0, 3712, 3712, 3713, 3713, 3713, 3713,    0,    0, 3713,
+     3713, 3714, 3714, 3714, 3714,    0,    0, 3714, 3714, 3715,
+
+     3715, 3715, 3715,    0, 3715,    0, 3715, 3716, 3716, 3716,
+     3716,    0,    0, 3716, 3716, 3717, 3717, 3717, 3717,    0,
+        0, 3717, 3717, 3718, 3718, 3718, 3718,    0,    0, 3718,
+     3718, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719,
+     3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3721,
+     3721, 3721, 3721,    0,    0, 3721, 3721, 3722, 3722, 3722,
+     3722,    0,    0, 3722, 3722, 3723, 3723, 3723,    0,    0,
+        0, 3723, 3724, 3724, 3724, 3724,    0, 3724,    0, 3724,
+     3725, 3725, 3725, 3725,    0,    0, 3725, 3725, 3726, 3726,
+     3726, 3726,    0,    0, 3726, 3726, 3727, 3727, 3727, 3727,
+
+        0,    0, 3727, 3727, 3728, 3728, 3728, 3728,    0,    0,
+     3728, 3728, 3729, 3729, 3729,    0,    0,    0, 3729, 3730,
+     3730, 3730, 3730,    0,    0, 3730, 3730, 3731, 3731, 3731,
+        0,    0,    0, 3731, 3732, 3732, 3732, 3732,    0,    0,
+     3732, 3732, 3733, 3733, 3733, 3733,    0,    0, 3733, 3733,
+     3734, 3734, 3734,    0,    0,    0, 3734, 3735, 3735, 3735,
+        0,    0,    0, 3735, 3736, 3736, 3736, 3736,    0, 3736,
+        0, 3736, 3737, 3737, 3737, 3737,    0,    0, 3737, 3737,
+     3738, 3738, 3738, 3738,    0, 3738,    0, 3738, 3739, 3739,
+     3739,    0,    0,    0, 3739, 3740, 3740, 3740,    0,    0,
+
+        0, 3740, 3741, 3741, 3741, 3741,    0,    0, 3741, 3741,
+     3742, 3742, 3742, 3742,    0, 3742,    0, 3742, 3743, 3743,
+     3743, 3743,    0,    0, 3743, 3743, 3744, 3744, 3744, 3744,
+        0,    0, 3744, 3744, 3745, 3745, 3745, 3745,    0,    0,
+     3745, 3745, 3746, 3746, 3746, 3746,    0, 3746,    0, 3746,
+     3747, 3747, 3747, 3747,    0,    0, 3747, 3747, 3748, 3748,
+     3748, 3748,    0,    0, 3748, 3748, 3749, 3749, 3749, 3749,
+     3749, 3749, 3749, 3749, 3749, 3750, 3750, 3750, 3750, 3750,
+     3750, 3750, 3750, 3750, 3751, 3751, 3751, 3751,    0,    0,
+     3751, 3751, 3752, 3752, 3752,    0,    0,    0, 3752, 3753,
+
+     3753, 3753,    0,    0,    0, 3753, 3754, 3754, 3754, 3754,
+        0,    0, 3754, 3754, 3755, 3755, 3755, 3755,    0,    0,
+     3755, 3755, 3756, 3756, 3756, 3756,    0,    0, 3756, 3756,
+     3757, 3757, 3757,    0,    0,    0, 3757, 3758, 3758, 3758,
+     3758,    0,    0, 3758, 3758, 3759, 3759, 3759,    0,    0,
+        0, 3759, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760,
+     3760, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761,
+     3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3763,
+     3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3764, 3764,
+     3764, 3764, 3764, 3764, 3764, 3764, 3764, 3765, 3765, 3765,
+
+     3765, 3765, 3765, 3765, 3765, 3765, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+     3285
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[565] =
+static yyconst flex_int32_t yy_rule_can_match_eol[563] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
     0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
@@ -4344,25 +4358,25 @@ static yyconst flex_int32_t yy_rule_can_match_eol[565] =
     1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
     1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
     1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
-    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
+    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
+    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
+    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    0, 0, 0, 1, 0,     };
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
+    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
+    0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 
+    0, 1, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -4574,9 +4588,6 @@ short int surfxml_process_kill___time_isset;
 AT_surfxml_cluster_bb___bw AX_surfxml_cluster_bb___bw;
 #define A_surfxml_cluster_bb___bw (surfxml_bufferstack + AX_surfxml_cluster_bb___bw)
 short int surfxml_cluster_bb___bw_isset;
-AT_surfxml_host_pstate AX_surfxml_host_pstate;
-#define A_surfxml_host_pstate (surfxml_bufferstack + AX_surfxml_host_pstate)
-short int surfxml_host_pstate_isset;
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 short int surfxml_argument_value_isset;
@@ -5023,57 +5034,60 @@ const char* *surfxml_statenames=NULL;
 #define AL_surfxml_host___link 72
 #define E_surfxml_host___link 73
 #define AL_surfxml_cluster 74
-#define E_surfxml_cluster 75
-#define AL_surfxml_cabinet 76
-#define E_surfxml_cabinet 77
-#define AL_surfxml_peer 78
-#define E_surfxml_peer 79
-#define AL_surfxml_router 80
-#define E_surfxml_router 81
-#define AL_surfxml_backbone 82
-#define E_surfxml_backbone 83
-#define AL_surfxml_link 84
-#define S_surfxml_link 85
-#define S_surfxml_link_1 86
-#define S_surfxml_link_2 87
-#define E_surfxml_link 88
-#define AL_surfxml_route 89
-#define S_surfxml_route 90
-#define S_surfxml_route_1 91
-#define S_surfxml_route_2 92
-#define E_surfxml_route 93
-#define AL_surfxml_ASroute 94
-#define S_surfxml_ASroute 95
-#define S_surfxml_ASroute_1 96
-#define S_surfxml_ASroute_2 97
-#define E_surfxml_ASroute 98
-#define AL_surfxml_link___ctn 99
-#define E_surfxml_link___ctn 100
-#define AL_surfxml_bypassRoute 101
-#define S_surfxml_bypassRoute 102
-#define S_surfxml_bypassRoute_1 103
-#define S_surfxml_bypassRoute_2 104
-#define E_surfxml_bypassRoute 105
-#define AL_surfxml_bypassASroute 106
-#define S_surfxml_bypassASroute 107
-#define S_surfxml_bypassASroute_1 108
-#define S_surfxml_bypassASroute_2 109
-#define E_surfxml_bypassASroute 110
-#define AL_surfxml_process 111
-#define S_surfxml_process 112
-#define S_surfxml_process_1 113
-#define S_surfxml_process_2 114
-#define E_surfxml_process 115
-#define AL_surfxml_argument 116
-#define E_surfxml_argument 117
-#define AL_surfxml_config 118
-#define S_surfxml_config 119
-#define S_surfxml_config_1 120
-#define S_surfxml_config_2 121
-#define E_surfxml_config 122
-#define AL_surfxml_prop 123
-#define E_surfxml_prop 124
-#define IMPOSSIBLE 125
+#define S_surfxml_cluster 75
+#define S_surfxml_cluster_1 76
+#define S_surfxml_cluster_2 77
+#define E_surfxml_cluster 78
+#define AL_surfxml_cabinet 79
+#define E_surfxml_cabinet 80
+#define AL_surfxml_peer 81
+#define E_surfxml_peer 82
+#define AL_surfxml_router 83
+#define E_surfxml_router 84
+#define AL_surfxml_backbone 85
+#define E_surfxml_backbone 86
+#define AL_surfxml_link 87
+#define S_surfxml_link 88
+#define S_surfxml_link_1 89
+#define S_surfxml_link_2 90
+#define E_surfxml_link 91
+#define AL_surfxml_route 92
+#define S_surfxml_route 93
+#define S_surfxml_route_1 94
+#define S_surfxml_route_2 95
+#define E_surfxml_route 96
+#define AL_surfxml_ASroute 97
+#define S_surfxml_ASroute 98
+#define S_surfxml_ASroute_1 99
+#define S_surfxml_ASroute_2 100
+#define E_surfxml_ASroute 101
+#define AL_surfxml_link___ctn 102
+#define E_surfxml_link___ctn 103
+#define AL_surfxml_bypassRoute 104
+#define S_surfxml_bypassRoute 105
+#define S_surfxml_bypassRoute_1 106
+#define S_surfxml_bypassRoute_2 107
+#define E_surfxml_bypassRoute 108
+#define AL_surfxml_bypassASroute 109
+#define S_surfxml_bypassASroute 110
+#define S_surfxml_bypassASroute_1 111
+#define S_surfxml_bypassASroute_2 112
+#define E_surfxml_bypassASroute 113
+#define AL_surfxml_process 114
+#define S_surfxml_process 115
+#define S_surfxml_process_1 116
+#define S_surfxml_process_2 117
+#define E_surfxml_process 118
+#define AL_surfxml_argument 119
+#define E_surfxml_argument 120
+#define AL_surfxml_config 121
+#define S_surfxml_config 122
+#define S_surfxml_config_1 123
+#define S_surfxml_config_2 124
+#define E_surfxml_config 125
+#define AL_surfxml_prop 126
+#define E_surfxml_prop 127
+#define IMPOSSIBLE 128
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -5295,7 +5309,6 @@ YY_DECL
   surfxml_bufferliteral('\0', &bnext, "2147483647");
   surfxml_bufferliteral('\0', &bnext, "1");
   surfxml_bufferliteral('\0', &bnext, "1.0");
-  surfxml_bufferliteral('\0', &bnext, "0.0");
   surfxml_bufferliteral('\0', &bnext, "1");
   surfxml_bufferliteral('\0', &bnext, "0.0");
   surfxml_bufferliteral('\0', &bnext, "-1.0");
@@ -5375,6 +5388,9 @@ YY_DECL
   surfxml_statenames[AL_surfxml_host___link] = NULL;
   surfxml_statenames[E_surfxml_host___link] = "host_link";
   surfxml_statenames[AL_surfxml_cluster] = NULL;
+  surfxml_statenames[S_surfxml_cluster] = "cluster";
+  surfxml_statenames[S_surfxml_cluster_1] = "cluster";
+  surfxml_statenames[S_surfxml_cluster_2] = "cluster";
   surfxml_statenames[E_surfxml_cluster] = "cluster";
   surfxml_statenames[AL_surfxml_cabinet] = NULL;
   surfxml_statenames[E_surfxml_cabinet] = "cabinet";
@@ -5480,13 +5496,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 3289 )
+                               if ( yy_current_state >= 3286 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 12042 );
+               while ( yy_base[yy_current_state] != 12107 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -6802,8 +6818,6 @@ YY_RULE_SETUP
   surfxml_host_state___file_isset = 0;
   AX_surfxml_host_coordinates = 0;
   surfxml_host_coordinates_isset = 0;
-  AX_surfxml_host_pstate = 22;
-  surfxml_host_pstate_isset = 0;
   ENTER(AL_surfxml_host); pushbuffer(0);
   }
        YY_BREAK
@@ -6893,16 +6907,6 @@ YY_RULE_SETUP
 if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");}  surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
 case 209:
-/* rule 209 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
-       YY_BREAK
-case 210:
-/* rule 210 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");}  surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
-       YY_BREAK
-case 211:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -6910,7 +6914,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
  }
        YY_BREAK
-case 212:
+case 210:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -6921,11 +6925,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 213:
+case 211:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
        YY_BREAK
-case 214:
+case 212:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6933,8 +6937,8 @@ case YY_STATE_EOF(AL_surfxml_host):
 FAIL("EOF in attribute list of `host' element.");
        YY_BREAK
 
-case 215:
-/* rule 215 can match eol */
+case 213:
+/* rule 213 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6945,12 +6949,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 216:
-/* rule 216 can match eol */
+case 214:
+/* rule 214 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
        YY_BREAK
-case 217:
+case 215:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6960,13 +6964,13 @@ case YY_STATE_EOF(S_surfxml_host_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host>' expected.");
        YY_BREAK
 
-case 218:
-/* rule 218 can match eol */
+case 216:
+/* rule 216 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <gpu> is not allowed here.");
        YY_BREAK
-case 219:
-/* rule 219 can match eol */
+case 217:
+/* rule 217 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_gpu_name = 0;
@@ -6975,24 +6979,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 220:
-/* rule 220 can match eol */
+case 218:
+/* rule 218 can match eol */
 YY_RULE_SETUP
 if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
-case 221:
-/* rule 221 can match eol */
+case 219:
+/* rule 219 can match eol */
 YY_RULE_SETUP
 if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");}  surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
-case 222:
+case 220:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
   LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu);
  }
        YY_BREAK
-case 223:
+case 221:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
@@ -7002,11 +7006,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 224:
+case 222:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of gpu element.", surf_parse_text[0]);
        YY_BREAK
-case 225:
+case 223:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `gpu' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7014,8 +7018,8 @@ case YY_STATE_EOF(AL_surfxml_gpu):
 FAIL("EOF in attribute list of `gpu' element.");
        YY_BREAK
 
-case 226:
-/* rule 226 can match eol */
+case 224:
+/* rule 224 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7026,12 +7030,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 227:
-/* rule 227 can match eol */
+case 225:
+/* rule 225 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</gpu>' expected.",surf_parse_text);
        YY_BREAK
-case 228:
+case 226:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</gpu>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7039,13 +7043,13 @@ case YY_STATE_EOF(E_surfxml_gpu):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</gpu>' expected.");
        YY_BREAK
 
-case 229:
-/* rule 229 can match eol */
+case 227:
+/* rule 227 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host_link> is not allowed here.");
        YY_BREAK
-case 230:
-/* rule 230 can match eol */
+case 228:
+/* rule 228 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host___link_id = 0;
@@ -7058,37 +7062,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 231:
-/* rule 231 can match eol */
+case 229:
+/* rule 229 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 232:
-/* rule 232 can match eol */
+case 230:
+/* rule 230 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");}  surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 233:
-/* rule 233 can match eol */
+case 231:
+/* rule 231 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 234:
-/* rule 234 can match eol */
+case 232:
+/* rule 232 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");}  surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 235:
-/* rule 235 can match eol */
+case 233:
+/* rule 233 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 236:
-/* rule 236 can match eol */
+case 234:
+/* rule 234 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");}  surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 237:
+case 235:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7097,7 +7101,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link);
  }
        YY_BREAK
-case 238:
+case 236:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7109,11 +7113,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 239:
+case 237:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]);
        YY_BREAK
-case 240:
+case 238:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7121,8 +7125,8 @@ case YY_STATE_EOF(AL_surfxml_host___link):
 FAIL("EOF in attribute list of `host_link' element.");
        YY_BREAK
 
-case 241:
-/* rule 241 can match eol */
+case 239:
+/* rule 239 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7133,12 +7137,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 242:
-/* rule 242 can match eol */
+case 240:
+/* rule 240 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
        YY_BREAK
-case 243:
+case 241:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7146,13 +7150,13 @@ case YY_STATE_EOF(E_surfxml_host___link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host_link>' expected.");
        YY_BREAK
 
-case 244:
-/* rule 244 can match eol */
+case 242:
+/* rule 242 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cluster> is not allowed here.");
        YY_BREAK
-case 245:
-/* rule 245 can match eol */
+case 243:
+/* rule 243 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cluster_id = 0;
@@ -7165,7 +7169,7 @@ YY_RULE_SETUP
   surfxml_cluster_radical_isset = 0;
   AX_surfxml_cluster_power = 0;
   surfxml_cluster_power_isset = 0;
-  AX_surfxml_cluster_core = 26;
+  AX_surfxml_cluster_core = 22;
   surfxml_cluster_core_isset = 0;
   AX_surfxml_cluster_bw = 0;
   surfxml_cluster_bw_isset = 0;
@@ -7195,202 +7199,202 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 244:
+/* rule 244 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+       YY_BREAK
+case 245:
+/* rule 245 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+       YY_BREAK
 case 246:
 /* rule 246 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
 case 247:
 /* rule 247 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
 case 248:
 /* rule 248 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
 case 249:
 /* rule 249 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
 case 250:
 /* rule 250 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 251:
 /* rule 251 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 252:
 /* rule 252 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 253:
 /* rule 253 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");}  surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 254:
 /* rule 254 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
 case 255:
 /* rule 255 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");}  surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
 case 256:
 /* rule 256 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
 case 257:
 /* rule 257 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
 case 258:
 /* rule 258 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
 case 259:
 /* rule 259 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
 case 260:
 /* rule 260 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
-       YY_BREAK
 case 261:
 /* rule 261 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
        YY_BREAK
 case 262:
 /* rule 262 can match eol */
 case 263:
 /* rule 263 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
        YY_BREAK
 case 264:
 /* rule 264 can match eol */
 case 265:
 /* rule 265 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
        YY_BREAK
 case 266:
 /* rule 266 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
+       YY_BREAK
 case 267:
 /* rule 267 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
        YY_BREAK
 case 268:
 /* rule 268 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
        YY_BREAK
 case 269:
 /* rule 269 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
        YY_BREAK
 case 270:
 /* rule 270 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
-       YY_BREAK
 case 271:
 /* rule 271 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
        YY_BREAK
 case 272:
 /* rule 272 can match eol */
 case 273:
 /* rule 273 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
        YY_BREAK
 case 274:
 /* rule 274 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
+       YY_BREAK
 case 275:
 /* rule 275 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");}  surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
        YY_BREAK
 case 276:
 /* rule 276 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
        YY_BREAK
 case 277:
 /* rule 277 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");}  surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");}  surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
        YY_BREAK
 case 278:
 /* rule 278 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
 case 279:
 /* rule 279 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");}  surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
 case 280:
 /* rule 280 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
 case 281:
 /* rule 281 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
 case 282:
 /* rule 282 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
 case 283:
 /* rule 283 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
 case 284:
 /* rule 284 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
        YY_BREAK
 case 285:
 /* rule 285 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
-       YY_BREAK
-case 286:
-/* rule 286 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
-       YY_BREAK
-case 287:
-/* rule 287 can match eol */
-YY_RULE_SETUP
 if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
        YY_BREAK
-case 288:
+case 286:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7400,10 +7404,10 @@ YY_RULE_SETUP
   if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element.");
   if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
   if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element.");
-  LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster);
+  LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster);
  }
        YY_BREAK
-case 289:
+case 287:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7421,11 +7425,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 290:
+case 288:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
        YY_BREAK
-case 291:
+case 289:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7433,8 +7437,8 @@ case YY_STATE_EOF(AL_surfxml_cluster):
 FAIL("EOF in attribute list of `cluster' element.");
        YY_BREAK
 
-case 292:
-/* rule 292 can match eol */
+case 290:
+/* rule 290 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7447,26 +7451,28 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 293:
-/* rule 293 can match eol */
+case 291:
+/* rule 291 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
        YY_BREAK
-case 294:
+case 292:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
        YY_BREAK
+case YY_STATE_EOF(S_surfxml_cluster_2):
+case YY_STATE_EOF(S_surfxml_cluster):
 case YY_STATE_EOF(E_surfxml_cluster):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
 
-case 295:
-/* rule 295 can match eol */
+case 293:
+/* rule 293 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cabinet> is not allowed here.");
        YY_BREAK
-case 296:
-/* rule 296 can match eol */
+case 294:
+/* rule 294 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cabinet_id = 0;
@@ -7487,77 +7493,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 295:
+/* rule 295 can match eol */
+YY_RULE_SETUP
+if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
+       YY_BREAK
+case 296:
+/* rule 296 can match eol */
+YY_RULE_SETUP
+if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
+       YY_BREAK
 case 297:
 /* rule 297 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
+if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
 case 298:
 /* rule 298 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
+if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
 case 299:
 /* rule 299 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
+if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
 case 300:
 /* rule 300 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
+if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
 case 301:
 /* rule 301 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
+if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
 case 302:
 /* rule 302 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
+if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
 case 303:
 /* rule 303 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
+if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
 case 304:
 /* rule 304 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
+if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");}  surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
 case 305:
 /* rule 305 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
+if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
 case 306:
 /* rule 306 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");}  surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
+if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
 case 307:
 /* rule 307 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
+if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
 case 308:
 /* rule 308 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
-       YY_BREAK
-case 309:
-/* rule 309 can match eol */
-YY_RULE_SETUP
-if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
-       YY_BREAK
-case 310:
-/* rule 310 can match eol */
-YY_RULE_SETUP
 if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");}  surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
-case 311:
+case 309:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7570,7 +7576,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet);
  }
        YY_BREAK
-case 312:
+case 310:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7589,11 +7595,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 313:
+case 311:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]);
        YY_BREAK
-case 314:
+case 312:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7601,8 +7607,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet):
 FAIL("EOF in attribute list of `cabinet' element.");
        YY_BREAK
 
-case 315:
-/* rule 315 can match eol */
+case 313:
+/* rule 313 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7616,12 +7622,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 316:
-/* rule 316 can match eol */
+case 314:
+/* rule 314 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
        YY_BREAK
-case 317:
+case 315:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7629,13 +7635,13 @@ case YY_STATE_EOF(E_surfxml_cabinet):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cabinet>' expected.");
        YY_BREAK
 
-case 318:
-/* rule 318 can match eol */
+case 316:
+/* rule 316 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <peer> is not allowed here.");
        YY_BREAK
-case 319:
-/* rule 319 can match eol */
+case 317:
+/* rule 317 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_peer_id = 0;
@@ -7658,87 +7664,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 318:
+/* rule 318 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
+       YY_BREAK
+case 319:
+/* rule 319 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
+       YY_BREAK
 case 320:
 /* rule 320 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
+if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
 case 321:
 /* rule 321 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
+if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");}  surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
 case 322:
 /* rule 322 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
+if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
 case 323:
 /* rule 323 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");}  surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
+if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
 case 324:
 /* rule 324 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
+if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
 case 325:
 /* rule 325 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
+if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
 case 326:
 /* rule 326 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
+if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
 case 327:
 /* rule 327 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
+if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
 case 328:
 /* rule 328 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
+if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
 case 329:
 /* rule 329 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
+if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
 case 330:
 /* rule 330 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
+if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
 case 331:
 /* rule 331 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
+if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
 case 332:
 /* rule 332 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
+if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
 case 333:
 /* rule 333 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
-       YY_BREAK
-case 334:
-/* rule 334 can match eol */
-YY_RULE_SETUP
-if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
-       YY_BREAK
-case 335:
-/* rule 335 can match eol */
-YY_RULE_SETUP
 if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");}  surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
-case 336:
+case 334:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -7749,7 +7755,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer);
  }
        YY_BREAK
-case 337:
+case 335:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -7765,11 +7771,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 338:
+case 336:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]);
        YY_BREAK
-case 339:
+case 337:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7777,8 +7783,8 @@ case YY_STATE_EOF(AL_surfxml_peer):
 FAIL("EOF in attribute list of `peer' element.");
        YY_BREAK
 
-case 340:
-/* rule 340 can match eol */
+case 338:
+/* rule 338 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7791,12 +7797,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 341:
-/* rule 341 can match eol */
+case 339:
+/* rule 339 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
        YY_BREAK
-case 342:
+case 340:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7804,13 +7810,13 @@ case YY_STATE_EOF(E_surfxml_peer):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
        YY_BREAK
 
-case 343:
-/* rule 343 can match eol */
+case 341:
+/* rule 341 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <router> is not allowed here.");
        YY_BREAK
-case 344:
-/* rule 344 can match eol */
+case 342:
+/* rule 342 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_id = 0;
@@ -7821,34 +7827,34 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 345:
-/* rule 345 can match eol */
+case 343:
+/* rule 343 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 346:
-/* rule 346 can match eol */
+case 344:
+/* rule 344 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");}  surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 347:
-/* rule 347 can match eol */
+case 345:
+/* rule 345 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 348:
-/* rule 348 can match eol */
+case 346:
+/* rule 346 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");}  surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 349:
+case 347:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
   LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router);
  }
        YY_BREAK
-case 350:
+case 348:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
@@ -7858,11 +7864,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 351:
+case 349:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
-case 352:
+case 350:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7870,8 +7876,8 @@ case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 353:
-/* rule 353 can match eol */
+case 351:
+/* rule 351 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7882,12 +7888,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 354:
-/* rule 354 can match eol */
+case 352:
+/* rule 352 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
-case 355:
+case 353:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7895,13 +7901,13 @@ case YY_STATE_EOF(E_surfxml_router):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 356:
-/* rule 356 can match eol */
+case 354:
+/* rule 354 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <backbone> is not allowed here.");
        YY_BREAK
-case 357:
-/* rule 357 can match eol */
+case 355:
+/* rule 355 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_backbone_id = 0;
@@ -7914,37 +7920,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 358:
-/* rule 358 can match eol */
+case 356:
+/* rule 356 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 359:
-/* rule 359 can match eol */
+case 357:
+/* rule 357 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");}  surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 360:
-/* rule 360 can match eol */
+case 358:
+/* rule 358 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 361:
-/* rule 361 can match eol */
+case 359:
+/* rule 359 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");}  surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 362:
-/* rule 362 can match eol */
+case 360:
+/* rule 360 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 363:
-/* rule 363 can match eol */
+case 361:
+/* rule 361 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");}  surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 364:
+case 362:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -7953,7 +7959,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone);
  }
        YY_BREAK
-case 365:
+case 363:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -7966,11 +7972,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 366:
+case 364:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]);
        YY_BREAK
-case 367:
+case 365:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7978,8 +7984,8 @@ case YY_STATE_EOF(AL_surfxml_backbone):
 FAIL("EOF in attribute list of `backbone' element.");
        YY_BREAK
 
-case 368:
-/* rule 368 can match eol */
+case 366:
+/* rule 366 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7991,12 +7997,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 369:
-/* rule 369 can match eol */
+case 367:
+/* rule 367 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
        YY_BREAK
-case 370:
+case 368:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8004,13 +8010,13 @@ case YY_STATE_EOF(E_surfxml_backbone):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</backbone>' expected.");
        YY_BREAK
 
-case 371:
-/* rule 371 can match eol */
+case 369:
+/* rule 369 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link> is not allowed here.");
        YY_BREAK
-case 372:
-/* rule 372 can match eol */
+case 370:
+/* rule 370 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_id = 0;
@@ -8019,7 +8025,7 @@ YY_RULE_SETUP
   surfxml_link_bandwidth_isset = 0;
   AX_surfxml_link_bandwidth___file = 0;
   surfxml_link_bandwidth___file_isset = 0;
-  AX_surfxml_link_latency = 28;
+  AX_surfxml_link_latency = 24;
   surfxml_link_latency_isset = 0;
   AX_surfxml_link_latency___file = 0;
   surfxml_link_latency___file_isset = 0;
@@ -8033,102 +8039,102 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 371:
+/* rule 371 can match eol */
+YY_RULE_SETUP
+if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
+       YY_BREAK
+case 372:
+/* rule 372 can match eol */
+YY_RULE_SETUP
+if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
+       YY_BREAK
 case 373:
 /* rule 373 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
+if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 case 374:
 /* rule 374 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
+if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 case 375:
 /* rule 375 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
+if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
 case 376:
 /* rule 376 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
+if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
 case 377:
 /* rule 377 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
+if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 case 378:
 /* rule 378 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
+if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 case 379:
 /* rule 379 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
+if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
 case 380:
 /* rule 380 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
+if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
 case 381:
 /* rule 381 can match eol */
-YY_RULE_SETUP
-if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
-       YY_BREAK
 case 382:
 /* rule 382 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
+A_surfxml_link_state = A_surfxml_link_state_ON;
        YY_BREAK
 case 383:
 /* rule 383 can match eol */
 case 384:
 /* rule 384 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_state = A_surfxml_link_state_ON;
+A_surfxml_link_state = A_surfxml_link_state_OFF;
        YY_BREAK
 case 385:
 /* rule 385 can match eol */
+YY_RULE_SETUP
+if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
+       YY_BREAK
 case 386:
 /* rule 386 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_state = A_surfxml_link_state_OFF;
+if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
 case 387:
 /* rule 387 can match eol */
-YY_RULE_SETUP
-if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
-       YY_BREAK
 case 388:
 /* rule 388 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
        YY_BREAK
 case 389:
 /* rule 389 can match eol */
 case 390:
 /* rule 390 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
        YY_BREAK
 case 391:
 /* rule 391 can match eol */
 case 392:
 /* rule 392 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
-       YY_BREAK
-case 393:
-/* rule 393 can match eol */
-case 394:
-/* rule 394 can match eol */
-YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
        YY_BREAK
-case 395:
+case 393:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8136,7 +8142,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 396:
+case 394:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8148,11 +8154,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 397:
+case 395:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
-case 398:
+case 396:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8160,8 +8166,8 @@ case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 399:
-/* rule 399 can match eol */
+case 397:
+/* rule 397 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8173,12 +8179,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 400:
-/* rule 400 can match eol */
+case 398:
+/* rule 398 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
-case 401:
+case 399:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8188,13 +8194,13 @@ case YY_STATE_EOF(S_surfxml_link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 402:
-/* rule 402 can match eol */
+case 400:
+/* rule 400 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <route> is not allowed here.");
        YY_BREAK
-case 403:
-/* rule 403 can match eol */
+case 401:
+/* rule 401 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_src = 0;
@@ -8207,41 +8213,41 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 402:
+/* rule 402 can match eol */
+YY_RULE_SETUP
+if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
+       YY_BREAK
+case 403:
+/* rule 403 can match eol */
+YY_RULE_SETUP
+if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
+       YY_BREAK
 case 404:
 /* rule 404 can match eol */
 YY_RULE_SETUP
-if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
+if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
 case 405:
 /* rule 405 can match eol */
 YY_RULE_SETUP
-if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
+if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
 case 406:
 /* rule 406 can match eol */
-YY_RULE_SETUP
-if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
-       YY_BREAK
 case 407:
 /* rule 407 can match eol */
 YY_RULE_SETUP
-if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
+A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
        YY_BREAK
 case 408:
 /* rule 408 can match eol */
 case 409:
 /* rule 409 can match eol */
 YY_RULE_SETUP
-A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
-       YY_BREAK
-case 410:
-/* rule 410 can match eol */
-case 411:
-/* rule 411 can match eol */
-YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
        YY_BREAK
-case 412:
+case 410:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8249,7 +8255,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 413:
+case 411:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8260,11 +8266,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 414:
+case 412:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
-case 415:
+case 413:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8272,8 +8278,8 @@ case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 416:
-/* rule 416 can match eol */
+case 414:
+/* rule 414 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8284,12 +8290,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 417:
-/* rule 417 can match eol */
+case 415:
+/* rule 415 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
-case 418:
+case 416:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8299,13 +8305,13 @@ case YY_STATE_EOF(E_surfxml_route):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 419:
-/* rule 419 can match eol */
+case 417:
+/* rule 417 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <ASroute> is not allowed here.");
        YY_BREAK
-case 420:
-/* rule 420 can match eol */
+case 418:
+/* rule 418 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_ASroute_src = 0;
@@ -8322,61 +8328,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 419:
+/* rule 419 can match eol */
+YY_RULE_SETUP
+if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
+       YY_BREAK
+case 420:
+/* rule 420 can match eol */
+YY_RULE_SETUP
+if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");}  surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
+       YY_BREAK
 case 421:
 /* rule 421 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
+if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
 case 422:
 /* rule 422 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");}  surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
+if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");}  surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
 case 423:
 /* rule 423 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
+if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
 case 424:
 /* rule 424 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");}  surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
+if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");}  surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
 case 425:
 /* rule 425 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
+if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
        YY_BREAK
 case 426:
 /* rule 426 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");}  surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
+if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");}  surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
        YY_BREAK
 case 427:
 /* rule 427 can match eol */
-YY_RULE_SETUP
-if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
-       YY_BREAK
 case 428:
 /* rule 428 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");}  surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
+A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
        YY_BREAK
 case 429:
 /* rule 429 can match eol */
 case 430:
 /* rule 430 can match eol */
 YY_RULE_SETUP
-A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
-       YY_BREAK
-case 431:
-/* rule 431 can match eol */
-case 432:
-/* rule 432 can match eol */
-YY_RULE_SETUP
 A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
        YY_BREAK
-case 433:
+case 431:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8386,7 +8392,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute);
  }
        YY_BREAK
-case 434:
+case 432:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8399,11 +8405,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 435:
+case 433:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 436:
+case 434:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8411,8 +8417,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute):
 FAIL("EOF in attribute list of `ASroute' element.");
        YY_BREAK
 
-case 437:
-/* rule 437 can match eol */
+case 435:
+/* rule 435 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8423,12 +8429,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 438:
-/* rule 438 can match eol */
+case 436:
+/* rule 436 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 439:
+case 437:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</ASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8438,13 +8444,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</ASroute>' expected.");
        YY_BREAK
 
-case 440:
-/* rule 440 can match eol */
+case 438:
+/* rule 438 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link_ctn> is not allowed here.");
        YY_BREAK
-case 441:
-/* rule 441 can match eol */
+case 439:
+/* rule 439 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link___ctn_id = 0;
@@ -8455,45 +8461,45 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 442:
-/* rule 442 can match eol */
+case 440:
+/* rule 440 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
+case 441:
+/* rule 441 can match eol */
+YY_RULE_SETUP
+if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
+       YY_BREAK
+case 442:
+/* rule 442 can match eol */
 case 443:
 /* rule 443 can match eol */
 YY_RULE_SETUP
-if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
+A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
        YY_BREAK
 case 444:
 /* rule 444 can match eol */
 case 445:
 /* rule 445 can match eol */
 YY_RULE_SETUP
-A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
+A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
        YY_BREAK
 case 446:
 /* rule 446 can match eol */
 case 447:
 /* rule 447 can match eol */
 YY_RULE_SETUP
-A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
-       YY_BREAK
-case 448:
-/* rule 448 can match eol */
-case 449:
-/* rule 449 can match eol */
-YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
        YY_BREAK
-case 450:
+case 448:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
   LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn);
  }
        YY_BREAK
-case 451:
+case 449:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
@@ -8506,11 +8512,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 452:
+case 450:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]);
        YY_BREAK
-case 453:
+case 451:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8518,8 +8524,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn):
 FAIL("EOF in attribute list of `link_ctn' element.");
        YY_BREAK
 
-case 454:
-/* rule 454 can match eol */
+case 452:
+/* rule 452 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8533,12 +8539,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 455:
-/* rule 455 can match eol */
+case 453:
+/* rule 453 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
        YY_BREAK
-case 456:
+case 454:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8546,13 +8552,13 @@ case YY_STATE_EOF(E_surfxml_link___ctn):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link_ctn>' expected.");
        YY_BREAK
 
-case 457:
-/* rule 457 can match eol */
+case 455:
+/* rule 455 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassRoute> is not allowed here.");
        YY_BREAK
-case 458:
-/* rule 458 can match eol */
+case 456:
+/* rule 456 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassRoute_src = 0;
@@ -8563,27 +8569,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 459:
-/* rule 459 can match eol */
+case 457:
+/* rule 457 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 460:
-/* rule 460 can match eol */
+case 458:
+/* rule 458 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");}  surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 461:
-/* rule 461 can match eol */
+case 459:
+/* rule 459 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 462:
-/* rule 462 can match eol */
+case 460:
+/* rule 460 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");}  surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 463:
+case 461:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8591,7 +8597,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute);
  }
        YY_BREAK
-case 464:
+case 462:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8602,11 +8608,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 465:
+case 463:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]);
        YY_BREAK
-case 466:
+case 464:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8614,8 +8620,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute):
 FAIL("EOF in attribute list of `bypassRoute' element.");
        YY_BREAK
 
-case 467:
-/* rule 467 can match eol */
+case 465:
+/* rule 465 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8626,12 +8632,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 468:
-/* rule 468 can match eol */
+case 466:
+/* rule 466 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
        YY_BREAK
-case 469:
+case 467:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8641,13 +8647,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassRoute>' expected.");
        YY_BREAK
 
-case 470:
-/* rule 470 can match eol */
+case 468:
+/* rule 468 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassASroute> is not allowed here.");
        YY_BREAK
-case 471:
-/* rule 471 can match eol */
+case 469:
+/* rule 469 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassASroute_src = 0;
@@ -8662,47 +8668,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 470:
+/* rule 470 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
+       YY_BREAK
+case 471:
+/* rule 471 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
+       YY_BREAK
 case 472:
 /* rule 472 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
+if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
 case 473:
 /* rule 473 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
+if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
 case 474:
 /* rule 474 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
+if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
 case 475:
 /* rule 475 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
+if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
 case 476:
 /* rule 476 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
+if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
 case 477:
 /* rule 477 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
-       YY_BREAK
-case 478:
-/* rule 478 can match eol */
-YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
-       YY_BREAK
-case 479:
-/* rule 479 can match eol */
-YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
-case 480:
+case 478:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -8712,7 +8718,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute);
  }
        YY_BREAK
-case 481:
+case 479:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -8725,11 +8731,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 482:
+case 480:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 483:
+case 481:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8737,8 +8743,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute):
 FAIL("EOF in attribute list of `bypassASroute' element.");
        YY_BREAK
 
-case 484:
-/* rule 484 can match eol */
+case 482:
+/* rule 482 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8749,12 +8755,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 485:
-/* rule 485 can match eol */
+case 483:
+/* rule 483 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 486:
+case 484:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8764,22 +8770,22 @@ case YY_STATE_EOF(S_surfxml_bypassASroute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassASroute>' expected.");
        YY_BREAK
 
-case 487:
-/* rule 487 can match eol */
+case 485:
+/* rule 485 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <process> is not allowed here.");
        YY_BREAK
-case 488:
-/* rule 488 can match eol */
+case 486:
+/* rule 486 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_host = 0;
   surfxml_process_host_isset = 0;
   AX_surfxml_process_function = 0;
   surfxml_process_function_isset = 0;
-  AX_surfxml_process_start___time = 32;
+  AX_surfxml_process_start___time = 28;
   surfxml_process_start___time_isset = 0;
-  AX_surfxml_process_kill___time = 37;
+  AX_surfxml_process_kill___time = 33;
   surfxml_process_kill___time_isset = 0;
   AX_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
   surfxml_process_on___failure_isset = 0;
@@ -8787,61 +8793,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
+case 487:
+/* rule 487 can match eol */
+YY_RULE_SETUP
+if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
+       YY_BREAK
+case 488:
+/* rule 488 can match eol */
+YY_RULE_SETUP
+if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
+       YY_BREAK
 case 489:
 /* rule 489 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
+if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 case 490:
 /* rule 490 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
+if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 case 491:
 /* rule 491 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
+if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
 case 492:
 /* rule 492 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
+if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
 case 493:
 /* rule 493 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
+if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
 case 494:
 /* rule 494 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
+if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
 case 495:
 /* rule 495 can match eol */
-YY_RULE_SETUP
-if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
-       YY_BREAK
 case 496:
 /* rule 496 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
+A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
        YY_BREAK
 case 497:
 /* rule 497 can match eol */
 case 498:
 /* rule 498 can match eol */
 YY_RULE_SETUP
-A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
-       YY_BREAK
-case 499:
-/* rule 499 can match eol */
-case 500:
-/* rule 500 can match eol */
-YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
        YY_BREAK
-case 501:
+case 499:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -8849,7 +8855,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 502:
+case 500:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -8860,11 +8866,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 503:
+case 501:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
-case 504:
+case 502:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8872,8 +8878,8 @@ case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 505:
-/* rule 505 can match eol */
+case 503:
+/* rule 503 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8884,12 +8890,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 506:
-/* rule 506 can match eol */
+case 504:
+/* rule 504 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
-case 507:
+case 505:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8899,13 +8905,13 @@ case YY_STATE_EOF(S_surfxml_process_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</process>' expected.");
        YY_BREAK
 
-case 508:
-/* rule 508 can match eol */
+case 506:
+/* rule 506 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <argument> is not allowed here.");
        YY_BREAK
-case 509:
-/* rule 509 can match eol */
+case 507:
+/* rule 507 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
@@ -8914,24 +8920,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 510:
-/* rule 510 can match eol */
+case 508:
+/* rule 508 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 511:
-/* rule 511 can match eol */
+case 509:
+/* rule 509 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");}  surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 512:
+case 510:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
   LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument);
  }
        YY_BREAK
-case 513:
+case 511:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
@@ -8941,11 +8947,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 514:
+case 512:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
-case 515:
+case 513:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8953,8 +8959,8 @@ case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 516:
-/* rule 516 can match eol */
+case 514:
+/* rule 514 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8965,12 +8971,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 517:
-/* rule 517 can match eol */
+case 515:
+/* rule 515 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
-case 518:
+case 516:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8978,13 +8984,13 @@ case YY_STATE_EOF(E_surfxml_argument):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</argument>' expected.");
        YY_BREAK
 
-case 519:
-/* rule 519 can match eol */
+case 517:
+/* rule 517 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <config> is not allowed here.");
        YY_BREAK
-case 520:
-/* rule 520 can match eol */
+case 518:
+/* rule 518 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_config_id = 0;
@@ -8993,23 +8999,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 521:
-/* rule 521 can match eol */
+case 519:
+/* rule 519 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 522:
-/* rule 522 can match eol */
+case 520:
+/* rule 520 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");}  surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 523:
+case 521:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
  }
        YY_BREAK
-case 524:
+case 522:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
@@ -9018,11 +9024,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 525:
+case 523:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]);
        YY_BREAK
-case 526:
+case 524:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9030,8 +9036,8 @@ case YY_STATE_EOF(AL_surfxml_config):
 FAIL("EOF in attribute list of `config' element.");
        YY_BREAK
 
-case 527:
-/* rule 527 can match eol */
+case 525:
+/* rule 525 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9042,12 +9048,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 528:
-/* rule 528 can match eol */
+case 526:
+/* rule 526 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
        YY_BREAK
-case 529:
+case 527:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9059,13 +9065,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</config>' expected.");
 
 /* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST prop key CDATA #REQUIRED> -->  */
-case 530:
-/* rule 530 can match eol */
+case 528:
+/* rule 528 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <prop> is not allowed here.");
        YY_BREAK
-case 531:
-/* rule 531 can match eol */
+case 529:
+/* rule 529 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_prop_id = 0;
@@ -9076,27 +9082,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 532:
-/* rule 532 can match eol */
+case 530:
+/* rule 530 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 533:
-/* rule 533 can match eol */
+case 531:
+/* rule 531 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");}  surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 534:
-/* rule 534 can match eol */
+case 532:
+/* rule 532 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 535:
-/* rule 535 can match eol */
+case 533:
+/* rule 533 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");}  surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 536:
+case 534:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9104,7 +9110,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 537:
+case 535:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9113,19 +9119,20 @@ YY_RULE_SETUP
   switch (YY_START) {
    case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break;
    case S_surfxml_storage_1: case S_surfxml_storage_2: case S_surfxml_storage: SET(S_surfxml_storage_2); break;
-   case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
-   case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
+   case S_surfxml_cluster_2: case S_surfxml_cluster: case S_surfxml_cluster_1: SET(S_surfxml_cluster_2); break;
    case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
+   case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
+   case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
   }
  }
        YY_BREAK
-case 538:
+case 536:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
-case 539:
+case 537:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9133,8 +9140,8 @@ case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 540:
-/* rule 540 can match eol */
+case 538:
+/* rule 538 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9143,20 +9150,21 @@ YY_RULE_SETUP
   switch (YY_START) {
    case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break;
    case S_surfxml_storage_1: case S_surfxml_storage_2: case S_surfxml_storage: SET(S_surfxml_storage_2); break;
-   case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
-   case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
+   case S_surfxml_cluster_2: case S_surfxml_cluster: case S_surfxml_cluster_1: SET(S_surfxml_cluster_2); break;
    case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
+   case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
+   case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
   }
  }
        YY_BREAK
-case 541:
-/* rule 541 can match eol */
+case 539:
+/* rule 539 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
-case 542:
+case 540:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9166,7 +9174,7 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</prop>' expected.");
 
 /* EPILOG: after the root element. */
 
-case 543:
+case 541:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -9177,58 +9185,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 544:
+case 542:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 545:
+case 543:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 546:
+case 544:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 547:
+case 545:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 548:
+case 546:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 549:
+case 547:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
-case 550:
+case 548:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
+case 549:
+/* rule 549 can match eol */
+case 550:
+/* rule 550 can match eol */
 case 551:
 /* rule 551 can match eol */
 case 552:
 /* rule 552 can match eol */
-case 553:
-/* rule 553 can match eol */
-case 554:
-/* rule 554 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 555:
+case 553:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 556:
+case 554:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 557:
+case 555:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9236,7 +9244,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 558:
+case 556:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9244,22 +9252,22 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 559:
-/* rule 559 can match eol */
+case 557:
+/* rule 557 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
-case 560:
+case 558:
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
-case 561:
+case 559:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 562:
+case 560:
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
@@ -9271,13 +9279,13 @@ FAIL("EOF in CDATA section.");
 /* Ideally, this should be replaced by code in flexml.pl that
     generates just the states not covered by other rules. */
 
-case 563:
-/* rule 563 can match eol */
+case 561:
+/* rule 561 can match eol */
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
-case 564:
+case 562:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -9296,6 +9304,7 @@ case YY_STATE_EOF(S_surfxml_AS_15):
 case YY_STATE_EOF(S_surfxml_storage___type_1):
 case YY_STATE_EOF(S_surfxml_storage_1):
 case YY_STATE_EOF(S_surfxml_host_1):
+case YY_STATE_EOF(S_surfxml_cluster_1):
 case YY_STATE_EOF(S_surfxml_link_1):
 case YY_STATE_EOF(S_surfxml_route_1):
 case YY_STATE_EOF(S_surfxml_ASroute_1):
@@ -9594,7 +9603,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 3289 )
+                       if ( yy_current_state >= 3286 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -9622,11 +9631,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 3289 )
+               if ( yy_current_state >= 3286 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 3288);
+       yy_is_jam = (yy_current_state == 3285);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
index 9de73f7..4684a82 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. The SimGrid Team.
+/* Copyright (c) 2004 - 2013. The SimGrid Team.
  * All rights reserved.                                                                 */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -6,7 +6,6 @@
 
 #include "xbt/ex.h"
 #include "xbt/dict.h"
-#include "xbt/file_stat.h"
 #include "portable.h"
 #include "surf_private.h"
 #include "storage_private.h"
@@ -35,19 +34,10 @@ static xbt_dynar_t storage_list;
 #define GENERIC_LMM_ACTION(action) action->generic_lmm_action
 #define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
 
-static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size);
+static xbt_dict_t parse_storage_content(char *filename, size_t *used_size);
 static int storage_action_unref(surf_action_t action);
 static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state);
-static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type);
-static void free_storage_content(void *p);
-
-static surf_action_t storage_action_stat(void *storage, surf_file_t stream)
-{
-  surf_action_t action = storage_action_execute(storage,0, STAT);
-  action->file = stream;
-  action->stat = stream->content->stat;
-  return action;
-}
+static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_action_storage_type_t type);
 
 static surf_action_t storage_action_ls(void *storage, const char* path)
 {
@@ -56,14 +46,14 @@ static surf_action_t storage_action_ls(void *storage, const char* path)
   xbt_dict_t ls_dict = xbt_dict_new();
 
   char* key;
-  surf_stat_t data = NULL;
+  size_t size = 0;
   xbt_dict_cursor_t cursor = NULL;
 
   xbt_dynar_t dyn = NULL;
   char* file = NULL;
 
-  // foreach file int the storage
-  xbt_dict_foreach(((storage_t)storage)->content,cursor,key,data){
+  // for each file in the storage content
+  xbt_dict_foreach(((storage_t)storage)->content,cursor,key,size){
     // Search if file start with the prefix 'path'
     if(xbt_str_start_with(key,path)){
       file = &key[strlen(path)];
@@ -74,12 +64,12 @@ static surf_action_t storage_action_ls(void *storage, const char* path)
 
       // file
       if(xbt_dynar_length(dyn) == 1){
-        xbt_dict_set(ls_dict,file,&(data->stat),NULL);
+        xbt_dict_set(ls_dict,file,&size,NULL);
       }
       // Directory
       else
       {
-        // if directory does not exist yet in dict
+        // if directory does not exist yet in the dictionary
         if(!xbt_dict_get_or_null(ls_dict,file))
           xbt_dict_set(ls_dict,file,NULL,NULL);
       }
@@ -91,88 +81,65 @@ static surf_action_t storage_action_ls(void *storage, const char* path)
   return action;
 }
 
-static surf_action_t storage_action_unlink(void *storage, surf_file_t stream)
-{
-  surf_action_t action = storage_action_execute(storage,0, UNLINK);
-
-  // Add memory to storage
-  ((storage_t)storage)->used_size -= stream->content->stat.size;
-
-  // Remove the file from storage
-  xbt_dict_t content_dict = ((storage_t)storage)->content;
-  xbt_dict_remove(content_dict,stream->name);
-
-  free(stream->name);
-  xbt_free(stream);
-
-  return action;
-}
-
-static surf_action_t storage_action_open(void *storage, const char* mount, const char* path, const char* mode)
+static surf_action_t storage_action_open(void *storage, const char* mount,
+                                         const char* path)
 {
   XBT_DEBUG("\tOpen file '%s'",path);
   xbt_dict_t content_dict = ((storage_t)storage)->content;
-  surf_stat_t content = xbt_dict_get_or_null(content_dict,path);
-
+  size_t size = (size_t) xbt_dict_get_or_null(content_dict,path);
   // if file does not exist create an empty file
-  if(!content){
-    content = xbt_new0(s_surf_stat_t,1);
-    content->stat.date = xbt_strdup("");
-    content->stat.group = xbt_strdup("");
-    content->stat.size = 0;
-    content->stat.time = xbt_strdup("");
-    content->stat.user = xbt_strdup("");
-    content->stat.user_rights = xbt_strdup("");
-    xbt_dict_set(content_dict,path,content,NULL);
+  if(!size){
+    xbt_dict_set(content_dict,path,&size,NULL);
     XBT_DEBUG("File '%s' was not found, file created.",path);
   }
   surf_file_t file = xbt_new0(s_surf_file_t,1);
   file->name = xbt_strdup(path);
-  file->content = content;
-  file->storage = mount;
+  file->size = size;
+  file->mount = xbt_strdup(mount);
 
   surf_action_t action = storage_action_execute(storage,0, OPEN);
   action->file = (void *)file;
   return action;
 }
 
-static surf_action_t storage_action_close(void *storage, surf_file_t fp)
+static surf_action_t storage_action_close(void *storage, surf_file_t fd)
 {
-  char *filename = fp->name;
-  XBT_DEBUG("\tClose file '%s' size '%f'",filename,fp->content->stat.size);
+  char *filename = fd->name;
+  XBT_DEBUG("\tClose file '%s' size '%zu'",filename,fd->size);
   // unref write actions from storage
   surf_action_storage_t write_action;
   unsigned int i;
   xbt_dynar_foreach(((storage_t)storage)->write_actions,i,write_action) {
-    if ((write_action->generic_lmm_action.generic_action.file) == fp) {
+    if ((write_action->generic_lmm_action.generic_action.file) == fd) {
       xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i);
       storage_action_unref((surf_action_t) write_action);
     }
   }
 
-  free(fp->name);
-  xbt_free(fp);
+  free(fd->name);
+  free(fd->mount);
+  xbt_free(fd);
   surf_action_t action = storage_action_execute(storage,0, CLOSE);
   return action;
 }
 
-static surf_action_t storage_action_read(void *storage, void* ptr, double size, size_t nmemb, surf_file_t stream)
+static surf_action_t storage_action_read(void *storage, size_t size,
+                                         surf_file_t fd)
 {
-  surf_stat_t content = stream->content;
-  if(size > content->stat.size)
-    size = content->stat.size;
+  if(size > fd->size)
+    size = fd->size;
   surf_action_t action = storage_action_execute(storage,size,READ);
   return action;
 }
 
-static surf_action_t storage_action_write(void *storage, const void* ptr, size_t size, size_t nmemb, surf_file_t stream)
+static surf_action_t storage_action_write(void *storage, size_t size, 
+                                          surf_file_t fd)
 {
-  char *filename = stream->name;
-  surf_stat_t content = stream->content;
-  XBT_DEBUG("\tWrite file '%s' size '%zu/%f'",filename,size,content->stat.size);
+  char *filename = fd->name;
+  XBT_DEBUG("\tWrite file '%s' size '%zu/%zu'",filename,size,fd->size);
 
   surf_action_t action = storage_action_execute(storage,size,WRITE);
-  action->file = stream;
+  action->file = fd;
 
   // If the storage is full
   if(((storage_t)storage)->used_size==((storage_t)storage)->size) {
@@ -181,12 +148,12 @@ static surf_action_t storage_action_write(void *storage, const void* ptr, size_t
   return action;
 }
 
-static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type)
+static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_action_storage_type_t type)
 {
   surf_action_storage_t action = NULL;
   storage_t STORAGE = storage;
 
-  XBT_IN("(%s,%f)", surf_resource_name(STORAGE), size);
+  XBT_IN("(%s,%zu", surf_resource_name(STORAGE), size);
   action =
       surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model,
           STORAGE->state_current != SURF_RESOURCE_ON);
@@ -207,7 +174,6 @@ static surf_action_t storage_action_execute (void *storage, double size, e_surf_
   case OPEN:
   case CLOSE:
   case STAT:
-  case UNLINK:
   case LS:
     break;
   case READ:
@@ -242,10 +208,14 @@ static void* storage_create_resource(const char* id, const char* model,const cha
   storage->write_actions = xbt_dynar_new(sizeof(char *),NULL);
 
   storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
-  double Bread  = atof(xbt_dict_get(storage_type->properties,"Bread"));
-  double Bwrite = atof(xbt_dict_get(storage_type->properties,"Bwrite"));
-  double Bconnection   = atof(xbt_dict_get(storage_type->properties,"Bconnection"));
-  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%ld'",Bconnection,Bread,Bwrite,storage_type->size);
+  double Bread =
+      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bread"));
+  double Bwrite =
+      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bwrite"));
+  double Bconnection =
+      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,
+                                            "Bconnection"));
+  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%lu'",Bconnection,Bread,Bwrite,(unsigned long)storage_type->size);
   storage->constraint       = lmm_constraint_new(storage_maxmin_system, storage, Bconnection);
   storage->constraint_read  = lmm_constraint_new(storage_maxmin_system, storage, Bread);
   storage->constraint_write = lmm_constraint_new(storage_maxmin_system, storage, Bwrite);
@@ -290,13 +260,16 @@ static void storage_update_actions_state(double now, double delta)
 
   // Update the disk usage
   // Update the file size
-  // Foreach action of type write
+  // For each action of type write
   xbt_swag_foreach_safe(action, next_action, running_actions) {
     if(action->type == WRITE)
     {
       double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable);
-      ((storage_t)(action->storage))->used_size += delta * rate; // disk usage
-      ((surf_action_t)action)->file->content->stat.size += delta * rate; // file size
+      /* Hack to avoid rounding differences between x86 and x86_64
+       * (note that the next sizes are of type size_t). */
+      long incr = delta * rate + MAXMIN_PRECISION;
+      ((storage_t)(action->storage))->used_size += incr; // disk usage
+      ((surf_action_t)action)->file->size += incr; // file size
     }
   }
 
@@ -512,8 +485,6 @@ static void surf_storage_model_init_internal(void)
   surf_storage_model->extension.storage.close = storage_action_close;
   surf_storage_model->extension.storage.read = storage_action_read;
   surf_storage_model->extension.storage.write = storage_action_write;
-  surf_storage_model->extension.storage.stat = storage_action_stat;
-  surf_storage_model->extension.storage.unlink = storage_action_unlink;
   surf_storage_model->extension.storage.ls = storage_action_ls;
 
   if (!storage_maxmin_system) {
@@ -552,24 +523,13 @@ static void storage_parse_storage(sg_platf_storage_cbarg_t storage)
       (void *) xbt_strdup(storage->type_id));
 }
 
-static void free_storage_content(void *p)
-{
-  surf_stat_t content = p;
-  free(content->stat.date);
-  free(content->stat.group);
-  free(content->stat.time);
-  free(content->stat.user);
-  free(content->stat.user_rights);
-  free(content);
-}
-
-static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size)
+static xbt_dict_t parse_storage_content(char *filename, size_t *used_size)
 {
   *used_size = 0;
   if ((!filename) || (strcmp(filename, "") == 0))
     return NULL;
 
-  xbt_dict_t parse_content = xbt_dict_new_homogeneous(free_storage_content);
+  xbt_dict_t parse_content = xbt_dict_new_homogeneous(NULL);
   FILE *file = NULL;
 
   file = surf_fopen(filename, "r");
@@ -579,33 +539,17 @@ static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size
   char *line = NULL;
   size_t len = 0;
   ssize_t read;
-  char user_rights[12];
-  char user[100];
-  char group[100];
-  char date[12];
-  char time[12];
   char path[1024];
-  int nb;
-  unsigned long size;
+  size_t size;
 
-  surf_stat_t content;
 
   while ((read = xbt_getline(&line, &len, file)) != -1) {
     if (read){
-    content = xbt_new0(s_surf_stat_t,1);
-    if(sscanf(line,"%s %d %s %s %ld %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) {
-        content->stat.date = xbt_strdup(date);
-        content->stat.group = xbt_strdup(group);
-        content->stat.size = size;
-        content->stat.time = xbt_strdup(time);
-        content->stat.user = xbt_strdup(user);
-        content->stat.user_rights = xbt_strdup(user_rights);
-        *used_size += content->stat.size;
-        xbt_dict_set(parse_content,path,content,NULL);
+    if(sscanf(line,"%s %zu",path, &size)==2) {
+        *used_size += size;
+        xbt_dict_set(parse_content,path,(void*) size,NULL);
       } else {
         xbt_die("Be sure of passing a good format for content file.\n");
-        // You can generate this kind of file with command line:
-        // find /path/you/want -type f -exec ls -l {} \; 2>/dev/null > ./content.txt
       }
     }
   }
@@ -624,7 +568,7 @@ static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_typ
   stype->properties = storage_type->properties;
   stype->content = xbt_strdup(storage_type->content);
   stype->type_id = xbt_strdup(storage_type->id);
-  stype->size = storage_type->size * 1000000000; /* storage_type->size is in Gbytes and stype->sizeis in bytes */
+  stype->size = storage_type->size;
 
   XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s' content '%s'",
       stype->type_id,
index 3079245..41b94c4 100644 (file)
@@ -12,7 +12,7 @@ typedef struct s_storage_type {
   char *content;
   char *type_id;
   xbt_dict_t properties;
-  unsigned long size;
+  size_t size;
 } s_storage_type_t, *storage_type_t;
 
 typedef struct s_mount {
@@ -20,31 +20,26 @@ typedef struct s_mount {
   char *name;
 } s_mount_t, *mount_t;
 
-typedef struct surf_stat { /* file status structure */
-  s_file_stat_t stat;
-  /* possible additionnal fields (e.g., popularity, last access time to know whether the file is in cache, ...) */
-} s_surf_stat_t;
-
 typedef struct surf_file {
   char *name;
-  surf_stat_t content;
-  const char* storage;
+  char *mount;
+  size_t size;
 } s_surf_file_t;
 
 typedef struct storage {
-  s_surf_resource_t generic_resource;   /*< Structure with generic data. Needed at begin to interate with SURF */
+  s_surf_resource_t generic_resource;   /*< Structure with generic data. Needed at begin to interact with SURF */
   e_surf_resource_state_t state_current;        /*< STORAGE current state (ON or OFF) */
-  lmm_constraint_t constraint;          /* Constraint for maximum bandwidth from connexion */
+  lmm_constraint_t constraint;          /* Constraint for maximum bandwidth from connection */
   lmm_constraint_t constraint_write;    /* Constraint for maximum write bandwidth*/
   lmm_constraint_t constraint_read;     /* Constraint for maximum write bandwidth*/
-  xbt_dict_t content; /* char * -> s_surf_stat_t */
-  unsigned long size;
-  unsigned long used_size;
+  xbt_dict_t content; /* char * -> s_surf_file_t */
+  size_t size;
+  size_t used_size;
   xbt_dynar_t write_actions;
 } s_storage_t, *storage_t;
 
 typedef enum {
-  READ=0, WRITE, STAT, OPEN, CLOSE, UNLINK, LS
+  READ=0, WRITE, STAT, OPEN, CLOSE, LS
 } e_surf_action_storage_type_t;
 
 typedef struct surf_action_storage {
index 867db6b..24b92be 100644 (file)
@@ -104,7 +104,6 @@ int net_get_link_latency_limited(surf_action_t action);
  */
 int __surf_is_absolute_file_path(const char *file_path);
 
-typedef struct s_as *AS_t;
 typedef struct s_routing_edge {
   AS_t rc_component;
   e_surf_network_element_type_t rc_type;
index 919022a..7380bf6 100644 (file)
@@ -1240,3 +1240,36 @@ void routing_exit(void) {
   finalize_rec(routing_platf->root);
   xbt_free(routing_platf);
 }
+
+AS_t surf_AS_get_routing_root() {
+  return routing_platf->root;  
+}
+
+const char *surf_AS_get_name(AS_t as) {
+  return as->name;
+}
+
+xbt_dict_t surf_AS_get_routing_sons(AS_t as) {
+  return as->routing_sons;
+}
+
+const char *surf_AS_get_model(AS_t as) {
+  return as->model_desc->name;
+}
+
+xbt_dynar_t surf_AS_get_hosts(AS_t as) {
+  xbt_dynar_t elms = as->index_network_elm;
+  sg_routing_edge_t relm;
+  xbt_dictelm_t delm;
+  int index;
+  int count = xbt_dynar_length(elms);
+  xbt_dynar_t res =  xbt_dynar_new(sizeof(xbt_dictelm_t), NULL);
+  for (index = 0; index < count; index++) {
+     relm = xbt_dynar_get_as(elms, index, sg_routing_edge_t);
+     delm = xbt_lib_get_elm_or_null(host_lib, relm->name);
+     if (delm!=NULL) {
+       xbt_dynar_push(res, &delm);
+     }
+  }
+  return res;
+}
index 4b0d4c9..d225cd4 100644 (file)
@@ -51,7 +51,7 @@ static void graph_node_map_elem_free(void *e)
   xbt_free(elm);
 }
 
-static void graph_edge_data_free(void *e) // FIXME: useless code dupplication
+static void graph_edge_data_free(void *e) // FIXME: useless code duplication
 {
   sg_platf_route_cbarg_t e_route = (sg_platf_route_cbarg_t) e;
   if (e_route) {
index 4fc2651..36ddde5 100644 (file)
@@ -109,6 +109,33 @@ double surf_parse_get_time(const char *string)
   return surf_parse_get_value_with_unit(string, units);
 }
 
+double surf_parse_get_size(const char *string)
+{
+  const struct unit_scale units[] = {
+    { "TiB", pow(1024, 4) },
+    { "GiB", pow(1024, 3) },
+    { "MiB", pow(1024, 2) },
+    { "KiB", 1024 },
+    { "TB",  1e12 },
+    { "GB",  1e9 },
+    { "MB",  1e6 },
+    { "kB",  1e3 },
+    { "B",   1.0 },
+    { "",      1.0 },           /* default unit is bytes*/
+    { "Tib", 0.125 * pow(1024, 4) },
+    { "Gib", 0.125 * pow(1024, 3) },
+    { "Mib", 0.125 * pow(1024, 2) },
+    { "Kib", 0.125 * 1024 },
+    { "Tb",  0.125 * 1e12 },
+    { "Gb",  0.125 * 1e9 },
+    { "Mb",  0.125 * 1e6 },
+    { "kb",  0.125 * 1e3 },
+    { "b",   0.125 },
+    { NULL,    0 }
+  };
+  return surf_parse_get_value_with_unit(string, units);
+}
+
 double surf_parse_get_bandwidth(const char *string)
 {
   const struct unit_scale units[] = {
@@ -224,7 +251,7 @@ void ETag_surfxml_storage___type(void)
   storage_type.id = A_surfxml_storage___type_id;
   storage_type.model = A_surfxml_storage___type_model;
   storage_type.properties = current_property_set;
-  storage_type.size = surf_parse_get_int(A_surfxml_storage___type_size);
+  storage_type.size = surf_parse_get_size(A_surfxml_storage___type_size);
   sg_platf_new_storage_type(&storage_type);
   current_property_set = NULL;
 }
@@ -463,9 +490,11 @@ void STag_surfxml_router(void){
   sg_platf_new_router(&router);
 }
 
-void STag_surfxml_cluster(void){
+void ETag_surfxml_cluster(void){
   s_sg_platf_cluster_cbarg_t cluster;
   memset(&cluster,0,sizeof(cluster));
+  cluster.properties = current_property_set;
+
   cluster.id = A_surfxml_cluster_id;
   cluster.prefix = A_surfxml_cluster_prefix;
   cluster.suffix = A_surfxml_cluster_suffix;
@@ -517,6 +546,12 @@ void STag_surfxml_cluster(void){
   cluster.availability_trace = A_surfxml_cluster_availability___file;
   cluster.state_trace = A_surfxml_cluster_state___file;
   sg_platf_new_cluster(&cluster);
+  
+  current_property_set = NULL;
+}
+
+void STag_surfxml_cluster(void){ 
+  xbt_assert(current_property_set == NULL, "Someone forgot to reset the property set to NULL in its closing tag (or XML malformed)");
 }
 
 void STag_surfxml_cabinet(void){
@@ -916,7 +951,6 @@ void ETag_surfxml_trace___connect(void){}
 void STag_surfxml_trace(void){}
 void ETag_surfxml_router(void){}
 void ETag_surfxml_host___link(void){}
-void ETag_surfxml_cluster(void){}
 void ETag_surfxml_cabinet(void){}
 void ETag_surfxml_peer(void){}
 void STag_surfxml_backbone(void){}
index 362092f..9496b25 100644 (file)
@@ -227,6 +227,14 @@ static double ws_get_speed(void *workstation, double load)
       get_speed(workstation, load);
 }
 
+static int ws_get_core(void *workstation)
+{
+  return surf_cpu_model->extension.cpu.
+      get_core(workstation);
+}
+
+
+
 static double ws_get_available_speed(void *workstation)
 {
   return surf_cpu_model->extension.cpu.
@@ -336,7 +344,7 @@ static xbt_dict_t ws_get_properties(const void *ws)
   return surf_resource_properties(surf_cpu_resource_priv(ws));
 }
 
-static storage_t find_storage_on_mount_list(void *workstation,const char* storage)
+static storage_t find_storage_on_mount_list(void *workstation,const char* mount)
 {
   storage_t st = NULL;
   s_mount_t mnt;
@@ -344,68 +352,85 @@ static storage_t find_storage_on_mount_list(void *workstation,const char* storag
   workstation_CLM03_t ws = (workstation_CLM03_t) surf_workstation_resource_priv(workstation);
   xbt_dynar_t storage_list = ws->storage;
 
-  XBT_DEBUG("Search for storage name '%s' on '%s'",storage,ws->generic_resource.name);
+  XBT_DEBUG("Search for storage name '%s' on '%s'",mount,ws->generic_resource.name);
   xbt_dynar_foreach(storage_list,cursor,mnt)
   {
     XBT_DEBUG("See '%s'",mnt.name);
-    if(!strcmp(storage,mnt.name)){
+    if(!strcmp(mount,mnt.name)){
       st = mnt.id;
       break;
     }
   }
-  if(!st) xbt_die("Can't find mount '%s' for '%s'",storage,ws->generic_resource.name);
+  if(!st) xbt_die("Can't find mount '%s' for '%s'",mount,ws->generic_resource.name);
   return st;
 }
 
-static surf_action_t ws_action_open(void *workstation, const char* mount, const char* path, const char* mode)
+static surf_action_t ws_action_open(void *workstation, const char* mount,
+                                    const char* path)
 {
   storage_t st = find_storage_on_mount_list(workstation, mount);
   XBT_DEBUG("OPEN on disk '%s'",st->generic_resource.name);
   surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.open(st, mount, path, mode);
+  return model->extension.storage.open(st, mount, path);
 }
 
-static surf_action_t ws_action_close(void *workstation, surf_file_t fp)
+static surf_action_t ws_action_close(void *workstation, surf_file_t fd)
 {
-  storage_t st = find_storage_on_mount_list(workstation, fp->storage);
+  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
   XBT_DEBUG("CLOSE on disk '%s'",st->generic_resource.name);
   surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.close(st, fp);
+  return model->extension.storage.close(st, fd);
 }
 
-static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size, size_t nmemb, surf_file_t stream)
+static surf_action_t ws_action_read(void *workstation, size_t size,
+                                    surf_file_t fd)
 {
-  storage_t st = find_storage_on_mount_list(workstation, stream->storage);
+  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
   XBT_DEBUG("READ on disk '%s'",st->generic_resource.name);
   surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.read(st, ptr, (double)size, nmemb, stream);
+  return model->extension.storage.read(st, size, fd);
 }
 
-static surf_action_t ws_action_write(void *workstation, const void* ptr, size_t size, size_t nmemb, surf_file_t stream)
+static surf_action_t ws_action_write(void *workstation, size_t size, 
+                                     surf_file_t fd)
 {
-  storage_t st = find_storage_on_mount_list(workstation, stream->storage);
+  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
   XBT_DEBUG("WRITE on disk '%s'",st->generic_resource.name);
   surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.write(st,  ptr, size, nmemb, stream);
+  return model->extension.storage.write(st, size, fd);
 }
 
-static surf_action_t ws_action_stat(void *workstation, surf_file_t stream)
+static int ws_file_unlink(void *workstation, surf_file_t fd)
 {
-  storage_t st = find_storage_on_mount_list(workstation, stream->storage);
-  XBT_DEBUG("STAT on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.stat(st,  stream);
-}
-
-static surf_action_t ws_action_unlink(void *workstation, surf_file_t stream)
-{
-  storage_t st = find_storage_on_mount_list(workstation, stream->storage);
-  XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.unlink(st,  stream);
+  if (!fd){
+    XBT_WARN("No such file descriptor. Impossible to unlink");
+    return 0;
+  } else {
+//    XBT_INFO("%s %zu", fd->storage, fd->size);
+    storage_t st = find_storage_on_mount_list(workstation, fd->mount);
+    xbt_dict_t content_dict = (st)->content;
+    /* Check if the file is on this storage */
+    if (!xbt_dict_get_or_null(content_dict, fd->name)){
+      XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name,
+          st->generic_resource.name);
+      return 0;
+    } else {
+      XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name);
+      st->used_size -= fd->size;
+
+      // Remove the file from storage
+      xbt_dict_remove(content_dict,fd->name);
+
+      free(fd->name);
+      free(fd->mount);
+      xbt_free(fd);
+      return 1;
+    }
+  }
 }
 
-static surf_action_t ws_action_ls(void *workstation, const char* mount, const char *path)
+static surf_action_t ws_action_ls(void *workstation, const char* mount,
+                                  const char *path)
 {
   XBT_DEBUG("LS on mount '%s' and file '%s'",mount, path);
   storage_t st = find_storage_on_mount_list(workstation, mount);
@@ -413,6 +438,11 @@ static surf_action_t ws_action_ls(void *workstation, const char* mount, const ch
   return model->extension.storage.ls(st, path);
 }
 
+static size_t ws_file_get_size(void *workstation, surf_file_t fd)
+{
+  return fd->size;
+}
+
 static void surf_workstation_model_init_internal(void)
 {
   surf_workstation_model = surf_model_init();
@@ -447,6 +477,7 @@ static void surf_workstation_model_init_internal(void)
   surf_workstation_model->extension.workstation.execute = ws_execute;
   surf_workstation_model->extension.workstation.sleep = ws_action_sleep;
   surf_workstation_model->extension.workstation.get_state = ws_get_state;
+  surf_workstation_model->extension.workstation.get_core = ws_get_core;
   surf_workstation_model->extension.workstation.get_speed = ws_get_speed;
   surf_workstation_model->extension.workstation.get_available_speed =
       ws_get_available_speed;
@@ -474,9 +505,9 @@ static void surf_workstation_model_init_internal(void)
   surf_workstation_model->extension.workstation.close = ws_action_close;
   surf_workstation_model->extension.workstation.read = ws_action_read;
   surf_workstation_model->extension.workstation.write = ws_action_write;
-  surf_workstation_model->extension.workstation.stat = ws_action_stat;
-  surf_workstation_model->extension.workstation.unlink = ws_action_unlink;
+  surf_workstation_model->extension.workstation.unlink = ws_file_unlink;
   surf_workstation_model->extension.workstation.ls = ws_action_ls;
+  surf_workstation_model->extension.workstation.get_size = ws_file_get_size;
 }
 
 void surf_workstation_model_init_current_default(void)
index 0a13e38..56cc4b6 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
 
 /* Bison implementation for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
    
    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
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.5"
+#define YYBISON_VERSION "2.7.12-4996"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -58,8 +58,6 @@
 /* Pull parsers.  */
 #define YYPULL 1
 
-/* Using locations.  */
-#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         xbt_automaton_parser_parse
 #define yydebug         xbt_automaton_parser_debug
 #define yynerrs         xbt_automaton_parser_nerrs
 
-
 /* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
+/* Line 371 of yacc.c  */
 #line 1 "parserPromela.yacc"
 
 
 void yyerror(const char *s);
 
 
+/* Line 371 of yacc.c  */
+#line 84 "parserPromela.tab.cacc"
 
-/* Line 268 of yacc.c  */
-#line 89 "parserPromela.tab.cacc"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
+# ifndef YY_NULL
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULL nullptr
+#  else
+#   define YY_NULL 0
+#  endif
+# endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -100,11 +98,17 @@ void yyerror(const char *s);
 # define YYERROR_VERBOSE 0
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
+/* In a future release of Bison, this section will be replaced
+   by #include "parserPromela.tab.hacc".  */
+#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
+# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int xbt_automaton_parser_debug;
 #endif
-
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -136,12 +140,10 @@ void yyerror(const char *s);
 #endif
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 293 of yacc.c  */
+/* Line 387 of yacc.c  */
 #line 10 "parserPromela.yacc"
 
   double real;
@@ -150,21 +152,36 @@ typedef union YYSTYPE
   xbt_automaton_exp_label_t label;
 
 
-
-/* Line 293 of yacc.c  */
-#line 156 "parserPromela.tab.cacc"
+/* Line 387 of yacc.c  */
+#line 157 "parserPromela.tab.cacc"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+extern YYSTYPE xbt_automaton_parser_lval;
 
-/* Copy the second part of user declarations.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int xbt_automaton_parser_parse (void *YYPARSE_PARAM);
+#else
+int xbt_automaton_parser_parse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int xbt_automaton_parser_parse (void);
+#else
+int xbt_automaton_parser_parse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
+#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
 
-/* Line 343 of yacc.c  */
-#line 168 "parserPromela.tab.cacc"
+/* Copy the second part of user declarations.  */
+
+/* Line 390 of yacc.c  */
+#line 185 "parserPromela.tab.cacc"
 
 #ifdef short
 # undef short
@@ -217,24 +234,33 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(msgid) msgid
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later.  */
+# if (! defined __GNUC__ || __GNUC__ < 2 \
+      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
+#  define __attribute__(Spec) /* empty */
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
+# define YYUSE(E) ((void) (E))
 #else
-# define YYUSE(e) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
+
 /* Identity function, used to suppress warnings about constant conditions.  */
 #ifndef lint
-# define YYID(n) (n)
+# define YYID(N) (N)
 #else
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
@@ -270,6 +296,7 @@ YYID (yyi)
 #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -361,20 +388,20 @@ union yyalloc
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
+/* Copy COUNT objects from SRC to DST.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
 #  else
-#   define YYCOPY(To, From, Count)             \
-      do                                       \
-       {                                       \
-         YYSIZE_T yyi;                         \
-         for (yyi = 0; yyi < (Count); yyi++)   \
-           (To)[yyi] = (From)[yyi];            \
-       }                                       \
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
       while (YYID (0))
 #  endif
 # endif
@@ -461,7 +488,7 @@ static const yytype_uint8 yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -470,7 +497,7 @@ static const char *const yytname[] =
   "AND", "OR", "NOT", "LEFT_PAR", "RIGHT_PAR", "CASE", "COLON",
   "SEMI_COLON", "CASE_TRUE", "LEFT_BRACE", "RIGHT_BRACE", "LITT_ENT",
   "LITT_CHAINE", "LITT_REEL", "ID", "$accept", "automaton", "stateseq",
-  "$@1", "option", "exp", 0
+  "$@1", "option", "exp", YY_NULL
 };
 #endif
 
@@ -544,10 +571,10 @@ static const yytype_uint8 yytable[] =
       10,    11,    18,    31,     0,    26,    24,    30,    29
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-16))
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-16)))
 
-#define yytable_value_is_error(yytable_value) \
+#define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
 static const yytype_int8 yycheck[] =
@@ -594,62 +621,35 @@ static const yytype_uint8 yystos[] =
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                 \
-do                                                             \
-  if (yychar == YYEMPTY && yylen == 1)                         \
-    {                                                          \
-      yychar = (Token);                                                \
-      yylval = (Value);                                                \
-      YYPOPSTACK (1);                                          \
-      goto yybackup;                                           \
-    }                                                          \
-  else                                                         \
-    {                                                          \
+#define YYBACKUP(Token, Value)                                  \
+do                                                              \
+  if (yychar == YYEMPTY)                                        \
+    {                                                           \
+      yychar = (Token);                                         \
+      yylval = (Value);                                         \
+      YYPOPSTACK (yylen);                                       \
+      yystate = *yyssp;                                         \
+      goto yybackup;                                            \
+    }                                                           \
+  else                                                          \
+    {                                                           \
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;                                                 \
     }                                                          \
 while (YYID (0))
 
-
+/* Error token number */
 #define YYTERROR       1
 #define YYERRCODE      256
 
 
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
-    do                                                                 \
-      if (YYID (N))                                                    \
-       {                                                               \
-         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
-         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
-         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
-         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         (Current).first_line   = (Current).last_line   =              \
-           YYRHSLOC (Rhs, 0).last_line;                                \
-         (Current).first_column = (Current).last_column =              \
-           YYRHSLOC (Rhs, 0).last_column;                              \
-       }                                                               \
-    while (YYID (0))
-#endif
-
-
 /* This macro is provided for backward compatibility. */
-
 #ifndef YY_LOCATION_PRINT
 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
-
 #ifdef YYLEX_PARAM
 # define YYLEX yylex (YYLEX_PARAM)
 #else
@@ -699,6 +699,8 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
     YYSTYPE const * const yyvaluep;
 #endif
 {
+  FILE *yyo = yyoutput;
+  YYUSE (yyo);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
@@ -707,11 +709,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 # else
   YYUSE (yyoutput);
 # endif
-  switch (yytype)
-    {
-      default:
-       break;
-    }
+  YYUSE (yytype);
 }
 
 
@@ -950,12 +948,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = 0;
+  const char *yyformat = YY_NULL;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1015,11 +1012,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  if (! (yysize <= yysize1
+                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                    return 2;
+                  yysize = yysize1;
+                }
               }
         }
     }
@@ -1039,10 +1038,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 # undef YYCASE_
     }
 
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+      return 2;
+    yysize = yysize1;
+  }
 
   if (*yymsg_alloc < yysize)
     {
@@ -1098,36 +1099,26 @@ yydestruct (yymsg, yytype, yyvaluep)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
-  switch (yytype)
-    {
-
-      default:
-       break;
-    }
+  YYUSE (yytype);
 }
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /* The lookahead symbol.  */
 int yychar;
 
+
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
+YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
 
 /* Number of syntax errors so far.  */
 int yynerrs;
@@ -1167,7 +1158,7 @@ yyparse ()
        `yyss': related to states.
        `yyvs': related to semantic values.
 
-       Refer to the stacks thru separate pointers, to allow yyoverflow
+       Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1185,7 +1176,7 @@ yyparse ()
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
+  int yytoken = 0;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1203,9 +1194,8 @@ yyparse ()
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1214,14 +1204,6 @@ yyparse ()
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1362,7 +1344,9 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1399,65 +1383,56 @@ yyreduce:
   switch (yyn)
     {
         case 4:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 51 "parserPromela.yacc"
     { new_state((yyvsp[(1) - (2)].string), 1);}
     break;
 
   case 7:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 55 "parserPromela.yacc"
     { new_transition((yyvsp[(5) - (6)].string), (yyvsp[(2) - (6)].label));}
     break;
 
   case 8:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 58 "parserPromela.yacc"
     { (yyval.label) = (yyvsp[(2) - (3)].label); }
     break;
 
   case 9:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 59 "parserPromela.yacc"
     { (yyval.label) = new_label(0, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
     break;
 
   case 10:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 60 "parserPromela.yacc"
     { (yyval.label) = new_label(1, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
     break;
 
   case 11:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 61 "parserPromela.yacc"
     { (yyval.label) = new_label(2, (yyvsp[(2) - (2)].label)); }
     break;
 
   case 12:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 62 "parserPromela.yacc"
     { (yyval.label) = new_label(4); }
     break;
 
   case 13:
-
-/* Line 1806 of yacc.c  */
+/* Line 1787 of yacc.c  */
 #line 63 "parserPromela.yacc"
     { (yyval.label) = new_label(3, (yyvsp[(1) - (1)].string)); }
     break;
 
 
-
-/* Line 1806 of yacc.c  */
-#line 1461 "parserPromela.tab.cacc"
+/* Line 1787 of yacc.c  */
+#line 1436 "parserPromela.tab.cacc"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -1620,7 +1595,9 @@ yyerrlab1:
       YY_STACK_PRINT (yyss, yyssp);
     }
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -1644,7 +1621,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined(yyoverflow) || YYERROR_VERBOSE
+#if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -1686,8 +1663,7 @@ yyreturn:
 }
 
 
-
-/* Line 2067 of yacc.c  */
+/* Line 2050 of yacc.c  */
 #line 66 "parserPromela.yacc"
 
 
@@ -1699,4 +1675,3 @@ void yyerror(const char *s){
 
 
 
-
index 676dd59..483349a 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
 
 /* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
    
    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
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
+# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int xbt_automaton_parser_debug;
+#endif
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 #endif
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 2068 of yacc.c  */
+/* Line 2053 of yacc.c  */
 #line 10 "parserPromela.yacc"
 
   double real;
@@ -75,9 +82,8 @@ typedef union YYSTYPE
   xbt_automaton_exp_label_t label;
 
 
-
-/* Line 2068 of yacc.c  */
-#line 81 "parserPromela.tab.hacc"
+/* Line 2053 of yacc.c  */
+#line 87 "parserPromela.tab.hacc"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -86,4 +92,18 @@ typedef union YYSTYPE
 
 extern YYSTYPE xbt_automaton_parser_lval;
 
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int xbt_automaton_parser_parse (void *YYPARSE_PARAM);
+#else
+int xbt_automaton_parser_parse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int xbt_automaton_parser_parse (void);
+#else
+int xbt_automaton_parser_parse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
+#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
index 6924f0b..b29a851 100644 (file)
@@ -34,16 +34,6 @@ static XBT_INLINE void _check_inbound_idx(xbt_dynar_t dynar, int idx)
   }
 }
 
-static XBT_INLINE void _check_sloppy_inbound_idx(xbt_dynar_t dynar,
-                                                 int idx)
-{
-  if (idx > dynar->used) {
-    THROWF(bound_error, idx,
-           "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)",
-           (int) (idx), (unsigned long) dynar->used);
-  }
-}
-
 static XBT_INLINE void _check_populated_dynar(xbt_dynar_t dynar)
 {
   if (dynar->used == 0) {
index a60af87..c560de6 100644 (file)
@@ -24,7 +24,6 @@
 #include "xbt/dynar.h"
 #include "xbt/xbt_os_thread.h"
 
-XBT_PUBLIC_DATA(int) (*xbt_pid) ();
 int xbt_log_no_loc = 0;         /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */
 static xbt_os_rmutex_t log_cat_init_mutex = NULL;
 
@@ -256,7 +255,7 @@ XBT_LOG_NEW_CATEGORY(VSS);
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(SA, VSS);
 
 int main() {
-       / * Now set the parent's priority.  (the string would typcially be a runtime option) * /
+       / * Now set the parent's priority.  (the string would typically be a runtime option) * /
        xbt_log_control_set("SA.thresh:3");
 
        / * This request is enabled, because WARNING >= INFO. * /
@@ -288,12 +287,29 @@ checks and deals properly with such arguments.
 
 The most common setting is to control which logging event will get
 displayed by setting a threshold to each category through the
-<tt>thres</tt> keyword.
+<tt>threshold</tt> keyword.
 
-For example, \verbatim --log=root.thres:debug\endverbatim will make
+For example, \verbatim --log=root.threshold:debug\endverbatim will make
 SimGrid <b>extremely</b> verbose while \verbatim
 --log=root.thres:critical\endverbatim should shut it almost
-completely off. The full list of recognized thresholds is the following:
+completely off.
+
+Note that the <tt>threshold</tt> keyword can be abbreviated here. For example,
+all the following notations have the same result.
+\verbatim
+--log=root.threshold:debug
+--log=root.threshol:debug
+--log=root.thresho:debug
+--log=root.thresh:debug
+--log=root.thres:debug
+--log=root.thre:debug
+--log=root.thr:debug
+--log=root.th:debug
+--log=root.t:debug
+--log=root.:debug     <--- That's obviously really ugly, but it actually works.
+\endverbatim
+
+The full list of recognized thresholds is the following:
 
  - trace: enter and return of some functions
  - debug: crufty output
@@ -622,6 +638,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(msg_mailbox);
   XBT_LOG_CONNECT(msg_new_API);
   XBT_LOG_CONNECT(msg_process);
+  XBT_LOG_CONNECT(msg_synchro);
   XBT_LOG_CONNECT(msg_task);
   XBT_LOG_CONNECT(msg_vm);
    
@@ -1065,7 +1082,7 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string)
   xbt_assert(*dot == '.' && (*eq == '=' || *eq == ':'),
               "Invalid control string '%s'", control_string);
 
-  if (!strncmp(dot + 1, "thresh", (size_t) (eq - dot - 1))) {
+  if (!strncmp(dot + 1, "threshold", (size_t) (eq - dot - 1))) {
     int i;
     char *neweq = xbt_strdup(eq + 1);
     char *p = neweq - 1;
index 9788f9f..4e0f331 100644 (file)
@@ -109,65 +109,294 @@ void xbt_os_timer_free(xbt_os_timer_t timer)
   free(timer);
 }
 
-void xbt_os_timer_resume(xbt_os_timer_t timer)
+double xbt_os_timer_elapsed(xbt_os_timer_t timer)
 {
 #ifdef HAVE_POSIX_GETTIME
-  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
-
-   timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
-  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start));
-#elif defined(HAVE_GETTIMEOFDAY)
-  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
-
-   timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec;
-  gettimeofday(&(timer->start), NULL);
+  return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) +
+                                          ((double) timer->elapse.tv_sec ) +
+      ((((double) timer->stop.tv_nsec) -
+        ((double) timer->start.tv_nsec) + ((double) timer->elapse.tv_nsec )) / 1e9);
+#elif defined(HAVE_GETTIMEOFDAY) || defined(_XBT_WIN32)
+  return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec)
+    + ((double) timer->elapse.tv_sec ) +
+      ((((double) timer->stop.tv_usec) -
+        ((double) timer->start.tv_usec) + ((double) timer->elapse.tv_usec )) / 1000000.0);
 #else
-  timer->elapse = timer->stop - timer->start;
-  timer->start = (unsigned long int) (time(NULL));
+  return (double) timer->stop - (double) timer->start + (double)
+    timer->elapse;
 #endif
 }
 
-void xbt_os_timer_start(xbt_os_timer_t timer)
+void xbt_os_walltimer_start(xbt_os_timer_t timer)
 {
 #ifdef HAVE_POSIX_GETTIME
   timer->elapse.tv_sec = 0;
   timer->elapse.tv_nsec = 0;
-  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start));
+  clock_gettime(CLOCK_REALTIME, &(timer->start));
 #elif defined(HAVE_GETTIMEOFDAY)
   timer->elapse.tv_sec = 0;
   timer->elapse.tv_usec = 0;
   gettimeofday(&(timer->start), NULL);
+#elif defined(_XBT_WIN32)
+  timer->elapse.tv_sec = 0;
+  timer->elapse.tv_usec = 0;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  struct _timeb tm;
+
+  _ftime(&tm);
+
+  timer->start.tv_sec = tm.time;
+  timer->start.tv_usec = tm.millitm * 1000;
+
+#  else
+  FILETIME ft;
+  unsigned __int64 tm;
+
+  GetSystemTimeAsFileTime(&ft);
+  tm = (unsigned __int64) ft.dwHighDateTime << 32;
+  tm |= ft.dwLowDateTime;
+  tm /= 10;
+  tm -= 11644473600000000ULL;
+
+  timer->start.tv_sec = (long) (tm / 1000000L);
+  timer->start.tv_usec = (long) (tm % 1000000L);
+#  endif                        /* windows version checker */
 #else
   timer->elapse = 0;
   timer->start = (unsigned long int) (time(NULL));
 #endif
 }
 
-void xbt_os_timer_stop(xbt_os_timer_t timer)
+void xbt_os_walltimer_resume(xbt_os_timer_t timer)
 {
 #ifdef HAVE_POSIX_GETTIME
-  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->stop));
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+
+   timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
+  clock_gettime(CLOCK_REALTIME, &(timer->start));
 #elif defined(HAVE_GETTIMEOFDAY)
-  gettimeofday(&(timer->stop), NULL);
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec;
+  gettimeofday(&(timer->start), NULL);
+#elif defined(_XBT_WIN32)
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_usec += timer->stop.tv_usec - timer->start.tv_usec;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  struct _timeb tm;
+
+  _ftime(&tm);
+
+  timer->start.tv_sec = tm.time;
+  timer->start.tv_usec = tm.millitm * 1000;
+
+#  else
+  FILETIME ft;
+  unsigned __int64 tm;
+
+  GetSystemTimeAsFileTime(&ft);
+  tm = (unsigned __int64) ft.dwHighDateTime << 32;
+  tm |= ft.dwLowDateTime;
+  tm /= 10;
+  tm -= 11644473600000000ULL;
+
+  timer->start.tv_sec = (long) (tm / 1000000L);
+  timer->start.tv_usec = (long) (tm % 1000000L);
+#  endif
 #else
-  timer->stop = (unsigned long int) (time(NULL));
+  timer->elapse = timer->stop - timer->start;
+  timer->start = (unsigned long int) (time(NULL));
 #endif
 }
 
-double xbt_os_timer_elapsed(xbt_os_timer_t timer)
+void xbt_os_walltimer_stop(xbt_os_timer_t timer)
 {
 #ifdef HAVE_POSIX_GETTIME
-  return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) +
-                                          ((double) timer->elapse.tv_sec ) +
-      ((((double) timer->stop.tv_nsec) -
-        ((double) timer->start.tv_nsec) + ((double) timer->elapse.tv_nsec )) / 1e9);
+  clock_gettime(CLOCK_REALTIME, &(timer->stop));
 #elif defined(HAVE_GETTIMEOFDAY)
-  return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec)
-    + ((double) timer->elapse.tv_sec ) +
-      ((((double) timer->stop.tv_usec) -
-        ((double) timer->start.tv_usec) + ((double) timer->elapse.tv_usec )) / 1000000.0);
+  gettimeofday(&(timer->stop), NULL);
+#elif defined(_XBT_WIN32)
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  struct _timeb tm;
+
+  _ftime(&tm);
+
+  timer->stop.tv_sec = tm.time;
+  timer->stop.tv_usec = tm.millitm * 1000;
+
+#  else
+  FILETIME ft;
+  unsigned __int64 tm;
+
+  GetSystemTimeAsFileTime(&ft);
+  tm = (unsigned __int64) ft.dwHighDateTime << 32;
+  tm |= ft.dwLowDateTime;
+  tm /= 10;
+  tm -= 11644473600000000ULL;
+
+  timer->stop.tv_sec = (long) (tm / 1000000L);
+  timer->stop.tv_usec = (long) (tm % 1000000L);
+#  endif
 #else
-  return (double) timer->stop - (double) timer->start + (double)
-    timer->elapse;
+  timer->stop = (unsigned long int) (time(NULL));
+#endif
+}
+
+void xbt_os_cputimer_start(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  timer->elapse.tv_sec = 0;
+  timer->elapse.tv_nsec = 0;
+  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start));
+#elif defined(_XBT_WIN32)
+  timer->elapse.tv_sec = 0;
+  timer->elapse.tv_nsec = 0;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentProcess();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
+#endif
+}
+
+void xbt_os_cputimer_resume(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
+  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->start));
+#elif defined(_XBT_WIN32)
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentProcess();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
+
+#endif
+}
+
+void xbt_os_cputimer_stop(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(timer->stop));
+#elif defined(_XBT_WIN32)
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentProcess();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
+#endif
+}
+
+void xbt_os_threadtimer_start(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  timer->elapse.tv_sec = 0;
+  timer->elapse.tv_nsec = 0;
+  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->start));
+#elif defined(_XBT_WIN32)
+  struct timeval tv;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentThread();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
+#endif
+}
+
+void xbt_os_threadtimer_resume(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
+  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->start));
+#elif defined(_XBT_WIN32)
+  timer->elapse.tv_sec += timer->stop.tv_sec - timer->start.tv_sec;
+  timer->elapse.tv_nsec += timer->stop.tv_nsec - timer->start.tv_nsec;
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentThread();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->start.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->start.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
+#endif
+}
+
+void xbt_os_threadtimer_stop(xbt_os_timer_t timer)
+{
+#ifdef HAVE_POSIX_GETTIME
+  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &(timer->stop));
+#elif defined(_XBT_WIN32)
+#  if defined(WIN32_WCE) || (_WIN32_WINNT < 0x0400)
+  THROW_UNIMPLEMENTED;
+#  else
+  HANDLE h = GetCurrentThread();
+  FILETIME creationTime, exitTime, kernelTime, userTime;
+  GetThreadTimes(h, &creationTime, &exitTime, &kernelTime, &userTime);
+  unsigned __int64 ktm, utm;
+  ktm = (unsigned __int64) kernelTime.dwHighDateTime << 32;
+  ktm |= kernelTime.dwLowDateTime;
+  ktm /= 10;
+  utm = (unsigned __int64) userTime.dwHighDateTime << 32;
+  utm |= userTime.dwLowDateTime;
+  utm /= 10;
+  timer->stop.tv_sec = (long) (ktm / 1000000L) + (long) (utm / 1000000L);
+  timer->stop.tv_usec = (long) (ktm % 1000000L) + (long) (utm % 1000000L);
+#  endif                        /* windows version checker */
 #endif
 }
index 7fa2e1c..db7782c 100644 (file)
@@ -45,9 +45,9 @@ int main(int argc, char **argv)
   w2 = workstations[j];
   printf("%d\tand\t%d\t\t",i,j);
 
-  xbt_os_timer_start(timer);
+  xbt_os_cputimer_start(timer);
   SD_route_get_list(w1, w2);
-  xbt_os_timer_stop(timer);
+  xbt_os_cputimer_stop(timer);
 
   printf("%lf\n", xbt_os_timer_elapsed(timer) );
 
index a710788..09726fb 100644 (file)
@@ -22,9 +22,9 @@ int main(int argc, char **argv)
   SD_init(&argc, argv);
 
   /* creation of the environment, timed */
-  xbt_os_timer_start(timer);
+  xbt_os_cputimer_start(timer);
   SD_create_environment(argv[1]);
-  xbt_os_timer_stop(timer);
+  xbt_os_cputimer_stop(timer);
 
   /* Display the result and exit after cleanup */
   printf( "%lf\n", xbt_os_timer_elapsed(timer) );
index 5f5d48d..0fcec51 100644 (file)
@@ -74,9 +74,9 @@ static void create_environment(xbt_os_timer_t parse_time, const char *platformFi
 {
   xbt_ex_t e;
   TRY {
-    xbt_os_timer_start(parse_time);
+    xbt_os_cputimer_start(parse_time);
     SD_create_environment(platformFile);
-    xbt_os_timer_stop(parse_time);
+    xbt_os_cputimer_stop(parse_time);
   }
   CATCH(e) {
     xbt_die("Error while loading %s: %s", platformFile, e.msg);
index e74b5a5..81c036f 100644 (file)
@@ -10,7 +10,7 @@ if(enable_smpi)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
   
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
-
+  add_executable(gather_coll gather_coll.c)
   add_executable(allgather_coll allgather_coll.c)
   add_executable(allgatherv_coll allgatherv_coll.c)
   add_executable(alltoall2 alltoall2.c)
@@ -20,14 +20,17 @@ if(enable_smpi)
   add_executable(allreduce allreduce.c)
   add_executable(allreduce_coll allreduce_coll.c)  
   add_executable(bcast bcast.c)
-  add_executable(bcast_coll bcast_coll.c)  
+  add_executable(bcast_coll bcast_coll.c) 
+  add_executable(barrier_coll barrier.c )
   add_executable(compute compute.c)
   add_executable(compute2 compute2.c)
   add_executable(compute3 compute3.c)
+  add_executable(shared shared.c)
   add_executable(pingpong pingpong.c)
   add_executable(scatter scatter.c)
   add_executable(reduce reduce.c)
   add_executable(reduce_coll reduce_coll.c)
+  add_executable(reduce_scatter_coll reduce_scatter_coll.c)
   add_executable(split split.c)
   add_executable(smpi_sendrecv sendrecv.c)
   add_executable(ttest01 ttest01.c)
@@ -36,6 +39,7 @@ if(enable_smpi)
   add_executable(indexed_test indexed_test.c)
   add_executable(struct_test struct_test.c)
 
+  target_link_libraries(gather_coll simgrid)
   target_link_libraries(allgather_coll simgrid)
   target_link_libraries(allgatherv_coll simgrid)
   target_link_libraries(alltoall2 simgrid)
@@ -46,13 +50,16 @@ if(enable_smpi)
   target_link_libraries(allreduce_coll simgrid)      
   target_link_libraries(bcast simgrid)
   target_link_libraries(bcast_coll simgrid)      
+  target_link_libraries(barrier_coll simgrid)
   target_link_libraries(compute simgrid)
+  target_link_libraries(shared simgrid)
   target_link_libraries(compute2 simgrid)
   target_link_libraries(compute3 simgrid)
   target_link_libraries(pingpong simgrid)
   target_link_libraries(scatter simgrid)
   target_link_libraries(reduce simgrid)
   target_link_libraries(reduce_coll simgrid)      
+  target_link_libraries(reduce_scatter_coll simgrid)      
   target_link_libraries(split simgrid)
   target_link_libraries(smpi_sendrecv simgrid)
   target_link_libraries(ttest01 simgrid)
@@ -73,19 +80,25 @@ endif()
 
 set(tesh_files
   ${tesh_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/gather_coll.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/allgather_coll.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/allgatherv_coll.tesh  
   ${CMAKE_CURRENT_SOURCE_DIR}/allreduce_coll.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/allreduce_coll_large.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/alltoall_coll.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/scatter_coll.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/barrier_coll.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/bcast.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/bcast_coll.tesh  
   ${CMAKE_CURRENT_SOURCE_DIR}/compute.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/shared.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/hvector.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/indexed.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/reduce.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/reduce_coll.tesh  
+  ${CMAKE_CURRENT_SOURCE_DIR}/reduce_scatter_coll.tesh  
   ${CMAKE_CURRENT_SOURCE_DIR}/struct.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/vector.tesh  
   PARENT_SCOPE
@@ -96,6 +109,7 @@ set(xml_files
   )
 set(examples_src
   ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/gather_coll.c
   ${CMAKE_CURRENT_SOURCE_DIR}/allgather_coll.c
   ${CMAKE_CURRENT_SOURCE_DIR}/allgatherv_coll.c  
   ${CMAKE_CURRENT_SOURCE_DIR}/allreduce_coll.c
@@ -103,6 +117,7 @@ set(examples_src
   ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.c  
   ${CMAKE_CURRENT_SOURCE_DIR}/bcast_coll.c
   ${CMAKE_CURRENT_SOURCE_DIR}/reduce_coll.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/reduce_scatter_coll.c
   ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv_coll.c
   ${CMAKE_CURRENT_SOURCE_DIR}/get_processor_name.c
   ${CMAKE_CURRENT_SOURCE_DIR}/pingpong.c
@@ -112,6 +127,7 @@ set(examples_src
   ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv.c
   ${CMAKE_CURRENT_SOURCE_DIR}/reduce.c
   ${CMAKE_CURRENT_SOURCE_DIR}/compute2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/shared.c
   ${CMAKE_CURRENT_SOURCE_DIR}/split.c
   ${CMAKE_CURRENT_SOURCE_DIR}/dsend.c
   ${CMAKE_CURRENT_SOURCE_DIR}/ttest01.c
index a2c9921..8f54a61 100644 (file)
@@ -15,6 +15,8 @@
 #define EXIT_FAILURE 1
 #endif
 
+//define MAXLEN  300000
+
 int main(int argc, char *argv[])
 {
   int rank, size;
@@ -22,28 +24,31 @@ int main(int argc, char *argv[])
   int *sb;
   int *rb;
   int status;
+  int mult=1;
 
   MPI_Init(&argc, &argv);
+  int maxlen = argc >= 2 ? atoi(argv[1]) : 1;
+
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   MPI_Comm_size(MPI_COMM_WORLD, &size);
-
-  sb = (int *) xbt_malloc(size * sizeof(int));
-  rb = (int *) xbt_malloc(size * sizeof(int));
+  if (maxlen>1)mult=size;
+  sb = (int *) xbt_malloc(size *maxlen * sizeof(int));
+  rb = (int *) xbt_malloc(size *maxlen * sizeof(int));
   
-  for (i = 0; i < size; ++i) {
+  for (i = 0; i < size *maxlen; ++i) {
     sb[i] = rank*size + i;
     rb[i] = 0;
   }
 
   printf("[%d] sndbuf=[", rank);
-  for (i = 0; i < size; i++)
+  for (i = 0; i < size *mult; i++)
     printf("%d ", sb[i]);
   printf("]\n");
 
-  status = MPI_Allreduce(sb, rb, size, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
+  status = MPI_Allreduce(sb, rb, size *maxlen, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
 
   printf("[%d] rcvbuf=[", rank);
-  for (i = 0; i < size; i++)
+  for (i =  0; i < size *mult; i++)//do not print everything
     printf("%d ", rb[i]);
   printf("]\n");
 
diff --git a/teshsuite/smpi/allreduce_coll_large.tesh b/teshsuite/smpi/allreduce_coll_large.tesh
new file mode 100644 (file)
index 0000000..3281683
--- /dev/null
@@ -0,0 +1,58 @@
+# Smpi Allreduce collectives tests
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+
+! timeout 20
+p Test allreduce
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 300000
+> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> [rank 0] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [0] sndbuf=[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 ]
+> [10] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [10] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 ]
+> [11] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [11] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 ]
+> [12] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [12] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 ]
+> [13] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [13] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 ]
+> [14] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [14] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 ]
+> [15] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 ]
+> [1] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [1] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 ]
+> [2] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [2] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 ]
+> [3] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [3] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 ]
+> [4] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [4] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 ]
+> [5] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [5] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 ]
+> [6] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [6] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 ]
+> [7] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [7] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 ]
+> [8] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [8] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 ]
+> [9] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 2176 2192 2208 2224 2240 2256 2272 2288 2304 2320 2336 2352 2368 2384 2400 2416 2432 2448 2464 2480 2496 2512 2528 2544 2560 2576 2592 2608 2624 2640 2656 2672 2688 2704 2720 2736 2752 2768 2784 2800 2816 2832 2848 2864 2880 2896 2912 2928 2944 2960 2976 2992 3008 3024 3040 3056 3072 3088 3104 3120 3136 3152 3168 3184 3200 3216 3232 3248 3264 3280 3296 3312 3328 3344 3360 3376 3392 3408 3424 3440 3456 3472 3488 3504 3520 3536 3552 3568 3584 3600 3616 3632 3648 3664 3680 3696 3712 3728 3744 3760 3776 3792 3808 3824 3840 3856 3872 3888 3904 3920 3936 3952 3968 3984 4000 4016 4032 4048 4064 4080 4096 4112 4128 4144 4160 4176 4192 4208 4224 4240 4256 4272 4288 4304 4320 4336 4352 4368 4384 4400 4416 4432 4448 4464 4480 4496 4512 4528 4544 4560 4576 4592 4608 4624 4640 4656 4672 4688 4704 4720 4736 4752 4768 4784 4800 4816 4832 4848 4864 4880 4896 4912 4928 4944 4960 4976 4992 5008 5024 5040 5056 5072 5088 5104 5120 5136 5152 5168 5184 5200 5216 5232 5248 5264 5280 5296 5312 5328 5344 5360 5376 5392 5408 5424 5440 5456 5472 5488 5504 5520 5536 5552 5568 5584 5600 5616 5632 5648 5664 5680 5696 5712 5728 5744 5760 5776 5792 5808 5824 5840 5856 5872 5888 5904 5920 5936 5952 5968 5984 6000 ]
+> [9] sndbuf=[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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 ]
+
index 568015e..7fb9a0c 100644 (file)
 int main(int argc, char **argv)
 {
   int size, rank;
-  int root = 0;
-  int value;
-  double start_timer;
+  //double start_timer;
 
   MPI_Init(&argc, &argv);
   MPI_Comm_size(MPI_COMM_WORLD, &size);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
-  start_timer = MPI_Wtime();
+  //start_timer = MPI_Wtime();
 
   MPI_Barrier(MPI_COMM_WORLD);
 
   MPI_Barrier(MPI_COMM_WORLD);
   if (0 == rank) {
     printf("... Barrier ....\n");
-    printf("Elapsed=%lf s\n", MPI_Wtime() - start_timer);
+    //printf("Elapsed=%lf s\n", MPI_Wtime() - start_timer);
   }
 
   MPI_Finalize();
diff --git a/teshsuite/smpi/barrier_coll.tesh b/teshsuite/smpi/barrier_coll.tesh
new file mode 100644 (file)
index 0000000..3ef563b
--- /dev/null
@@ -0,0 +1,25 @@
+# Smpi  scatter collectives tests
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+
+p Test barrier
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./barrier_coll
+> ... Barrier ....
+> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [rank 0] -> Tremblay
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
index 9bb6a04..67c0c13 100644 (file)
@@ -31,7 +31,24 @@ int main(int argc, char **argv)
   printf("[%d] number of values equals to 17: %d\n", rank, good);
 
   MPI_Barrier(MPI_COMM_WORLD);
+  xbt_free(values);
 
+  count = 4096;
+  values = (int *) xbt_malloc(count * sizeof(int));  
+
+  for (i = 0; i < count; i++)
+    values[i] = (size -1 == rank) ? 17 : 3;
+
+  status = MPI_Bcast(values, count, MPI_INT, size-1, MPI_COMM_WORLD);
+
+  good = 0;
+  for (i = 0; i < count; i++)
+    if (values[i]==17) good++;
+  printf("[%d] number of values equals to 17: %d\n", rank, good);
+
+
+  
+  
   if (rank == 0) {
     if (status != MPI_SUCCESS) {
       printf("bcast returned %d\n", status);
index 7dc08a5..5fb6b97 100644 (file)
@@ -22,18 +22,35 @@ $ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/
 > [rank 15] -> Tremblay
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 > [0] number of values equals to 17: 2048
+> [0] number of values equals to 17: 4096
+> [10] number of values equals to 17: 2048
+> [10] number of values equals to 17: 4096
+> [11] number of values equals to 17: 2048
+> [11] number of values equals to 17: 4096
+> [12] number of values equals to 17: 2048
+> [12] number of values equals to 17: 4096
+> [13] number of values equals to 17: 2048
+> [13] number of values equals to 17: 4096
+> [14] number of values equals to 17: 2048
+> [14] number of values equals to 17: 4096
+> [15] number of values equals to 17: 2048
+> [15] number of values equals to 17: 4096
 > [1] number of values equals to 17: 2048
+> [1] number of values equals to 17: 4096
 > [2] number of values equals to 17: 2048
+> [2] number of values equals to 17: 4096
 > [3] number of values equals to 17: 2048
+> [3] number of values equals to 17: 4096
 > [4] number of values equals to 17: 2048
+> [4] number of values equals to 17: 4096
 > [5] number of values equals to 17: 2048
+> [5] number of values equals to 17: 4096
 > [6] number of values equals to 17: 2048
+> [6] number of values equals to 17: 4096
 > [7] number of values equals to 17: 2048
+> [7] number of values equals to 17: 4096
 > [8] number of values equals to 17: 2048
+> [8] number of values equals to 17: 4096
 > [9] number of values equals to 17: 2048
-> [10] number of values equals to 17: 2048
-> [11] number of values equals to 17: 2048
-> [12] number of values equals to 17: 2048
-> [13] number of values equals to 17: 2048
-> [14] number of values equals to 17: 2048
-> [15] number of values equals to 17: 2048
+> [9] number of values equals to 17: 4096
+
diff --git a/teshsuite/smpi/gather_coll.c b/teshsuite/smpi/gather_coll.c
new file mode 100644 (file)
index 0000000..a6111b4
--- /dev/null
@@ -0,0 +1,65 @@
+/* Copyright (c) 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "mpi.h"
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#endif
+
+int main(int argc, char *argv[])
+{
+  int rank, size;
+  int i;
+  int *sb;
+  int *rb;
+  int status;
+
+  int root = 0;
+
+  MPI_Init(&argc, &argv);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+  MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+  int count = 2;
+  sb = (int *) xbt_malloc(count * sizeof(int));
+  rb = (int *) xbt_malloc(count * size * sizeof(int));
+  
+  for (i = 0; i < count; ++i)
+    sb[i] = rank * count + i;
+  for (i = 0; i < count * size; ++i)  
+    rb[i] = 0;
+
+  printf("[%d] sndbuf=[", rank);
+  for (i = 0; i < count; i++)
+    printf("%d ", sb[i]);
+  printf("]\n");
+
+  status = MPI_Gather(sb, count, MPI_INT, rb, count, MPI_INT, root, MPI_COMM_WORLD);
+
+  if (rank == root) {
+  printf("[%d] rcvbuf=[", rank);
+  for (i = 0; i < count * size; i++)
+    printf("%d ", rb[i]);
+  printf("]\n");
+
+
+    if (status != MPI_SUCCESS) {
+      printf("allgather returned %d\n", status);
+      fflush(stdout);
+    }
+  }
+  free(sb);
+  free(rb);
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Finalize();
+  return (EXIT_SUCCESS);
+}
diff --git a/teshsuite/smpi/gather_coll.tesh b/teshsuite/smpi/gather_coll.tesh
new file mode 100644 (file)
index 0000000..c4b40fe
--- /dev/null
@@ -0,0 +1,42 @@
+# Smpi Alltoall collectives tests
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+
+p Test all to all
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./gather_coll
+> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> [rank 0] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0] rcvbuf=[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 ]
+> [0] sndbuf=[0 1 ]
+> [1] sndbuf=[2 3 ]
+> [2] sndbuf=[4 5 ]
+> [3] sndbuf=[6 7 ]
+> [4] sndbuf=[8 9 ]
+> [5] sndbuf=[10 11 ]
+> [6] sndbuf=[12 13 ]
+> [7] sndbuf=[14 15 ]
+> [8] sndbuf=[16 17 ]
+> [9] sndbuf=[18 19 ]
+> [10] sndbuf=[20 21 ]
+> [11] sndbuf=[22 23 ]
+> [12] sndbuf=[24 25 ]
+> [13] sndbuf=[26 27 ]
+> [14] sndbuf=[28 29 ]
+> [15] sndbuf=[30 31 ]
+
index 3cb057d..9cb824a 100644 (file)
@@ -31,10 +31,8 @@ int main( int argc, char **argv )
     recvcounts = (int *)malloc( size * sizeof(int) );
         recvbuf = (int *)malloc( size * sizeof(int) );
     for (i=0; i<size; i++) 
-       recvcounts[i] = 1;
-printf("rank : %d\n", rank);
+    recvcounts[i] = 1;
     MPI_Reduce_scatter( sendbuf, recvbuf, recvcounts, MPI_INT, MPI_SUM, comm );
-printf("rankt : %d\n", rank);
     sumval = size * rank + ((size - 1) * size)/2;
 /* recvbuf should be size * (rank + i) */
     if (recvbuf[0] != sumval) {
index 9cb6cf8..168ade1 100755 (executable)
@@ -17,6 +17,7 @@ runtests=1
 makeeach=0
 writesummaryfile=no
 have_fortran=0
+have_selector="no"
 quiet=0
 MAKE="make --no-print-directory"
 for arg in "$@" ; do
@@ -30,6 +31,9 @@ for arg in "$@" ; do
        -fort=* )
        have_fortran=`echo $arg | sed 's/-fort=//'`
        ;;
+       -selector=* )
+       have_selector=`echo $arg | sed 's/-selector=//'`
+       ;;
        -checkonly )
        runtests=0
        ;;
@@ -73,7 +77,9 @@ if [ ! -x coll1 -a $makeeach = 0 -a $runtests = 1 ] ; then
     $MAKE
 fi
 
-mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+selector=${have_selector:+--cfg=smpi/coll_selector:$have_selector}
+
+mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical  $selector "
 testfiles=""
 if [ $runtests = 1 ] ; then
 echo '**** Testing MPI Collective routines ****'
@@ -104,10 +110,8 @@ RunTest coll8 4
 
 RunTest coll9 4
 
-#smpi does not handle non commutative operations, removed
-#RunTest coll10 4
+RunTest coll10 4
 
-#smpi does not handle non commutative operations, removed
 RunTest coll11 4
 
 #weird manipulations of ranks in split, and comms -> deadlock, removed
@@ -145,7 +149,7 @@ rm -f longuser1
 #CleanExe allredmany
 
 RunTest grouptest 4
-#uses MPI_Dims_create, MPI_Cart_create ... removed
+
 RunTest allred 4 "*** Allred ***"
 
 RunTest allred2 4 "*** Allred2 ***"
@@ -154,8 +158,7 @@ RunTest allred2 4 "*** Allred2 ***"
 
 RunTest scattern 4 "*** Scattern ***"
 
-#fails, more debug needed to understand
-#RunTest redscat 4 "*** Reduce_scatter ***"
+RunTest redscat 4 "*** Reduce_scatter ***"
 
 RunTest alltoallv_mpich 4 "*** Alltoallv ***"
 echo "runtests: fortran ($have_fortran)"
index 75a58bf..e002051 100755 (executable)
@@ -80,7 +80,7 @@ fi
 testfiles=""
 if [ $runtests = 1 ] ; then
 
-#RunTest timers 1 "*** Timer tests ***"
+RunTest timers 1 "*** Timer tests ***"
 
 RunTest init 2 "*** MPI_Initialized tests ***"
 # uses MPI_Attr_get
index 531e51b..9538887 100644 (file)
@@ -3,39 +3,39 @@
 
 int main( int argc, char **argv )
 {
-    int rank, size;
-    MPI_Request r1, r2;
-    MPI_Status  s;
-    int         buf[10000], buf2[10000], count, tag1, tag2;
+  int rank, size;
+  MPI_Request r1, r2;
+  MPI_Status  s;
+  int         buf[10000], buf2[10000], count, tag1, tag2;
 
-    count = 10000;
-    tag1  = 100;
-    tag2  = 1000;
+  count = 10000;
+  tag1  = 100;
+  tag2  = 1000;
 
-    MPI_Init( &argc, &argv );
-    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
-    MPI_Comm_size( MPI_COMM_WORLD, &size );
+  MPI_Init( &argc, &argv );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+  MPI_Comm_size( MPI_COMM_WORLD, &size );
 
-    if (rank == 0) {
-       MPI_Isend( buf, count, MPI_INT, 1, tag1, MPI_COMM_WORLD, &r1 );
-       MPI_Isend( buf2, count, MPI_INT, 1, tag2, MPI_COMM_WORLD, &r2 );
-       MPI_Wait( &r1, &s );
-       MPI_Wait( &r2, &s );
-    }
-    else if (rank == 1) {
-       MPI_Irecv( buf2, count, MPI_INT, 0, tag2, MPI_COMM_WORLD, &r2 );
-       MPI_Irecv( buf,  count, MPI_INT, 0, tag1, MPI_COMM_WORLD, &r1 );
-       MPI_Wait( &r2, &s );
-       if (s.MPI_TAG != tag2) {
+  if (rank == 0) {
+    MPI_Isend( buf, count, MPI_INT, 1, tag1, MPI_COMM_WORLD, &r1 );
+    MPI_Isend( buf2, count, MPI_INT, 1, tag2, MPI_COMM_WORLD, &r2 );
+    MPI_Wait( &r1, &s );
+    MPI_Wait( &r2, &s );
+  }
+  else if (rank == 1) {
+    MPI_Irecv( buf2, count, MPI_INT, 0, tag2, MPI_COMM_WORLD, &r2 );
+    MPI_Irecv( buf,  count, MPI_INT, 0, tag1, MPI_COMM_WORLD, &r1 );
+    MPI_Wait( &r2, &s );
+    if (s.MPI_TAG != tag2) {
            printf( "Error in receive order\n" );
-       }
-       MPI_Wait( &r1, &s );
     }
+    MPI_Wait( &r1, &s );
+  }
 
-    MPI_Barrier( MPI_COMM_WORLD );
-    if (rank == 0) {
-       printf( "Test completed\n" );
-    }
-    MPI_Finalize( );
-    return 0;
+  MPI_Barrier( MPI_COMM_WORLD );
+  if (rank == 0) {
+    printf( "Test completed\n" );
+  }
+  MPI_Finalize( );
+  return 0;
 }
index 2174624..833880f 100644 (file)
@@ -57,312 +57,312 @@ void ReceiverTest3 (void);
 
 void 
 AllocateBuffers(bufferspace, buffertypes, num_types, bufferlen)
-    void **bufferspace;
-    MPI_Datatype *buffertypes;
-    int num_types;
-    int bufferlen;
+     void **bufferspace;
+     MPI_Datatype *buffertypes;
+     int num_types;
+     int bufferlen;
 {
-    int i;
-    for (i = 0; i < ntypes; i++) {
-       if (buffertypes[i] == MPI_CHAR)
+  int i;
+  for (i = 0; i < ntypes; i++) {
+    if (buffertypes[i] == MPI_CHAR)
            bufferspace[i] = malloc(bufferlen * sizeof(char));
-       else if (buffertypes[i] == MPI_SHORT)
+    else if (buffertypes[i] == MPI_SHORT)
            bufferspace[i] = malloc(bufferlen * sizeof(short));
-       else if (buffertypes[i] == MPI_INT)
+    else if (buffertypes[i] == MPI_INT)
            bufferspace[i] = malloc(bufferlen * sizeof(int));
-       else if (buffertypes[i] == MPI_LONG)
+    else if (buffertypes[i] == MPI_LONG)
            bufferspace[i] = malloc(bufferlen * sizeof(long));
-       else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
+    else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
            bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
-       else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
+    else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
            bufferspace[i] = malloc(bufferlen * sizeof(unsigned short));
-       else if (buffertypes[i] == MPI_UNSIGNED)
+    else if (buffertypes[i] == MPI_UNSIGNED)
            bufferspace[i] = malloc(bufferlen * sizeof(unsigned int));
-       else if (buffertypes[i] == MPI_UNSIGNED_LONG)
+    else if (buffertypes[i] == MPI_UNSIGNED_LONG)
            bufferspace[i] = malloc(bufferlen * sizeof(unsigned long));
-       else if (buffertypes[i] == MPI_FLOAT)
+    else if (buffertypes[i] == MPI_FLOAT)
            bufferspace[i] = malloc(bufferlen * sizeof(float));
-       else if (buffertypes[i] == MPI_DOUBLE)
+    else if (buffertypes[i] == MPI_DOUBLE)
            bufferspace[i] = malloc(bufferlen * sizeof(double));
 #if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
-       else if (buffertypes[i] == MPI_LONG_DOUBLE) {
+    else if (buffertypes[i] == MPI_LONG_DOUBLE) {
            int dlen;
            MPI_Type_size( MPI_LONG_DOUBLE, &dlen );
            bufferspace[i] = malloc(bufferlen * dlen);
-       }
+    }
 #endif
 #if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR)
-       else if (buffertypes[i] == MPI_LONG_LONG_INT) 
+    else if (buffertypes[i] == MPI_LONG_LONG_INT) 
            bufferspace[i] = malloc(bufferlen * sizeof(long long) );
 #endif
-       else if (buffertypes[i] == MPI_BYTE)
+    else if (buffertypes[i] == MPI_BYTE)
            bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
-    }
+  }
 }
 
 void FreeBuffers(void **buffers, int nbuffers)
 {
-    int i;
-    for (i = 0; i < nbuffers; i++)
-       free(buffers[i]);
+  int i;
+  for (i = 0; i < nbuffers; i++)
+    free(buffers[i]);
 }
 
 void FillBuffers(bufferspace, buffertypes, num_types, bufferlen)
-    void **bufferspace; 
-    MPI_Datatype *buffertypes;
-    int num_types;
-    int bufferlen;
+     void **bufferspace; 
+     MPI_Datatype *buffertypes;
+     int num_types;
+     int bufferlen;
 {
-    int i, j;
-    for (i = 0; i < ntypes; i++) {
-       for (j = 0; j < bufferlen; j++) {
+  int i, j;
+  for (i = 0; i < ntypes; i++) {
+    for (j = 0; j < bufferlen; j++) {
            if (buffertypes[i] == MPI_CHAR)
-               ((char *)bufferspace[i])[j] = (char)(j & 0x7f);
+        ((char *)bufferspace[i])[j] = (char)(j & 0x7f);
            else if (buffertypes[i] == MPI_SHORT)
-               ((short *)bufferspace[i])[j] = (short)j;
+        ((short *)bufferspace[i])[j] = (short)j;
            else if (buffertypes[i] == MPI_INT)
-               ((int *)bufferspace[i])[j] = (int)j;
+        ((int *)bufferspace[i])[j] = (int)j;
            else if (buffertypes[i] == MPI_LONG)
-               ((long *)bufferspace[i])[j] = (long)j;
+        ((long *)bufferspace[i])[j] = (long)j;
            else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
-               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
+        ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
            else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
-               ((unsigned short *)bufferspace[i])[j] = (unsigned short)j;
+        ((unsigned short *)bufferspace[i])[j] = (unsigned short)j;
            else if (buffertypes[i] == MPI_UNSIGNED)
-               ((unsigned int *)bufferspace[i])[j] = (unsigned int)j;
+        ((unsigned int *)bufferspace[i])[j] = (unsigned int)j;
            else if (buffertypes[i] == MPI_UNSIGNED_LONG)
-               ((unsigned long *)bufferspace[i])[j] = (unsigned long)j;
+        ((unsigned long *)bufferspace[i])[j] = (unsigned long)j;
            else if (buffertypes[i] == MPI_FLOAT)
-               ((float *)bufferspace[i])[j] = (float)j;
+        ((float *)bufferspace[i])[j] = (float)j;
            else if (buffertypes[i] == MPI_DOUBLE)
-               ((double *)bufferspace[i])[j] = (double)j;
+        ((double *)bufferspace[i])[j] = (double)j;
 #if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
            else if (buffertypes[i] == MPI_LONG_DOUBLE)
-               ((long double *)bufferspace[i])[j] = (long double)j;
+        ((long double *)bufferspace[i])[j] = (long double)j;
 #endif
 #if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) 
            else if (buffertypes[i] == MPI_LONG_LONG_INT)
-               ((long long *)bufferspace[i])[j] = (long long)j;
+        ((long long *)bufferspace[i])[j] = (long long)j;
 #endif
            else if (buffertypes[i] == MPI_BYTE)
-               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
-       }
+        ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
     }
+  }
 }
 
 int
 CheckBuffer(bufferspace, buffertype, bufferlen)
-    void *bufferspace; 
-    MPI_Datatype buffertype; 
-    int bufferlen;
+     void *bufferspace; 
+     MPI_Datatype buffertype; 
+     int bufferlen;
 {
-    int j;
-    char valerr[256];
-    valerr[0] = 0;
-    for (j = 0; j < bufferlen; j++) {
-       if (buffertype == MPI_CHAR) {
+  int j;
+  char valerr[256];
+  valerr[0] = 0;
+  for (j = 0; j < bufferlen; j++) {
+    if (buffertype == MPI_CHAR) {
            if (((char *)bufferspace)[j] != (char)(j & 0x7f)) {
-               sprintf( valerr, "%x != %x", 
-                       ((char *)bufferspace)[j], (char)(j&0x7f) );
-               break;
-               }
-       } else if (buffertype == MPI_SHORT) {
+        sprintf( valerr, "%x != %x", 
+                 ((char *)bufferspace)[j], (char)(j&0x7f) );
+        break;
+      }
+    } else if (buffertype == MPI_SHORT) {
            if (((short *)bufferspace)[j] != (short)j) {
-               sprintf( valerr, "%d != %d", 
-                       ((short *)bufferspace)[j], (short)j );
-               break;
-               }
-       } else if (buffertype == MPI_INT) {
+        sprintf( valerr, "%d != %d", 
+                 ((short *)bufferspace)[j], (short)j );
+        break;
+      }
+    } else if (buffertype == MPI_INT) {
            if (((int *)bufferspace)[j] != (int)j) {
-               sprintf( valerr, "%d != %d", 
-                       ((int *)bufferspace)[j], (int)j );
-               break;
-               }
-       } else if (buffertype == MPI_LONG) {
+        sprintf( valerr, "%d != %d", 
+                 ((int *)bufferspace)[j], (int)j );
+        break;
+      }
+    } else if (buffertype == MPI_LONG) {
            if (((long *)bufferspace)[j] != (long)j) {
-               break;
-               }
-       } else if (buffertype == MPI_UNSIGNED_CHAR) {
+        break;
+      }
+    } else if (buffertype == MPI_UNSIGNED_CHAR) {
            if (((unsigned char *)bufferspace)[j] != (unsigned char)j) {
-               break;
-               }
-       } else if (buffertype == MPI_UNSIGNED_SHORT) {
+        break;
+      }
+    } else if (buffertype == MPI_UNSIGNED_SHORT) {
            if (((unsigned short *)bufferspace)[j] != (unsigned short)j) {
-               break;
-               }
-       } else if (buffertype == MPI_UNSIGNED) {
+        break;
+      }
+    } else if (buffertype == MPI_UNSIGNED) {
            if (((unsigned int *)bufferspace)[j] != (unsigned int)j) {
-               break;
-               }
-       } else if (buffertype == MPI_UNSIGNED_LONG) {
+        break;
+      }
+    } else if (buffertype == MPI_UNSIGNED_LONG) {
            if (((unsigned long *)bufferspace)[j] != (unsigned long)j) {
-               break;
-               }
-       } else if (buffertype == MPI_FLOAT) {
+        break;
+      }
+    } else if (buffertype == MPI_FLOAT) {
            if (((float *)bufferspace)[j] != (float)j) {
-               break;
-               }
-       } else if (buffertype == MPI_DOUBLE) {
+        break;
+      }
+    } else if (buffertype == MPI_DOUBLE) {
            if (((double *)bufferspace)[j] != (double)j) {
-               break;
-               }
+        break;
+      }
 #if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
-       } else if (buffertype == MPI_LONG_DOUBLE) {
+    } else if (buffertype == MPI_LONG_DOUBLE) {
            if (((long double *)bufferspace)[j] != (long double)j) {
-               break;
-               }
+        break;
+      }
 #endif
 #if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) 
-       } else if (buffertype == MPI_LONG_LONG_INT) {
+    } else if (buffertype == MPI_LONG_LONG_INT) {
            if (((long long *)bufferspace)[j] != (long long)j) {
-               break;
-               }
+        break;
+      }
 #endif
-       } else if (buffertype == MPI_BYTE) {
+    } else if (buffertype == MPI_BYTE) {
            if (((unsigned char *)bufferspace)[j] != (unsigned char)j) {
-               break;
-               }
-       }
+        break;
+      }
     }
-    /* Return +1 so an error in the first location is > 0 */
-    if (j < bufferlen) {
-       if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", 
-                               j, valerr );
-       else
+  }
+  /* Return +1 so an error in the first location is > 0 */
+  if (j < bufferlen) {
+    if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", 
+                            j, valerr );
+    else
            fprintf( stderr, "Different value[%d]\n", j );
-       return j+1;
+    return j+1;
        }
-    return 0;
+  return 0;
 }
 
 void 
 SetupBasicTypes()
 {
-    BasicTypes[0] = MPI_CHAR;        BasicNames[0] = (char*)"MPI_CHAR" ;
-    BasicTypes[1] = MPI_SHORT;       BasicNames[1] = (char*)"MPI_SHORT";
-    BasicTypes[2] = MPI_INT;         BasicNames[2] = (char*)"MPI_INT"  ;
-    BasicTypes[3] = MPI_LONG;        BasicNames[3] = (char*)"MPI_LONG" ;
-    BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR";
-    BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT";
-    BasicTypes[6] = MPI_UNSIGNED;    BasicNames[6] = (char*)"MPI_UNSIGNED";
-    BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG";
-    BasicTypes[8] = MPI_FLOAT;       BasicNames[8] = (char*)"MPI_FLOAT";
-    BasicTypes[9] = MPI_DOUBLE;      BasicNames[9] = (char*)"MPI_DOUBLE";
-    BasicTypes[10] = MPI_BYTE;       BasicNames[10] = (char*)"MPI_BYTE";
-    /* By making the BYTE type LAST, we make it easier to handle heterogeneous
-       systems that may not support all of the types */
-    ntypes = 11;
+  BasicTypes[0] = MPI_CHAR;        BasicNames[0] = (char*)"MPI_CHAR" ;
+  BasicTypes[1] = MPI_SHORT;       BasicNames[1] = (char*)"MPI_SHORT";
+  BasicTypes[2] = MPI_INT;         BasicNames[2] = (char*)"MPI_INT"  ;
+  BasicTypes[3] = MPI_LONG;        BasicNames[3] = (char*)"MPI_LONG" ;
+  BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR";
+  BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT";
+  BasicTypes[6] = MPI_UNSIGNED;    BasicNames[6] = (char*)"MPI_UNSIGNED";
+  BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG";
+  BasicTypes[8] = MPI_FLOAT;       BasicNames[8] = (char*)"MPI_FLOAT";
+  BasicTypes[9] = MPI_DOUBLE;      BasicNames[9] = (char*)"MPI_DOUBLE";
+  BasicTypes[10] = MPI_BYTE;       BasicNames[10] = (char*)"MPI_BYTE";
+  /* By making the BYTE type LAST, we make it easier to handle heterogeneous
+     systems that may not support all of the types */
+  ntypes = 11;
 #if defined (HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
-    /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 
-       for "actually implemented" */
-    if (!nolongdouble) { 
-       int l;
-       MPI_Type_size( MPI_LONG_DOUBLE, &l );
-       if (l > 0) {
+  /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 
+     for "actually implemented" */
+  if (!nolongdouble) { 
+    int l;
+    MPI_Type_size( MPI_LONG_DOUBLE, &l );
+    if (l > 0) {
            BasicTypes[ntypes] = MPI_LONG_DOUBLE; 
            BasicNames[ntypes] = (char*)"MPI_LONG_DOUBLE";
            ntypes++;
-       }
     }
+  }
 #endif
 #if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR)
-    BasicTypes[ntypes] = MPI_LONG_LONG_INT;
-    BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT";
-    ntypes++;
+  BasicTypes[ntypes] = MPI_LONG_LONG_INT;
+  BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT";
+  ntypes++;
 #endif
 }
 
 void 
 SenderTest1()
 {
-    void *bufferspace[MAX_TYPES];
-    int i, j;
-
-    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
-    FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
-    for (i = 0; i < ntypes; i++) {
-       MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD );
-       for (j = 0; j < maxbufferlen; j += 500)
+  void *bufferspace[MAX_TYPES];
+  int i, j;
+
+  AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+  FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+  for (i = 0; i < ntypes; i++) {
+    MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD );
+    for (j = 0; j < maxbufferlen; j += 500)
            MPI_Send(bufferspace[i], j, BasicTypes[i], dest, 
-                    2000, MPI_COMM_WORLD);
-    }
-    FreeBuffers(bufferspace, ntypes);
+               2000, MPI_COMM_WORLD);
+  }
+  FreeBuffers(bufferspace, ntypes);
 }
 
 void
 ReceiverTest1()
 {
-    void *bufferspace[MAX_TYPES];
-    int i, j;
-    char message[81];
-    MPI_Status Stat;
-    int dummy, passed;
-
-    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
-    for (i = 0; i < ntypes; i++) {
-       passed = 1;
-       MPI_Recv( (void *)0, 0, BasicTypes[i], src, 
-                    2000, MPI_COMM_WORLD, &Stat);
-       if (Stat.MPI_SOURCE != src) {
+  void *bufferspace[MAX_TYPES];
+  int i, j;
+  char message[81];
+  MPI_Status Stat;
+  int dummy, passed;
+
+  AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+  for (i = 0; i < ntypes; i++) {
+    passed = 1;
+    MPI_Recv( (void *)0, 0, BasicTypes[i], src, 
+              2000, MPI_COMM_WORLD, &Stat);
+    if (Stat.MPI_SOURCE != src) {
            fprintf(stderr, "*** Incorrect Source returned. ***\n");
            Test_Failed(message);
            passed = 0;
-       } else if (Stat.MPI_TAG != 2000) {      
+    } else if (Stat.MPI_TAG != 2000) { 
            fprintf(stderr, "*** Incorrect Tag returned. ***\n");           
            Test_Failed(message);
            passed = 0;
-       } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
-                  dummy != 0) {
+    } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
+               dummy != 0) {
            fprintf(stderr, 
-                   "*** Incorrect Count returned, Count = %d. ***\n", 
-                   dummy);
+              "*** Incorrect Count returned, Count = %d. ***\n", 
+              dummy);
            Test_Failed(message);
            passed = 0;
-           }
-       /* Try different sized messages */
-       for (j = 0; j < maxbufferlen; j += 500) {
+    }
+    /* Try different sized messages */
+    for (j = 0; j < maxbufferlen; j += 500) {
            MPI_Recv(bufferspace[i], j, BasicTypes[i], src, 
-                    2000, MPI_COMM_WORLD, &Stat);
+               2000, MPI_COMM_WORLD, &Stat);
            sprintf(message, "Send-Receive Test, Type %d, Count %d",
-                   i, j);
+              i, j);
            if (Stat.MPI_SOURCE != src) {
-               fprintf(stderr, "*** Incorrect Source returned. ***\n");
-               Test_Failed(message);
-               passed = 0;
+        fprintf(stderr, "*** Incorrect Source returned. ***\n");
+        Test_Failed(message);
+        passed = 0;
            } else if (Stat.MPI_TAG != 2000) {  
-               fprintf(stderr, "*** Incorrect Tag returned. ***\n");       
-               Test_Failed(message);
-               passed = 0;
+        fprintf(stderr, "*** Incorrect Tag returned. ***\n");      
+        Test_Failed(message);
+        passed = 0;
            } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
-                      dummy != j) {
-               fprintf(stderr, 
-           "*** Incorrect Count returned, Count = %d (should be %d). ***\n", 
-                       dummy, j);
-               Test_Failed(message);
-               passed = 0;
+                 dummy != j) {
+        fprintf(stderr, 
+                "*** Incorrect Count returned, Count = %d (should be %d). ***\n", 
+                dummy, j);
+        Test_Failed(message);
+        passed = 0;
            } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) {
-               fprintf(stderr, 
-              "*** Incorrect Message received (type = %d (%s), count = %d). ***\n",
-                       i, BasicNames[i], j );
-               Test_Failed(message);
-               passed = 0;
+        fprintf(stderr, 
+                "*** Incorrect Message received (type = %d (%s), count = %d). ***\n",
+                i, BasicNames[i], j );
+        Test_Failed(message);
+        passed = 0;
            } 
 #ifdef VERBOSE         
            else {
-               fprintf(stderr, 
-              "Message of count %d, type %d received correctly.\n", 
-                          j, i );
+        fprintf(stderr, 
+                "Message of count %d, type %d received correctly.\n", 
+                j, i );
            }
 #endif
-       }
-       sprintf(message, "Send-Receive Test, Type %d (%s)",
-               i, BasicNames[i] );
-       if (passed) 
+    }
+    sprintf(message, "Send-Receive Test, Type %d (%s)",
+            i, BasicNames[i] );
+    if (passed) 
            Test_Passed(message);
-       else 
+    else 
            Test_Failed(message);
-    }
-    FreeBuffers(bufferspace, ntypes);
+  }
+  FreeBuffers(bufferspace, ntypes);
 }
 
 #define MAX_ORDER_TAG 2010
@@ -373,263 +373,263 @@ ReceiverTest1()
 void 
 SenderTest2()
 {
-    int *buffer;
-    int i;
-    MPI_Request r[10];
-    MPI_Status  s[10];
-
-    buffer = (int *)malloc(maxbufferlen * sizeof(int));
-    for (i = 0; i < maxbufferlen; i++)
-       buffer[i] = i;
+  int *buffer;
+  int i;
+  MPI_Request r[10];
+  MPI_Status  s[10];
+
+  buffer = (int *)malloc(maxbufferlen * sizeof(int));
+  for (i = 0; i < maxbufferlen; i++)
+    buffer[i] = i;
     
-    for (i = 2001; i <= MAX_ORDER_TAG; i++)
-       MPI_Isend(buffer, maxbufferlen, MPI_INT, dest,
-                i, MPI_COMM_WORLD, &r[i-2001] );
+  for (i = 2001; i <= MAX_ORDER_TAG; i++)
+    MPI_Isend(buffer, maxbufferlen, MPI_INT, dest,
+              i, MPI_COMM_WORLD, &r[i-2001] );
     
-    MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s );
-    free(buffer);
+  MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s );
+  free(buffer);
     
-    return;
+  return;
 }
 
 void
 ReceiverTest2()
 {
-    int *buffer;
-    int i, j;
-    char message[81];
-    MPI_Status Stat;
-    int dummy, passed;
-    int errloc;
-
-    buffer = (int *)calloc(maxbufferlen,sizeof(int));
-    passed = 1;
-
-    for (i = MAX_ORDER_TAG; i >= 2001; i--) {
-       MPI_Recv(buffer, maxbufferlen, MPI_INT, src, 
-                i, MPI_COMM_WORLD, &Stat);
-       sprintf(message, "Tag Selectivity Test, Tag %d",
-               i);
-       if (Stat.MPI_SOURCE != src) {
+  int *buffer;
+  int i, j;
+  char message[81];
+  MPI_Status Stat;
+  int dummy, passed;
+  int errloc;
+
+  buffer = (int *)calloc(maxbufferlen,sizeof(int));
+  passed = 1;
+
+  for (i = MAX_ORDER_TAG; i >= 2001; i--) {
+    MPI_Recv(buffer, maxbufferlen, MPI_INT, src, 
+             i, MPI_COMM_WORLD, &Stat);
+    sprintf(message, "Tag Selectivity Test, Tag %d",
+            i);
+    if (Stat.MPI_SOURCE != src) {
            fprintf(stderr, "*** Incorrect Source returned. ***\n");
            Test_Failed(message);
-       } else if (Stat.MPI_TAG != i) { 
+    } else if (Stat.MPI_TAG != i) {    
            fprintf(stderr, "*** Incorrect Tag returned. ***\n");           
            Test_Failed(message);
-       } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) ||
-                  dummy != maxbufferlen) {
+    } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) ||
+               dummy != maxbufferlen) {
            fprintf(stderr, 
-                   "*** Incorrect Count returned, Count = %d. ***\n", 
-                   dummy);
+              "*** Incorrect Count returned, Count = %d. ***\n", 
+              dummy);
            Test_Failed(message);
-       } else if((errloc = 
-                  CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) {
+    } else if((errloc = 
+               CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) {
            fprintf(stderr, 
-                   "*** Incorrect Message received at %d (tag=%d). ***\n",
-                   errloc-1, i);
+              "*** Incorrect Message received at %d (tag=%d). ***\n",
+              errloc-1, i);
            Test_Failed(message);
            passed = 0;
-       }
-       /* Clear out the buffer */
-       for (j = 0; j < maxbufferlen; j++)
-           buffer[j] = -1;
     }
-    strncpy(message, "Tag Selectivity Test", 81);
-    if (passed)
-       Test_Passed(message);
-    else
-       Test_Failed(message);
-    free(buffer);
-    return;
+    /* Clear out the buffer */
+    for (j = 0; j < maxbufferlen; j++)
+           buffer[j] = -1;
+  }
+  strncpy(message, "Tag Selectivity Test", 81);
+  if (passed)
+    Test_Passed(message);
+  else
+    Test_Failed(message);
+  free(buffer);
+  return;
 }
 
 void
 SenderTest3()
 {
-    int ibuf[10];
+  int ibuf[10];
 
-    /* A receive test might not fail until it is triggered... */
-    MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD);
+  /* A receive test might not fail until it is triggered... */
+  MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD);
 
-    return;
+  return;
 }
 
 void
 ReceiverTest3( void )
 {
-    int buffer[20];
-    MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
-    MPI_Status status;
-    int myrank;
-    int small_tag;
-/*
+  int buffer[20];
+  MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
+  MPI_Status status;
+  int myrank;
+  int small_tag;
+  /*
     if (verbose) 
-       MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN);
+    MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN);
     else 
-       MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN );
-*/
-    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+  */
+  MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
 
-    if (myrank == 0 && verbose) {
-       fprintf( stderr, 
-"There should be eight error messages about invalid communicator\n\
+  if (myrank == 0 && verbose) {
+    fprintf( stderr, 
+             "There should be eight error messages about invalid communicator\n\
 count argument, datatype argument, tag, rank, buffer send and buffer recv\n" );
        }
-    if (MPI_Send(buffer, 20, MPI_INT, dest,
-                1, MPI_COMM_NULL) == MPI_SUCCESS){
-       Test_Failed("NULL Communicator Test");
-    }
-    else
-       Test_Passed("NULL Communicator Test");
-
-    if (MPI_Send(buffer, -1, MPI_INT, dest,
-                1, MPI_COMM_WORLD) == MPI_SUCCESS){
-       Test_Failed("Invalid Count Test");
-    }
-    else
-       Test_Passed("Invalid Count Test");
-
-    if (MPI_Send(buffer, 20, bogus_type, dest,
-                1, MPI_COMM_WORLD) == MPI_SUCCESS){
-       Test_Failed("Invalid Type Test");
-    }
-    else
-       Test_Passed("Invalid Type Test");
-
-    small_tag = -1;
-    if (small_tag == MPI_ANY_TAG) small_tag = -2;
-    if (MPI_Send(buffer, 20, MPI_INT, dest, 
-                small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
-        Test_Failed("Invalid Tag Test");
-    }
-    else
-       Test_Passed("Invalid Tag Test");
-
-    /* Form a tag that is too large */
-    /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag );
+  if (MPI_Send(buffer, 20, MPI_INT, dest,
+               1, MPI_COMM_NULL) == MPI_SUCCESS){
+    Test_Failed("NULL Communicator Test");
+  }
+  else
+    Test_Passed("NULL Communicator Test");
+
+  if (MPI_Send(buffer, -1, MPI_INT, dest,
+               1, MPI_COMM_WORLD) == MPI_SUCCESS){
+    Test_Failed("Invalid Count Test");
+  }
+  else
+    Test_Passed("Invalid Count Test");
+
+  if (MPI_Send(buffer, 20, bogus_type, dest,
+               1, MPI_COMM_WORLD) == MPI_SUCCESS){
+    Test_Failed("Invalid Type Test");
+  }
+  else
+    Test_Passed("Invalid Type Test");
+
+  small_tag = -1;
+  if (small_tag == MPI_ANY_TAG) small_tag = -2;
+  if (MPI_Send(buffer, 20, MPI_INT, dest, 
+               small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
+    Test_Failed("Invalid Tag Test");
+  }
+  else
+    Test_Passed("Invalid Tag Test");
+
+  /* Form a tag that is too large */
+  /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag );
     if (!flag) Test_Failed("Could not get tag ub!" );
     large_tag = *tag_ubp + 1;
     if (large_tag > *tag_ubp) {
-       if (MPI_Send(buffer, 20, MPI_INT, dest, 
-                    large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
-           Test_Failed("Invalid Tag Test");
-           }
-       else
-           Test_Passed("Invalid Tag Test");
-    }
-*/
-    if (MPI_Send(buffer, 20, MPI_INT, 300,
-                1, MPI_COMM_WORLD) == MPI_SUCCESS) {
-       Test_Failed("Invalid Destination Test");
-    }
-    else
-       Test_Passed("Invalid Destination Test");
-
-    if (MPI_Send((void *)0, 10, MPI_INT, dest,
-                1, MPI_COMM_WORLD) == MPI_SUCCESS){
-       Test_Failed("Invalid Buffer Test (send)");
+    if (MPI_Send(buffer, 20, MPI_INT, dest, 
+    large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
+    Test_Failed("Invalid Tag Test");
     }
     else
-       Test_Passed("Invalid Buffer Test (send)");
-
-    /* A receive test might not fail until it is triggered... */
-    if (MPI_Recv((void *)0, 10, MPI_INT, src,
-                15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){
-       Test_Failed("Invalid Buffer Test (recv)");
+    Test_Passed("Invalid Tag Test");
     }
-    else
-       Test_Passed("Invalid Buffer Test (recv)");
-
-    /* Just to keep things happy, see if there is a message to receive */
-    { //int flag, 
+  */
+  if (MPI_Send(buffer, 20, MPI_INT, 300,
+               1, MPI_COMM_WORLD) == MPI_SUCCESS) {
+    Test_Failed("Invalid Destination Test");
+  }
+  else
+    Test_Passed("Invalid Destination Test");
+
+  if (MPI_Send((void *)0, 10, MPI_INT, dest,
+               1, MPI_COMM_WORLD) == MPI_SUCCESS){
+    Test_Failed("Invalid Buffer Test (send)");
+  }
+  else
+    Test_Passed("Invalid Buffer Test (send)");
+
+  /* A receive test might not fail until it is triggered... */
+  if (MPI_Recv((void *)0, 10, MPI_INT, src,
+               15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){
+    Test_Failed("Invalid Buffer Test (recv)");
+  }
+  else
+    Test_Passed("Invalid Buffer Test (recv)");
+
+  /* Just to keep things happy, see if there is a message to receive */
+  { //int flag, 
     int ibuf[10];
 
     //MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status );
     //if (flag) 
-       MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status );
-    }
-    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL );
-    return;
+    MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status );
+  }
+  MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL );
+  return;
 }
 
 /* Allow -nolongdouble to suppress long double testing */
 int main( int argc, char **argv )
 {
-    int myrank, mysize;
-    int rc, itemp, i;
-
-    MPI_Init(&argc, &argv);
-    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
-    MPI_Comm_size(MPI_COMM_WORLD, &mysize);
-    Test_Init("sendrecv", myrank);
-    SetupBasicTypes();
-
-    if (mysize != 2) {
-       fprintf(stderr, 
-               "*** This test program requires exactly 2 processes.\n");
-       MPI_Abort( MPI_COMM_WORLD, 1 );
-    }
-
-    /* Get the min of the basic types */
-    itemp = ntypes;
-    MPI_Allreduce( &itemp, &ntypes, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD );
-
-    /* dest writes out the received stats; for the output to be
-       consistant (with the final check), it should be procees 0 */
-    for (i=1; i<argc; i++) {
-       if (argv[i] && strcmp( "-alt", argv[i] ) == 0) {
+  int myrank, mysize;
+  int rc, itemp, i;
+
+  MPI_Init(&argc, &argv);
+  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+  MPI_Comm_size(MPI_COMM_WORLD, &mysize);
+  Test_Init("sendrecv", myrank);
+  SetupBasicTypes();
+
+  if (mysize != 2) {
+    fprintf(stderr, 
+            "*** This test program requires exactly 2 processes.\n");
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+  }
+
+  /* Get the min of the basic types */
+  itemp = ntypes;
+  MPI_Allreduce( &itemp, &ntypes, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD );
+
+  /* dest writes out the received stats; for the output to be
+     consistant (with the final check), it should be procees 0 */
+  for (i=1; i<argc; i++) {
+    if (argv[i] && strcmp( "-alt", argv[i] ) == 0) {
            dest = 1;
            src  = 0;
-       
-       else if (argv[i] && strcmp( "-nolongdouble", argv[i] ) == 0) {
+    } 
+    else if (argv[i] && strcmp( "-nolongdouble", argv[i] ) == 0) {
            nolongdouble = 1;
-       }
-       else if (argv[i] && strcmp( "-test1", argv[i] ) == 0) {
+    }
+    else if (argv[i] && strcmp( "-test1", argv[i] ) == 0) {
            do_test2 = do_test3 = 0;
-       }
-       else if (argv[i] && strcmp( "-test2", argv[i] ) == 0) {
+    }
+    else if (argv[i] && strcmp( "-test2", argv[i] ) == 0) {
            do_test1 = do_test3 = 0;
-       }
-       else if (argv[i] && strcmp( "-test3", argv[i] ) == 0) {
+    }
+    else if (argv[i] && strcmp( "-test3", argv[i] ) == 0) {
            do_test2 = do_test1 = 0;
-       }
-       else {
+    }
+    else {
            printf( "Unrecognized argument %s\n", argv[i] );
-       }
     }
+  }
 
-    /* Turn stdout's buffering to line buffered so it mixes right with
-       stderr in output files. (hopefully) */
-    setvbuf(stdout, NULL, _IOLBF, 0);
-    setvbuf(stderr, NULL, _IOLBF, 0);
+  /* Turn stdout's buffering to line buffered so it mixes right with
+     stderr in output files. (hopefully) */
+  setvbuf(stdout, NULL, _IOLBF, 0);
+  setvbuf(stderr, NULL, _IOLBF, 0);
 
-    if (myrank == src) {
-       if (do_test1)
+  if (myrank == src) {
+    if (do_test1)
            SenderTest1();
-       if (do_test2)
+    if (do_test2)
            SenderTest2();
-       if (do_test3)
+    if (do_test3)
            SenderTest3(); 
-    } else if (myrank == dest) {
-       if (do_test1)
+  } else if (myrank == dest) {
+    if (do_test1)
            ReceiverTest1();
-       if (do_test2)
+    if (do_test2)
            ReceiverTest2();
-       if (do_test3) 
+    if (do_test3) 
            ReceiverTest3();
-    } else {
-       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
-       MPI_Abort( MPI_COMM_WORLD, 1 );
-    }
-    if (myrank == dest) {
-       rc = Summarize_Test_Results();
-    }
-    else {
-       rc = 0;
-    }
-    Test_Finalize();
-    Test_Waitforall( );
-    MPI_Finalize();
-    return rc;
+  } else {
+    fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+  }
+  if (myrank == dest) {
+    rc = Summarize_Test_Results();
+  }
+  else {
+    rc = 0;
+  }
+  Test_Finalize();
+  Test_Waitforall( );
+  MPI_Finalize();
+  return rc;
 }
 
index df40dc2..65ecebd 100644 (file)
@@ -34,16 +34,16 @@ int main(int argc, char *argv[])
     sb[i] = rank*size + i;
     rb[i] = 0;
   }
-
   printf("[%d] sndbuf=[", rank);
   for (i = 0; i < size; i++)
     printf("%d ", sb[i]);
   printf("]\n");
-
-  status = MPI_Reduce(sb, rb, size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
+  
+  int root=0;
+  status = MPI_Reduce(sb, rb, size, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD);
   MPI_Barrier(MPI_COMM_WORLD);
 
-  if (rank == 0) {
+  if (rank == root) {
     printf("[%d] rcvbuf=[", rank);
     for (i = 0; i < size; i++)
       printf("%d ", rb[i]);
@@ -53,6 +53,27 @@ int main(int argc, char *argv[])
       fflush(stdout);
     }
   }
+  
+  
+  printf("[%d] second sndbuf=[", rank);
+  for (i = 0; i < 1; i++)
+    printf("%d ", sb[i]);
+  printf("]\n");
+  
+  root=size-1;
+  status = MPI_Reduce(sb, rb, 1, MPI_INT, MPI_PROD, root, MPI_COMM_WORLD);
+  MPI_Barrier(MPI_COMM_WORLD);
+
+  if (rank == root) {
+    printf("[%d] rcvbuf=[", rank);
+    for (i = 0; i < 1; i++)
+      printf("%d ", rb[i]);
+    printf("]\n");
+    if (status != MPI_SUCCESS) {
+      printf("all_to_all returned %d\n", status);
+      fflush(stdout);
+    }
+  }
   free(sb);
   free(rb);
   MPI_Finalize();
index ae94a6c..ddc2ad5 100644 (file)
@@ -5,37 +5,55 @@
 p Test allreduce
 $ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_coll
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
-> [rank 4] -> Bourassa
-> [rank 5] -> Tremblay
-> [rank 6] -> Jupiter
-> [rank 7] -> Fafard
-> [rank 8] -> Ginette
-> [rank 9] -> Bourassa
-> [rank 10] -> Tremblay
-> [rank 11] -> Jupiter
-> [rank 12] -> Fafard
-> [rank 13] -> Ginette
-> [rank 14] -> Bourassa
-> [rank 15] -> Tremblay
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ]
+> [0] second sndbuf=[0 ]
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
+> [10] second sndbuf=[160 ]
+> [10] sndbuf=[160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 ]
+> [11] second sndbuf=[176 ]
+> [11] sndbuf=[176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 ]
+> [12] second sndbuf=[192 ]
+> [12] sndbuf=[192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ]
+> [13] second sndbuf=[208 ]
+> [13] sndbuf=[208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ]
+> [14] second sndbuf=[224 ]
+> [14] sndbuf=[224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 ]
+> [15] rcvbuf=[0 ]
+> [15] second sndbuf=[240 ]
+> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 ]
+> [1] second sndbuf=[16 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
+> [2] second sndbuf=[32 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [3] second sndbuf=[48 ]
 > [3] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ]
+> [4] second sndbuf=[64 ]
 > [4] sndbuf=[64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ]
+> [5] second sndbuf=[80 ]
 > [5] sndbuf=[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [6] second sndbuf=[96 ]
 > [6] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ]
+> [7] second sndbuf=[112 ]
 > [7] sndbuf=[112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ]
+> [8] second sndbuf=[128 ]
 > [8] sndbuf=[128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [9] second sndbuf=[144 ]
 > [9] sndbuf=[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ]
-> [10] sndbuf=[160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 ]
-> [11] sndbuf=[176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 ]
-> [12] sndbuf=[192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ]
-> [13] sndbuf=[208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ]
-> [14] sndbuf=[224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 ]
-> [15] sndbuf=[240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 ]
-> [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ]
+> [rank 0] -> Tremblay
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
+
diff --git a/teshsuite/smpi/reduce_scatter_coll.c b/teshsuite/smpi/reduce_scatter_coll.c
new file mode 100644 (file)
index 0000000..cba19bc
--- /dev/null
@@ -0,0 +1,50 @@
+/* 
+ * Test of reduce scatter.
+ *
+ * Each processor contributes its rank + the index to the reduction, 
+ * then receives the ith sum
+ *
+ * Can be called with any number of processors.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main( int argc, char **argv )
+{
+    int      err = 0, toterr;
+    int      *sendbuf, *recvbuf, *recvcounts;
+    int      size, rank, i, sumval;
+    MPI_Comm comm;
+
+
+    MPI_Init( &argc, &argv );
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+    sendbuf = (int *) malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) 
+       sendbuf[i] = rank + i;
+    recvcounts = (int *)malloc( size * sizeof(int) );
+        recvbuf = (int *)malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) 
+    recvcounts[i] = 1;
+    MPI_Reduce_scatter( sendbuf, recvbuf, recvcounts, MPI_INT, MPI_SUM, comm );
+    sumval = size * rank + ((size - 1) * size)/2;
+/* recvbuf should be size * (rank + i) */
+    if (recvbuf[0] != sumval) {
+       err++;
+       fprintf( stdout, "Did not get expected value for reduce scatter\n" );
+       fprintf( stdout, "[%d] Got %d expected %d\n", rank, recvbuf[0], sumval );
+    }
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0 && toterr == 0) {
+       printf( " No Errors\n" );
+    }
+    MPI_Finalize( );
+
+    return toterr;
+}
diff --git a/teshsuite/smpi/reduce_scatter_coll.tesh b/teshsuite/smpi/reduce_scatter_coll.tesh
new file mode 100644 (file)
index 0000000..8c4a278
--- /dev/null
@@ -0,0 +1,25 @@
+# Smpi reduce scatter collectives tests
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+
+p Test reduce_scatter
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_scatter_coll 
+> No Errors
+> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [rank 0] -> Tremblay
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
diff --git a/teshsuite/smpi/scatter_coll.tesh b/teshsuite/smpi/scatter_coll.tesh
new file mode 100644 (file)
index 0000000..f5d2c79
--- /dev/null
@@ -0,0 +1,58 @@
+# Smpi  scatter collectives tests
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+
+p Test scatter
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./scatter 
+>      [0] ok.
+>      [0] ok.
+>      [10] ok.
+>      [10] ok.
+>      [11] ok.
+>      [11] ok.
+>      [12] ok.
+>      [12] ok.
+>      [13] ok.
+>      [13] ok.
+>      [14] ok.
+>      [14] ok.
+>      [15] ok.
+>      [15] ok.
+>      [1] ok.
+>      [1] ok.
+>      [2] ok.
+>      [2] ok.
+>      [3] ok.
+>      [3] ok.
+>      [4] ok.
+>      [4] ok.
+>      [5] ok.
+>      [5] ok.
+>      [6] ok.
+>      [6] ok.
+>      [7] ok.
+>      [7] ok.
+>      [8] ok.
+>      [8] ok.
+>      [9] ok.
+>      [9] ok.
+> ** IBM Test Result: ... 
+> ** Small Test Result: ... 
+> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [rank 0] -> Tremblay
+> [rank 10] -> Tremblay
+> [rank 11] -> Jupiter
+> [rank 12] -> Fafard
+> [rank 13] -> Ginette
+> [rank 14] -> Bourassa
+> [rank 15] -> Tremblay
+> [rank 1] -> Jupiter
+> [rank 2] -> Fafard
+> [rank 3] -> Ginette
+> [rank 4] -> Bourassa
+> [rank 5] -> Tremblay
+> [rank 6] -> Jupiter
+> [rank 7] -> Fafard
+> [rank 8] -> Ginette
+> [rank 9] -> Bourassa
diff --git a/teshsuite/smpi/shared.c b/teshsuite/smpi/shared.c
new file mode 100644 (file)
index 0000000..1a6ac05
--- /dev/null
@@ -0,0 +1,62 @@
+/* Copyright (c) 2009-2012. The SimGrid Team. All rights reserved.          */
+
+/* This example should be instructive to learn about SMPI_SAMPLE_LOCAL and 
+   SMPI_SAMPLE_GLOBAL macros for execution sampling */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include <mpi.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+void* hash(char *str, uint64_t* ans);
+
+void* hash(char *str, uint64_t* ans)
+{
+  *ans=5381;
+  int c;
+  printf("hashing !\n");
+  while ((c = *str++)!=0)
+    *ans = ((*ans << 5) + *ans) + c; /* hash * 33 + c */
+  return NULL;
+}
+
+
+int main(int argc, char *argv[])
+{
+  MPI_Init(&argc, &argv);
+  int rank, size;
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+  MPI_Comm_size(MPI_COMM_WORLD, &size);
+  //Let's Allocate a shared memory buffer
+  uint64_t* buf = SMPI_SHARED_MALLOC(sizeof(uint64_t));
+  //one writes data in it
+  if(rank==0){
+    *buf=size;  
+  }
+  
+  MPI_Barrier(MPI_COMM_WORLD);
+  //everyobne reads from it. 
+  printf("[%d] The value in the shared buffer is: %" PRIu64"\n", rank, *buf);
+  
+  
+  MPI_Barrier(MPI_COMM_WORLD);
+  //Try SMPI_SHARED_CALL function, which should call hash only once and for all.
+  char *str = strdup("onceandforall");
+  if(rank==size-1){
+    SMPI_SHARED_CALL(hash,str,str,buf);  
+  }
+  
+  MPI_Barrier(MPI_COMM_WORLD);
+  
+  printf("[%d] After change, the value in the shared buffer is: %" PRIu64"\n", rank, *buf);
+  
+  SMPI_SHARED_FREE(buf);  
+  buf=NULL;  
+  free(str);
+    
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/shared.tesh b/teshsuite/smpi/shared.tesh
new file mode 100644 (file)
index 0000000..31d4c71
--- /dev/null
@@ -0,0 +1,20 @@
+p Test compute
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+! timeout 5
+$ ../../bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 4 ./shared 
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
+> [0] After change, the value in the shared buffer is: 16053117601147974045
+> [0] The value in the shared buffer is: 4
+> [1] After change, the value in the shared buffer is: 16053117601147974045
+> [1] The value in the shared buffer is: 4
+> [2] After change, the value in the shared buffer is: 16053117601147974045
+> [2] The value in the shared buffer is: 4
+> [3] After change, the value in the shared buffer is: 16053117601147974045
+> [3] The value in the shared buffer is: 4
+> hashing !
+
+
index 53b1d1f..d282149 100755 (executable)
@@ -13,7 +13,7 @@ fi
 
 if [ $# -lt 1 -o $# -gt 3 ]; then
     cat <<EOF
-Usage: $0 [-batch] archive.tar.gz [git_url [git_branch]]
+Usage: $0 [-batch] archive.tar.gz [git_url [git_reference]]
 EOF
     exit 1
 fi
@@ -26,10 +26,10 @@ fi
 
 if [ $# -ge 2 ]; then
     giturl=$2
-    gitbranch=${3:-master}
+    gitref=${3:-master}
 else
     giturl=$(git rev-parse --show-toplevel)
-    gitbranch=$(git branch | sed -n '/^\*/{s/^..//;p;}')
+    gitref=HEAD
 fi
 
 tmpdir=$(mktemp -d)
@@ -60,8 +60,8 @@ tar --directory "$tmpdir" \
     --transform 's!^[^/]*!a!' \
     --extract --gunzip --file "$archive"
 
-echo "Copying git repository: $giturl/$gitbranch -> $git_dir"
-git archive --format=tar --prefix="b/" --remote="$giturl" "$gitbranch" \
+echo "Copying git repository: $giturl/$gitref -> $git_dir"
+git archive --format=tar --prefix="b/" --remote="$giturl" "$gitref" \
     | tar --directory "$tmpdir" --extract --file -
 
 fa=from_tgz
index 61a58e5..4ded2ab 100644 (file)
@@ -8,6 +8,7 @@
 - Makefile
 - doc/html/.*
 
++ \.cproject
 + \.gitignore
 + README\.(coding|git)
 + mk_win-dist.sh