Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' into master
authorMartin Quinson <624847+mquinson@users.noreply.github.com>
Thu, 13 Sep 2018 20:00:17 +0000 (22:00 +0200)
committerGitHub <noreply@github.com>
Thu, 13 Sep 2018 20:00:17 +0000 (22:00 +0200)
330 files changed:
.circleci/config.yml
.gitignore
.gitlab-ci.yml
ChangeLog
doc/doxygen/application.doc [deleted file]
doc/doxygen/java.doc
doc/doxygen/models.doc [deleted file]
doc/doxygen/module-smpi.doc
doc/doxygen/options.doc
doc/doxygen/platform.doc
doc/doxygen/scenario.doc [deleted file]
doc/tuto-msg/Makefile [deleted file]
doc/tuto-msg/deployment0.xml [deleted file]
doc/tuto-msg/deployment_general.xml [deleted file]
doc/tuto-msg/masterworker-sol1.c [deleted file]
doc/tuto-msg/masterworker-sol2.c [deleted file]
doc/tuto-msg/masterworker-sol3.c [deleted file]
doc/tuto-msg/masterworker-sol4.c [deleted file]
doc/tuto-msg/masterworker.c [deleted file]
doc/tuto-msg/tuto-msg.doc [deleted file]
docs/Build.sh [new file with mode: 0755]
docs/requirements.txt
docs/source/Doxyfile [new file with mode: 0644]
docs/source/app_s4u.rst [new file with mode: 0644]
docs/source/application.rst [new file with mode: 0644]
docs/source/conf.py
docs/source/images/tuto-masterworkers-question.svg [deleted file]
docs/source/img/eclipseScreenShot.png [moved from docs/source/images/eclipseScreenShot.png with 99% similarity]
docs/source/img/extlink.png [moved from docs/source/images/extlink.png with 100% similarity]
docs/source/img/extlink.svg [moved from docs/source/images/extlink.svg with 99% similarity]
docs/source/img/graphical-toc.svg [new file with mode: 0644]
docs/source/index.rst
docs/source/intro_concepts.rst [moved from doc/doxygen/getting_started.doc with 55% similarity]
docs/source/intro_install.rst [moved from docs/source/installation.rst with 90% similarity]
docs/source/intro_yours.rst [moved from docs/source/install_yours.rst with 92% similarity]
docs/source/introduction.rst [new file with mode: 0644]
docs/source/main_concepts.rst
docs/source/models.rst [new file with mode: 0644]
docs/source/platform.rst [new file with mode: 0644]
docs/source/scenar_config.rst [new file with mode: 0644]
docs/source/scenario.rst [new file with mode: 0644]
docs/source/tuto_s4u.rst [new file with mode: 0644]
docs/source/tuto_s4u/.gitignore [new file with mode: 0644]
docs/source/tuto_s4u/deployment1.xml [new file with mode: 0644]
docs/source/tuto_s4u/deployment2.xml [moved from doc/tuto-msg/deployment1.xml with 86% similarity]
docs/source/tuto_s4u/deployment3.xml [moved from doc/tuto-msg/deployment2.xml with 100% similarity]
docs/source/tuto_s4u/deployment4.xml [moved from doc/tuto-msg/deployment3.xml with 100% similarity]
docs/source/tuto_s4u/draw_gantt.R [new file with mode: 0644]
docs/source/tuto_s4u/img/Rscript-screenshot.png [new file with mode: 0644]
docs/source/tuto_s4u/img/intro.svg [moved from docs/source/images/tuto-masterworkers-intro.svg with 100% similarity]
docs/source/tuto_s4u/img/question.svg [moved from doc/tuto-msg/overview.svg with 100% similarity]
docs/source/tuto_s4u/img/result.png [moved from docs/source/images/tuto-masterworkers-result.png with 100% similarity]
docs/source/tuto_s4u/img/vite-screenshot.png [new file with mode: 0644]
docs/source/tuto_s4u/master-workers-lab1.cpp [new file with mode: 0644]
docs/source/tuto_s4u/master-workers-lab2.cpp [new file with mode: 0644]
docs/source/tuto_s4u/master-workers-lab3.cpp [new file with mode: 0644]
docs/source/tuto_s4u/master-workers-lab4.cpp [new file with mode: 0644]
docs/source/usecase_algorithms.rst [deleted file]
examples/java/app/bittorrent/app-bittorrent.tesh
examples/java/app/centralizedmutex/app-centralizedmutex.tesh
examples/java/app/masterworker/app-masterworker.tesh
examples/java/app/pingpong/app-pingpong.tesh
examples/java/app/tokenring/Main.java
examples/java/app/tokenring/app-tokenring.tesh
examples/java/async/dsend/async-dsend.tesh
examples/java/async/waitall/async-waitall.tesh
examples/java/async/yield/async-yield.tesh
examples/java/cloud/masterworker/cloud-masterworker.tesh
examples/java/cloud/migration/cloud-migration.tesh
examples/java/dht/chord/dht-chord.tesh
examples/java/dht/kademlia/dht-kademlia.tesh
examples/java/energy/consumption/Main.java
examples/java/energy/consumption/energy-consumption.tesh
examples/java/energy/pstate/energy-pstate.tesh
examples/java/energy/vm/energy-vm.tesh
examples/java/io/file/io-file.tesh
examples/java/io/storage/io-storage.tesh
examples/java/process/kill/process-kill.tesh
examples/java/process/migration/process-migration.tesh
examples/java/process/startkilltime/process-startkilltime.tesh
examples/java/process/suspend/process-suspend.tesh
examples/java/task/priority/task-priority.tesh
examples/java/trace/pingpong/trace-pingpong.tesh
examples/msg/CMakeLists.txt
examples/msg/platform-failures/platform-failures.c
examples/msg/platform-failures/platform-failures.tesh
examples/msg/trace-process-migration/trace-process-migration.tesh
examples/s4u/CMakeLists.txt
examples/s4u/app-bittorrent/s4u-peer.cpp
examples/s4u/app-masterworkers/s4u-app-masterworkers-class.cpp
examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
examples/s4u/app-masterworkers/s4u-app-masterworkers.tesh
examples/s4u/app-masterworkers/s4u-app-masterworkers_d.xml
examples/s4u/async-wait/s4u-async-wait.cpp
examples/s4u/async-waitall/s4u-async-waitall.cpp
examples/s4u/async-waitany/s4u-async-waitany.cpp
examples/s4u/async-waituntil/s4u-async-waituntil.cpp [new file with mode: 0644]
examples/s4u/async-waituntil/s4u-async-waituntil.tesh [new file with mode: 0644]
examples/s4u/async-waituntil/s4u-async-waituntil_d.xml [new file with mode: 0644]
examples/s4u/dht-chord/s4u-dht-chord-node.cpp
examples/s4u/dht-chord/s4u-dht-chord.hpp
examples/s4u/exec-basic/s4u-exec-basic.cpp
examples/s4u/exec-ptask/s4u-exec-ptask.cpp
examples/s4u/platform-failures/s4u-masterworker-failures_d.xml [new file with mode: 0644]
examples/s4u/platform-failures/s4u-platform-failures.cpp
examples/s4u/platform-failures/s4u-platform-failures.tesh
examples/s4u/platform-properties/s4u-platform-properties.cpp
examples/simdag/test/sd_test.cpp
examples/smpi/ampi/ampi.tesh
examples/smpi/energy/energy.tesh
examples/smpi/energy/f77/energy.tesh
examples/smpi/energy/f90/energy.tesh
include/simgrid/Exception.hpp [new file with mode: 0644]
include/simgrid/forward.h
include/simgrid/s4u.hpp
include/simgrid/s4u/Activity.hpp
include/simgrid/s4u/Actor.hpp
include/simgrid/s4u/Comm.hpp
include/simgrid/s4u/ConditionVariable.hpp
include/simgrid/s4u/Exec.hpp
include/simgrid/s4u/Host.hpp
include/simgrid/s4u/Io.hpp
include/simgrid/s4u/Link.hpp
include/simgrid/s4u/Mailbox.hpp
include/simgrid/s4u/Mutex.hpp
include/simgrid/s4u/NetZone.hpp
include/simgrid/s4u/Storage.hpp
include/simgrid/simix.h
include/simgrid/smpi/replay.hpp
include/smpi/smpi_helpers_internal.h
include/xbt/backtrace.h
include/xbt/backtrace.hpp
include/xbt/ex.h
include/xbt/ex.hpp [deleted file]
include/xbt/exception.hpp [deleted file]
include/xbt/functional.hpp
include/xbt/log.hpp
src/bindings/java/JavaContext.cpp
src/bindings/java/JavaContext.hpp
src/bindings/java/jmsg.cpp
src/bindings/java/jmsg_process.cpp
src/bindings/java/jmsg_synchro.cpp
src/bindings/java/jmsg_synchro.h
src/bindings/java/jmsg_vm.cpp
src/bindings/java/org/simgrid/NativeLib.java
src/instr/instr_interface.cpp
src/instr/instr_paje_containers.cpp
src/instr/instr_platform.cpp
src/instr/instr_private.hpp
src/kernel/activity/ConditionVariableImpl.cpp
src/kernel/activity/SleepImpl.cpp
src/kernel/context/Context.cpp
src/kernel/context/Context.hpp
src/kernel/context/ContextBoost.cpp
src/kernel/context/ContextRaw.cpp
src/kernel/context/ContextThread.cpp
src/kernel/context/ContextThread.hpp
src/kernel/context/ContextUnix.cpp
src/msg/instr_msg_task.cpp
src/msg/msg_gos.cpp
src/msg/msg_process.cpp
src/msg/msg_synchro.cpp
src/plugins/vm/VmLiveMigration.cpp
src/s4u/s4u_Activity.cpp
src/s4u/s4u_Actor.cpp
src/s4u/s4u_Barrier.cpp
src/s4u/s4u_Comm.cpp
src/s4u/s4u_ConditionVariable.cpp
src/s4u/s4u_Exec.cpp
src/s4u/s4u_Host.cpp
src/s4u/s4u_Io.cpp
src/s4u/s4u_Mailbox.cpp
src/simix/ActorImpl.cpp
src/simix/ActorImpl.hpp
src/simix/libsmx.cpp
src/simix/smx_context.cpp
src/simix/smx_deployment.cpp
src/simix/smx_environment.cpp
src/simix/smx_global.cpp
src/simix/smx_host.cpp
src/simix/smx_io.cpp
src/simix/smx_network.cpp
src/smpi/colls/barrier/barrier-mpich-smp.cpp [new file with mode: 0644]
src/smpi/colls/smpi_default_selector.cpp
src/smpi/colls/smpi_mpich_selector.cpp
src/smpi/colls/smpi_openmpi_selector.cpp
src/smpi/include/private.hpp
src/smpi/include/smpi_coll.hpp
src/smpi/include/smpi_comm.hpp
src/smpi/internals/smpi_bench.cpp
src/smpi/internals/smpi_global.cpp
src/smpi/mpi/smpi_comm.cpp
src/smpi/mpi/smpi_info.cpp
src/smpi/mpi/smpi_request.cpp
src/surf/HostImpl.cpp
src/surf/HostImpl.hpp
src/surf/cpu_cas01.cpp
src/surf/cpu_ti.cpp
src/surf/ptask_L07.cpp
src/surf/sg_platf.cpp
src/surf/surf_interface.cpp
src/surf/surf_interface.hpp
src/surf/xml/simgrid.dtd
src/surf/xml/simgrid_dtd.c
src/surf/xml/simgrid_dtd.h
src/xbt/backtrace_linux.cpp
src/xbt/config.cpp
src/xbt/cunit.cpp
src/xbt/dict.cpp
src/xbt/dynar.cpp
src/xbt/ex.cpp [deleted file]
src/xbt/exception.cpp
src/xbt/xbt_os_synchro.cpp
src/xbt/xbt_replay.cpp
src/xbt/xbt_str.cpp
teshsuite/java/semaphoregc/semaphoregc.tesh
teshsuite/java/sleephostoff/sleephostoff.tesh
teshsuite/msg/host_on_off_processes/host_on_off_processes.cpp
teshsuite/msg/host_on_off_processes/host_on_off_processes.tesh
teshsuite/msg/task_destroy_cancel/task_destroy_cancel.cpp
teshsuite/msg/task_progress/task_progress.cpp
teshsuite/s4u/CMakeLists.txt
teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp [new file with mode: 0644]
teshsuite/s4u/activity-lifecycle/activity-lifecycle.tesh [new file with mode: 0644]
teshsuite/s4u/activity-lifecycle/testing_platform.xml [new file with mode: 0644]
teshsuite/s4u/actor-autorestart/actor-autorestart.cpp
teshsuite/s4u/actor-autorestart/actor-autorestart.tesh
teshsuite/s4u/host_on_off_wait/host_on_off_wait.cpp [deleted file]
teshsuite/s4u/host_on_off_wait/host_on_off_wait.tesh [deleted file]
teshsuite/smpi/CMakeLists.txt
teshsuite/smpi/coll-allreduce/coll-allreduce-automatic.tesh
teshsuite/smpi/isp/umpire/CMakeLists.txt
teshsuite/smpi/isp/umpire/any_src-can-deadlock.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock10.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock10_mod.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock11.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock2.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock3.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock4.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock4_mod.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock5.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock5_mod.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock6.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock6_mod.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock7.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock8.c
teshsuite/smpi/isp/umpire/any_src-can-deadlock9.c
teshsuite/smpi/isp/umpire/any_src-deadlock.c
teshsuite/smpi/isp/umpire/any_src-wait-deadlock.c
teshsuite/smpi/isp/umpire/any_src-wait-deadlock2.c
teshsuite/smpi/isp/umpire/any_src-waitall-deadlock.c
teshsuite/smpi/isp/umpire/any_src-waitall-deadlock2.c
teshsuite/smpi/isp/umpire/any_src-waitall-deadlock3.c
teshsuite/smpi/isp/umpire/any_src-waitany-deadlock.c
teshsuite/smpi/isp/umpire/any_src-waitany-deadlock2.c
teshsuite/smpi/isp/umpire/basic-deadlock-cart_create.c
teshsuite/smpi/isp/umpire/basic-deadlock-cart_sub.c
teshsuite/smpi/isp/umpire/basic-deadlock-comm_create.c
teshsuite/smpi/isp/umpire/basic-deadlock-comm_dup.c
teshsuite/smpi/isp/umpire/basic-deadlock-comm_split.c
teshsuite/smpi/isp/umpire/basic-deadlock-graph_create.c
teshsuite/smpi/isp/umpire/basic-deadlock-intercomm_create.c
teshsuite/smpi/isp/umpire/basic-deadlock-intercomm_merge.c
teshsuite/smpi/isp/umpire/basic-deadlock.c
teshsuite/smpi/isp/umpire/bcast-deadlock.c
teshsuite/smpi/isp/umpire/collective-misorder-allreduce.c
teshsuite/smpi/isp/umpire/collective-misorder.c
teshsuite/smpi/isp/umpire/collective-misorder2.c
teshsuite/smpi/isp/umpire/complex-deadlock.c
teshsuite/smpi/isp/umpire/finalize-deadlock.c
teshsuite/smpi/isp/umpire/intercomm_create-deadlock.c
teshsuite/smpi/isp/umpire/intercomm_create-deadlock2.c
teshsuite/smpi/isp/umpire/intercomm_create-deadlock3.c
teshsuite/smpi/isp/umpire/intercomm_create-deadlock4.c
teshsuite/smpi/isp/umpire/intercomm_merge-deadlock.c
teshsuite/smpi/isp/umpire/irecv-deadlock.c
teshsuite/smpi/isp/umpire/irecv-isend-ok.c
teshsuite/smpi/isp/umpire/irecv-isend-ok2.c
teshsuite/smpi/isp/umpire/lost-request-waitall.c
teshsuite/smpi/isp/umpire/lost-request.c
teshsuite/smpi/isp/umpire/lost-request3.c
teshsuite/smpi/isp/umpire/no-error-any_src.c
teshsuite/smpi/isp/umpire/no-error-derived-comms.c
teshsuite/smpi/isp/umpire/no-error-test.c
teshsuite/smpi/isp/umpire/no-error-testall.c
teshsuite/smpi/isp/umpire/no-error-testany.c
teshsuite/smpi/isp/umpire/no-error-wait-any_src.c
teshsuite/smpi/isp/umpire/no-error-wait-any_src2.c
teshsuite/smpi/isp/umpire/no-error-wait-any_src3.c
teshsuite/smpi/isp/umpire/no-error-wait-any_src4.c
teshsuite/smpi/isp/umpire/no-error-wait.c
teshsuite/smpi/isp/umpire/no-error-wait2.c
teshsuite/smpi/isp/umpire/no-error-waitall-any_src.c
teshsuite/smpi/isp/umpire/no-error-waitall-any_src2.c
teshsuite/smpi/isp/umpire/no-error-waitall-any_src3.c
teshsuite/smpi/isp/umpire/no-error-waitall.c
teshsuite/smpi/isp/umpire/no-error-waitany-any_src.c
teshsuite/smpi/isp/umpire/no-error-waitany-any_src2.c
teshsuite/smpi/isp/umpire/no-error-waitany-any_src3.c
teshsuite/smpi/isp/umpire/no-error-waitany.c
teshsuite/smpi/isp/umpire/no-error-waitany2.c
teshsuite/smpi/isp/umpire/no-error.c
teshsuite/smpi/isp/umpire/no-error2.c
teshsuite/smpi/isp/umpire/no-error3-any_src.c
teshsuite/smpi/isp/umpire/no-error3.c
teshsuite/smpi/isp/umpire/no-error4-any_src.c
teshsuite/smpi/isp/umpire/no-error4.c
teshsuite/smpi/isp/umpire/persistent.c
teshsuite/smpi/isp/umpire/persistent2.c
teshsuite/smpi/isp/umpire/persistent3.c
teshsuite/smpi/isp/umpire/persistent4.c
teshsuite/smpi/isp/umpire/send-recv-ok.c
teshsuite/smpi/isp/umpire/sendrecv-deadlock.c
teshsuite/smpi/isp/umpire/wait-deadlock.c
teshsuite/smpi/isp/umpire/waitall-deadlock.c
teshsuite/smpi/isp/umpire/waitany-deadlock.c
teshsuite/smpi/timers/timers.tesh
teshsuite/xbt/mmalloc/mmalloc_test.cpp
tools/cmake/DefinePackages.cmake
tools/cmake/MakeLib.cmake
tools/cmake/Tests.cmake
tools/docker/.gitignore [new file with mode: 0644]
tools/docker/Dockerfile.build-deps [new file with mode: 0644]
tools/docker/Dockerfile.stable [new file with mode: 0644]
tools/docker/Dockerfile.tuto-s4u [new file with mode: 0644]
tools/docker/Dockerfile.unstable [new file with mode: 0644]
tools/docker/Makefile [new file with mode: 0644]
tools/internal/check_dist_archive.exclude
tools/jenkins/project_description.sh
tools/tesh/tesh.py

index b241f7f..768dcda 100644 (file)
@@ -7,7 +7,7 @@
 
 default: &default
   docker:
-    - image: simgrid/build
+    - image: simgrid/build-deps
 
 version: 2.0
 jobs:
@@ -19,5 +19,5 @@ jobs:
           name: Configure, build and test da stuff
           command: |
             mkdir _build && cd _build
-            cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON ..
+            cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=OFF -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON ..
             make -j4 && ctest -j4 --output-on-failure
index 5f2d918..85093f4 100644 (file)
@@ -160,6 +160,7 @@ examples/s4u/app-token-ring/s4u-app-token-ring
 examples/s4u/async-wait/s4u-async-wait
 examples/s4u/async-waitall/s4u-async-waitall
 examples/s4u/async-waitany/s4u-async-waitany
+examples/s4u/async-waituntil/s4u-async-waituntil
 examples/s4u/cloud-capping/s4u-cloud-capping
 examples/s4u/cloud-migration/s4u-cloud-migration
 examples/s4u/cloud-simple/s4u-cloud-simple
@@ -176,6 +177,7 @@ examples/s4u/exec-dvfs/s4u-exec-dvfs
 examples/s4u/exec-monitor/s4u-exec-monitor
 examples/s4u/exec-ptask/s4u-exec-ptask
 examples/s4u/exec-remote/s4u-exec-remote
+examples/s4u/io-async/s4u-io-async
 examples/s4u/io-file-remote/s4u-io-file-remote
 examples/s4u/io-file-system/s4u-io-file-system
 examples/s4u/io-storage-raw/s4u-io-storage-raw
@@ -214,6 +216,7 @@ examples/smpi/NAS/is
 examples/smpi/replay_multiple/deployment.xml
 examples/smpi/replay_multiple/replay_multiple
 examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual
+examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_resources
 examples/smpi/replay/one_trace
 examples/smpi/replay/smpi_replay
 examples/smpi/smpi_msg_masterslave/masterslave_mailbox_smpi
@@ -266,10 +269,10 @@ teshsuite/msg/trace_integration/trace_integration
 teshsuite/s4u/actor/actor
 teshsuite/s4u/actor-autorestart/actor-autorestart
 teshsuite/s4u/actor-migration/actor-migration
+teshsuite/s4u/activity-lifecycle/activity-lifecycle
 teshsuite/s4u/cloud-interrupt-migration/cloud-interrupt-migration
 teshsuite/s4u/comm-pt2pt/comm-pt2pt
 teshsuite/s4u/concurrent_rw/concurrent_rw
-teshsuite/s4u/host_on_off_wait/host_on_off_wait
 teshsuite/s4u/listen_async/listen_async
 teshsuite/s4u/pid/pid
 teshsuite/s4u/storage_client_server/storage_client_server
index 3ef1530..fc8df80 100644 (file)
@@ -1,23 +1,18 @@
-image: debian:testing-slim
+image: simgrid/build-deps
 
-.build: &build
+pages:
   script:
-  - apt-get update
-  - apt-get install -y python3-pip doxygen libboost-all-dev libboost-dev fig2dev
   - pip3 install --requirement docs/requirements.txt 
   - cd docs
-  - sphinx-build -M html source/ build/
+  - ./Build.sh
   - mv build/html ../public
   artifacts:
     paths:
     - public
-
-pages:
-  <<: *build
   only:
   - master
 
-test:
-  <<: *build
-  except:
-  - master
+ctest:
+  script:
+  - cmake -Denable_model-checking=OFF -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=ON -Denable_compile_warnings=ON .
+  - make VERBOSE=1 && ctest --output-on-failure
index 39946e8..3438268 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,11 @@ S4U new features:
        activity.
      - read_async(sg_size_t) and write_async(sg_size_t) which are wrappers on 
        io_init() + start()
+ - Fully reimplement auto_restart mechanism that was utterly broken 
+   (fix #22, #131 and #281 that were all very related)
+ - When creating an actor from a function and its parameters,
+   move-only parameters are not allowed anymore, as it would prevent
+   the actor to be restartable if its parameters are consumed on run.
 
 Tracing:
  - Rename 'power' and 'power_used' variables into 'speed' and 'speed_used'
@@ -18,15 +23,24 @@ XBT:
  - Remove portability wrapper to condition variables
  - Remove xbt_os_thread_yield()
 
+Java:
+ - Due to an internal bug, Msg.run() must now be your last line.
+   We hope to fix it in a future release, and we are sorry for the inconvenience.
+
 Fixed bugs:
+ - #22: Process autorestart seem to only work with CAS01 cpus 
  - #93: simgrid should not eat --help
+ - #131: Java : autostart does not work
  - #264: Add ptask L07 resource tracing
  - #271: Dynamic and manual replay of SMPI traces
  - #279: Breakpoints option uses time deltas instead of absolute time
+ - #281: Daemonized actor no longer daemonized after an auto-restart
  - #282: TIT convertor erase traces when using absolute path in the trace list file
  - #285: segfault when a s4u actor kills itself with msg process tracing activated
  - #286: Pajé traces are not exposing the number of cores
  - #287: Command-line parsing should stop when encountering '--'
+ - #288: MPI_Init(NULL, NULL)
+ - #296: DTD too permissive
 
 ----------------------------------------------------------------------------
 
diff --git a/doc/doxygen/application.doc b/doc/doxygen/application.doc
deleted file mode 100644 (file)
index 1bfb58a..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/** 
-@page application Describing your application
-
-TBD
-
-* Main concepts
-
-  - *Actor* (or process in legacy interfaces of SimGrid)
-  
-  - *Activities*: resource usage that applications do. This is what
-    takes time.
-    
-    Any given actor can do at most one foreground activity, while it
-    can also do several non-blocking activities in the background.
-    
-  - These activities take place on *Resources* (links, compute
-    machine, disks). Resources should be described (created) in the
-    Virtual Platform (link), but your application have many other ways
-    to interact with the resource.  
-
-  - The resources are arranged in a hierarchy of *Networking Zones*,
-    with which the application can also interact. The netzone knows the
-    networking path between one resource to another.
-
-Speak of mailboxes here? Where if not?
-
-* Interfaces to describe applications
-
-- Simple C++ interface: S4U that is currently designed
-- Simple Legacy C interfaces: MSG and SimDag, with comparison.
-- Simple Java Interface: Currently MSG-based, but will be replaced with S4U stuff when ready
-- MPI applications
-- Event-oriented, and trace-based. The old documentation of the
-  obsolete MSG module was removed in
-  https://github.com/simgrid/simgrid/commit/e05361c201fb95d2b7605e59001cd0a49a489739
-
-- Arbitrary applications: Simterpose and Remote SimGrid (they are currently far from being usable).
-- State our goal of BYOS (build your own simulator), even if it's just a neat name for now
-
-*/
\ No newline at end of file
index 81c8027..d4c273a 100644 (file)
@@ -61,6 +61,15 @@ $ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SIMGRID_ROOT/lib
 Add these lines to your `~/.bashrc` file or equivalent to make these
 settings permanent even after a reboot.
 
+** **pthread_create failed**
+
+You reached the amount of threads that can be run on your system. Try
+increasing the thread limits of your operating system.
+
+If you manage to get it working, you could also switch to the Java
+co-routines (see @ref bindings_java_coro_install). Unfortunately,
+nobody used them since a few years, so they may well be broken by now.
+
 ** **Other errors**
 
 When using jMSG, your program can crash for 3 main reasons:
diff --git a/doc/doxygen/models.doc b/doc/doxygen/models.doc
deleted file mode 100644 (file)
index caed4c6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/** 
-@page models SimGrid Models
-
-TBD
-
- - Main existing models (contention, cste, LM07)
- - Main concepts (Routing, LMM) + link to the papers
- - How to switch on the command line
-
-*/
\ No newline at end of file
index ede94c1..cdaa5f2 100644 (file)
@@ -126,8 +126,8 @@ of the targeted MPI implementations.
 You can switch the automatic selector through the
 \c smpi/coll-selector configuration item. Possible values:
 
- - <b>ompi</b>: default selection logic of OpenMPI (version 1.7)
- - <b>mpich</b>: default selection logic of MPICH (version 3.0.4)
+ - <b>ompi</b>: default selection logic of OpenMPI (version 3.1.2)
+ - <b>mpich</b>: default selection logic of MPICH (version 3.3b)
  - <b>mvapich2</b>: selection logic of MVAPICH2 (version 1.9) tuned
    on the Stampede cluster   
  - <b>impi</b>: preliminary version of an Intel MPI selector (version
@@ -231,6 +231,7 @@ which will iterate over all implemented versions and output the best
  - ompi_tree: recursive doubling type algorithm, with tree structure
  - ompi_doublering: double ring algorithm
  - mvapich2_pair: pairwise algorithm
+ - mpich_smp: barrier intra-node, then inter-node
 
 #### MPI_Scatter
 
index 209de0b..34bec89 100644 (file)
@@ -1248,28 +1248,33 @@ at least one huge page:
 Then, you can pass the option --cfg=smpi/shared-malloc-hugepage:/home/huge
 to smpirun to actually activate the huge page support in shared mallocs.
 
-@subsection options_model_smpi_wtime smpi/wtime: Inject constant times for calls to MPI_Wtime
+@subsection options_model_smpi_wtime smpi/wtime: Inject constant times for calls to MPI_Wtime, gettimeofday and clock_gettime
 
-@b Default value: 0
-
-By setting this option, you can control the amount of time a process sleeps
-when MPI_Wtime() is called; this is important, because SimGrid normally only
-advances the time while communication is happening and thus,
-MPI_Wtime will not add to the time, resulting in a deadlock if used as a
-break-condition.
+@b Default value: 10 ns
 
-Here is an example:
+This option controls the amount of (simulated) time spent in calls to
+MPI_Wtime(), gettimeofday() and clock_gettime(). If you set this value
+to 0, the simulated clock is not advanced in these calls, which leads
+to issue if your application contains such a loop:
 
 @code{.unparsed}
     while(MPI_Wtime() < some_time_bound) {
-        ...
+        /* some tests, with no communication nor computation */
     }
 @endcode
 
-If the time is never advanced, this loop will clearly never end as MPI_Wtime()
-always returns the same value. Hence, pass a (small) value to the smpi/wtime
-option to force a call to MPI_Wtime to advance the time as well.
-
+When the option smpi/wtime is set to 0, the time advances only on
+communications and computations, so the previous code results in an
+infinite loop: the current [simulated] time will never reach @c
+some_time_bound.  This infinite loop is avoided when that option is
+set to a small amount, as it is by default since SimGrid v3.21.
+
+Note that if your application does not contain any loop depending on
+the current time only, then setting this option to a non-zero value
+will slow down your simulations by a tiny bit: the simulation loop has
+to be broken and reset each time your code ask for the current time.
+If the simulation speed really matters to you, you can avoid this
+extra delay by setting smpi/wtime to 0.
 
 @section options_generic Configuring other aspects of SimGrid
 
index 3ada216..c4e0ea4 100644 (file)
@@ -128,7 +128,6 @@ Attribute         | Values                                 | Description
 id                | String (mandatory)                     | The identifier of the host. facilitates referring to this AS.
 speed             | double (mandatory)                     | Computational power of every core of this host in FLOPS (must be positive)
 core              | int (defaults to 1)                    | Number of cores (see @ref howto_multicore)
-state             | optionally "OFF"                       | If set to OFF, the host is initially turned off.
 availability_file | File name (optional) | (Relative or absolute) filename to use as input; must contain availability traces for this host. The syntax of this file is defined below.
 state_file        | File name (optional) |  File to use as a state profile (see @ref howto_churn)
 coordinates       | String (mandatory when using Vivaldi routing) | The coordinates of this host (see @ref pf_P2P_tags).
@@ -310,8 +309,7 @@ lat             | yes       | int    | Latency for the links between nodes and b
 
 @note
     Please note that as of now, it is impossible to change attributes such as,
-    amount of cores (always set to 1), the initial state of hosts/links
-    (always set to ON), the sharing policy of the links (always set to @ref pf_sharing_policy_splitduplex "SPLITDUPLEX").
+    amount of cores (always set to 1), the sharing policy of the links (always set to @ref pf_sharing_policy_splitduplex "SPLITDUPLEX").
 
 #### Example ####
 
@@ -432,7 +430,6 @@ id              | yes       | string | The identifier of the link to be used whe
 bandwidth       | yes       | int    | Maximum bandwidth for this link, given in bytes/s
 latency         | no        | double (default: 0.0) | Latency for this link.
 sharing_policy  | no        | @ref sharing_policy_shared "SHARED"@|@ref pf_sharing_policy_fatpipe "FATPIPE"@|@ref pf_sharing_policy_splitduplex "SPLITDUPLEX" (default: SHARED) | Sharing policy for the link.
-state           | no        | ON@|OFF (default: ON) | Allows you to to turn this link on or off (working / not working)
 bandwidth_file  | no        | string | Allows you to use a file as input for bandwidth.
 latency_file    | no        | string | Allows you to use a file as input for latency.
 state_file      | no        | string | Allows you to use a file as input for states.
diff --git a/doc/doxygen/scenario.doc b/doc/doxygen/scenario.doc
deleted file mode 100644 (file)
index 7fd0d5e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
-@page scenario Describing the experimental scenario
-
-TBD
-
-Main concepts:
-
- - Deployment file
- - Availability and state profiles
- - Reproducible random number generation
- - Command line options, in particular on the model switching
-
-*/
\ No newline at end of file
diff --git a/doc/tuto-msg/Makefile b/doc/tuto-msg/Makefile
deleted file mode 100644 (file)
index fbac5c3..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# This Makefile is specifically tailored for the binaries of this tutorial.
-
-# For your own project, you should use the one provided at 
-# http://simgrid.gforge.inria.fr/simgrid/latest/doc/install_yours.html
-
-# Some configuration
-SIMGRID_INSTALL_PATH ?= ../.. # Where you installed simgrid 
-CC ?= gcc                     # Your compiler (on Mac, use clang instead)
-
-# No change needed bellow for this tutorial.
-############################################################################
-
-all: masterworker
-
-WARNINGS = -Wall -Wextra -Wshadow -Wcast-align -Waggregate-return -Wmissing-prototypes \
-          -Wmissing-declarations -Wmissing-prototypes -Wpointer-arith -Wwrite-strings \
-          -Wmissing-noreturn -Wredundant-decls \
-         -Wno-nested-externs  -Wno-strict-prototypes -Wno-unused-parameter
-WARNINGS += -Werror # Comment that line to not be in paranoid mode
-
-# CFLAGS = -std=gnu99 -g -O0 $(WARNINGS) $(EXTRA_CFLAGS) # Use this line to make debugging easier
-CFLAGS = -std=gnu99 -g -O2 $(WARNINGS) $(EXTRA_CFLAGS) # Use this line to get better performance
-
-# No change should be mandated past that line
-#############################################
-# The following are implicit rules, used by default to actually build
-# the targets for which you listed the dependencies above.
-
-.SUFFIXES: .c
-# The blanks before the $(CC) must be a Tab char, not spaces
-.c:
-       $(CC) -I$(strip $(SIMGRID_INSTALL_PATH))/include -L$(strip $(SIMGRID_INSTALL_PATH))/lib/ $(CFLAGS) $< -lsimgrid -o $@
-
-clean:
-       rm -f *.o *~ masterworker masterworker-sol1 masterworker-sol2 masterworker-sol3 masterworker-sol4
-.PHONY: clean
-
diff --git a/doc/tuto-msg/deployment0.xml b/doc/tuto-msg/deployment0.xml
deleted file mode 100644 (file)
index a9fe036..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4.1">
-  <!-- The master actor (with some arguments) -->
-  <actor host="Tremblay" function="master">
-     <argument value="20"/>       <!-- Number of tasks -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="1000000"/>   <!-- Communication size of tasks -->
-     <argument value="Jupiter"/>  <!-- First worker -->
-     <argument value="Fafard"/>   <!-- Second worker -->
-     <argument value="Ginette"/>  <!-- Third worker -->
-     <argument value="Bourassa"/> <!-- Last worker -->
-     <argument value="Tremblay"/> <!-- Me! I can work too! -->
-  </actor>
-  <!-- The worker actor (with no argument) -->
-  <actor host="Tremblay" function="worker" on_failure="RESTART"/>
-  <actor host="Jupiter" function="worker" on_failure="RESTART"/>
-  <actor host="Fafard" function="worker" on_failure="RESTART"/>
-  <actor host="Ginette" function="worker" on_failure="RESTART"/>
-  <actor host="Bourassa" function="worker" on_failure="RESTART"/>
-</platform>
diff --git a/doc/tuto-msg/deployment_general.xml b/doc/tuto-msg/deployment_general.xml
deleted file mode 100644 (file)
index adbb7cb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4.1">
-  <actor host="griffon-1.nancy.grid5000.fr" function="master"> <!-- griffon-1.nancy.grid5000.fr peer-0 cb1-1.dc1.acloud.com-->
-     <argument value="3600"/>      <!-- Simulation timeout -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="100000"/>   <!-- Communication size of tasks -->
-  </actor>
-</platform>
diff --git a/doc/tuto-msg/masterworker-sol1.c b/doc/tuto-msg/masterworker-sol1.c
deleted file mode 100644 (file)
index 180c61e..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Copyright (c) 2007-2018. 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 "simgrid/msg.h"
-
-#include <stdio.h> /* sprintf */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
-
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
-
-static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
-{
-  strcpy(buffer, sender);
-  strcat(buffer, ":");
-  strcat(buffer, receiver);
-  return buffer;
-}
-
-/* forward definitions */
-static int master(int argc, char* argv[]);
-static int worker(int argc, char* argv[]);
-
-static int master(int argc, char* argv[])
-{
-  msg_host_t host_self    = MSG_host_self();
-  const char* master_name = MSG_host_get_name(host_self);
-  char channel[1024];
-
-  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");       /** - Number of tasks      */
-  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
-
-  /* Create the tasks in advance */
-  msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
-
-  for (int i = 0; i < number_of_tasks; i++) {
-    char sprintf_buffer[64];
-    sprintf(sprintf_buffer, "Task_%d", i);
-    todo[i] = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
-  }
-
-  /* Get the info about the worker processes (directly from SimGrid) */
-  int worker_count    = MSG_get_host_number();
-  msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
-
-  for (int i = 0; i < worker_count; i++)
-    if (host_self == workers[i]) {
-      workers[i] = workers[worker_count - 1];
-      worker_count--;
-      break;
-    }
-
-  for (int i = 0; i < worker_count; i++)
-    MSG_process_create("worker", worker, (void*)master_name, workers[i]);
-  XBT_INFO("Got %d workers and %ld tasks to process", worker_count, number_of_tasks);
-
-  /* Dispatch the tasks */
-  for (int i = 0; i < number_of_tasks; i++) {
-    build_channel_name(channel, master_name, MSG_host_get_name(workers[i % worker_count]));
-
-    XBT_INFO("Sending '%s' to channel '%s'", todo[i]->name, channel);
-
-    MSG_task_send(todo[i], channel);
-    XBT_INFO("Sent");
-  }
-
-  XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (int i = 0; i < worker_count; i++) {
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % worker_count])));
-  }
-
-  XBT_INFO("Goodbye now!");
-  free(workers);
-  free(todo);
-  return 0;
-} /* end_of_master */
-
-/** Receiver function  */
-static int worker(int argc, char* argv[])
-{
-  char channel[1024];
-
-  build_channel_name(channel, MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
-
-  XBT_INFO("Receiving on channel '%s'", channel);
-
-  while (1) {
-    msg_task_t task = NULL;
-    int res         = MSG_task_receive(&(task), channel);
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-
-    XBT_INFO("Received '%s'", MSG_task_get_name(task));
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    XBT_INFO("Processing '%s'", MSG_task_get_name(task));
-    MSG_task_execute(task);
-    XBT_INFO("'%s' done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-  }
-  XBT_INFO("I'm done. See you!");
-  return 0;
-} /* end_of_worker */
-
-/** Main function */
-int main(int argc, char* argv[])
-{
-  MSG_init(&argc, argv);
-  xbt_assert(argc > 2,
-             "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
-             argv[0], argv[0]);
-
-  /*  Create a simulated platform */
-  MSG_create_environment(argv[1]);
-
-  /*   Application deployment */
-  MSG_function_register("master", master);
-  MSG_function_register("worker", worker);
-  MSG_launch_application(argv[2]);
-
-  /* Run the simulation */
-  msg_error_t res = MSG_main();
-
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-  return (res != MSG_OK);
-}
diff --git a/doc/tuto-msg/masterworker-sol2.c b/doc/tuto-msg/masterworker-sol2.c
deleted file mode 100644 (file)
index 16d44b0..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Copyright (c) 2007-2018. 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 "simgrid/msg.h"
-
-#include <stdio.h> /* sprintf */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
-
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
-
-static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
-{
-  strcpy(buffer, sender);
-  strcat(buffer, ":");
-  strcat(buffer, receiver);
-  return buffer;
-}
-
-/* forward definitions */
-static int master(int argc, char* argv[]);
-static int worker(int argc, char* argv[]);
-
-static int master(int argc, char* argv[])
-{
-  msg_host_t host_self = MSG_host_self();
-  char* master_name    = (char*)MSG_host_get_name(host_self);
-  char channel[1024];
-
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
-
-  /* Get the info about the worker processes (directly from SimGrid) */
-  int worker_count    = MSG_get_host_number();
-  msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
-
-  for (int i = 0; i < worker_count; i++) // Remove my host from the list
-    if (host_self == workers[i]) {
-      workers[i] = workers[worker_count - 1];
-      worker_count--;
-      break;
-    }
-
-  for (int i = 0; i < worker_count; i++)
-    MSG_process_create("worker", worker, (void*)master_name, workers[i]);
-  XBT_INFO("Got %d workers and will send tasks for %g seconds", worker_count, timeout);
-
-  /* Dispatch the tasks */
-  int task_num = 0;
-  while (1) {
-    if (MSG_get_clock() > timeout)
-      break;
-
-    char sprintf_buffer[64];
-    sprintf(sprintf_buffer, "Task_%d", task_num);
-    msg_task_t task = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
-
-    build_channel_name(channel, master_name, MSG_host_get_name(workers[task_num % worker_count]));
-
-    XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
-    MSG_task_send(task, channel);
-    XBT_DEBUG("Sent");
-    task_num++;
-  }
-
-  XBT_DEBUG("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (int i = 0; i < worker_count; i++) {
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % worker_count])));
-  }
-
-  XBT_DEBUG("Sent %d tasks in total!", task_num);
-  free(workers);
-  return 0;
-}
-
-/** Worker function  */
-static int worker(int argc, char* argv[])
-{
-  char channel[1024];
-
-  build_channel_name(channel, MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
-
-  XBT_DEBUG("Receiving on channel '%s'", channel);
-
-  while (1) {
-    msg_task_t task = NULL;
-    int res         = MSG_task_receive(&(task), channel);
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-
-    XBT_DEBUG("Received '%s'", MSG_task_get_name(task));
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    XBT_DEBUG("Processing '%s'", MSG_task_get_name(task));
-    MSG_task_execute(task);
-    XBT_DEBUG("'%s' done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-  }
-  XBT_DEBUG("I'm done. See you!");
-  return 0;
-}
-
-/** Main function */
-int main(int argc, char* argv[])
-{
-  MSG_init(&argc, argv);
-  xbt_assert(argc > 2,
-             "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
-             argv[0], argv[0]);
-
-  /*  Create a simulated platform */
-  MSG_create_environment(argv[1]);
-
-  /*   Application deployment */
-  MSG_function_register("master", master);
-  MSG_function_register("worker", worker);
-  MSG_launch_application(argv[2]);
-
-  /* Run the simulation */
-  msg_error_t res = MSG_main();
-
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-  return (res != MSG_OK);
-}
diff --git a/doc/tuto-msg/masterworker-sol3.c b/doc/tuto-msg/masterworker-sol3.c
deleted file mode 100644 (file)
index 2c187ec..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/* Copyright (c) 2007-2018. 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 "simgrid/msg.h"
-
-#include <stdio.h> /* sprintf */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
-
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
-
-static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
-{
-  strcpy(buffer, sender);
-  strcat(buffer, ":");
-  strcat(buffer, receiver);
-  return buffer;
-}
-
-/* forward definitions */
-static int master(int argc, char* argv[]);
-static int worker(int argc, char* argv[]);
-
-static int master(int argc, char* argv[])
-{
-  msg_host_t host_self = MSG_host_self();
-  char* master_name    = (char*)MSG_host_get_name(host_self);
-  char channel[1024];
-
-  TRACE_category(master_name);
-
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
-
-  /* Get the info about the worker processes */
-  int worker_count    = MSG_get_host_number();
-  msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
-
-  for (int i = 0; i < worker_count; i++) // Remove my host from the list
-    if (host_self == workers[i]) {
-      workers[i] = workers[worker_count - 1];
-      worker_count--;
-      break;
-    }
-
-  for (int i = 0; i < worker_count; i++)
-    MSG_process_create("worker", worker, (void*)master_name, workers[i]);
-  XBT_INFO("Got %d workers and will send tasks for %g seconds", worker_count, timeout);
-
-  /* Dispatch the tasks */
-  int task_num = 0;
-  while (1) {
-    if (MSG_get_clock() > timeout)
-      break;
-
-    char sprintf_buffer[64];
-    sprintf(sprintf_buffer, "Task_%d", task_num);
-
-    msg_task_t task = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
-    MSG_task_set_category(task, master_name);
-
-    build_channel_name(channel, master_name, MSG_host_get_name(workers[task_num % worker_count]));
-
-    XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
-    MSG_task_send(task, channel);
-    XBT_DEBUG("Sent");
-    task_num++;
-  }
-
-  XBT_DEBUG("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (int i = 0; i < worker_count; i++) {
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % worker_count])));
-  }
-
-  XBT_INFO("Sent %d tasks in total!", task_num);
-  free(workers);
-  return 0;
-}
-
-/** Worker function  */
-static int worker(int argc, char* argv[])
-{
-  char channel[1024];
-  build_channel_name(channel, MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
-
-  XBT_DEBUG("Receiving on channel '%s'", channel);
-
-  while (1) {
-    msg_task_t task = NULL;
-    int res         = MSG_task_receive(&(task), channel);
-    xbt_assert(res == MSG_OK, "MSG_task_get failed");
-
-    XBT_DEBUG("Received '%s'", MSG_task_get_name(task));
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    XBT_DEBUG("Processing '%s'", MSG_task_get_name(task));
-    MSG_task_execute(task);
-    XBT_DEBUG("'%s' done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-  }
-  XBT_DEBUG("I'm done. See you!");
-  return 0;
-}
-
-/** Main function */
-int main(int argc, char* argv[])
-{
-  MSG_init(&argc, argv);
-  xbt_assert(argc > 2,
-             "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
-             argv[0], argv[0]);
-
-  /*  Create a simulated platform */
-  MSG_create_environment(argv[1]);
-
-  /*   Application deployment */
-  MSG_function_register("master", master);
-  MSG_function_register("worker", worker);
-  MSG_launch_application(argv[2]);
-
-  /* Run the simulation */
-  msg_error_t res = MSG_main();
-
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-  return (res != MSG_OK);
-}
diff --git a/doc/tuto-msg/masterworker-sol4.c b/doc/tuto-msg/masterworker-sol4.c
deleted file mode 100644 (file)
index 6235ed6..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Copyright (c) 2007-2018. 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 "simgrid/msg.h"
-
-#include <stdio.h> /* sprintf */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
-
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
-
-static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
-{
-  strcpy(buffer, sender);
-  strcat(buffer, ":");
-  strcat(buffer, receiver);
-  return buffer;
-}
-
-/* forward definitions */
-static int master(int argc, char* argv[]);
-static int worker(int argc, char* argv[]);
-
-static int master(int argc, char* argv[])
-{
-  msg_host_t host_self = MSG_host_self();
-  char* master_name    = (char*)MSG_host_get_name(host_self);
-  char channel[1024];
-
-  TRACE_category(master_name);
-
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
-
-  /* Get the info about the worker processes */
-  int worker_count    = MSG_get_host_number();
-  msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
-
-  for (int i = 0; i < worker_count; i++) // Remove my host from the list
-    if (host_self == workers[i]) {
-      workers[i] = workers[worker_count - 1];
-      worker_count--;
-      break;
-    }
-
-  for (int i = 0; i < worker_count; i++)
-    MSG_process_create("worker", worker, (void*)master_name, workers[i]);
-  XBT_INFO("Got %d workers and will send tasks for %g seconds", worker_count, timeout);
-
-  /* Dispatch the tasks */
-  int task_num = 0;
-  while (MSG_get_clock() < timeout) {
-
-    /* Retrieve the next incomming request */
-    XBT_DEBUG("Retrieve the next incomming request on %s", master_name);
-    msg_task_t request = NULL;
-    int res            = MSG_task_receive(&(request), master_name);
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-    msg_host_t requester = MSG_task_get_data(request);
-    MSG_task_destroy(request);
-
-    /* Prepare the task to be sent */
-    char sprintf_buffer[64];
-    sprintf(sprintf_buffer, "Task_%d", task_num);
-    msg_task_t task = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
-    MSG_task_set_category(task, master_name);
-
-    /* Send this out */
-    build_channel_name(channel, master_name, MSG_host_get_name(requester));
-
-    XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
-    MSG_task_send(task, channel);
-    XBT_DEBUG("Sent");
-    task_num++;
-  }
-
-  XBT_DEBUG("Time is up. Let's tell everybody the computation is over.");
-  for (int i = 0; i < worker_count; i++) { /* We don't write in order, but the total amount is right */
-
-    /* Don't write to a worker that did not request for work, or it will deadlock: both would be sending something */
-    msg_task_t request = NULL;
-    int res            = MSG_task_receive(&(request), master_name);
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-    msg_host_t requester = MSG_task_get_data(request);
-    MSG_task_destroy(request);
-
-    XBT_DEBUG("Stop worker %s", MSG_host_get_name(requester));
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(requester)));
-  }
-
-  XBT_INFO("Sent %d tasks in total!", task_num);
-  free(workers);
-  return 0;
-}
-
-/** Worker function  */
-static int worker(int argc, char* argv[])
-{
-  char channel[1024];
-
-  const char* my_master = MSG_process_get_data(MSG_process_self());
-  build_channel_name(channel, my_master, MSG_host_get_name(MSG_host_self()));
-
-  XBT_DEBUG("Receiving on channel \"%s\"", channel);
-
-  while (1) {
-    /* Send a request */
-    XBT_DEBUG("Sent a request to my master on %s", my_master);
-    msg_task_t request = MSG_task_create("request", 0, 0, MSG_host_self());
-    MSG_task_send(request, my_master);
-
-    /* Wait for the answer */
-    msg_task_t task = NULL;
-    int res         = MSG_task_receive(&(task), channel);
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-
-    XBT_DEBUG("Received '%s'", MSG_task_get_name(task));
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    XBT_DEBUG("Processing '%s'", MSG_task_get_name(task));
-    MSG_task_execute(task);
-    XBT_DEBUG("'%s' done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-  }
-  XBT_DEBUG("I'm done. See you!");
-  return 0;
-}
-
-/** Main function */
-int main(int argc, char* argv[])
-{
-  MSG_init(&argc, argv);
-  xbt_assert(argc > 2,
-             "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
-             argv[0], argv[0]);
-
-  /*  Create a simulated platform */
-  MSG_create_environment(argv[1]);
-
-  /*   Application deployment */
-  MSG_function_register("master", master);
-  MSG_function_register("worker", worker);
-  MSG_launch_application(argv[2]);
-
-  /* Run the simulation */
-  msg_error_t res = MSG_main();
-
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-  return (res != MSG_OK);
-}
diff --git a/doc/tuto-msg/masterworker.c b/doc/tuto-msg/masterworker.c
deleted file mode 100644 (file)
index 2a2b906..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Copyright (c) 2007-2018. 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 "simgrid/msg.h"
-
-#include <stdio.h> /* sprintf */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
-
-#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
-
-/** Master expects 3+ arguments given in the XML deployment file: */
-static int master(int argc, char* argv[])
-{
-  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");       /** - Number of tasks      */
-  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
-
-  /* Create the tasks in advance */
-  msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
-
-  for (int i = 0; i < number_of_tasks; i++) {
-    char sprintf_buffer[64];
-    sprintf(sprintf_buffer, "Task_%d", i);
-    todo[i] = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
-  }
-
-  /* Get the info about the worker processes from my parameters */
-  int worker_count    = argc - 4;
-  msg_host_t* workers = xbt_new0(msg_host_t, worker_count);
-
-  for (int i = 4; i < argc; i++) {
-    workers[i - 4] = MSG_get_host_by_name(argv[i]);
-    xbt_assert(workers[i - 4] != NULL, "Unknown host %s. Stopping Now! ", argv[i]);
-  }
-  XBT_INFO("Got %d workers and %ld tasks to process", worker_count, number_of_tasks);
-
-  /* Dispatch the tasks */
-  for (int i = 0; i < number_of_tasks; i++) {
-    XBT_INFO("Sending '%s' to '%s'", todo[i]->name, MSG_host_get_name(workers[i % worker_count]));
-    if (MSG_host_self() == workers[i % worker_count]) {
-      XBT_INFO("Hey ! It's me ! :)");
-    }
-
-    MSG_task_send(todo[i], MSG_host_get_name(workers[i % worker_count]));
-    XBT_INFO("Sent");
-  }
-
-  XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (int i = 0; i < worker_count; i++) {
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, MSG_host_get_name(workers[i]));
-  }
-
-  XBT_INFO("Goodbye now!");
-  free(workers);
-  free(todo);
-  return 0;
-}
-
-/** Worker does not expect any argument from XML deployment file. */
-static int worker(int argc, char* argv[])
-{
-  while (1) {
-    msg_task_t task = NULL;
-    int res         = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-
-    XBT_INFO("Received '%s'", MSG_task_get_name(task));
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    XBT_INFO("Processing \"%s\"", MSG_task_get_name(task));
-    MSG_task_execute(task);
-    XBT_INFO("'%s' done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-  }
-  XBT_INFO("I'm done. See you!");
-  return 0;
-} /* end_of_worker */
-
-/** Main function */
-int main(int argc, char* argv[])
-{
-
-  MSG_init(&argc, argv);
-  xbt_assert(argc > 2,
-             "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
-             argv[0], argv[0]);
-
-  /*  Create a simulated platform */
-  MSG_create_environment(argv[1]);
-
-  /*   Application deployment */
-  MSG_function_register("master", master);
-  MSG_function_register("worker", worker);
-  MSG_launch_application(argv[2]);
-
-  /* Run the simulation */
-  msg_error_t res = MSG_main();
-
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-  return (res != MSG_OK);
-} /* end_of_main */
diff --git a/doc/tuto-msg/tuto-msg.doc b/doc/tuto-msg/tuto-msg.doc
deleted file mode 100644 (file)
index c0ebbb3..0000000
+++ /dev/null
@@ -1,428 +0,0 @@
-/*! @page tutorial_msg SimGrid Tutorial with MSG
-
-@tableofcontents
-
-@section tuto-msg-intro Introduction
-
-@subsection tuto-msg-intro-settings Settings
-
-@warning Before you take this tutorial, you should remember that the
-MSG interface is currently deprecated. It means that it will remain as
-is, inchanged, for a few years, but that new developments should use
-the new S4U interface instead. Unfortunately, the S4U tutorial is not
-written yet. Sorry about that.
-
-This tutorial will guide your create and run your first SimGrid
-simulator. Let's consider the following scenario:
-
-> Assume we have a (possibly large) bunch of (possibly large) data to
-> process and which originally reside on a server (a.k.a. master). For
-> sake of simplicity, we assume all input file require the same amount
-> of computation. We assume the server can be helped by a (possibly
-> large) set of worker machines. What is the best way to organize the
-> computations ?
-
-@htmlonly
-<div align="center">
-@endhtmlonly
-@htmlinclude tuto-msg/overview.svg
-@htmlonly
-</div>
-@endhtmlonly
-
-@subsection tuto-msg-intro-questions Raised Questions
-
-Although this looks like a very simple setting it raises several
-interesting questions:
-
-- Which algorithm should the master use to send workload?
-
-    The provided code sends the tasks to the workers with a trivial
-    round-robin algorithm. It would probably be more efficient if the
-    workers were asking for tasks, to let the master distribute the
-    tasks in a more cleaver way.
-
-- Should the worker specify how many tasks they want? Or should the
-  master decide everything?
-
-    The workers will starve if they don't get the tasks fast
-    enough. One possibility to reduce latency would be to send tasks
-    in pools instead of one by one. But if the pools are too big, the
-    load balancing will likely get uneven, in particular when
-    distributing the last tasks.
-
-- How does the quality of such algorithm dependent on the platform
-    characteristics and on the task characteristics?
-
-    Whenever the input communication time is very small compared to
-    processing time and workers are homogeneous, it is likely that the
-    round-robin algorithm performs very well. Would it still hold true
-    when transfer time is not negligible and the platform is, say, a
-    volunteer computing system ? What if some tasks are performed
-    faster on some specific nodes?
-
-- The network topology interconnecting the master and the workers
-  may be quite complicated. How does such a topology impact the
-  previous result?
-
-    When data transfers are the bottleneck, it is likely that a good
-    modeling of the platform becomes essential. The SimGrid platform
-    models are particularly handy to account for complex platform
-    topologies.
-
-- What topology to use for the application? 
-
-    Is a flat master worker deployment sufficient? Should we go for a
-    hierarchical algorithm, with some forwarders taking large pools of
-    tasks from the master, each of them distributing their tasks to a
-    sub-pool of workers? Or should we introduce super-peers,
-    dupplicating the master's role in a peer-to-peer manner?  Do the
-    algorithms require a perfect knowledge of the network?
-
-- How is such an algorithm sensitive to external workload variation?
-
-    What if bandwidth, latency and computing speed can vary with no
-    warning?  Shouldn't you study whether your algorithm is sensitive
-    to such load variations?
-
-- Although an algorithm may be more efficient than another, how
-  does it interfere with other applications?
-
-
-- Etc, etc.
-
-As you can see, this very simple setting may need to evolve way beyond
-what you initially imagined. And this is a good news.
-
-But don't believe the fools saying that all you need to study such
-settings is a simple discrete event simulator. Do you really want to
-reinvent the wheel, write your own tool, debug it, optimize it and
-validate its models against real settings for ages, or do you prefer
-to sit on the shoulders of a giant?<br>
-With SimGrid, you can forget about most technical details (but not
-all), and focus on your algorithm. The whole simulation mechanism is
-already working.
-
-@subsection tuto-msg-intro-goal Envisionned Study
-
-
-The following figure is a screenshot of [triva][fn:1] visualizing a [SimGrid
-simulation][fn:2] of two master worker applications (one in light gray and
-the other in dark gray) running in concurrence and showing resource
-usage over a long period of time.
-
-![Test](./sc3-description.png)
-
-@section tuto-msg-starting Getting Started
-
-@subsection tuto-msg-prerequesite Prerequisite
-
-In this example, we use Pajeng and Vite to visualize the result of
-SimGrid simulations. These external tools are usually very easy to
-install. On Debian and Ubuntu for example, you can get them as follows:
-
-~~~~{.sh}
-sudo apt-get install pajeng vite
-~~~~
-
-@subsection tuto-msg-setup Setting up and Compiling
-
-The corresponding source files can be obtained
-[online on GitLab](https://gitlab.inria.fr/simgrid/simgrid/tree/master/doc/tuto-msg/src). 
-There is a button on the top right to download the whole 
-directory in one archive file. If you wish, other platform files are available from 
-[this GitLab directory](https://gitlab.inria.fr/simgrid/simgrid/tree/master/examples/platforms).
-
-As you can see, there is already a little Makefile that compiles
-everything for you. If you struggle with the compilation, then you should double check 
-your @ref install "SimGrid installation". 
-On need, please refer to the @ref install_yours_trouble section.
-
-@section tuto-msg-ex0 Discovering the provided simulator
-
-Please compile and execute the provided simulator as follows:
-
-~~~~{.sh}
-make masterworker
-./masterworker examples/platforms/small_platform.xml deployment0.xml
-~~~~
-
-For a more "fancy" output, you can use simgrid-colorizer. 
-
-~~~~{.sh}
-./masterworker examples/platforms/small_platform.xml deployment0.xml 2>&1 | simgrid-colorizer
-~~~~
-
-If you installed SimGrid to a non-standard path, you may have to
-specify the full path to simgrid-colorizer on the above line, such as
-@c /opt/simgrid/bin/simgrid-colorizer. If you did not install it at all,
-you can find it in @<simgrid_root_directory@>/bin/colorize.
-
-For a classical Gantt-Chart visualization, you can produce a [Paje][fn:5] trace:
-
-~~~~{.sh}
-./masterworker platforms/platform.xml deployment0.xml --cfg=tracing:yes \
-    --cfg=tracing/msg/process:yes
-pajeng simgrid.trace
-~~~~
-
-Alternatively, you can use [vite][fn:6].
-
-~~~~{.sh}
-./masterworker platforms/platform.xml deployment0.xml --cfg=tracing:yes \
-    --cfg=tracing/msg/process:yes --cfg=tracing/basic:yes
-vite simgrid.trace
-~~~~
-
-@subsection tuto-msg-exo0-source Understanding this source code
-
-Explore the @ref doc/tuto-msg/masterworker.c source file. It contains 3 functions:
- - @c master: that's the code executed by the master process.<br>
-   It creates a large array containing all tasks,
-   dispatches all tasks to the workers and then dispatch
-   specific tasks which name is "finalize". 
- - @c worker: each workers will execute this function.<br>
-   That's an infinite loop waiting for incomming tasks.
-   We exit the loop if the name of the received task is "finalize", or process the task otherwise.
- - @c main: this setups the simulation.
-
-How does SimGrid know that we need one master and several workers?
-Because it's written in the deployment file (called @c
-deployment0.xml), that we pass to MSG_create_environment() during the setup.
-
-@include doc/tuto-msg/deployment0.xml
-
-@section tuto-msg-exo1 Exercise 1: Simplifying the deployment file
-
-In the provided example, the deployment file `deployment0.xml` is
-tightly connected to the platform file `small_platform.xml` and adding
-more workers quickly becomes a pain: You need to start them (at the
-bottom of the file), add to inform the master that they are available
-(in the master parameters list).
-
-Instead, modify the simulator `masterworker.c` into `masterworker-exo1.c`
-so that the master launches a worker process on all the other machines
-at startup. The new deployment file `deployment1.xml` should be as
-simple as:
-
-@include doc/tuto-msg/deployment1.xml
-
-For that, the master needs to retrieve the list of hosts declared in
-the platform, with the following functions (follow the links for their
-documentation):
-
-~~~~{.c}
-int MSG_get_host_number(void);
-xbt_dynar_t MSG_hosts_as_dynar(void);
-void * xbt_dynar_to_array (xbt_dynar_t dynar);
-~~~~
-
-Then, the master should start the worker processes with the following function:
-
-~~~~{.c}
-msg_process_t MSG_process_create(const char *name, xbt_main_func_t code, void *data, msg_host_t host);
-~~~~
-
-@subsection tuto-msg-exo1-config Increasing configurability
-
-The worker processes wait for incomming messages on a channel which
-name they need to know beforehand. In the provided code, each worker
-uses the name of its host as a channel name. You can see this in the
-receiver source code:
-
-~~~~{.c}
-    int res = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
-    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-~~~~
-
-This way, you can have at most one worker per host. To later study the
-behavior of concurrent applications on the platform, we need to
-alleviate this. Several solutions exist:
-
-Now that the the master creates the workers, it knows their PID
-(process ID -- given by @ref MSG_process_get_PID()), so you could use
-it in the channel name.
-
-Another possibility for the master is to determine a channel name
-before the process creation, and give that name as a parameter to the
-starting process. This is what the `data` parameter of @ref
-MSG_process_create is meant for. You can pass any arbitrary pointer,
-and the created process can retrieve this value later with the @ref
-MSG_process_get_data and @ref MSG_process_self functions.  Since we
-want later to study concurrent applications, it is advised to use a
-channel name such as `master_name:worker_name`.
-
-A third possibility would be to inverse the communication architecture
-and have the workers pulling work from the master. This require to
-pass the master's channel to the workers.
-
-@subsection tuto-msg-exo1-wrapup Wrap up 
-
-In this exercise, we reduced the amount of configuration that our
-simulator requests. This is both a good idea, and a dangerous
-trend. This simplification is an application of the good old DRY/SPOT
-programming principle (Don't Repeat Yourself / Single Point Of Truth
--- <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">more on wikipedia</a>),
-and you really want your programming artefacts to follow these software engineering principles.
-
-But at the same time, you should be careful in separating your
-scientific contribution (the master/wokers algorithm) and the
-artefacts used to test it (platform, deployment and workload). This is
-why SimGrid forces you to expres your platform and deployment files in
-XML instead of using a programming interface: it forces a clear
-separation of concerns between things that are of very different
-nature.
-
-If you struggle with this exercise, have a look at
-our solution in @ref doc/tuto-msg/masterworker-sol1.c
-This is not perfect at all, and many other solutions would have been possible, of course.
-
-@section tuto-msg-exo2 Exercise 2: Infinite amount of work, fixed experiment duration
-
-In the current version, the number of tasks is defined through the
-worker arguments. Hence, tasks are created at the very beginning of
-the simulation. Instead, have the master dispatching tasks for a
-predetermined amount of time.  The tasks must now be created on demand
-instead of beforehand.
-
-Of course, usual time functions like `gettimeofday` will give you the
-time on your real machine, which is prety useless in the
-simulation. Instead, retrieve the time in the simulated world with
-@ref MSG_get_clock.
-
-You can still stop your workers with a specific task as previously,
-but other methods exist. You can forcefully stop processes with the
-following functions, but be warned that SimGrid traditionnally had
-issues with forcefully stopping procsses involved in computations or
-communications. We hope that it's better now, but YMMV.
-
-~~~~{.c}
-void MSG_process_kill(msg_process_t process);
-int MSG_process_killall(int reset_PIDs);
-~~~~
-
-Anyway, the new deployment `deployment2.xml` file should thus look
-like this:
-
-@include doc/tuto-msg/deployment2.xml
-
-@subsection tuto-msg-exo2-verbosity Controlling the message verbosity
-
-Not all messages are equally informative, so you probably want to
-change most of the `XBT_INFO` into `XBT_DEBUG` so that they are hidden
-by default. You could for example show only the total number of tasks
-processed by default. You can still see the debug messages as follows:
-
-~~~~{.sh}
-./masterworker examples/platforms/small_platform.xml deployment2.xml --log=msg_test.thres:debug
-~~~~
-
-@subsection tuto-msg-exo2-wrapup Wrap up
-
-Our imperfect solution to this exercise is available as @ref doc/tuto-msg/masterworker-sol2.c
-But there is still much to improve in that code.
-
-@section tuto-msg-exo3 Exercise 3: Understanding how competing applications behave
-
-It is now time to start several applications at once, with the following `deployment3.xml` file.
-
-@include doc/tuto-msg/deployment3.xml
-
-Things happen when you do so, but it remains utterly difficult to
-understand what's happening exactely. Even visualizations with pajeng
-and Vite contain too much information to be useful: it is impossible
-to understand which task belong to which application. To fix this, we
-will categorize the tasks.
-
-For that, first let each master create its own category of tasks with
-@ref TRACE_category(), and then assign this category to each task using
-@ref MSG_task_set_category().
-
-The outcome can then be visualized as a Gantt-chart as follows:
-
-~~~~{.sh}
-./masterworker examples/platforms/small_platform.xml deployment3.xml --cfg=tracing:yes --cfg=tracing/msg/process:yes
-vite simgrid.trace
-~~~~
-
-@subsection tuto-msg-exo3-further Going further
-
-vite is not enough to understand the situation, because it does not
-deal with categorization. That is why you should switch to R to
-visualize your outcomes, as explained on <a
-href="http://simgrid.gforge.inria.fr/contrib/R_visualization.php">this
-page</a>.
-
-As usual, you can explore our imperfect solution, in @ref doc/tuto-msg/masterworker-sol3.c.
-
-@section tuto-msg-exo4 Exercise 4: Better scheduling: FCFS
-
-You don't need a very advanced visualization solution to notice that
-round-robin is completely suboptimal: most of the workers keep waiting
-for more work. We will move to a First-Come First-Served mechanism
-instead.
-
-For that, your workers should explicitely request for work with a
-message sent to a channel that is specific to their master. The name
-of their private channel name should be attached (using the last
-parameter of @ref MSG_task_create()) to the message sent, so that
-their master can answer.
-
-The master should serve requests in a round-robin manner, until the
-time is up. Things get a bit more complex to stop the workers
-afterward: the master cannot simply send a terminating task, as the
-workers are blocked until their request for work is accepted. So
-instead, the master should wait for incomming requests even once the
-time is up, and answer with a terminating task.
-
-Once it works, you will see that such as simple FCFS schema allows to
-double the amount of tasks handled over time in this case.
-
-@subsection tuto-msg-exo4-further Going further
-
-From this, many things can easily be added. For example, you could:
-- Allow workers to have several pending requests so as to overlap
-  communication and computations as much as possible. Non-blocking communication will probably become handy here.
-- Add a performance measurement mechanism, enabling the master to make smart scheduling choices.
-- Test your code on other platforms, from the `examples/platforms` directory in your archive.<br>
-  What is the largest number of tasks requiring 50e6 flops and 1e5
-  bytes that you manage to distribute and process in one hour on
-  `g5k.xml` (you should use `deployment_general.xml`)?
-- Optimize not only for the amount of tasks handled, but also for the total energy dissipated.
-- And so on. If you come up with a really nice extension, please share it with us so that we can extend this tutorial.
-
-@section tuto-msg-further Where to go from here?
-
-This tutorial is now terminated. You could keep reading the [online documentation][fn:4] or
-[tutorials][fn:7], or you could head up to the example section to read some code.
-
-@subsection tuto-msg-further-todo TODO: Points to improve for the next time
-
-- Propose equivalent exercises and skeleton in java.
-- Propose a virtualbox image with everything (simgrid, pajeng, ...) already set
-  up.
-- Ease the installation on mac OS X (binary installer) and
-  windows.
-- Explain that programming in C or java and having a working
-  development environment is a prerequisite.
-
-
-[fn:1]: http://triva.gforge.inria.fr/index.html
-[fn:2]: http://hal.inria.fr/inria-00529569
-[fn:3]: http://hal.inria.fr/hal-00738321
-[fn:4]: http://simgrid.gforge.inria.fr/simgrid/latest/doc/
-[fn:5]: https://github.com/schnorr/pajeng/
-[fn:6]: http://vite.gforge.inria.fr/
-[fn:7]: http://simgrid.org/tutorials/
-
-
-*/
-
-
-/**
- *  @example doc/tuto-msg/masterworker.c
- *  @example doc/tuto-msg/masterworker-sol1.c
- *  @example doc/tuto-msg/masterworker-sol2.c
- *  @example doc/tuto-msg/masterworker-sol3.c
- *  @example doc/tuto-msg/masterworker-sol4.c
- */
diff --git a/docs/Build.sh b/docs/Build.sh
new file mode 100755 (executable)
index 0000000..e39cf57
--- /dev/null
@@ -0,0 +1,18 @@
+#! /bin/sh
+#
+# Simplistic script to rebuild our documentation with sphinx-build
+
+set -e
+
+if [ "x$1" != 'xdoxy' -a -e build/xml ] ; then
+  echo "(Doxygen not rerun)"
+else
+  rm -rf build/xml source/api/
+  cd source; doxygen; cd ..
+fi
+
+sphinx-build -M html source build ${SPHINXOPTS}
+cat source/img/graphical-toc.svg \
+ | perl -pe 's/(xlink:href="http)/target="_top" $1/' \
+ | perl -pe 's/(xlink:href=".*?.html)/target="_top" $1/' \
+ > build/html/graphical-toc.svg
index 98294c5..038b4d3 100644 (file)
@@ -1,5 +1,5 @@
 breathe
 exhale
-sphinx
+sphinx>=1.8.0b1
 sphinx_rtd_theme
 
diff --git a/docs/source/Doxyfile b/docs/source/Doxyfile
new file mode 100644 (file)
index 0000000..06760f5
--- /dev/null
@@ -0,0 +1,42 @@
+# What to read
+INPUT                  = ../../include/simgrid/forward.h
+INPUT                 += ../../include/simgrid/s4u
+INPUT                 += ../../include/simgrid/xbt
+RECURSIVE              = YES
+
+# What to produce
+OUTPUT_DIRECTORY       = ../build/
+GENERATE_XML           = YES
+GENERATE_HTML          = NO
+GENERATE_LATEX         = NO
+
+FULL_PATH_NAMES        = NO # Don't leak the path on which it was built
+XML_PROGRAMLISTING     = NO # No program listings, please
+CREATE_SUBDIRS         = NO # Mandatory for exhale
+
+# Allow for rst directives and advanced functions e.g. grid tables
+ALIASES                = "rst=\verbatim embed:rst:leading-asterisk"
+ALIASES               += "endrst=\endverbatim"
+
+# Enable preprocessing and related preprocessor necessities
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SKIP_FUNCTION_MACROS   = NO
+
+PREDEFINED             += \
+    __cplusplus \
+    DOXYGEN \
+    XBT_PUBLIC= \
+    XBT_EXPORT_NO_IMPORT= \
+    XBT_IMPORT_NO_EXPORT= \
+    XBT_PUBLIC_DATA=extern \
+    XBT_PUBLIC= \
+    XBT_INLINE= \
+    XBT_ALWAYS_INLINE= \
+    XBT_PRIVATE= \
+    XBT_ATTRIB_NORETURN= \
+    XBT_ATTRIB_UNUSED= \
+    XBT_ATTRIB_DEPRECATED_v322(m)= \
+    XBT_ATTRIB_DEPRECATED_v323(m)= \
+    XBT_ATTRIB_DEPRECATED_v324(m)=
diff --git a/docs/source/app_s4u.rst b/docs/source/app_s4u.rst
new file mode 100644 (file)
index 0000000..9d20e2b
--- /dev/null
@@ -0,0 +1,209 @@
+.. _S4U_doc:
+
+=================
+The S4U Interface
+=================
+
+.. raw:: html
+
+   <object id="TOC" data="graphical-toc.svg" width="100%" type="image/svg+xml"></object>
+   <script>
+   window.onload=function() { // Wait for the SVG to be loaded before changing it
+     var elem=document.querySelector("#TOC").contentDocument.getElementById("S4UBox")
+     elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1";
+   }
+   </script>
+   <br/>
+   <br/>
+
+The S4U interface (SimGrid for you) mixes the full power of SimGrid
+with the full power of C++. This is the preferred interface to describe
+abstract algorithms in the domains of Cloud, P2P, HPC, IoT, and similar
+settings.
+
+-------------
+Main Concepts
+-------------
+
+A typical SimGrid simulation is composed of several |Actors|_, that
+execute user-provided functions. The actors have to explicitly use the
+S4U interface to express their
+:ref:`computation <exhale_class_classsimgrid_1_1s4u_1_1Exec>`,
+:ref:`communication <exhale_class_classsimgrid_1_1s4u_1_1Comm>`,
+:ref:`disk usage <exhale_class_classsimgrid_1_1s4u_1_1Io>`,
+and other |Activities|_, so that they get reflected within the
+simulator. These activities take place on resources such as |Hosts|_,
+|Links|_ and |Storages|_. SimGrid predicts the time taken by each
+activity and orchestrates the actors accordingly, waiting for the
+completion of these activities.
+
+
+When **communicating**, data is not directly sent to other actors but
+posted onto a |Mailbox|_ that serves as a rendez-vous point between
+communicating actors. This means that you don't need to know who you
+are talking to, you just put your communication `Put` request in a
+mailbox, and it will be matched with a complementary `Get`
+request.  Alternatively, actors can interact through **classical
+synchronization mechanisms** such as |Barrier|_, |Semaphore|_,
+|Mutex|_ and |ConditionVariable|_.
+
+Each actor is located on a simulated |Host|_. Each host is located
+itself in a |NetZone|_, that knows the networking path between one
+resource to another. Each NetZone is included in another one, forming
+a tree of NetZones which root zone contains the whole platform.
+
+The :ref:`simgrid::s4u::this_actor
+<namespace_simgrid__s4u__this_actor>` namespace provides many helper
+functions to simplify the code of actors.
+
+- **Global Classes**
+
+  - :ref:`class s4u::Actor <exhale_class_classsimgrid_1_1s4u_1_1Actor>`:
+    Active entities executing your application.
+  - :ref:`class s4u::Engine <exhale_class_classsimgrid_1_1s4u_1_1Engine>`
+    Simulation engine (singleton).
+  - :ref:`class s4u::Mailbox <exhale_class_classsimgrid_1_1s4u_1_1Mailbox>`
+    Communication rendez-vous.
+
+- **Platform Elements**
+
+  - :ref:`class s4u::Host <exhale_class_classsimgrid_1_1s4u_1_1Host>`:
+    Actor location, providing computational power.
+  - :ref:`class s4u::Link <exhale_class_classsimgrid_1_1s4u_1_1Link>`
+    Interconnecting hosts.
+  - :ref:`class s4u::NetZone <exhale_class_classsimgrid_1_1s4u_1_1NetZone>`:
+    Sub-region of the platform, containing resources (Hosts, Links, etc).
+  - :ref:`class s4u::Storage <exhale_class_classsimgrid_1_1s4u_1_1Storage>`
+    Resource on which actors can write and read data.
+  - :ref:`class s4u::VirtualMachine <exhale_class_classsimgrid_1_1s4u_1_1VirtualMachine>`:
+    Execution containers that can be moved between Hosts.
+
+- **Activities** (:ref:`class s4u::Activity <exhale_class_classsimgrid_1_1s4u_1_1Activity>`):
+  The things that actors can do on resources
+
+  - :ref:`class s4u::Comm <exhale_class_classsimgrid_1_1s4u_1_1Comm>`
+    Communication activity, started on Mailboxes and consuming links.
+  - :ref:`class s4u::Exec <exhale_class_classsimgrid_1_1s4u_1_1Exec>`
+    Computation activity, started on Host and consuming CPU resources.
+  - :ref:`class s4u::Io <exhale_class_classsimgrid_1_1s4u_1_1Io>`
+    I/O activity, started on and consumming Storages.
+
+- **Synchronization Mechanisms**: Classical IPC that actors can use
+
+  - :ref:`class s4u::Barrier <exhale_class_classsimgrid_1_1s4u_1_1Barrier>`
+  - :ref:`class s4u::ConditionVariable <exhale_class_classsimgrid_1_1s4u_1_1ConditionVariable>`
+  - :ref:`class s4u::Mutex <exhale_class_classsimgrid_1_1s4u_1_1Mutex>`
+  - :ref:`class s4u::Semaphore <exhale_class_classsimgrid_1_1s4u_1_1Semaphore>`
+
+
+.. |Actors| replace:: **Actors**
+.. _Actors: api/classsimgrid_1_1s4u_1_1Actor.html
+
+.. |Activities| replace:: **Activities**
+.. _Activities: api/classsimgrid_1_1s4u_1_1Activity.html
+
+.. |Hosts| replace:: **Hosts**
+.. _Hosts: api/classsimgrid_1_1s4u_1_1Host.html
+
+.. |Links| replace:: **Links**
+.. _Links: api/classsimgrid_1_1s4u_1_1Link.html
+
+.. |Storages| replace:: **Storages**
+.. _Storages: api/classsimgrid_1_1s4u_1_1Storage.html
+
+.. |VirtualMachines| replace:: **VirtualMachines**
+.. _VirtualMachines: api/classsimgrid_1_1s4u_1_1VirtualMachine.html
+
+.. |Host| replace:: **Host**
+.. _Host: api/classsimgrid_1_1s4u_1_1Host.html
+
+.. |Mailbox| replace:: **Mailbox**
+.. _Mailbox: api/classsimgrid_1_1s4u_1_1Mailbox.html
+
+.. |NetZone| replace:: **NetZone**
+.. _NetZone: api/classsimgrid_1_1s4u_1_1NetZone.html
+
+.. |Barrier| replace:: **Barrier**
+.. _Barrier: api/classsimgrid_1_1s4u_1_1Barrier.html
+
+.. |ConditionVariable| replace:: **ConditionVariable**
+.. _ConditionVariable: api/classsimgrid_1_1s4u_1_1ConditionVariable.html
+
+.. |Mutex| replace:: **Mutex**
+.. _Mutex: api/classsimgrid_1_1s4u_1_1Mutex.html
+
+----------
+Activities
+----------
+
+Activities represent the actions that consume a resource, such as a
+:ref:`s4u::Comm <exhale_class_classsimgrid_1_1s4u_1_1Comm>` that
+consumes the *transmiting power* of :ref:`s4u::Link
+<exhale_class_classsimgrid_1_1s4u_1_1Link>` resources.
+
+.......................
+Asynchronous Activities
+.......................
+
+Every activity can be either **blocking** or **asynchronous**. For
+example, :cpp:func:`s4u::Mailbox::put() <simgrid::s4u::Mailbox::put>`
+and :cpp:func:`s4u::Mailbox::get() <simgrid::s4u::Mailbox::get>`
+create blocking communications: the actor is blocked until the
+completion of that communication. Asynchronous communications do not
+block the actor during their execution but progress on their own.
+
+Once your asynchronous activity is started, you can test for its
+completion using :cpp:func:`s4u::Activity::test() <simgrid::s4u::Activity::test>`.
+This function returns ``true`` if the activity completed already.
+You can also use :cpp:func:`s4u::Activity::wait() <simgrid::s4u::Activity::wait>`
+to block until the completion of the activity. To wait for at most a given amount of time,
+use  :cpp:func:`s4u::Activity::wait_for() <simgrid::s4u::Activity::wait_for>`.
+Finally, to wait at most until a specified time limit, use
+:cpp:func:`s4u::Activity::wait_until() <simgrid::s4u::Activity::wait_until>`.
+
+.. todo::
+
+   wait_for and wait_until are currently not implemented for Exec and Io activities.
+
+Every kind of activities can be asynchronous:
+
+  - :ref:`s4u::CommPtr <exhale_class_classsimgrid_1_1s4u_1_1Comm>` are created with 
+    :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>` and
+    :cpp:func:`s4u::Mailbox::get_async() <simgrid::s4u::Mailbox::get_async>`.
+  - :ref:`s4u::IoPtr <exhale_class_classsimgrid_1_1s4u_1_1Io>` are created with 
+    :cpp:func:`s4u::Storage::read_async() <simgrid::s4u::Storage::read_async>` and
+    :cpp:func:`s4u::Storage::write_async() <simgrid::s4u::Storage::write_async>`.    
+  - :ref:`s4u::ExecPtr <exhale_class_classsimgrid_1_1s4u_1_1Exec>` are created with
+    :cpp:func:`s4u::Host::exec_async() <simgrid::s4u::Host::exec_async>`.
+  - In the future, it will become possible to have asynchronous IPC
+    such as asynchronous mutex lock requests.
+
+The following example shows how to have several concurrent
+communications ongoing.  First, you have to declare a vector in which
+we will store the ongoing communications. It is also useful to have a
+vector of mailboxes.
+
+.. literalinclude:: ../../examples/s4u/async-waitall/s4u-async-waitall.cpp
+   :language: c++
+   :start-after: init-begin
+   :end-before: init-end
+   :dedent: 4
+
+Then, you start all the communications that should occur concurrently with
+:cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>`.  
+Finally, the actor waits for the completion of all of them at once
+with 
+:cpp:func:`s4u::Comm::wait_all() <simgrid::s4u::Comm::wait_all>`.  
+     
+.. literalinclude:: ../../examples/s4u/async-waitall/s4u-async-waitall.cpp
+   :language: c++
+   :start-after: put-begin
+   :end-before: put-end
+   :dedent: 4
+
+
+.....................
+Activities Life cycle
+.....................
+
+Sometimes, you want to change the setting of an activity before it even starts. 
diff --git a/docs/source/application.rst b/docs/source/application.rst
new file mode 100644 (file)
index 0000000..e2b087a
--- /dev/null
@@ -0,0 +1,69 @@
+.. _application:
+
+Describing your Application
+***************************
+
+.. raw:: html
+
+   <object id="TOC" data="graphical-toc.svg" width="100%" type="image/svg+xml"></object>
+   <script>
+   window.onload=function() { // Wait for the SVG to be loaded before changing it
+     var elem=document.querySelector("#TOC").contentDocument.getElementById("ApplicationBox")
+     elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1";
+   }
+   </script>
+   <br/>
+   <br/>
+
+Every SimGrid simulation entails a distributed application, that
+virtually executes on the simulated platform. You can express this
+application using one of the following interfaces. It is even possible
+to mix several interfaces in the same simulation.
+
+ - :ref:`Describing Algorithms with the S4U interface <S4U_doc>` (in C++)
+ - Simulating existing MPI programs with the SMPI toolsuite (in C, C++,
+   or Fortran)
+ - In some cases, you may want to replay an execution trace in the simulator. This
+   trace lists the events of your application or of your workload, and
+   your application is decomposed as a list of event handlers that are
+   fired according to the trace. SimGrid comes with a build-in support
+   for MPI traces (with solutions to import traces captured by several
+   MPI profilers). You can reuse this mecanism for any kind of trace
+   that you want to replay, for example to study how a P2P DHT overlay
+   reacts to a given workload.
+ - Simulating algorithms with one of the legacy interfaces: MSG and
+   SimDAG (in C or Java). SimGrid was founded in 1998, and many
+   interfaces were proposed along the way. MSG, introduced around
+   2002, is still present in SimGrid. It does not evolve anymore, but
+   given its popularity, it will not be removed until at least 2020.
+ - We are currently working on the ability to modify any existing
+   application so that it can run on top of SimGrid. This project,
+   called `Remote-SimGrid
+   <git@framagit.org:simgrid/remote-simgrid.git>`_, is highly
+   experimental at this point.
+
+As you can see, SimGrid is very modular and can be used in many
+ways. We are working to improve it along two main directions. First,
+we plan to further increase the modularity of the simulator so that
+users can invent the specific API or DSL they need for their usage. We
+call this project BYOS: Build Your Own Simulator.
+
+Executing existing applications within the simulator is another
+long-term goal. SMPI and Remote-SimGrid already allow you to execute some
+applications, but our long term goal would be to allow for the execution
+of any legacy application, with absolutely no modification. We call it
+SimOS, even if it will not become usable before several years of
+additional work.
+
+.. The old documentation of the obsolete MSG replay module was removed in
+..  https://github.com/simgrid/simgrid/commit/e05361c201fb95d2b7605e59001cd0a49a489739
+
+
+.. include:: app_smpi.rst
+
+.. include:: app_legacy.rst
+
+.. toctree::
+   :hidden:
+
+      The S4U Interface <app_s4u.rst>
index 8fd2797..d335a48 100644 (file)
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 #
-# import os
+import os, subprocess
 # import sys
 # sys.path.insert(0, os.path.abspath('.'))
 
-
 # -- Project information -----------------------------------------------------
 
 project = u'SimGrid'
@@ -41,7 +40,7 @@ release = u'3.21'
 extensions = [
     'sphinx.ext.todo',
 #    'sphinx.ext.coverage',
-    'sphinx.ext.mathjax',
+#    'sphinx.ext.mathjax',
 #    'sphinx.ext.ifconfig',
     'breathe',
     'exhale',
@@ -49,10 +48,11 @@ extensions = [
 
 todo_include_todos = True
 
-breathe_projects = { 'simgrid': '../build/doxy/xml' }
+breathe_projects = { 'simgrid': '../build/xml' }
 breathe_default_project = "simgrid"
 
 # Setup the exhale extension
+
 exhale_args = {
     # These arguments are required
     "containmentFolder":     "./api",
@@ -61,31 +61,11 @@ exhale_args = {
     "doxygenStripFromPath":  "..",
     # Suggested optional arguments
     "createTreeView":        True,
-    # TIP: if using the sphinx-bootstrap-theme, you need
-    # "treeViewIsBootstrap": True,
-    "exhaleExecutesDoxygen": True,
-    "exhaleDoxygenStdin":    """
-    INPUT = ../../include/simgrid/s4u
-    GENERATE_XML           = YES
-    PREDEFINED             += \
-        __cplusplus \
-        DOXYGEN \
-        XBT_PUBLIC= \
-        XBT_EXPORT_NO_IMPORT= \
-        XBT_IMPORT_NO_EXPORT= \
-        XBT_PUBLIC_DATA=extern \
-        XBT_PUBLIC= \
-        XBT_INLINE= \
-        XBT_ALWAYS_INLINE= \
-        XBT_PRIVATE= \
-        XBT_ATTRIB_NORETURN= \
-        XBT_ATTRIB_UNUSED= \
-        XBT_ATTRIB_DEPRECATED_v322(m)= \
-        XBT_ATTRIB_DEPRECATED_v323(m)= \
-        XBT_ATTRIB_DEPRECATED_v324(m)=
-        """
+    "exhaleExecutesDoxygen": False,
+    # "exhaleUseDoxyfile":     True,
 }
 
+
 # For cross-ref generation
 primary_domain = 'cpp'
 
@@ -115,7 +95,6 @@ exclude_patterns = []
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
 
-
 # -- Options for HTML output -------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
@@ -153,9 +132,10 @@ htmlhelp_basename = 'SimGrid-doc'
 
 html_context = {
     "display_gitlab": True, # Integrate Gitlab
-    "gitlab_host": "framagit.org", 
+    "gitlab_host": "framagit.org",
     "gitlab_user": "simgrid",
     "gitlab_repo": "simgrid",
     "gitlab_version": "master", # Version
     "conf_py_path": "/docs/source/", # Path in the checkout to the docs root
 }
+
diff --git a/docs/source/images/tuto-masterworkers-question.svg b/docs/source/images/tuto-masterworkers-question.svg
deleted file mode 100644 (file)
index c318876..0000000
+++ /dev/null
@@ -1,1240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="86.313606mm"
-   height="41.106529mm"
-   viewBox="0 0 86.313605 41.106529"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="overview.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1496"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1502"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1496-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1496-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-3"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1496-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-9"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1496-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8"
-     inkscape:cx="75.667359"
-     inkscape:cy="76.402423"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1019"
-     inkscape:window-x="0"
-     inkscape:window-y="32"
-     inkscape:window-maximized="1"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0" />
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-29.950586,-101.20699)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.80246687px;line-height:4.0930109px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="47.823597"
-       y="119.2951"
-       id="text817"><tspan
-         sodipodi:role="line"
-         id="tspan815"
-         x="47.823597"
-         y="119.2951"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.16372044px">Master</tspan></text>
-    <ellipse
-       style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.43658787;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path819"
-       cx="55.781475"
-       cy="121.76025"
-       rx="12.693116"
-       ry="8.3518229" />
-    <g
-       id="g5649"
-       transform="matrix(0.61878596,0,0,0.61878596,10.598982,54.807393)">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,62.219405,60.11345)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-15"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-06"
-         y="107.92625"
-         x="85.694588"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="107.92625"
-           x="85.694588"
-           id="tspan815-8-50"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       id="g5641"
-       transform="matrix(0.61878596,0,0,0.61878596,11.505291,54.982808)">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       id="g1489"
-       transform="matrix(0.61878596,0,0,0.61878596,19.779021,54.251913)">
-      <g
-         transform="translate(0.29020366)"
-         id="g1294">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           x="125.17461"
-           y="85.676834"
-           id="text817-3"><tspan
-             sodipodi:role="line"
-             id="tspan815-8"
-             x="125.17461"
-             y="85.676834"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
-        <ellipse
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="path1289"
-           cx="138.98015"
-           cy="82.78347"
-           rx="16.30344"
-           ry="6.5481029" />
-      </g>
-      <g
-         id="g1294-6"
-         transform="translate(0.29020366,13.157293)">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           x="125.17461"
-           y="85.676834"
-           id="text817-3-0"><tspan
-             sodipodi:role="line"
-             id="tspan815-8-89"
-             x="125.17461"
-             y="85.676834"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
-        <ellipse
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="path1289-2"
-           cx="138.98015"
-           cy="82.78347"
-           rx="16.30344"
-           ry="6.5481029" />
-      </g>
-      <g
-         id="g1294-2"
-         transform="translate(0.29020366,26.31459)">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           x="125.17461"
-           y="85.676834"
-           id="text817-3-3"><tspan
-             sodipodi:role="line"
-             id="tspan815-8-18"
-             x="125.17461"
-             y="85.676834"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
-        <ellipse
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="path1289-3"
-           cx="138.98015"
-           cy="82.78347"
-           rx="16.30344"
-           ry="6.5481029" />
-      </g>
-      <g
-         id="g1294-4"
-         transform="translate(0.29020366,52.629172)">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           x="125.17461"
-           y="85.676834"
-           id="text817-3-2"><tspan
-             sodipodi:role="line"
-             id="tspan815-8-2"
-             x="125.17461"
-             y="85.676834"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
-        <ellipse
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="path1289-4"
-           cx="138.98015"
-           cy="82.78347"
-           rx="16.30344"
-           ry="6.5481029" />
-      </g>
-      <g
-         id="g1294-5"
-         transform="translate(0.29020366,39.471889)">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           x="125.17461"
-           y="85.676834"
-           id="text817-3-1"><tspan
-             sodipodi:role="line"
-             id="tspan815-8-75"
-             x="125.17461"
-             y="85.676834"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
-        <ellipse
-           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="path1289-7"
-           cx="138.98015"
-           cy="82.78347"
-           rx="16.30344"
-           ry="6.5481029" />
-      </g>
-    </g>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="m 68.602797,121.43899 27.144559,-16.2551"
-       id="path1491"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
-       d="m 68.602797,121.43899 27.144559,-8.05361"
-       id="path1491-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
-       d="m 68.602797,121.43899 27.144559,0.14787"
-       id="path1491-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-3)"
-       d="m 68.602797,121.43899 27.144559,8.34936"
-       id="path1491-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-9)"
-       d="m 68.602797,121.43899 27.144559,16.55085"
-       id="path1491-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.80246687px;line-height:4.0930109px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="58.617321"
-       y="135.63525"
-       id="text4842"><tspan
-         sodipodi:role="line"
-         id="tspan4840"
-         x="58.617321"
-         y="135.63525"
-         style="text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.16372044px">How should the master</tspan><tspan
-         sodipodi:role="line"
-         x="58.617321"
-         y="139.81946"
-         style="text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.16372044px"
-         id="tspan5522">distribute the tasks?</tspan></text>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,12.703959,52.631832)"
-       id="g5641-0">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-4"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-8"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-4"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,14.01957,54.912224)"
-       id="g5641-8">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-1"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-6"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-8"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,12.236186,57.484974)"
-       id="g5641-5">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-2"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-1"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-9"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,14.896644,57.777332)"
-       id="g5641-9">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-6"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-0"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-6"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,17.586337,57.046437)"
-       id="g5641-4">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-9"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-9"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-0"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,17.264743,54.093622)"
-       id="g5641-89">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-3"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-14"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-89"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,18.083346,59.765366)"
-       id="g5641-6">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-7"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-7"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-3"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,15.422888,60.262374)"
-       id="g5641-7">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-12"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-2"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-1"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,19.282013,61.987286)"
-       id="g5641-50">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-90"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-4"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-01"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,20.539152,59.414536)"
-       id="g5641-3">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-74"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-11"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-30"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,20.042144,56.05242)"
-       id="g5641-32">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-17"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-5"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-65"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,22.614894,54.473687)"
-       id="g5641-42">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-21"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-72"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-41"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,22.84878,56.987965)"
-       id="g5641-65">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-78"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-59"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-2"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,23.024194,59.882309)"
-       id="g5641-73">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-64"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-79"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-7"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,28.081987,59.18065)"
-       id="g5641-2">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-216"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-3"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-02"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,25.713888,57.572681)"
-       id="g5641-1">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-5"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-65"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-00"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,28.929825,56.841786)"
-       id="g5641-34">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-66"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-02"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-5"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,25.129172,55.029167)"
-       id="g5641-895">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-0"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-60"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-83"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,28.023516,54.269036)"
-       id="g5641-78">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-210"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-58"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-55"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,22.264064,62.133465)"
-       id="g5641-07">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-38"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-23"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-07"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,25.450765,61.431807)"
-       id="g5641-77">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-69"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-119"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-08"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,28.052752,61.519514)"
-       id="g5641-98">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-8"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-03"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-70"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,31.151746,59.794602)"
-       id="g5641-69">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-217"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-797"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-62"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,31.736462,57.309559)"
-       id="g5641-71">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-58"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-84"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-56"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <g
-       transform="matrix(0.61878596,0,0,0.61878596,34.163033,55.263054)"
-       id="g5641-56">
-      <path
-         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
-         inkscape:transform-center-y="-0.1233255"
-         inkscape:transform-center-x="0.088729829"
-         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0.2"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.610775"
-         sodipodi:arg1="0.82537685"
-         sodipodi:r2="3.6409302"
-         sodipodi:r1="4.7284808"
-         sodipodi:cy="96.547852"
-         sodipodi:cx="41.159508"
-         sodipodi:sides="4"
-         id="path823-226-84"
-         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="star" />
-      <text
-         id="text817-8-91-88"
-         y="108.54047"
-         x="52.338184"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
-           y="108.54047"
-           x="52.338184"
-           id="tspan815-8-04-38"
-           sodipodi:role="line">T</tspan></text>
-    </g>
-    <ellipse
-       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.44087529;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path5967"
-       cx="75.089897"
-       cy="120.15488"
-       rx="3.0595784"
-       ry="6.408577" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.57525826px;line-height:3.97712588px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.15908505px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="72.321075"
-       y="130.08104"
-       id="text5965"
-       transform="scale(1.0291379,0.97168708)"><tspan
-         sodipodi:role="line"
-         id="tspan5963"
-         x="72.321075"
-         y="130.08104"
-         style="font-size:13.57525826px;fill:#ff0000;stroke-width:0.15908505px">?</tspan></text>
-  </g>
-</svg>
similarity index 99%
rename from docs/source/images/eclipseScreenShot.png
rename to docs/source/img/eclipseScreenShot.png
index 4111737..5aa4fc6 100644 (file)
Binary files a/docs/source/images/eclipseScreenShot.png and b/docs/source/img/eclipseScreenShot.png differ
similarity index 99%
rename from docs/source/images/extlink.svg
rename to docs/source/img/extlink.svg
index f882e19..4e4747d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Font Awesome by Dave Gandy - https://fortawesome.github.com/Font-Awesome 
+<!-- Font Awesome by Dave Gandy - https://fortawesome.github.com/Font-Awesome
      [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)],
      via Wikimedia Commons -->
 <svg
diff --git a/docs/source/img/graphical-toc.svg b/docs/source/img/graphical-toc.svg
new file mode 100644 (file)
index 0000000..699873a
--- /dev/null
@@ -0,0 +1,7676 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210.6227mm"
+   height="82.696243mm"
+   viewBox="0 0 210.6227 82.696243"
+   version="1.1"
+   id="SVGRoot"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="graphical-toc.svg">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.959798"
+     inkscape:cx="131.77503"
+     inkscape:cy="253.06312"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1019"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     objecttolerance="24"
+     gridtolerance="10"
+     guidetolerance="10">
+    <inkscape:grid
+       type="xygrid"
+       id="grid924"
+       visible="true"
+       originx="-2.3081243"
+       originy="-2.3081328" />
+  </sodipodi:namedview>
+  <defs
+     id="defs815">
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path221889"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path221883"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path221877"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <clipPath
+       id="clipPath2104"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2102"
+         d="M 0,0 H 335.20001 V 110.99023 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2108"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2106"
+         d="m 0,110.99 h 61.801 v -85 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2112"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2110"
+         d="m 84.5,99.689 h 97.801 V 28.791 H 84.5 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2116"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2114"
+         d="m 234.699,96.49 h 100.5 v -73.5 h -100.5 z" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath15467">
+      <rect
+         style="opacity:0.93999999;fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.14111111;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect15469"
+         width="120.38541"
+         height="79.375"
+         x="269.875"
+         y="77.885414"
+         ry="2.5431316e-06" />
+    </clipPath>
+    <clipPath
+       id="clipPath15598"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15596"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15632"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15630"
+         d="M -4.00005,-1 H 349.83139 V 7.00009 H -4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15646"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15644"
+         d="M 0,0 H 5669.291 V 3.985 H 0 Z" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient15654"
+       gradientUnits="userSpaceOnUse"
+       y2="3.9851"
+       x2="0"
+       y1="0"
+       x1="0">
+      <stop
+         id="stop15648"
+         offset="0"
+         style="stop-opacity:1;stop-color:#d6d6f0" />
+      <stop
+         id="stop15650"
+         offset="1.99255"
+         style="stop-opacity:1;stop-color:#d6d6f0" />
+      <stop
+         id="stop15652"
+         offset="3.9851"
+         style="stop-opacity:1;stop-color:#c2c2e8" />
+    </linearGradient>
+    <clipPath
+       id="clipPath15676"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15674"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient15682"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop15678"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop15680"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath15694"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15692"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15708"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15706"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient15716"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop15710"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop15712"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop15714"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath15728"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15726"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15742"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15740"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient15750"
+       gradientUnits="userSpaceOnUse"
+       y2="8.0000896"
+       x2="0"
+       y1="0"
+       x1="0">
+      <stop
+         id="stop15744"
+         offset="0"
+         style="stop-opacity:1;stop-color:#ffffff" />
+      <stop
+         id="stop15746"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop15748"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#808080" />
+    </linearGradient>
+    <clipPath
+       id="clipPath15762"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15760"
+         d="m 349.83139,1 h 4.00005 v 230.51465 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15776"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15774"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient15782"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop15778"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop15780"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath15792"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15790"
+         d="m 349.83139,1 h 4.00005 v 225.51459 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath15806"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15804"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask15926"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image15928"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath15978"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path15976"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16012"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16010"
+         d="M -4.00005,-1 H 349.83139 V 7.00009 H -4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16026"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16024"
+         d="M 0,0 H 5669.291 V 3.985 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16056"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16054"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16062"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16058"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16060"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16074"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16072"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16088"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16086"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16096"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop16090"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16092"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16094"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16108"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16106"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16122"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16120"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16142"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16140"
+         d="m 349.83139,1 h 4.00005 v 173.035 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16156"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16154"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16162"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16158"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16160"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16172"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16170"
+         d="m 349.83139,1 h 4.00005 v 168.03496 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16186"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16184"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask16340"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image16342"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath16392"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16390"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16434"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16432"
+         d="M -4.00005,-1 H 349.83139 V 7.00009 H -4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16448"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16446"
+         d="M 0,0 H 5669.291 V 3.985 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16478"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16476"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16484"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16480"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16482"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16496"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16494"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16510"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16508"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16518"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop16512"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16514"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16516"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16530"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16528"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16544"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16542"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16564"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16562"
+         d="m 349.83139,1 h 4.00005 v 130.02907 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16578"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16576"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16584"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16580"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16582"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16594"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16592"
+         d="m 349.83139,1 h 4.00005 v 125.029 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16608"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16606"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask16676"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image16678"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath16728"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16726"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16760"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16758"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16766"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16762"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16764"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16778"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16776"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16792"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16790"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16800"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop16794"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16796"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16798"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16812"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16810"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16826"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16824"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16846"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16844"
+         d="m 349.83139,1 h 4.00005 v 208.09842 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16860"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16858"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient16866"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop16862"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop16864"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath16876"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16874"
+         d="m 349.83139,1 h 4.00005 v 203.09836 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath16890"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path16888"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask16976"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image16978"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath17028"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17026"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17060"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17058"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17066"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop17062"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17064"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17078"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17076"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17092"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17090"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17100"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop17094"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17096"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17098"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17112"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17110"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17126"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17124"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17146"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17144"
+         d="m 349.83139,1 h 4.00005 v 216.06863 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17160"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17158"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17166"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop17162"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17164"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17176"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17174"
+         d="m 349.83139,1 h 4.00005 v 211.06857 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17190"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17188"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask17326"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image17328"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath17378"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17376"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17398"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17396"
+         d="M 0,0 H 4.693 V 4.693 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17410"
+       gradientUnits="userSpaceOnUse"
+       r="2.34677"
+       cy="2.34677"
+       cx="2.34677"
+       fy="3.3476"
+       fx="1.5279">
+      <stop
+         id="stop17400"
+         offset="0"
+         style="stop-opacity:1;stop-color:#f9f9fd" />
+      <stop
+         id="stop17402"
+         offset="0.72784"
+         style="stop-opacity:1;stop-color:#e0e0f4" />
+      <stop
+         id="stop17404"
+         offset="1.45572"
+         style="stop-opacity:1;stop-color:#d3d3e5" />
+      <stop
+         id="stop17406"
+         offset="2.00165"
+         style="stop-opacity:1;stop-color:#d1d1de" />
+      <stop
+         id="stop17408"
+         offset="2.34677"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17434"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17432"
+         d="M 0,0 H 4.693 V 4.693 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17446"
+       gradientUnits="userSpaceOnUse"
+       r="2.34677"
+       cy="2.34677"
+       cx="2.34677"
+       fy="3.3476"
+       fx="1.5279">
+      <stop
+         id="stop17436"
+         offset="0"
+         style="stop-opacity:1;stop-color:#f9f9fd" />
+      <stop
+         id="stop17438"
+         offset="0.72784"
+         style="stop-opacity:1;stop-color:#e0e0f4" />
+      <stop
+         id="stop17440"
+         offset="1.45572"
+         style="stop-opacity:1;stop-color:#d3d3e5" />
+      <stop
+         id="stop17442"
+         offset="2.00165"
+         style="stop-opacity:1;stop-color:#d1d1de" />
+      <stop
+         id="stop17444"
+         offset="2.34677"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17468"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17466"
+         d="M 0,0 H 4.693 V 4.693 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17480"
+       gradientUnits="userSpaceOnUse"
+       r="2.34677"
+       cy="2.34677"
+       cx="2.34677"
+       fy="3.3476"
+       fx="1.5279">
+      <stop
+         id="stop17470"
+         offset="0"
+         style="stop-opacity:1;stop-color:#e0e0f4" />
+      <stop
+         id="stop17472"
+         offset="0.72784"
+         style="stop-opacity:1;stop-color:#6666c6" />
+      <stop
+         id="stop17474"
+         offset="1.45572"
+         style="stop-opacity:1;stop-color:#24247d" />
+      <stop
+         id="stop17476"
+         offset="2.00165"
+         style="stop-opacity:1;stop-color:#191959" />
+      <stop
+         id="stop17478"
+         offset="2.34677"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17516"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17514"
+         d="M 0,0 H 4.693 V 4.693 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17528"
+       gradientUnits="userSpaceOnUse"
+       r="2.34677"
+       cy="2.34677"
+       cx="2.34677"
+       fy="3.3476"
+       fx="1.5279">
+      <stop
+         id="stop17518"
+         offset="0"
+         style="stop-opacity:1;stop-color:#f9f9fd" />
+      <stop
+         id="stop17520"
+         offset="0.72784"
+         style="stop-opacity:1;stop-color:#e0e0f4" />
+      <stop
+         id="stop17522"
+         offset="1.45572"
+         style="stop-opacity:1;stop-color:#d3d3e5" />
+      <stop
+         id="stop17524"
+         offset="2.00165"
+         style="stop-opacity:1;stop-color:#d1d1de" />
+      <stop
+         id="stop17526"
+         offset="2.34677"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <mask
+       id="mask17544"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image17546"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath17596"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17594"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17628"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17626"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17634"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop17630"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17632"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17646"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17644"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17660"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17658"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17668"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop17662"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17664"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17666"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17680"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17678"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17694"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17692"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17714"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17712"
+         d="m 349.83139,1 h 4.00005 v 215.48747 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17728"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17726"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient17734"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop17730"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17732"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath17744"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17742"
+         d="m 349.83139,1 h 4.00005 v 210.48743 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17758"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17756"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask17910"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image17912"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath17962"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17960"
+         d="M 0,0 H 362.835 V 272.126 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17994"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17992"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient18000"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop17996"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop17998"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath18012"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18010"
+         d="m 344.83133,-7.00008 h 9.00009 v 9.00009 h -9.00009 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath18026"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18024"
+         d="M 0,0 H 16 V 16 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient18034"
+       gradientUnits="userSpaceOnUse"
+       r="8.0000896"
+       cy="8.0000896"
+       cx="8.0000896"
+       fy="8.0000896"
+       fx="8.0000896">
+      <stop
+         id="stop18028"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop18030"
+         offset="4.00005"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop18032"
+         offset="8.00009"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath18046"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18044"
+         d="m 4.00005,-7.00008 h 341.83128 v 5.00005 H 4.00005 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath18060"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18058"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath18080"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18078"
+         d="m 349.83139,1 h 4.00005 v 199.54704 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath18094"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18092"
+         d="M 0,0 H 8 V 8 H 0 Z" />
+    </clipPath>
+    <radialGradient
+       id="radialGradient18100"
+       gradientUnits="userSpaceOnUse"
+       r="4.0000501"
+       cy="4.0000501"
+       cx="4.0000501"
+       fy="4.0000501"
+       fx="4.0000501">
+      <stop
+         id="stop18096"
+         offset="0"
+         style="stop-opacity:1;stop-color:#808080" />
+      <stop
+         id="stop18098"
+         offset="1"
+         style="stop-opacity:1;stop-color:#ffffff" />
+    </radialGradient>
+    <clipPath
+       id="clipPath18110"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18108"
+         d="m 349.83139,1 h 4.00005 v 194.547 h -4.00005 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath18124"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path18122"
+         d="M 0,0 H 5669.291 V 8 H 0 Z" />
+    </clipPath>
+    <mask
+       id="mask18246"
+       height="1"
+       width="1"
+       y="0"
+       x="0"
+       maskUnits="userSpaceOnUse">
+      <image
+         id="image18248"
+         xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAABqCAAAAACHJkn6AAAAAXNCSVQI5gpbmQAAAQxJREFUeJzt0UENACAQwDDAv+fjhQb2aBUs2Z5Fw/kdwGNFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkWFFhhUZVmRYkXEBU1YB0yqrKfUAAAAASUVORK5CYII="
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeSpeed"
+         height="1"
+         width="1" />
+    </mask>
+    <clipPath
+       id="clipPath32382"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32380"
+         d="M 0,0 H 229 V 399 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32420"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32418"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 613.109,-551.39 -85.035,-44.72 17.637,-33.39 85.035,44.73 v 0 l -75.586,-18.9 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32432"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32430"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1622.21,-558.95 85.67,-42.2 16.37,34.01 -85.03,42.21 v 0 l 59.21,-51.03 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32444"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32442"
+         d="M 0,3990 V 0 H 2290 V 3990 Z M 1093.72,377.926 V 282.18 h 37.8 v 95.746 0 l -18.9,-75.586 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32456"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32454"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 2005.82,-1777.8 26.45,-91.97 35.91,10.08 -26.46,91.96 v 0 l 3.15,-78.11 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32468"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32466"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1972.43,-1813.08 80.63,-51.65 20.16,32.12 -80.63,51.02 v 0 l 54.17,-56.68 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32480"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32478"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1226.63,-1773.39 -47.24,-83.15 32.75,-18.27 47.25,82.52 v 0 l -53.54,-56.69 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32492"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32490"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1087.43,-1796.07 51.02,-80.63 32.12,20.16 -51.65,80.63 v 0 l 25.2,-74.33 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32504"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32502"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 212.492,-1796.07 -28.344,-91.34 36.536,-11.34 27.714,91.34 v 0 l -39.683,-66.77 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32516"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32514"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1063.49,-2946.9 71.81,-62.991 25.19,28.351 -71.81,62.99 v 0 l 44.73,-64.25 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32528"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32526"
+         d="M 0,3990 V 0 H 2290 V 3990 Z M 1122.07,1086.56 v -95.74 h 37.79 v 95.74 0 l -18.9,-75.58 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32540"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32538"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 1188.21,-2914.77 -67.4,-68.03 26.46,-26.458 68.02,67.398 v 0 l -66.77,-40.31 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32554"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32552"
+         d="M 0,3990 V 0 h 2290 v 3990 z m 295.012,-1820.64 -80,-52.91 21.418,-31.49 79.367,52.91 v 0 l -73.067,-26.46 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32612"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32610"
+         d="M 0,0 H 263 V 168 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32702"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32700"
+         d="M 0,1680 V 0 h 2630 v 1680 z m 1459.41,-1348.086 -4.41,73.699 -37.79,-1.89 4.4,-73.7 v 0 l 15.75,57.325 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32716"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32714"
+         d="M 0,1680 V 0 h 2630 v 1680 z m 770.297,-369.22 -5.668,-73.07 37.793,-3.15 5.672,73.7 v 0 l -22.676,-55.43 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32780"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32778"
+         d="M 0,1680 V 0 H 2630 V 1680 Z M 2172.46,7.51562 h 95.74 V 45.3086 h -95.74 v 0 l 75.58,-18.8945 z M 1597.36,365.301 v 95.742 h -37.8 v -95.742 0 l 18.9,75.586 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32796"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path32794"
+         d="M 0,1680 V 0 h 2630 v 1680 z m 1577.2,-453.63 h 95.75 v 37.8 h -95.75 v 0 l 75.59,-18.9 z m -575.1,357.79 v 95.74 h -37.791 v -95.74 0 l 18.894,75.59 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32832"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32830"
+         d="M 0,0 H 1744 V 1544 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath32866"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32864"
+         d="M 0,0 H 334 V 241 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2504"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2502"
+         d="M 0,0 H 576 V 288 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2518"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2516"
+         d="M 0,0 H 576 V 288 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath2530"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path2528"
+         d="m 58.18,37.28 h 204.5 V 259.22 H 58.18 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath17130"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path17128"
+         d="m 266.28,37.28 h 204.5 v 221.94 h -204.5 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30600"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path30598"
+         d="M 0,0 H 118 V 119 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30610"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30608"
+         d="M 0,1190 V 0 H 1180 V 1190 Z M 897.102,178.457 h 57.32 v 18.895 h -57.32 v 0 l 37.793,-9.446 z M 709.391,197.352 H 652.07 v -18.895 h 57.321 v 0 l -37.793,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30628"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30626"
+         d="M 0,1190 V 0 H 1180 V 1190 Z M 415.227,178.457 h 57.324 v 18.895 h -57.324 v 0 l 37.796,-9.446 z M 227.52,197.352 h -57.325 v -18.895 h 57.325 v 0 l -37.797,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30646"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30644"
+         d="M 0,1190 V 0 H 1180 V 1190 Z M 500.266,235.148 h 57.32 v 18.895 h -57.32 v 0 l 37.793,-9.445 z M 227.52,254.043 h -57.325 v -18.895 h 57.325 v 0 l -37.797,9.45 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30678"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30676"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 291.137,-538.488 25.828,-51.024 17.008,8.821 -25.828,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30692"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30690"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 404.52,-538.488 25.828,-51.024 17.004,8.821 -25.825,51.019 v 0 l 8.821,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30706"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30704"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 507.824,-546.676 25.824,-51.023 17.008,8.82 -25.824,51.02 v 0 l 8.816,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30724"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30722"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 912.848,-823.203 28.347,-49.762 16.375,9.449 -28.343,49.762 v 0 l 10.707,-37.797 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30738"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30736"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 645.773,-651.242 28.344,49.762 -16.379,9.449 -28.343,-49.762 v 0 l 27.085,27.715 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30752"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30750"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 147.52,-227.949 28.347,-49.762 16.375,9.449 -28.344,49.762 v 0 l 10.707,-37.793 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30766"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path30764"
+         d="M 0,1190 V 0 h 1180 v 1190 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30772"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30770"
+         d="M 0,1190 V 0 h 1180 v 1190 z m 447.352,-55.98 28.347,49.76 -16.379,9.45 -28.343,-49.77 v 0 l 27.085,27.72 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30890"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path30888"
+         d="M 0,0 H 147 V 119 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30900"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30898"
+         d="M 0,1190 V 0 H 1470 V 1190 Z M 698.043,178.457 h 57.32 v 18.895 h -57.32 v 0 l 37.793,-9.446 z m -499.512,18.895 h -57.32 v -18.895 h 57.32 v 0 l -37.793,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30918"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30916"
+         d="M 0,1190 V 0 H 1470 V 1190 Z M 1264.95,178.457 h 57.32 v 18.895 h -57.32 v 0 l 37.8,-9.446 z m -471.161,18.895 h -57.32 v -18.895 h 57.32 v 0 l -37.797,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30936"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30934"
+         d="M 0,1190 V 0 H 1470 V 1190 Z M 414.59,235.148 h 57.32 v 18.895 h -57.32 v 0 l 37.793,-9.445 z m -187.711,18.895 h -57.32 v -18.895 h 57.32 v 0 l -37.797,9.45 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30966"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30964"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 970.789,-544.156 25.828,-51.024 17.003,8.821 -25.823,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30980"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30978"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1027.48,-544.156 25.82,-51.024 17.01,8.821 -25.82,51.019 v 0 l 8.81,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath30994"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path30992"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1086.69,-544.156 25.83,-51.024 17,8.821 -25.82,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31008"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31006"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1140.86,-544.156 25.83,-51.024 17.01,8.821 -25.83,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31022"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31020"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1197.55,-549.828 25.83,-51.02 17.01,8.817 -25.83,51.023 v 0 l 8.82,-38.426 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31036"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31034"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 916.617,-542.898 25.828,-51.02 17.008,8.816 -25.828,51.024 v 0 l 8.82,-38.426 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31050"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31048"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 859.926,-542.898 25.828,-51.02 17.008,8.816 -25.828,51.024 v 0 l 8.82,-38.426 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31064"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31062"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1252.98,-535.969 25.83,-51.023 17.01,8.82 -25.83,51.02 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31082"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31080"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1289.52,-830.133 28.34,-49.762 16.38,9.45 -28.34,49.761 v 0 l 10.71,-37.793 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31096"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path31094"
+         d="M 0,1190 V 0 h 1470 v 1190 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31102"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31100"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 446.711,-55.98 28.348,49.76 -16.379,9.45 -28.344,-49.77 v 0 l 27.086,27.72 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31116"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31114"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 146.879,-227.949 28.348,-49.762 16.375,9.449 -28.344,49.762 v 0 l 10.707,-37.793 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31130"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31128"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 730.168,-651.242 28.344,49.762 -16.375,9.449 -28.348,-49.762 v 0 l 27.086,27.715 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31236"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path31234"
+         d="M 0,0 H 147 V 119 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31246"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31244"
+         d="M 0,1190 V 0 H 1470 V 1190 Z M 697.957,178.004 h 57.32 v 18.898 h -57.32 v 0 l 37.793,-9.449 z m -499.512,18.898 h -57.32 v -18.898 h 57.32 v 0 l -37.793,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31264"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31262"
+         d="M 0,1190 V 0 H 1470 V 1190 Z M 1264.87,178.004 h 57.32 v 18.898 h -57.32 v 0 l 37.79,-9.449 z m -471.171,18.898 h -57.32 v -18.898 h 57.32 v 0 l -37.793,9.449 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31292"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31290"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 970.703,-544.609 25.824,-51.024 17.013,8.821 -25.829,51.019 v 0 l 8.816,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31306"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31304"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1027.39,-544.609 25.83,-51.024 17.01,8.821 -25.83,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31320"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31318"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1086.61,-544.609 25.82,-51.024 17.01,8.821 -25.83,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31334"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31332"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1140.78,-544.609 25.82,-51.024 17.01,8.821 -25.83,51.019 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31348"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31346"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1197.46,-550.281 25.83,-51.02 17.01,8.817 -25.83,51.023 v 0 l 8.82,-38.422 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31362"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31360"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 916.531,-543.352 25.824,-51.019 17.008,8.816 -25.824,51.024 v 0 l 8.816,-38.426 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31376"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31374"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 859.84,-543.352 25.824,-51.019 17.008,8.816 -25.824,51.024 v 0 l 8.816,-38.426 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31390"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31388"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1252.9,-536.422 25.82,-51.023 17.01,8.82 -25.82,51.023 v 0 l 8.81,-38.425 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31408"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path31406"
+         d="M 0,1190 V 0 h 1470 v 1190 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31414"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31412"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1296.99,-56.44 28.35,49.76 -16.38,9.45 -28.35,-49.76 v 0 l 27.09,27.72 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31428"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31426"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 1289.43,-830.586 28.35,-49.762 16.38,9.45 -28.35,49.761 v 0 l 10.71,-37.793 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31442"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31440"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 146.793,-228.398 28.344,-49.766 16.379,9.449 -28.344,49.762 v 0 l 10.707,-37.793 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31456"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path31454"
+         d="M 0,1190 V 0 h 1470 v 1190 z m 730.082,-651.691 28.344,49.761 -16.379,9.446 -28.344,-49.762 v 0 l 27.086,27.719 z" />
+    </clipPath>
+    <clipPath
+       id="clipPath31546"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path31544"
+         d="M 0,0 H 586.00549 V 215.95586 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath34100"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34098"
+         d="M 0,0 H 661 V 253 H 0 Z" />
+    </clipPath>
+    <clipPath
+       id="clipPath34378"
+       clipPathUnits="userSpaceOnUse">
+      <path
+         style="clip-rule:evenodd"
+         inkscape:connector-curvature="0"
+         id="path34376"
+         d="M 0,2530 V 0 h 6610 v 2530 z m 4576.39,-1903.336 -17,-91.336 55.43,-10.078 17,91.336 v 0 l -40.31,-64.883 z" />
+    </clipPath>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221883-8"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-3-0"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221883-8-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-6"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-1"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-30"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221883-0"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-30-5"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221883-0-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-9"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-9"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-98"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-16"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-93"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-15"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-8"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221883-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-7-93-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-0-3-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send-6-2"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path221889-1-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+  </defs>
+  <metadata
+     id="metadata818">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="underlining">
+    <rect
+       transform="translate(-2.308124,-62.995622)"
+       style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="S4UBox"
+       width="50.270832"
+       height="7.9375029"
+       x="5.2916665"
+       y="81.854164"
+       inkscape:label="#rect6249" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Calque 1"
+     transform="translate(-2.308124,-62.995623)"
+     style="display:inline">
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="ApplicationBox"
+       width="50.270832"
+       height="26.458334"
+       x="5.2916665"
+       y="81.854164"
+       ry="2.6458309"
+       inkscape:label="#rect1020-7" />
+    <a
+       id="a6161"
+       xlink:href="http://simgrid.gforge.inria.fr/contrib/smpi-calibration-doc/"
+       style="fill:#ffffff;fill-opacity:1">
+      <rect
+         ry="2.6458309"
+         y="121.54166"
+         x="83.34375"
+         height="7.9375086"
+         width="31.75"
+         id="rect1020-5-6-3"
+         style="opacity:0.93999999;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </a>
+    <g
+       id="g3049"
+       transform="translate(0,-0.27062338)">
+      <text
+         id="text1032-6"
+         y="132.04036"
+         x="4.823277"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="132.04036"
+           x="4.823277"
+           id="tspan1030-0"
+           sodipodi:role="line">HPC</tspan></text>
+      <text
+         id="text1028-4"
+         y="132.04036"
+         x="17.162859"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="132.04036"
+           x="17.162859"
+           id="tspan1026-38"
+           sodipodi:role="line">Clouds</tspan></text>
+      <text
+         id="text1036-8-2"
+         y="132.04036"
+         x="48.030613"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="132.04036"
+           x="48.030613"
+           id="tspan1034-9-2"
+           sodipodi:role="line">P2P</tspan></text>
+    </g>
+    <g
+       id="g3037"
+       transform="translate(0,-0.85044613)">
+      <text
+         id="text1036-8-3"
+         y="126.1971"
+         x="4.9195676"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="126.1971"
+           x="4.9195676"
+           id="tspan1034-9-1"
+           sodipodi:role="line">Scheduling</tspan></text>
+      <text
+         id="text1028-4-7"
+         y="126.1971"
+         x="44.552963"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="126.1971"
+           x="44.552963"
+           id="tspan1026-38-6"
+           sodipodi:role="line">Grids</tspan></text>
+    </g>
+    <a
+       xlink:href="application.html"
+       id="a6238">
+      <text
+         id="text814"
+         y="71.701172"
+         x="8.285965"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+           y="71.701172"
+           x="8.285965"
+           id="tspan812"
+           sodipodi:role="line">Application</tspan></text>
+    </a>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:7.14375019px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="88.616463"
+       y="71.881897"
+       id="text818"><tspan
+         sodipodi:role="line"
+         id="tspan816"
+         x="88.616463"
+         y="71.881897"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:7.14375019px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.26458332px">Experimental</tspan><tspan
+         sodipodi:role="line"
+         x="88.616463"
+         y="79.02565"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:7.14375019px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.26458332px"
+         id="tspan820">Setup</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="130.77637"
+       y="69.158264"
+       id="text824"><tspan
+         sodipodi:role="line"
+         id="tspan822"
+         x="130.77637"
+         y="69.158264"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Simulation</tspan><tspan
+         sodipodi:role="line"
+         x="130.77637"
+         y="75.77285"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+         id="tspan826" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="122.5321"
+       y="116.70518"
+       id="text830"><tspan
+         sodipodi:role="line"
+         id="tspan828"
+         x="122.5321"
+         y="116.70518"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Model Checking</tspan><tspan
+         sodipodi:role="line"
+         x="122.5321"
+         y="123.50304"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05555534px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+         id="tspan832" /></text>
+    <a
+       xlink:href="application.html"
+       id="a6242">
+      <rect
+         rx="3.9687512"
+         ry="5.2916679"
+         y="63.333332"
+         x="2.6458333"
+         height="47.625"
+         width="55.5625"
+         id="rect834"
+         style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.67541802;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </a>
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.67500001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect834-7"
+       width="56.885414"
+       height="82.020836"
+       x="60.854168"
+       y="63.333332"
+       ry="5.2916679" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.94453"
+       y="123.91735"
+       id="text904"><tspan
+         sodipodi:role="line"
+         id="tspan902"
+         x="123.94453"
+         y="123.91735"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Property</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46805573px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="152.5228"
+       y="123.8143"
+       id="text904-3"><tspan
+         sodipodi:role="line"
+         id="tspan902-5"
+         x="152.5228"
+         y="123.8143"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46805573px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Reduction</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.67486387;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 120.85583,117.57291 v 22.48959 h 60.38375 v 5.29167 l 5.29167,-17.19792 -5.29167,-15.875 v 5.29166 z"
+       id="path885-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.67486387;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 120.85583,69.947917 v 35.718743 l 60.38375,1e-5 v 5.29167 l 3.96875,-23.812501 -3.96875,-22.48958 v 5.291667 z"
+       id="path885-2-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <a
+       xlink:href="application.html"
+       id="a6245">
+      <text
+         id="text1018"
+         y="78.263397"
+         x="30.003435"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:center;text-anchor:middle;fill:#d40000;stroke-width:0.26458332px"
+           y="78.263397"
+           x="30.003435"
+           id="tspan1016"
+           sodipodi:role="line">(what you test)</tspan></text>
+    </a>
+    <rect
+       style="opacity:0.93999999;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="PlatformBox"
+       width="51.59375"
+       height="29.104168"
+       x="63.5"
+       y="81.854164"
+       ry="2.6458309"
+       inkscape:label="#rect1020" />
+    <a
+       xlink:href="platform.html"
+       id="a6154">
+      <text
+         id="text1024"
+         y="87.523804"
+         x="66.448212"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"
+         inkscape:label="text1024"><tspan
+           style="stroke-width:0.26458332px"
+           y="87.523804"
+           x="66.448212"
+           id="tspan1022"
+           sodipodi:role="line">Virtual Platform</tspan></text>
+    </a>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="69.055466"
+       y="94.176186"
+       id="text1028"><tspan
+         sodipodi:role="line"
+         id="tspan1026"
+         x="69.055466"
+         y="94.176186"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">▸ Resources</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="69.055466"
+       y="103.17203"
+       id="text1032"><tspan
+         sodipodi:role="line"
+         id="tspan1030"
+         x="69.055466"
+         y="103.17203"
+         style="font-size:4.93888903px;stroke-width:0.26458332px">▸ Routing  </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="69.055466"
+       y="108.99284"
+       id="text1036"><tspan
+         sodipodi:role="line"
+         id="tspan1034"
+         x="69.055466"
+         y="108.99284"
+         style="font-size:4.93888903px;stroke-width:0.26458332px">▸ External Events</tspan></text>
+    <a
+       xlink:href="app_s4u.html"
+       id="a6253">
+      <text
+         inkscape:label="#text1028-9"
+         id="Actors"
+         y="87.184937"
+         x="6.6014075"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+           y="87.184937"
+           x="6.6014075"
+           id="tspan1026-3"
+           sodipodi:role="line">▸ Actors:</tspan></text>
+    </a>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0.93000034;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="6.6014075"
+       y="93.328972"
+       id="text1028-9-6"><tspan
+         sodipodi:role="line"
+         id="tspan1026-3-0"
+         x="6.6014075"
+         y="93.328972"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">▸ MPI Legacy Code</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0.93000034;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="6.6014075"
+       y="99.473015"
+       id="text1028-9-6-2"><tspan
+         sodipodi:role="line"
+         id="tspan1026-3-0-6"
+         x="6.6014075"
+         y="99.473015"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">▸ Offline Traces</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0.93000034;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="6.6014075"
+       y="105.61705"
+       id="text1028-9-6-2-1"><tspan
+         sodipodi:role="line"
+         id="tspan1026-3-0-6-0"
+         x="6.6014075"
+         y="105.61705"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">▸ Centralized Algo</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:0.93000034;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="28.509558"
+       y="87.184937"
+       id="text1028-9-6-8-4"><tspan
+         sodipodi:role="line"
+         id="tspan1026-3-0-0-2"
+         x="28.509558"
+         y="87.184937"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">C/C++/Java</tspan></text>
+    <g
+       id="g982"
+       transform="translate(-2.2622938,-5.9720233)">
+      <circle
+         r="5.953125"
+         cy="102.47958"
+         cx="61.903095"
+         id="path977"
+         style="opacity:0.93999999;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         id="text853"
+         y="106.90308"
+         x="55.99131"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-size:14.11111069px;stroke-width:0.26458332px"
+           y="106.90308"
+           x="55.99131"
+           id="tspan851"
+           sodipodi:role="line">+</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.56258"
+       y="128.77045"
+       id="text1028-1"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2"
+         x="123.56258"
+         y="128.77045"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Safety</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.56258"
+       y="133.19275"
+       id="text1032-0"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6"
+         x="123.56258"
+         y="133.19275"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Liveness</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.56258"
+       y="137.6151"
+       id="text1032-0-8"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-7"
+         x="123.56258"
+         y="137.6151"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Patterns</tspan></text>
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1020-5-9"
+       width="28.633774"
+       height="19.843735"
+       x="122.17873"
+       y="118.89583"
+       ry="2.6458309" />
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1020-5-9-4"
+       width="29.104172"
+       height="19.843754"
+       x="152.13541"
+       y="118.89584"
+       ry="2.6458309" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="153.11868"
+       y="128.39607"
+       id="text1028-1-5"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-9"
+         x="153.11868"
+         y="128.39607"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ DPOR</tspan></text>
+    <g
+       id="g3559"
+       transform="translate(2.6458531,2.6458386)">
+      <text
+         id="text1032-0-1"
+         y="130.17258"
+         x="150.47285"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:4.4979167px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           id="tspan3528"
+           style="font-size:4.23333311px;line-height:4.4979167px;stroke-width:0.26458332px"
+           y="130.17258"
+           x="150.47285"
+           sodipodi:role="line">▸ State</tspan></text>
+      <text
+         id="text1032-0-1-8"
+         y="134.97"
+         x="154.33516"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:4.4979167px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           id="tspan3528-6"
+           style="font-size:4.23333311px;line-height:4.4979167px;stroke-width:0.26458332px"
+           y="134.97"
+           x="154.33516"
+           sodipodi:role="line">Equality</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="128.43848"
+       y="143.96512"
+       id="text1032-0-8-0"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-7-6"
+         x="128.43848"
+         y="143.96512"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px">(highly experimental)</tspan></text>
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1020-5-9-0"
+       width="28.633774"
+       height="30.427078"
+       x="122.17873"
+       y="72.59375"
+       ry="2.6458309" />
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect1020-5-9-0-3"
+       width="29.104172"
+       height="30.427082"
+       x="152.13541"
+       y="72.593758"
+       ry="2.6458309" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="125.24854"
+       y="78.04998"
+       id="text904-0"><tspan
+         sodipodi:role="line"
+         id="tspan902-0"
+         x="125.24854"
+         y="78.04998"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Models</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46805573px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="157.15215"
+       y="77.946869"
+       id="text904-3-4"><tspan
+         sodipodi:role="line"
+         id="tspan902-5-5"
+         x="157.15215"
+         y="77.946869"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.46805573px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Plugins</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.00803"
+       y="83.07312"
+       id="text1028-1-4"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99"
+         x="123.00803"
+         y="83.07312"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Raw Perf.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.00803"
+       y="92.446938"
+       id="text1032-0-9"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-4"
+         x="123.00803"
+         y="92.446938"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Contention</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="123.00803"
+       y="97.587425"
+       id="text1032-0-9-3"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-4-9"
+         x="123.00803"
+         y="97.587425"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Collective</tspan></text>
+    <g
+       id="g11613"
+       transform="matrix(0.59989277,0,0,0.59989277,81.319387,49.091318)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3732"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.18644,106.5369 c 0,-0.13381 -0.10838,-0.24276 -0.24218,-0.24276 -0.13438,0 -0.24276,0.10895 -0.24276,0.24276 0,0.13366 0.10838,0.24203 0.24276,0.24203 0.1338,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3740"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.8093,107.51948 c 0,-0.13366 -0.10838,-0.24203 -0.24204,-0.24203 -0.1338,0 -0.24275,0.10837 -0.24275,0.24203 0,0.13381 0.10895,0.24218 0.24275,0.24218 0.13366,0 0.24204,-0.10837 0.24204,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3748"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.75569,106.69267 c -0.0575,0.0587 -0.11517,0.13033 -0.1484,0.20764 -0.0311,0.0728 -0.048,0.15519 -0.0559,0.23539" />
+      <path
+         d="m 192.59833,107.1431 -0.0526,0.13265 -0.0418,-0.1367"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3750"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3754"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.59833,107.14307 -0.0526,0.13264 -0.0418,-0.13655 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3762"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.7796,107.51948 c 0,-0.15634 -0.12701,-0.28336 -0.28394,-0.28336 -0.15634,0 -0.28321,0.12702 -0.28321,0.28336 0,0.15635 0.12687,0.28336 0.28321,0.28336 0.15693,0 0.28394,-0.12701 0.28394,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3770"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.0639,106.7496 c 0.066,0.11805 0.14956,0.26703 0.22585,0.403" />
+      <path
+         d="m 193.33209,107.13125 0.0249,0.14045 -0.10678,-0.0942"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3772"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3776"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.33209,107.13122 0.0249,0.14045 -0.10678,-0.0942 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3784"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.48201,107.74923 c -0.0305,0.12196 -0.0446,0.27094 0.0175,0.38943 0.0418,0.0802 0.11069,0.14623 0.18395,0.19882" />
+      <path
+         d="m 192.71061,108.2985 0.0903,0.11054 -0.13944,-0.0299"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3786"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3790"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.71061,108.29847 0.0903,0.11069 -0.13944,-0.0299 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3798"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.26707,108.51132 c 0,-0.13381 -0.10838,-0.24276 -0.24261,-0.24276 -0.13381,0 -0.24218,0.10895 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.13423,0 0.24261,-0.10837 0.24261,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3806"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.28448,109.45387 c 0,-0.13438 -0.10895,-0.24275 -0.24275,-0.24275 -0.13381,0 -0.24218,0.10837 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.1338,0 0.24275,-0.10837 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3814"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.84889,108.67951 c -0.14623,0.14045 -0.35734,0.3426 -0.52669,0.50574" />
+      <path
+         d="m 192.35268,109.22126 -0.13033,0.0588 0.0649,-0.12701"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3816"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3820"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.35268,109.22138 -0.13033,0.0587 0.0649,-0.12701 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3828"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.29142,110.4366 c 0,-0.1338 -0.10837,-0.24275 -0.24217,-0.24275 -0.13381,0 -0.24218,0.10895 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.1338,0 0.24217,-0.10837 0.24217,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3836"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.79955,109.47642 c -0.42165,0.0441 -1.26942,0.1536 -1.49469,0.34101 -0.0756,0.0626 -0.12918,0.15172 -0.16704,0.24261" />
+      <path
+         d="m 190.18074,110.07987 -0.088,0.11227 -0.001,-0.14276"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3838"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3842"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.18074,110.07984 -0.088,0.11227 -0.001,-0.14276 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3850"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.88594,110.4366 c 0,-0.15634 -0.12702,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12702 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3858"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.28101,109.49621 c 0.85919,0.15187 3.80102,0.67119 4.90166,0.86583" />
+      <path
+         d="m 197.19452,110.31641 0.1247,0.0699 -0.14103,0.0231"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3860"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3864"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.19452,110.31638 0.1247,0.0699 -0.14103,0.0231 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3872"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.1501,110.4366 c 0,-0.15634 -0.12701,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12702 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3880"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.84694,109.60343 c -0.062,0.0592 -0.12239,0.13265 -0.15519,0.214 -0.0311,0.0767 -0.0293,0.1614 -0.0113,0.24261" />
+      <path
+         d="m 191.72672,110.0488 -0.003,0.14219 -0.0864,-0.11285"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3882"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3886"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.72672,110.04877 -0.003,0.14233 -0.0864,-0.113 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3894"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.9512,111.45994 c 0,-0.13381 -0.10837,-0.24218 -0.24218,-0.24218 -0.13424,0 -0.24261,0.10837 -0.24261,0.24218 0,0.1338 0.10837,0.24218 0.24261,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3902"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.09606,110.67936 c 0.0317,0.12022 0.0802,0.26299 0.15519,0.37642 0.0418,0.0643 0.0971,0.1247 0.15418,0.17773" />
+      <path
+         d="m 190.43693,111.19857 0.0718,0.12311 -0.13323,-0.0514"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3904"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3908"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.43693,111.19854 0.0718,0.12311 -0.13323,-0.0514 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3916"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 187.38398,112.48327 c 0,-0.15692 -0.12701,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28393,0.12644 -0.28393,0.28336 0,0.15635 0.12759,0.28336 0.28393,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3924"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.80591,110.4564 c -0.44809,0.049 -1.41449,0.20996 -2.01892,0.72075 -0.2783,0.23539 -0.46008,0.61354 -0.56557,0.90196" />
+      <path
+         d="m 187.26477,112.09663 -0.088,0.11227 -0.001,-0.14276"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3926"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3930"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 187.26477,112.09659 -0.088,0.11228 -0.001,-0.14276 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3938"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.79406,111.45994 c 0,-0.15635 -0.12701,-0.28336 -0.28336,-0.28336 -0.15692,0 -0.28379,0.12701 -0.28379,0.28336 0,0.15634 0.12687,0.28336 0.28379,0.28336 0.15635,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3946"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.83134,110.54324 c -0.11343,0.0678 -0.24218,0.1682 -0.30763,0.29752 -0.0305,0.0604 -0.0462,0.12803 -0.0542,0.19695" />
+      <path
+         d="m 189.51692,111.0428 -0.0507,0.13323 -0.0435,-0.13612"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3948"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3952"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.51692,111.04277 -0.0507,0.13323 -0.0435,-0.13597 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3960"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.37501,112.48327 c 0,-0.1338 -0.10838,-0.24276 -0.24276,-0.24276 -0.1338,0 -0.24218,0.10896 -0.24218,0.24276 0,0.13381 0.10838,0.24218 0.24218,0.24218 0.13438,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3968"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.93256,111.55415 c 0.4228,0.17845 1.34166,0.56672 1.84798,0.78072" />
+      <path
+         d="m 192.80034,112.29184 0.10548,0.0955 -0.14218,-0.009"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3970"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3974"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.80034,112.29196 0.10548,0.0954 -0.14218,-0.009 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3982"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.48447,111.55863 c -0.15692,0.0645 -0.37208,0.14349 -0.57019,0.18409 -0.82175,0.16935 -1.08936,-0.14797 -1.88468,0.1208 -0.22065,0.075 -0.43971,0.21617 -0.60891,0.34492" />
+      <path
+         d="m 187.44655,112.24791 -0.13481,0.0468 0.0767,-0.1208"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3984"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3988"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 187.44655,112.24788 -0.13481,0.0468 0.0767,-0.1208 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3996"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.30233,112.48327 c 0,-0.15692 -0.12759,-0.28336 -0.28394,-0.28336 -0.15634,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12702,0.28336 0.28336,0.28336 0.15635,0 0.28394,-0.12701 0.28394,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4004"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.78749,111.68969 c 0.0192,0.0569 0.039,0.11733 0.0559,0.17383 0.0209,0.0682 0.0423,0.14002 0.0621,0.20995" />
+      <path
+         d="m 190.95178,112.06281 -0.009,0.14219 -0.0818,-0.1169"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4006"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4010"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.95178,112.06278 -0.009,0.14219 -0.0818,-0.11676 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4018"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.33715,112.34672 c 0.23539,-0.17499 0.58984,-0.50242 0.58984,-0.88678 v -2.00607 c 0,-0.34029 -0.31111,-0.60559 -0.5673,-0.76713" />
+      <path
+         d="m 193.33484,108.72694 -0.0915,-0.10895 0.14002,0.0282"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4020"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4024"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.33484,108.72691 -0.0915,-0.10896 0.14002,0.0282 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4032"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.73842,113.5066 c 0,-0.1338 -0.10837,-0.24275 -0.24276,-0.24275 -0.13366,0 -0.24203,0.10895 -0.24203,0.24275 0,0.13381 0.10837,0.24218 0.24203,0.24218 0.13439,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4040"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.21519,112.71519 c 0.0446,0.12701 0.10158,0.28741 0.15245,0.42959" />
+      <path
+         d="m 193.4133,113.13239 5.8e-4,0.14276 -0.0892,-0.11112"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4042"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4046"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.4133,113.13235 5.8e-4,0.14277 -0.0892,-0.11112 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4054"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.54393,113.5066 c 0,-0.1338 -0.10895,-0.24275 -0.24276,-0.24275 -0.1338,0 -0.24217,0.10895 -0.24217,0.24275 0,0.13381 0.10837,0.24218 0.24217,0.24218 0.13381,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4062"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.97533,112.66779 c -0.12413,0.1367 -0.3088,0.31775 -0.50242,0.43465 -0.24941,0.15071 -0.56326,0.25519 -0.80254,0.32007" />
+      <path
+         d="m 191.68048,113.4682 -0.14218,-0.0124 0.11906,-0.079"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4064"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4068"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.68048,113.46817 -0.14218,-0.0124 0.11906,-0.079 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4076"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.73842,114.52994 c 0,-0.13439 -0.10837,-0.24276 -0.24276,-0.24276 -0.13366,0 -0.24203,0.10837 -0.24203,0.24276 0,0.1338 0.10837,0.24218 0.24203,0.24218 0.13439,0 0.24276,-0.10838 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4084"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.49566,113.74878 v 0.39853" />
+      <path
+         d="m 193.5432,114.15066 -0.0475,0.13424 -0.0468,-0.13424"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4086"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4090"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.5432,114.15063 -0.0475,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4098"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.73842,115.90324 c 0,-0.1338 -0.10837,-0.24275 -0.24276,-0.24275 -0.13366,0 -0.24203,0.10895 -0.24203,0.24275 0,0.13381 0.10837,0.24218 0.24203,0.24218 0.13439,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4106"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.49566,114.77544 v 0.7485" />
+      <path
+         d="m 193.5432,115.52498 -0.0475,0.13496 -0.0468,-0.13496"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4108"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4112"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.5432,115.52509 -0.0475,0.13482 -0.0468,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4120"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.14583,117.57292 c 0,-0.13439 -0.10837,-0.24276 -0.24218,-0.24276 -0.1338,0 -0.24275,0.10837 -0.24275,0.24276 0,0.13366 0.10895,0.24203 0.24275,0.24203 0.13381,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4128"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.46575,116.14369 c -0.0406,0.26978 -0.12745,0.71454 -0.2929,1.06567 -0.01,0.0208 -0.0208,0.0418 -0.0332,0.0627" />
+      <path
+         d="m 193.17791,117.2997 -0.11401,0.0857 0.0356,-0.13829"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4130"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4134"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.17791,117.29967 -0.11401,0.0858 0.0356,-0.13828 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4142"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.58173,124.37211 c 0,-0.1338 -0.10895,-0.24217 -0.24276,-0.24217 -0.1338,0 -0.24218,0.10837 -0.24218,0.24217 0,0.13381 0.10838,0.24218 0.24218,0.24218 0.13381,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4150"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.75121,117.76596 c -0.17614,0.24204 -0.44028,0.67727 -0.44028,1.09949 v 1.93887 c 0,0.40358 0.0971,0.60227 -0.18843,0.88837 -0.1812,0.18178 -0.32411,0.0334 -0.56571,0.12138 -0.1523,0.0559 -1.16884,0.58088 -1.29253,0.68636 -0.63608,0.54476 -0.47858,0.98273 -1.13055,1.50827 -0.12875,0.10317 -0.29131,0.18453 -0.43581,0.24377" />
+      <path
+         d="m 188.71438,124.29657 -0.14291,0.004 0.10953,-0.092"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4152"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4156"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.71438,124.29654 -0.14291,0.004 0.10953,-0.092 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4164"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.01616,130.02732 c 0,-0.1338 -0.10837,-0.24275 -0.24275,-0.24275 -0.13381,0 -0.24218,0.10895 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13438,0 0.24275,-0.10837 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4172"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.16008,124.54147 c -0.16545,0.17614 -0.38667,0.46788 -0.38667,0.77335 v 4.3332" />
+      <path
+         d="m 187.8208,129.64863 -0.0474,0.13423 -0.0468,-0.13423"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4174"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4178"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 187.8208,129.6486 -0.0474,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4186"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.00258,129.9545 c 0.13207,-0.0175 0.25504,0.0101 0.25504,0.0814 0,0.0439 -0.048,0.0705 -0.11618,0.0806" />
+      <path
+         d="m 188.13696,130.16391 -0.13438,-0.0474 0.13482,-0.0474"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4188"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4192"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.13696,130.16387 -0.13438,-0.0474 0.13482,-0.0474 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4200"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.73236,114.52994 c 0,-0.13439 -0.10838,-0.24276 -0.24262,-0.24276 -0.1338,0 -0.24217,0.10837 -0.24217,0.24276 0,0.1338 0.10837,0.24218 0.24217,0.24218 0.13424,0 0.24262,-0.10838 0.24262,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4208"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.34582,113.74878 c 0.0225,0.12138 0.0502,0.27036 0.075,0.40575" />
+      <path
+         d="m 191.46706,114.14777 -0.0214,0.14118 -0.0711,-0.12369"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4210"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4214"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.46706,114.14774 -0.0214,0.14117 -0.0711,-0.12354 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4222"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.14404,115.2163 c 0,-0.15635 -0.12702,-0.28336 -0.28336,-0.28336 -0.15693,0 -0.28336,0.12701 -0.28336,0.28336 0,0.15693 0.12643,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12643 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4230"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.05726,113.5501 c -0.33581,0.0649 -0.91438,0.1981 -1.04862,0.36009 -0.20157,0.24376 -0.22802,0.60674 -0.20995,0.88779" />
+      <path
+         d="m 189.8455,114.79469 -0.035,0.13828 -0.0588,-0.1299"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4232"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4236"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.8455,114.79466 -0.035,0.13828 -0.0588,-0.12976 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4244"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.01839,115.90324 c 0,-0.1338 -0.10837,-0.24275 -0.24218,-0.24275 -0.1338,0 -0.24217,0.10895 -0.24217,0.24275 0,0.13381 0.10837,0.24218 0.24217,0.24218 0.13381,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4252"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.25378,114.59771 c -0.1614,0.0598 -0.36414,0.1653 -0.46398,0.33581 -0.1039,0.17715 -0.11184,0.40532 -0.0921,0.59605" />
+      <path
+         d="m 190.74515,115.52671 -0.0276,0.13944 -0.0655,-0.12643"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4254"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4258"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.74515,115.52668 -0.0276,0.13944 -0.0655,-0.12643 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4266"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.74313,116.92658 c 0,-0.13381 -0.10837,-0.24276 -0.24218,-0.24276 -0.13438,0 -0.24275,0.10895 -0.24275,0.24276 0,0.1338 0.10837,0.24218 0.24275,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4274"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.55383,116.00309 c -0.39679,0.17846 -1.22881,0.55256 -1.7029,0.76598" />
+      <path
+         d="m 188.86957,116.81202 -0.14233,0.0124 0.10331,-0.0983"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4276"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4280"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.86957,116.81199 -0.14233,0.0124 0.10331,-0.0983 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4288"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.42478,116.92658 c 0,-0.13381 -0.10837,-0.24276 -0.24218,-0.24276 -0.13366,0 -0.24203,0.10895 -0.24203,0.24276 0,0.1338 0.10837,0.24218 0.24203,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4296"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.01897,115.93142 c 0.7196,0.0853 2.79574,0.33422 2.85383,0.37541 0.088,0.0626 0.15187,0.15692 0.19869,0.25345" />
+      <path
+         d="m 194.11657,116.5473 0.007,0.14277 -0.0942,-0.10722"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4298"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4302"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.11657,116.54727 0.007,0.14276 -0.0942,-0.10721 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4310"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.74313,118.21911 c 0,-0.13381 -0.10837,-0.24261 -0.24218,-0.24261 -0.13438,0 -0.24275,0.1088 -0.24275,0.24261 0,0.1338 0.10837,0.24218 0.24275,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4318"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.50095,117.16933 v 0.6631" />
+      <path
+         d="m 188.54777,117.8381 -0.0468,0.13438 -0.0474,-0.13438"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4320"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4324"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.54777,117.83821 -0.0468,0.13424 -0.0474,-0.13424 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4332"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.80426,119.51179 c 0,-0.13439 -0.10837,-0.24276 -0.24218,-0.24276 -0.13438,0 -0.24276,0.10837 -0.24276,0.24276 0,0.13366 0.10838,0.24203 0.24276,0.24203 0.13381,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4340"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.26903,116.99767 c -0.36861,0.12701 -1.08431,0.42612 -1.45119,0.93866 -0.25012,0.34882 -0.29131,0.85239 -0.28451,1.19557" />
+      <path
+         d="m 186.58014,119.13179 -0.0418,0.13612 -0.0524,-0.13265"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4342"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4346"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.58014,119.1319 -0.0418,0.13597 -0.0524,-0.13264 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4354"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.99123,119.51179 c 0,-0.13439 -0.10838,-0.24276 -0.24204,-0.24276 -0.1338,0 -0.24218,0.10837 -0.24218,0.24276 0,0.13366 0.10838,0.24203 0.24218,0.24203 0.13366,0 0.24204,-0.10837 0.24204,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4362"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.71206,118.34049 c 0.39174,0.22527 1.23271,0.7089 1.70233,0.97883" />
+      <path
+         d="m 190.44315,119.28149 0.0938,0.10779 -0.1406,-0.026"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4364"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4368"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.44315,119.28146 0.0938,0.10779 -0.1406,-0.026 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4376"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.29331,118.34439 c -0.10447,0.0571 -0.23438,0.12022 -0.35792,0.1575 -0.21386,0.0639 -0.81844,-0.013 -0.99631,0.1208 -0.16358,0.12311 -0.25678,0.33018 -0.30981,0.51369" />
+      <path
+         d="m 186.67436,119.15101 -0.0779,0.11964 -0.0134,-0.14218"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4378"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4382"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.67436,119.15098 -0.0779,0.11978 -0.0134,-0.14233 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4390"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.81913,119.27915 c 0.1812,-0.61123 0.65934,-2.31934 0.81901,-3.78007 0.027,-0.24998 0.0435,-0.31775 0,-0.56556 -0.003,-0.0169 -0.007,-0.0338 -0.0113,-0.0514" />
+      <path
+         d="m 191.58164,114.89511 0.006,-0.14276 0.0841,0.11516"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4392"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4396"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.58164,114.89508 0.006,-0.14276 0.0841,0.11516 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4404"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.99123,120.80432 c 0,-0.13381 -0.10838,-0.24276 -0.24204,-0.24276 -0.1338,0 -0.24218,0.10895 -0.24218,0.24276 0,0.1338 0.10838,0.24218 0.24218,0.24218 0.13366,0 0.24204,-0.10838 0.24204,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4412"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.74919,119.7544 v 0.66324" />
+      <path
+         d="m 190.79659,120.42273 -0.0474,0.13496 -0.047,-0.13496"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4414"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4418"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.79659,120.4227 -0.0474,0.13496 -0.047,-0.13496 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.31845,122.09685 c 0,-0.1338 -0.10838,-0.24218 -0.24218,-0.24218 -0.13424,0 -0.24261,0.10838 -0.24261,0.24218 0,0.13381 0.10837,0.24218 0.24261,0.24218 0.1338,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4434"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.63229,121.02222 c -0.0322,0.0598 -0.0666,0.12528 -0.0983,0.18568 -0.0948,0.18062 -0.19927,0.38321 -0.28438,0.54866" />
+      <path
+         d="m 190.28969,121.78246 -0.10332,0.0982 0.0192,-0.14117"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4436"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4440"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.28969,121.78242 -0.10332,0.0983 0.0192,-0.14103 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4448"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.1631,122.09685 c 0,-0.1338 -0.10837,-0.24218 -0.24275,-0.24218 -0.13381,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13438,0 0.24275,-0.10837 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4456"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.91233,120.98379 c 0.19464,0.21501 0.52265,0.57741 0.75182,0.8297" />
+      <path
+         d="m 191.6997,121.78303 0.0559,0.1315 -0.12542,-0.0682"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4458"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4462"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.6997,121.783 0.0559,0.1315 -0.12542,-0.0682 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4470"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.90453,123.42956 c 0,-0.13381 -0.10837,-0.24218 -0.24217,-0.24218 -0.13381,0 -0.24262,0.10837 -0.24262,0.24218 0,0.1338 0.10881,0.24261 0.24262,0.24261 0.1338,0 0.24217,-0.10881 0.24217,-0.24261" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4478"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.84261,122.16693 c -0.18336,0.0637 -0.43681,0.17326 -0.61469,0.3335 -0.17658,0.15924 -0.31602,0.38668 -0.41312,0.57684" />
+      <path
+         d="m 188.85656,123.10042 -0.101,0.101 0.0157,-0.1416"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4480"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4484"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.85656,123.10039 -0.101,0.10115 0.0157,-0.14175 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4492"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.48058,123.59486 c -0.0507,0.0571 -0.10043,0.12542 -0.12803,0.19869 -0.0237,0.0621 -0.0361,0.13105 -0.0412,0.19926" />
+      <path
+         d="m 188.35819,123.99457 -0.0491,0.13424 -0.0452,-0.13539"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4494"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4498"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.35819,123.99454 -0.0491,0.13438 -0.0452,-0.13553 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4506"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.2709,123.42956 c 0,-0.13381 -0.10895,-0.24218 -0.24276,-0.24218 -0.1338,0 -0.24218,0.10837 -0.24218,0.24218 0,0.1338 0.10838,0.24261 0.24218,0.24261 0.13381,0 0.24276,-0.10881 0.24276,-0.24261" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4514"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.94072,122.34134 c 0.0157,0.19695 0.0383,0.47858 0.0569,0.70544" />
+      <path
+         d="m 192.04505,123.04855 -0.0366,0.13828 -0.0576,-0.13034"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4516"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4520"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.04505,123.04851 -0.0366,0.13829 -0.0576,-0.13034 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4528"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.50701,123.42956 c 0,-0.13381 -0.10895,-0.24218 -0.24275,-0.24218 -0.13381,0 -0.24218,0.10837 -0.24218,0.24218 0,0.1338 0.10837,0.24261 0.24218,0.24261 0.1338,0 0.24275,-0.10881 0.24275,-0.24261" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4536"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.68554,122.16173 c -0.37194,0.10447 -1.05715,0.29983 -1.0979,0.3387 -0.15013,0.1445 -0.23076,0.36183 -0.27367,0.5504" />
+      <path
+         d="m 190.35963,123.06372 -0.0717,0.12369 -0.0208,-0.14118"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4538"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4542"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.35963,123.06383 -0.0717,0.12355 -0.0208,-0.14118 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4550"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.03478,123.42956 c 0,-0.13381 -0.10837,-0.24218 -0.24275,-0.24218 -0.13381,0 -0.24218,0.10837 -0.24218,0.24218 0,0.1338 0.10837,0.24261 0.24218,0.24261 0.13438,0 0.24275,-0.10881 0.24275,-0.24261" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4558"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.12077,122.23918 c 0.32685,0.2325 0.97593,0.69533 1.36203,0.97016" />
+      <path
+         d="m 193.51098,123.17151 0.0824,0.1169 -0.13713,-0.04"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4560"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4564"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.51098,123.17163 0.0824,0.11675 -0.13713,-0.04 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.37869,124.37211 c 0,-0.1338 -0.10895,-0.24217 -0.24275,-0.24217 -0.13366,0 -0.24204,0.10837 -0.24204,0.24217 0,0.13381 0.10838,0.24218 0.24204,0.24218 0.1338,0 0.24275,-0.10837 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4580"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.05646,123.67217 c 0.0107,0.0971 0.0237,0.21169 0.0361,0.31905" />
+      <path
+         d="m 192.13941,123.98778 -0.0311,0.13944 -0.0621,-0.12875"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4582"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4586"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.13941,123.98775 -0.0311,0.13944 -0.0621,-0.12875 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4594"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.37205,124.37211 c 0,-0.1338 -0.10837,-0.24217 -0.24203,-0.24217 -0.1338,0 -0.24276,0.10837 -0.24276,0.24217 0,0.13381 0.10896,0.24218 0.24276,0.24218 0.13366,0 0.24203,-0.10837 0.24203,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4602"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.78553,123.45831 c -0.27671,0.0412 -0.7339,0.13554 -1.07651,0.33524 -0.1247,0.0722 -0.2416,0.17787 -0.33697,0.27945" />
+      <path
+         d="m 190.40196,124.11032 -0.1247,0.0694 0.0542,-0.13207"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4604"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4608"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.40196,124.11028 -0.1247,0.0694 0.0542,-0.13207 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.2904,124.37211 c 0,-0.1338 -0.10837,-0.24217 -0.24203,-0.24217 -0.13439,0 -0.24276,0.10837 -0.24276,0.24217 0,0.13381 0.10837,0.24218 0.24276,0.24218 0.13366,0 0.24203,-0.10837 0.24203,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4624"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.22235,123.57622 c 0.0858,0.0656 0.18741,0.1445 0.27714,0.21733 0.11575,0.0926 0.12471,0.14565 0.2562,0.21515 0.28957,0.15346 0.6514,0.24825 0.91843,0.30186" />
+      <path
+         d="m 193.68423,124.26493 0.12369,0.0711 -0.14117,0.0214"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4626"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4630"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.68423,124.2649 0.12369,0.0711 -0.14117,0.0215 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4638"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.50701,125.31482 c 0,-0.13381 -0.10895,-0.24276 -0.24275,-0.24276 -0.13381,0 -0.24218,0.10895 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.1338,0 0.24275,-0.10837 0.24275,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4646"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.89896,124.4263 c -0.23033,0.0577 -0.5842,0.1614 -0.86698,0.30937 -0.16878,0.0886 -0.33929,0.21285 -0.47699,0.32396" />
+      <path
+         d="m 190.58201,125.09854 -0.13366,0.0497 0.0733,-0.12195"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4648"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4652"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.58201,125.09865 -0.13366,0.0496 0.0733,-0.12181 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4660"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.22335,125.31482 c 0,-0.13381 -0.10895,-0.24276 -0.24275,-0.24276 -0.13381,0 -0.24218,0.10895 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.1338,0 0.24275,-0.10837 0.24275,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4668"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.26917,124.58265 c 0.0891,0.12427 0.21674,0.27498 0.36529,0.36861 0.29405,0.1851 0.68231,0.27715 0.96625,0.3218" />
+      <path
+         d="m 193.60808,125.22671 0.12702,0.0654 -0.14002,0.0277"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4670"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4674"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.60808,125.22667 0.12702,0.0655 -0.14002,0.0277 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4682"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.66842,126.25738 c 0,-0.13381 -0.10837,-0.24276 -0.24218,-0.24276 -0.1338,0 -0.24261,0.10895 -0.24261,0.24276 0,0.1338 0.10881,0.24217 0.24261,0.24217 0.13381,0 0.24218,-0.10837 0.24218,-0.24217" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4690"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.30602,125.55743 c 0.0169,0.0971 0.0361,0.21111 0.0548,0.31891" />
+      <path
+         d="m 190.4076,125.87131 -0.0237,0.1406 -0.0688,-0.12427"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4692"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4696"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.4076,125.87128 -0.0237,0.14059 -0.0688,-0.12412 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4704"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.47674,128.14206 c 0,-0.1338 -0.10895,-0.24218 -0.24276,-0.24218 -0.1338,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10838,0.24218 0.24218,0.24218 0.13381,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4712"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.06904,125.46047 c -0.51427,0.40243 -1.82544,1.54598 -1.16451,2.31803 0.12471,0.14624 1.32144,0.27383 1.94899,0.33134" />
+      <path
+         d="m 190.85916,128.06305 0.1299,0.0587 -0.13828,0.035"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4714"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4718"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.85916,128.06302 0.1299,0.0587 -0.13828,0.0351 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4726"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.66842,127.20008 c 0,-0.13438 -0.10837,-0.24276 -0.24218,-0.24276 -0.1338,0 -0.24261,0.10838 -0.24261,0.24276 0,0.13366 0.10881,0.24203 0.24261,0.24203 0.13381,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4734"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.42624,126.50013 v 0.31891" />
+      <path
+         d="m 190.47306,126.82008 -0.0468,0.13439 -0.0474,-0.13439"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4736"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4740"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.47306,126.8202 -0.0468,0.13423 -0.0474,-0.13423 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4748"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.67131,126.29076 c 0.35214,0.053 0.97536,0.16761 1.12824,0.33017 0.35734,0.37989 0.46571,0.71628 0.18857,1.15757 -0.0858,0.1367 -0.23871,0.22354 -0.38495,0.27715" />
+      <path
+         d="m 191.6156,128.10149 -0.14233,-0.005 0.11401,-0.0851"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4750"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4754"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.6156,128.10146 -0.14233,-0.004 0.11401,-0.0853 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4762"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.95872,128.14206 c 0,-0.1338 -0.10895,-0.24218 -0.24276,-0.24218 -0.13366,0 -0.24203,0.10838 -0.24203,0.24218 0,0.13381 0.10837,0.24218 0.24203,0.24218 0.13381,0 0.24276,-0.10837 0.24276,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4770"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.18132,127.22595 c -0.26704,0.0379 -0.69764,0.12874 -1.00759,0.33754 -0.0971,0.0649 -0.18336,0.1575 -0.25402,0.24955" />
+      <path
+         d="m 188.9554,127.84457 -0.11632,0.0825 0.0394,-0.13727"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4772"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4776"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.9554,127.84468 -0.11632,0.0824 0.0394,-0.13713 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4784"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.48953,127.43706 c 0.0383,0.11242 0.0965,0.24333 0.17889,0.34144 0.0627,0.0746 0.14392,0.13887 0.22628,0.19204" />
+      <path
+         d="m 190.92013,127.93156 0.0921,0.10895 -0.14002,-0.0283"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4786"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4790"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.92013,127.93153 0.0921,0.10895 -0.14002,-0.0282 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4798"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.71596,129.08476 c 0,-0.1338 -0.10837,-0.24217 -0.24203,-0.24217 -0.1338,0 -0.24218,0.10837 -0.24218,0.24217 0,0.13367 0.10838,0.24204 0.24218,0.24204 0.13366,0 0.24203,-0.10837 0.24203,-0.24204" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4806"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.65499,128.37976 c -0.0259,0.101 -0.0569,0.22123 -0.0857,0.33292" />
+      <path
+         d="m 188.61496,128.72514 -0.079,0.11849 -0.0124,-0.14219"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4808"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4812"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.61496,128.72511 -0.079,0.11863 -0.0124,-0.14233 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4820"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.32886,129.27998 c -0.0949,0.12759 -0.2208,0.29694 -0.32859,0.44202" />
+      <path
+         d="m 188.03639,129.75194 -0.11791,0.08 0.0423,-0.13597"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4822"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4826"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.03639,129.75191 -0.11791,0.08 0.0423,-0.13597 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4834"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.42862,129.08476 c 0,-0.1338 -0.10838,-0.24217 -0.24218,-0.24217 -0.13381,0 -0.24218,0.10837 -0.24218,0.24217 0,0.13367 0.10837,0.24204 0.24218,0.24204 0.1338,0 0.24218,-0.10837 0.24218,-0.24204" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4842"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.4542,128.2487 c 0.33697,0.16256 0.98316,0.47482 1.384,0.66772" />
+      <path
+         d="m 192.86305,128.87643 0.10101,0.101 -0.14176,-0.0163"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4844"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4848"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.86305,128.8764 0.10101,0.101 -0.14176,-0.0163 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4856"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.42862,130.02732 c 0,-0.1338 -0.10838,-0.24275 -0.24218,-0.24275 -0.13381,0 -0.24218,0.10895 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.1338,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4864"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.18644,129.32738 v 0.3189" />
+      <path
+         d="m 193.23383,129.64747 -0.0474,0.13438 -0.0474,-0.13438"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4866"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4870"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.23383,129.64744 -0.0474,0.13438 -0.0474,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4878"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.41561,129.91158 c 0.13265,-0.0175 0.25562,0.0101 0.25562,0.0814 0,0.0439 -0.048,0.0705 -0.11676,0.0806" />
+      <path
+         d="m 193.55043,130.12099 -0.13482,-0.0474 0.13482,-0.0474"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4880"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4884"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.55043,130.12096 -0.13482,-0.0474 0.13482,-0.0474 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4892"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.9806,125.55859 v 2.58347 c 0,0.30995 -0.25403,0.57062 -0.47468,0.73882" />
+      <path
+         d="m 193.53179,128.9205 -0.13655,0.04 0.0819,-0.1169"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4894"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4898"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.53179,128.92047 -0.13655,0.04 0.0819,-0.11676 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4906"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.11976,124.61603 c -5.8e-4,0.10375 0.004,0.22628 0.0237,0.33523 0,10e-4 5.8e-4,0.003 5.8e-4,0.004" />
+      <path
+         d="m 190.18984,124.9445 -0.013,0.14219 -0.0785,-0.11907"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4908"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4912"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.18984,124.94447 -0.013,0.14233 -0.0785,-0.11921 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4920"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.03088,124.61487 c -0.007,0.0971 -0.0153,0.21111 -0.0233,0.31891" />
+      <path
+         d="m 194.05458,124.93887 -0.0565,0.13033 -0.0373,-0.13713"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4922"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4926"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.05458,124.93883 -0.0565,0.13034 -0.0373,-0.13713 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4934"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.04245,123.53619 c -0.0998,0.0598 -0.20721,0.14624 -0.2624,0.25736 -0.0429,0.0853 -0.0361,0.12643 0,0.21515 0.0158,0.0395 0.0383,0.0767 0.0637,0.1117" />
+      <path
+         d="m 189.88047,124.09052 0.0542,0.13149 -0.1247,-0.0689"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4936"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4940"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.88047,124.09049 0.0542,0.13149 -0.1247,-0.0688 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4948"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.98334,123.58417 c 0.0582,0.0587 0.11459,0.13033 0.14566,0.20938 0.026,0.0666 0.0316,0.14059 0.026,0.21284" />
+      <path
+         d="m 194.20125,124.01538 -0.0688,0.12528 -0.0243,-0.14103"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4950"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4954"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.20125,124.01549 -0.0688,0.12528 -0.0243,-0.14117 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4962"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.41368,120.80432 c 0,-0.13381 -0.10837,-0.24276 -0.24218,-0.24276 -0.1338,0 -0.24217,0.10895 -0.24217,0.24276 0,0.1338 0.10837,0.24218 0.24217,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4970"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.49041,119.74876 c -0.0581,0.19305 -0.14161,0.46904 -0.2088,0.69041" />
+      <path
+         d="m 186.32669,120.45322 -0.0841,0.11517 -0.006,-0.14233"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4972"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4976"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.32669,120.45319 -0.0841,0.11516 -0.006,-0.14218 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.39056,120.69147 c 0.13597,-0.0272 0.26573,0.0107 0.26573,0.11285 0,0.0649 -0.053,0.10447 -0.12687,0.11675" />
+      <path
+         d="m 186.52364,120.96792 -0.13308,-0.0513 0.13597,-0.0429"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path4986"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4990"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.52364,120.96804 -0.13308,-0.0515 0.13597,-0.0429 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4998"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.42478,118.86545 c 0,-0.13381 -0.10837,-0.24276 -0.24218,-0.24276 -0.13366,0 -0.24203,0.10895 -0.24203,0.24276 0,0.1338 0.10837,0.24218 0.24203,0.24218 0.13381,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5006"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.1826,117.17208 v 1.31117" />
+      <path
+         d="m 194.23,118.48675 -0.0474,0.13482 -0.0468,-0.13482"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5008"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5012"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.23,118.48672 -0.0474,0.13482 -0.0468,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5020"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.822,118.21911 c 0,-0.13381 -0.10895,-0.24261 -0.24275,-0.24261 -0.13367,0 -0.24204,0.1088 -0.24204,0.24261 0,0.1338 0.10837,0.24218 0.24204,0.24218 0.1338,0 0.24275,-0.10838 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5028"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.39935,117.04348 c 0.41948,0.2257 1.34224,0.7235 1.84177,0.99327" />
+      <path
+         d="m 196.26829,117.99791 0.0965,0.10549 -0.14117,-0.0225"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5030"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5034"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.26829,117.99788 0.0965,0.10549 -0.14117,-0.0225 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5042"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.42478,120.15798 c 0,-0.1338 -0.10837,-0.24276 -0.24218,-0.24276 -0.13366,0 -0.24203,0.10896 -0.24203,0.24276 0,0.13381 0.10837,0.24218 0.24203,0.24218 0.13381,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5050"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.1826,119.1082 v 0.6631" />
+      <path
+         d="m 194.23,119.77697 -0.0474,0.13438 -0.0468,-0.13438"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5052"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5056"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.23,119.77694 -0.0474,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5064"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.50614,121.45066 c 0,-0.13438 -0.10896,-0.24276 -0.24276,-0.24276 -0.13381,0 -0.24218,0.10838 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.1338,0 0.24276,-0.10837 0.24276,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5072"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.19792,120.40132 c 0.0118,0.18741 0.0282,0.45097 0.0418,0.66656" />
+      <path
+         d="m 194.28708,121.07124 -0.0389,0.13727 -0.0554,-0.13164"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5074"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5078"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.28708,121.07121 -0.0389,0.13727 -0.0554,-0.13149 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5086"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.91947,127.20008 c 0,-0.13438 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24276,0.10838 -0.24276,0.24276 0,0.13366 0.10895,0.24203 0.24276,0.24203 0.1338,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5094"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.444,121.61654 c 0.23423,0.23539 0.61412,0.69027 0.61412,1.16668 v 3.47416 c 0,0.26255 0.16993,0.50863 0.33191,0.68362" />
+      <path
+         d="m 195.42673,126.91155 0.0616,0.12875 -0.12817,-0.0627"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5096"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5100"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.42673,126.91152 0.0616,0.12875 -0.12817,-0.0626 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5108"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.46451,128.14206 c 0,-0.1338 -0.10895,-0.24218 -0.24261,-0.24218 -0.13381,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13366,0 0.24261,-0.10837 0.24261,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5116"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.90762,127.28519 c 0.44592,0.16487 1.42865,0.52901 1.9591,0.72538" />
+      <path
+         d="m 197.88435,127.96653 0.10938,0.0915 -0.14218,-0.003"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5118"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5122"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.88435,127.9665 0.10938,0.0915 -0.14218,-0.003 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5130"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.46451,129.08476 c 0,-0.1338 -0.10895,-0.24217 -0.24261,-0.24217 -0.13381,0 -0.24218,0.10837 -0.24218,0.24217 0,0.13367 0.10837,0.24204 0.24218,0.24204 0.13366,0 0.24261,-0.10837 0.24261,-0.24204" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5138"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.2219,128.38482 v 0.3189" />
+      <path
+         d="m 198.26929,128.70477 -0.0474,0.13496 -0.047,-0.13496"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5140"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5144"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.26929,128.70488 -0.0474,0.13482 -0.047,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5152"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.46451,130.02732 c 0,-0.1338 -0.10895,-0.24275 -0.24261,-0.24275 -0.13381,0 -0.24218,0.10895 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13366,0 0.24261,-0.10837 0.24261,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5160"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.2219,129.32738 v 0.3189" />
+      <path
+         d="m 198.26929,129.64747 -0.0474,0.13438 -0.047,-0.13438"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5162"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5166"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.26929,129.64744 -0.0474,0.13438 -0.047,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5174"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.4515,129.94597 c 0.13207,-0.0163 0.25519,0.0108 0.25519,0.0814 0,0.0441 -0.048,0.0711 -0.11632,0.0812" />
+      <path
+         d="m 198.58589,130.15596 -0.13439,-0.048 0.13439,-0.0462"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5176"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5180"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.58589,130.15607 -0.13439,-0.048 0.13439,-0.0464 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5188"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.30636,119.51179 c 0,-0.13439 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24218,0.10837 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.1338,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5196"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.66623,118.45002 c 0.0728,0.19478 0.17889,0.47698 0.26241,0.70153" />
+      <path
+         d="m 196.97502,119.13974 0.003,0.14276 -0.0915,-0.10938"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5198"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5202"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.97502,119.13971 0.003,0.1429 -0.0915,-0.10953 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5210"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.36749,119.51179 c 0,-0.13439 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24218,0.10837 -0.24218,0.24276 0,0.13366 0.10837,0.24203 0.24218,0.24203 0.1338,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5218"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.33996,118.26939 c -0.3166,0.0711 -0.85066,0.2088 -0.98548,0.3533 -0.12701,0.13554 -0.18568,0.33134 -0.21227,0.50517" />
+      <path
+         d="m 195.18845,119.13742 -0.062,0.12875 -0.0316,-0.13886"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5220"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5224"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.18845,119.13754 -0.062,0.1286 -0.0316,-0.13886 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5232"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.4515,119.51179 c 0,-0.15693 -0.12701,-0.28394 -0.28336,-0.28394 -0.15634,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12702,0.28321 0.28336,0.28321 0.15635,0 0.28336,-0.12687 0.28336,-0.28321" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5240"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.80842,118.30552 c 0.16993,0.0705 0.40141,0.18062 0.57857,0.31717 0.20042,0.15476 0.38841,0.36573 0.53002,0.5436" />
+      <path
+         d="m 197.95761,119.14205 0.0452,0.13539 -0.11965,-0.0779"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5242"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5246"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.95761,119.14202 0.0452,0.13539 -0.11965,-0.0779 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5254"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.34696,120.80432 c 0,-0.13381 -0.10837,-0.24276 -0.24275,-0.24276 -0.13381,0 -0.24218,0.10895 -0.24218,0.24276 0,0.1338 0.10837,0.24218 0.24218,0.24218 0.13438,0 0.24275,-0.10838 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5262"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.07155,119.7544 c 0.006,0.18683 0.014,0.44823 0.0208,0.66324" />
+      <path
+         d="m 197.13975,120.42158 -0.0429,0.13611 -0.0513,-0.13322"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5264"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5268"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.13975,120.42154 -0.0429,0.13612 -0.0513,-0.13323 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5276"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.71789,120.80432 c 0,-0.13381 -0.10895,-0.24276 -0.24261,-0.24276 -0.1338,0 -0.24218,0.10895 -0.24218,0.24276 0,0.1338 0.10838,0.24218 0.24218,0.24218 0.13366,0 0.24261,-0.10838 0.24261,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5284"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.81911,119.55355 c -0.35098,0.0649 -0.97362,0.19926 -1.12824,0.36167 -0.12759,0.13381 -0.18351,0.32975 -0.20721,0.50358" />
+      <path
+         d="m 195.53048,120.42837 -0.0592,0.12932 -0.035,-0.13828"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5286"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5290"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.53048,120.42834 -0.0592,0.12932 -0.035,-0.13828 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5298"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.63581,120.80432 c 0,-0.13381 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24276,0.10895 -0.24276,0.24276 0,0.1338 0.10895,0.24218 0.24276,0.24218 0.1338,0 0.24218,-0.10838 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5306"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.24928,119.67377 c 0.0734,0.0705 0.15519,0.15519 0.21848,0.24145 0.14508,0.19652 0.0637,0.33538 0.2562,0.48494 0.19868,0.15461 0.86193,0.28105 1.29036,0.34939" />
+      <path
+         d="m 199.02386,120.7032 0.12528,0.0672 -0.13988,0.026"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5308"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5312"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.02386,120.70332 0.12528,0.067 -0.13988,0.026 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5320"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.43142,122.09685 c 0,-0.1338 -0.10895,-0.24218 -0.24275,-0.24218 -0.13381,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.1338,0 0.24275,-0.10837 0.24275,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5328"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.86203,120.83929 c -0.21328,0.0457 -0.51355,0.14681 -0.65978,0.36861 -0.0988,0.15013 -0.11068,0.34766 -0.0938,0.51817" />
+      <path
+         d="m 196.15543,121.72148 -0.0277,0.14002 -0.0655,-0.12702"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5330"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5334"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.15543,121.72145 -0.0277,0.14002 -0.0655,-0.12702 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5342"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.68942,122.09685 c 0,-0.1338 -0.10838,-0.24218 -0.24218,-0.24218 -0.13381,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.1338,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5350"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.28266,120.97642 c 0.26356,0.25518 0.72856,0.70385 0.75067,0.71627 0.32396,0.18568 0.73824,0.29073 1.0346,0.34723" />
+      <path
+         d="m 199.0792,121.99357 0.12412,0.0699 -0.14103,0.0233"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5352"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5356"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.0792,121.99354 0.12412,0.0701 -0.14103,0.0231 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5364"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.43142,123.42956 c 0,-0.13381 -0.10895,-0.24218 -0.24275,-0.24218 -0.13381,0 -0.24218,0.10837 -0.24218,0.24218 0,0.1338 0.10837,0.24261 0.24218,0.24261 0.1338,0 0.24275,-0.10881 0.24275,-0.24261" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5372"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.18867,122.34134 v 0.70544" />
+      <path
+         d="m 196.23606,123.05245 -0.0474,0.13438 -0.0468,-0.13438"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5374"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5378"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.23606,123.05242 -0.0474,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5386"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.90869,125.31482 c 0,-0.13381 -0.10837,-0.24276 -0.24203,-0.24276 -0.13438,0 -0.24276,0.10895 -0.24276,0.24276 0,0.13366 0.10838,0.24203 0.24276,0.24203 0.13366,0 0.24203,-0.10837 0.24203,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5394"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.43085,122.12344 c 0.28957,0.0423 0.77956,0.14392 1.1317,0.37699 0.77957,0.5176 1.01828,0.7485 1.33271,1.62951 0.0975,0.27324 0.0225,0.59778 -0.0672,0.83823" />
+      <path
+         d="m 198.87098,124.98857 -0.0944,0.10664 0.007,-0.14218"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5396"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5400"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.87098,124.98854 -0.0944,0.10664 0.007,-0.14218 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5408"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.21583,124.37211 c 0,-0.1338 -0.10837,-0.24217 -0.24218,-0.24217 -0.1338,0 -0.24275,0.10837 -0.24275,0.24217 0,0.13381 0.10895,0.24218 0.24275,0.24218 0.13381,0 0.24218,-0.10837 0.24218,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5416"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.00631,123.59428 c -0.0513,0.0577 -0.10042,0.126 -0.12687,0.19927 -0.0254,0.0672 -0.0289,0.14175 -0.0215,0.214" />
+      <path
+         d="m 195.90415,124.00079 -0.0208,0.14045 -0.0717,-0.12297"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5418"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5422"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.90415,124.00075 -0.0208,0.1406 -0.0717,-0.12311 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5430"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.43258,123.46279 c 0.22397,0.0418 0.55198,0.1338 0.76642,0.33076 0.2952,0.27151 0.0542,0.58203 0.37656,0.82074 0.32064,0.2377 0.58016,-0.13091 0.88895,0.12138 0.0643,0.0525 0.10837,0.12701 0.13828,0.20548" />
+      <path
+         d="m 198.6486,124.93034 -0.008,0.14233 -0.0824,-0.11632"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5432"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5436"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.6486,124.93045 -0.008,0.14219 -0.0824,-0.11632 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5444"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.91947,125.31482 c 0,-0.13381 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24276,0.10895 -0.24276,0.24276 0,0.13366 0.10895,0.24203 0.24276,0.24203 0.1338,0 0.24218,-0.10837 0.24218,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5452"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.75864,124.48453 c -0.0932,0.0604 -0.19204,0.14508 -0.24275,0.25114 -0.0361,0.0746 -0.0344,0.15866 -0.0147,0.23929" />
+      <path
+         d="m 195.54637,124.96199 0.002,0.14276 -0.0903,-0.11112"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5454"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5458"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.54637,124.96195 0.002,0.14291 -0.0903,-0.11126 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5466"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 196.20283,124.45404 c 0.17715,0.0666 0.42612,0.1682 0.63218,0.28163 0.14724,0.0812 0.15692,0.14681 0.3098,0.21559 0.37208,0.16646 0.83028,0.26241 1.14644,0.31385" />
+      <path
+         d="m 198.29978,125.21832 0.12586,0.067 -0.1406,0.0266"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5468"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5472"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.29978,125.21829 0.12586,0.0672 -0.1406,0.0264 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5480"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.91947,126.25738 c 0,-0.13381 -0.10838,-0.24276 -0.24218,-0.24276 -0.13381,0 -0.24276,0.10895 -0.24276,0.24276 0,0.1338 0.10895,0.24217 0.24276,0.24217 0.1338,0 0.24218,-0.10837 0.24218,-0.24217" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5488"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.67729,125.55743 v 0.31891" />
+      <path
+         d="m 195.72411,125.87752 -0.0468,0.13439 -0.0474,-0.13439"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5490"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5494"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.72411,125.87749 -0.0468,0.13438 -0.0474,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5502"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.67729,126.50013 v 0.31891" />
+      <path
+         d="m 195.72411,126.82008 -0.0468,0.13439 -0.0474,-0.13439"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5504"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5508"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.72411,126.8202 -0.0468,0.13423 -0.0474,-0.13423 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5516"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.63197,126.25738 c 0,-0.13381 -0.10837,-0.24276 -0.24217,-0.24276 -0.13366,0 -0.24262,0.10895 -0.24262,0.24276 0,0.1338 0.10896,0.24217 0.24262,0.24217 0.1338,0 0.24217,-0.10837 0.24217,-0.24217" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5524"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.84786,125.47839 c 0.14609,0.12658 0.36168,0.2981 0.57221,0.41557 0.18915,0.10491 0.415,0.19132 0.60068,0.25331" />
+      <path
+         d="m 200.0404,126.10438 0.11358,0.0858 -0.14233,0.004"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5526"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5530"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.0404,126.1045 0.11358,0.0857 -0.14233,0.004 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5538"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.03613,127.20008 c 0,-0.13438 -0.10895,-0.24276 -0.24275,-0.24276 -0.13323,0 -0.24204,0.10838 -0.24204,0.24276 0,0.13366 0.10881,0.24203 0.24204,0.24203 0.1338,0 0.24275,-0.10837 0.24275,-0.24203" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5546"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.48574,126.48091 c 0.0464,0.10838 0.10332,0.24161 0.15592,0.36414" />
+      <path
+         d="m 200.68616,126.82919 0.01,0.14218 -0.0959,-0.10548"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5548"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5552"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.68616,126.82915 0.01,0.14233 -0.0959,-0.10562 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5560"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.13035,128.14206 c 0,-0.1338 -0.10838,-0.24218 -0.24261,-0.24218 -0.13381,0 -0.24218,0.10838 -0.24218,0.24218 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13423,0 0.24261,-0.10837 0.24261,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5568"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.81765,127.44269 c 0.0103,0.0971 0.0215,0.21111 0.0322,0.31891" />
+      <path
+         d="m 200.89727,127.75831 -0.0338,0.13886 -0.0604,-0.12933"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5570"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5574"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.89727,127.75828 -0.0338,0.13886 -0.0604,-0.12933 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5582"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.13035,129.08476 c 0,-0.1338 -0.10838,-0.24217 -0.24261,-0.24217 -0.13381,0 -0.24218,0.10837 -0.24218,0.24217 0,0.13367 0.10837,0.24204 0.24218,0.24204 0.13423,0 0.24261,-0.10837 0.24261,-0.24204" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5590"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.88774,128.38482 v 0.3189" />
+      <path
+         d="m 200.93513,128.70477 -0.0474,0.13496 -0.047,-0.13496"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5592"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5596"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.93513,128.70488 -0.0474,0.13482 -0.047,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5604"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.13035,130.02732 c 0,-0.1338 -0.10838,-0.24275 -0.24261,-0.24275 -0.13381,0 -0.24218,0.10895 -0.24218,0.24275 0,0.13381 0.10837,0.24218 0.24218,0.24218 0.13423,0 0.24261,-0.10837 0.24261,-0.24218" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5612"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.88774,129.32738 v 0.3189" />
+      <path
+         d="m 200.93513,129.64747 -0.0474,0.13438 -0.047,-0.13438"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5614"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5618"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.93513,129.64744 -0.0474,0.13438 -0.047,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5626"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.11749,129.94597 c 0.13207,-0.0163 0.25504,0.0108 0.25504,0.0814 0,0.0441 -0.048,0.0711 -0.11618,0.0812" />
+      <path
+         d="m 201.25173,130.15596 -0.13424,-0.048 0.13481,-0.0462"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5628"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5632"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.25173,130.15607 -0.13424,-0.048 0.13481,-0.0464 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5640"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.6426,122.24077 c 0.27599,0.22181 0.7472,0.67567 0.7472,1.18879 v 2.44851" />
+      <path
+         d="m 200.43676,125.8781 -0.047,0.13496 -0.0474,-0.13496"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5642"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5646"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.43676,125.87807 -0.047,0.13496 -0.0474,-0.13496 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5654"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.43742,121.04419 c -0.0169,0.19015 -0.0124,0.45386 0.10505,0.6485 0.0676,0.11184 0.17947,0.19753 0.29117,0.26082" />
+      <path
+         d="m 195.85791,121.91294 0.0994,0.10216 -0.14118,-0.0181"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5656"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5660"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 195.85791,121.91291 0.0994,0.10216 -0.14118,-0.0181 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5668"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.40317,121.04708 c 0.009,0.18683 0.0192,0.44808 0.0277,0.6631" />
+      <path
+         d="m 199.4783,121.71368 -0.0412,0.13655 -0.0532,-0.13265"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5670"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5674"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.4783,121.71364 -0.0412,0.13655 -0.0532,-0.13264 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5682"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 194.9311,119.66351 c -0.0717,0.0683 -0.14507,0.15533 -0.18293,0.25171 -0.0789,0.20042 -0.12239,0.30764 0,0.48494 0.0876,0.12586 0.18741,0.0497 0.32295,0.12138 0.0311,0.0163 0.0631,0.035 0.0936,0.0542" />
+      <path
+         d="m 187.47531,129.79934 0.0858,0.11458 -0.13829,-0.0361"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5684"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5688"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 187.47531,129.79931 0.0858,0.11458 -0.13829,-0.0361 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5696"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.4476,119.56872 c 0.20606,0.0559 0.47858,0.15981 0.64966,0.3465 0.12933,0.14118 0.20216,0.34044 0.24334,0.51427" />
+      <path
+         d="m 199.38684,120.42042 -0.0198,0.14175 -0.0728,-0.12311"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5698"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5702"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.38684,120.42053 -0.0198,0.14161 -0.0728,-0.12297 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5710"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.86978,115.50298 c 0.0338,1.09053 0.15577,4.97564 0.19406,6.2124" />
+      <path
+         d="m 190.11138,121.717 -0.0429,0.13597 -0.0514,-0.13308"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5712"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5716"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.11138,121.71697 -0.0429,0.13611 -0.0514,-0.13322 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5724"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.81885,112.51549 c -0.50111,0.075 -1.49569,0.30923 -1.49569,0.99111 v 15.65706 c 0,0.2179 2.14434,0.57409 2.23798,0.75023" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5732"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.07085,112.76258 c 0.0221,0.10737 0.0503,0.22976 0.0825,0.33986 0.004,0.0142 0.008,0.0288 0.0129,0.0435" />
+      <path
+         d="m 191.2126,113.13513 -0.001,0.14233 -0.0881,-0.11242"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5734"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5738"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.2126,113.13524 -0.001,0.14219 -0.0881,-0.11227 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5746"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.3493,113.5066 c 0,-0.15692 -0.12644,-0.28336 -0.28278,-0.28336 -0.15693,0 -0.28394,0.12644 -0.28394,0.28336 0,0.15635 0.12701,0.28336 0.28394,0.28336 0.15634,0 0.28278,-0.12701 0.28278,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5754"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.77116,112.62329 c -0.0999,0.0513 -0.21906,0.10606 -0.33134,0.14276 -0.30084,0.0971 -0.41716,-0.0186 -0.70052,0.12138 -0.14609,0.0717 -0.28336,0.1851 -0.39506,0.29579" />
+      <path
+         d="m 189.37646,113.21822 -0.12759,0.0643 0.0592,-0.12976"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5756"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5760"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.37646,113.21819 -0.12759,0.0643 0.0592,-0.12976 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5768"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 188.78316,113.53767 c -0.76873,0.0925 -2.84083,0.39737 -2.84083,0.99227 v 4.98185 c 0,0.31486 0.0672,0.66714 0.12817,0.92449" />
+      <path
+         d="m 186.11674,120.42606 -0.013,0.14175 -0.0785,-0.11907"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5770"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5774"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 186.11674,120.42617 -0.013,0.14161 -0.0785,-0.11907 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5782"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.41317,111.72856 c -0.0249,0.1208 -0.026,0.25692 0.0569,0.35055 0.14392,0.16314 0.7615,0.0592 0.96972,0.12138 0.0689,0.0202 0.1406,0.0485 0.20779,0.079" />
+      <path
+         d="m 190.67189,112.23939 0.10042,0.101 -0.14175,-0.0163"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5784"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5788"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 190.67189,112.23936 0.10042,0.10115 -0.14175,-0.0165 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5796"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.39612,111.72177 c -0.0175,0.047 -0.0338,0.0955 -0.0474,0.14175 -0.11574,0.4098 -0.19131,0.89068 -0.23539,1.22592" />
+      <path
+         d="m 189.1603,113.09568 -0.0639,0.12759 -0.0299,-0.13944"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5798"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5802"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.1603,113.09565 -0.0639,0.12759 -0.0299,-0.13944 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5810"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.44781,111.45994 c 0,-0.15635 -0.12643,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28336,0.12701 -0.28336,0.28336 0,0.15634 0.12702,0.28336 0.28336,0.28336 0.15693,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5818"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.8397,110.59179 c 0.25793,0.16936 0.67336,0.44145 0.9703,0.63565" />
+      <path
+         d="m 198.83818,111.18961 0.087,0.11343 -0.13829,-0.0345"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5820"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5824"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.83818,111.18958 0.087,0.11343 -0.13829,-0.0344 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5832"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.9998,112.48327 c 0,-0.15692 -0.12702,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5840"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.3208,111.69648 c 0.0344,0.0542 0.0689,0.11227 0.0993,0.16704 0.0408,0.074 0.0819,0.15346 0.11921,0.23091" />
+      <path
+         d="m 199.58437,112.07856 0.0147,0.14161 -0.1,-0.101"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5842"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5846"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.58437,112.07853 0.0147,0.14175 -0.1,-0.10114 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5854"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.9998,113.5066 c 0,-0.15692 -0.12702,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5862"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.71644,112.76836 v 0.31833" />
+      <path
+         d="m 199.76383,113.08831 -0.0474,0.13439 -0.0468,-0.13439"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5864"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5868"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.76383,113.08828 -0.0474,0.13439 -0.0468,-0.13439 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5876"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.9998,114.52994 c 0,-0.15693 -0.12702,-0.28394 -0.28336,-0.28394 -0.15635,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5884"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.71644,113.7917 v 0.31833" />
+      <path
+         d="m 199.76383,114.11165 -0.0474,0.13438 -0.0468,-0.13438"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5886"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5890"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.76383,114.11162 -0.0474,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5898"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.96952,122.09685 c 0,-0.15692 -0.12701,-0.28336 -0.28336,-0.28336 -0.15692,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12644,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5906"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.81469,114.79914 c 0.0903,0.2744 0.21169,0.71295 0.21169,1.1041 v 4.90108 c 0,0.36067 0.20649,0.72307 0.38827,0.97146" />
+      <path
+         d="m 200.45424,121.74922 0.0445,0.1354 -0.11965,-0.0779"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5908"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5912"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.45424,121.74919 0.0445,0.13539 -0.11965,-0.0779 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5920"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.83803,122.33903 c 0.27035,0.46456 0.77219,1.50364 0.38667,2.27526 -0.38841,0.7761 -1.56187,0.30431 -1.56187,1.17173 v 1.41406 c 0,0.50733 -0.63391,0.7563 -1.06062,0.86641" />
+      <path
+         d="m 198.60843,128.11334 -0.14219,-0.0147 0.12022,-0.0773"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5922"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5926"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.60843,128.11331 -0.14219,-0.0147 0.12022,-0.0773 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5934"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 191.80186,110.71202 c -0.0441,0.12528 -0.11632,0.26298 -0.23149,0.34376 -0.22411,0.1575 -0.95787,0.0633 -1.22476,0.12137 -0.14739,0.0316 -0.30431,0.0806 -0.44202,0.12919" />
+      <path
+         d="m 189.91602,111.35217 -0.14276,0.002 0.10996,-0.0903"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5936"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5940"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 189.91602,111.35214 -0.14276,0.002 0.10996,-0.0902 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5948"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.10153,111.45994 c 0,-0.15635 -0.12687,-0.28336 -0.28322,-0.28336 -0.15692,0 -0.28336,0.12701 -0.28336,0.28336 0,0.15634 0.12644,0.28336 0.28336,0.28336 0.15635,0 0.28322,-0.12702 0.28322,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5956"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 192.1462,110.48458 c 0.9573,0.16487 4.11298,0.70717 5.25495,0.90369" />
+      <path
+         d="m 197.41126,111.34191 0.1247,0.0695 -0.14045,0.0237"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5958"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5962"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.41126,111.34188 0.1247,0.0695 -0.14045,0.0237 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5970"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.50511,112.48327 c 0,-0.15692 -0.12643,-0.28336 -0.28321,-0.28336 -0.1565,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12686,0.28336 0.28336,0.28336 0.15678,0 0.28321,-0.12701 0.28321,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5978"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.78161,111.73983 c -0.004,0.11011 0.006,0.23423 0.0501,0.33928 0.0181,0.0447 0.0441,0.087 0.074,0.12644" />
+      <path
+         d="m 197.94302,112.17624 0.0542,0.13207 -0.1247,-0.0695"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path5980"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5984"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 197.94302,112.17621 0.0542,0.13207 -0.1247,-0.0694 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5992"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.43335,112.48327 c 0,-0.15692 -0.12701,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12702,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6000"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.02711,111.65067 c 0.19522,0.1773 0.4611,0.41601 0.49101,0.42844 0.32916,0.13886 1.24629,0.0915 1.60248,0.12138 0.93128,0.0785 2.02297,0.18394 2.60833,0.24102" />
+      <path
+         d="m 202.73687,112.39458 0.12918,0.0604 -0.13886,0.0334"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6002"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6006"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.73687,112.39469 0.12918,0.0604 -0.13886,0.0332 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6014"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.76145,113.5066 c 0,-0.15692 -0.12701,-0.28336 -0.28394,-0.28336 -0.15634,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12702,0.28336 0.28336,0.28336 0.15693,0 0.28394,-0.12701 0.28394,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6022"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.29183,112.76258 c 0.026,0.10332 0.0559,0.22296 0.0841,0.33596" />
+      <path
+         d="m 198.42217,113.08831 -0.0136,0.14233 -0.0783,-0.11921"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6024"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6028"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.42217,113.08828 -0.0136,0.14233 -0.0783,-0.11906 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6036"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 198.60453,113.76511 c 0.0688,0.12138 0.16371,0.26082 0.27714,0.36067 0.12702,0.11184 0.29073,0.19984 0.43971,0.26529" />
+      <path
+         d="m 199.33944,114.34761 0.10722,0.0942 -0.14276,-0.007"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6038"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6042"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 199.33944,114.34758 0.10722,0.0944 -0.14276,-0.007 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6050"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.80666,113.5066 c 0,-0.15692 -0.12701,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6058"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.42093,112.56795 c 0.18625,0.0672 0.43233,0.17325 0.61743,0.31948 0.0926,0.0723 0.1773,0.16531 0.24897,0.25793" />
+      <path
+         d="m 204.32967,113.12328 0.0418,0.13612 -0.11733,-0.0808"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6060"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6064"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.32967,113.1234 0.0418,0.13597 -0.11733,-0.0808 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6072"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.58501,113.5066 c 0,-0.15692 -0.12702,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6080"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.93498,112.66722 c -0.0722,0.066 -0.15071,0.14348 -0.21574,0.22021 -0.0682,0.0796 -0.13539,0.17152 -0.19463,0.25909" />
+      <path
+         d="m 202.56189,113.1753 -0.11343,0.0868 0.0344,-0.13828"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6082"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6086"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.56189,113.17527 -0.11343,0.087 0.0344,-0.13843 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6094"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.54338,113.5066 c 0,-0.15692 -0.12644,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15692,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6102"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.4322,112.54367 c 0.31775,0.0711 0.84777,0.19695 1.29311,0.34376 0.39737,0.13034 0.83881,0.31212 1.14586,0.44534" />
+      <path
+         d="m 205.89314,113.29104 0.10505,0.097 -0.14219,-0.0107"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6104"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6108"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 205.89314,113.29101 0.10505,0.0971 -0.14219,-0.0108 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6116"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.86085,114.52994 c 0,-0.15693 -0.12702,-0.28394 -0.28336,-0.28394 -0.15693,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12643,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6124"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.53847,113.7917 c 0.005,0.0981 0.0108,0.21111 0.0165,0.31833" />
+      <path
+         d="m 204.60234,114.10948 -0.0402,0.13655 -0.0542,-0.13149"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6126"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6130"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.60234,114.10945 -0.0402,0.13655 -0.0542,-0.13149 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6138"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.2312,114.52994 c 0,-0.15693 -0.12687,-0.28394 -0.28322,-0.28394 -0.15649,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12687,0.28336 0.28336,0.28336 0.15635,0 0.28322,-0.12702 0.28322,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6146"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.24167,113.55848 c -0.35055,0.0707 -0.92348,0.20374 -1.07809,0.35171 -0.0592,0.0565 -0.10216,0.12975 -0.13323,0.20663" />
+      <path
+         d="m 203.07485,114.1326 -0.0863,0.11343 -0.003,-0.14276"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6148"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6152"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.07485,114.13257 -0.0863,0.11343 -0.003,-0.14277 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6160"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 207.14969,114.52994 c 0,-0.15693 -0.12701,-0.28394 -0.28336,-0.28394 -0.15692,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12644,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6168"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.72993,113.70587 c 0.17716,0.16993 0.41254,0.39115 0.46673,0.41991 0.39289,0.20995 0.89574,0.31269 1.24629,0.36124" />
+      <path
+         d="m 206.45148,114.44081 0.12744,0.0637 -0.13987,0.0293"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6170"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6174"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.45148,114.44078 0.12744,0.0637 -0.13987,0.0293 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6182"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.89112,115.90324 c 0,-0.15634 -0.12701,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12702 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6190"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.29413,114.56548 c -0.22354,0.0452 -0.52323,0.14566 -0.67279,0.36804 -0.10895,0.1614 -0.12195,0.37483 -0.10389,0.55993" />
+      <path
+         d="m 203.56427,115.48886 -0.0282,0.13944 -0.0649,-0.12644"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6192"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6196"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.56427,115.48897 -0.0282,0.13944 -0.0649,-0.12644 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6204"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 207.12253,115.90324 c 0,-0.15634 -0.12702,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12702 -0.28336,0.28336 0,0.15635 0.12701,0.28336 0.28336,0.28336 0.15634,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6212"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.76822,114.74105 c 0.25519,0.28105 0.67625,0.74445 0.69764,0.75803 0.29246,0.18236 0.67061,0.28568 0.95628,0.34203" />
+      <path
+         d="m 206.43399,115.79548 0.12413,0.0705 -0.14118,0.022"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6214"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6218"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.43399,115.79545 0.12413,0.0705 -0.14118,0.022 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6226"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.89112,116.92658 c 0,-0.15693 -0.12701,-0.28336 -0.28336,-0.28336 -0.15635,0 -0.28336,0.12643 -0.28336,0.28336 0,0.15634 0.12701,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12702 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6234"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.60776,116.18834 v 0.31833" />
+      <path
+         d="m 203.65516,116.50829 -0.0474,0.13438 -0.0468,-0.13438"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6236"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6240"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.65516,116.50826 -0.0474,0.13438 -0.0468,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6248"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.9047,119.51179 c 0,-0.15693 -0.12701,-0.28394 -0.28336,-0.28394 -0.15634,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12702,0.28321 0.28336,0.28321 0.15635,0 0.28336,-0.12687 0.28336,-0.28321" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6256"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.88765,115.94558 c 0.3624,0.061 0.9625,0.18626 1.09342,0.36125 0.29232,0.39057 0.21949,1.7594 0,2.19506 -0.1078,0.21458 -0.63276,0.56672 -0.9979,0.79358" />
+      <path
+         d="m 204.00571,119.33669 -0.13944,0.0305 0.0903,-0.11055"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6258"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6262"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.00571,119.3368 -0.13944,0.0305 0.0903,-0.11069 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6270"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.38285,118.21911 c 0,-0.15692 -0.12643,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28336,0.12644 -0.28336,0.28336 0,0.15635 0.12702,0.28336 0.28336,0.28336 0.15693,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6278"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.32382,116.9627 c -0.39115,0.0559 -1.06278,0.17773 -1.21074,0.36746 -0.10332,0.13323 -0.1208,0.31385 -0.10722,0.478" />
+      <path
+         d="m 202.05325,117.8066 -0.0288,0.1393 -0.0649,-0.12702"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6280"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6284"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.05325,117.80657 -0.0288,0.13944 -0.0649,-0.12701 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6292"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.6095,117.21268 c 0.002,0.45676 0.007,1.35077 0.01,1.87963" />
+      <path
+         d="m 203.66585,119.09292 -0.0462,0.13482 -0.0474,-0.13424"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6294"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6298"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.66585,119.09289 -0.0462,0.13496 -0.0474,-0.13438 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6306"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.96952,119.51179 c 0,-0.15693 -0.12701,-0.28394 -0.28336,-0.28394 -0.15692,0 -0.28336,0.12701 -0.28336,0.28394 0,0.15634 0.12644,0.28321 0.28336,0.28321 0.15635,0 0.28336,-0.12687 0.28336,-0.28321" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6314"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.81671,118.24786 c -0.41818,0.0503 -1.17057,0.16719 -1.33256,0.37483 -0.11574,0.14855 -0.0808,0.34998 -0.01,0.52438" />
+      <path
+         d="m 200.51912,119.13136 0.0142,0.1416 -0.0994,-0.10216"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6316"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6320"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.51912,119.13132 0.0142,0.14161 -0.0994,-0.10216 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6328"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.0245,118.49178 c -0.0356,0.19189 -0.0452,0.44418 0.0886,0.61585 0.1338,0.17094 0.69041,0.2861 1.08821,0.34824" />
+      <path
+         d="m 203.20808,119.40951 0.12644,0.0666 -0.13988,0.0266"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6330"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6334"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.20808,119.40948 0.12644,0.0666 -0.13988,0.0266 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6342"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.96952,120.80432 c 0,-0.15693 -0.12701,-0.28336 -0.28336,-0.28336 -0.15692,0 -0.28336,0.12643 -0.28336,0.28336 0,0.15635 0.12644,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6350"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.68616,119.79847 v 0.58074" />
+      <path
+         d="m 200.73298,120.38328 -0.0468,0.13482 -0.0474,-0.13482"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6352"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6356"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.73298,120.38325 -0.0468,0.13482 -0.0474,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6364"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.68616,121.091 v 0.58088" />
+      <path
+         d="m 200.73298,121.67582 -0.0468,0.13481 -0.0474,-0.13481"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6366"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6370"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 200.73298,121.67579 -0.0468,0.13496 -0.0474,-0.13496 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6378"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.9047,120.80432 c 0,-0.15693 -0.12701,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28336,0.12643 -0.28336,0.28336 0,0.15635 0.12702,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12701 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6386"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.62134,119.79847 v 0.58074" />
+      <path
+         d="m 203.66816,120.38328 -0.0468,0.13482 -0.0474,-0.13482"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6388"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6392"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.66816,120.38325 -0.0468,0.13482 -0.0474,-0.13482 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6400"
+         style="fill:none;stroke:#000000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.78701,122.78322 c 0,-0.15635 -0.12701,-0.28336 -0.28336,-0.28336 -0.15634,0 -0.28336,0.12701 -0.28336,0.28336 0,0.15692 0.12702,0.28336 0.28336,0.28336 0.15635,0 0.28336,-0.12644 0.28336,-0.28336" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6408"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.4819,121.05098 c -0.19305,0.34202 -0.54417,0.96351 -0.76872,1.36203" />
+      <path
+         d="m 202.75205,122.43949 -0.10722,0.0942 0.0248,-0.14045"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6410"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6414"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.75205,122.43946 -0.10722,0.0944 0.0248,-0.14059 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6422"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.39369,123.04461 c -0.0847,0.22354 -0.18626,0.55531 -0.18626,0.8563 v 3.29917 c 0,0.46788 -0.55718,0.72581 -0.94776,0.84892" />
+      <path
+         d="m 201.27268,128.09412 -0.14291,-0.007 0.11632,-0.0829"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6424"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6428"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 201.27268,128.09409 -0.14291,-0.007 0.11632,-0.0829 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6436"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.83917,116.18935 v 3.32244 c 0,0.59706 -1.93382,1.04529 -2.80297,1.21638" />
+      <path
+         d="m 204.04241,120.77502 -0.14117,-0.0209 0.12311,-0.0717"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6438"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6442"
+         style="fill:none;stroke:#ff0000;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 204.04241,120.77499 -0.14117,-0.021 0.12311,-0.0717 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6450"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.88412,114.80708 c -0.0311,0.20432 -0.0406,0.48205 0.0773,0.692 0.0588,0.10448 0.15693,0.18568 0.25909,0.24666" />
+      <path
+         d="m 203.24319,115.70459 0.097,0.10433 -0.14103,-0.0208"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6452"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6456"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 203.24319,115.70456 0.097,0.10447 -0.14103,-0.021 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6464"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.8607,114.81445 c -0.004,0.19305 -0.009,0.45214 -0.013,0.66946" />
+      <path
+         d="m 206.89451,115.48495 -0.0497,0.13381 -0.0445,-0.13554"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6466"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6470"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.89451,115.48492 -0.0497,0.13381 -0.0445,-0.1354 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6478"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.19558,113.77407 c -0.0283,0.11516 -0.0361,0.24723 0.0253,0.35171 0.0728,0.12412 0.19984,0.21284 0.32686,0.27483" />
+      <path
+         d="m 202.56752,114.35773 0.10549,0.0965 -0.14219,-0.01"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6480"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6484"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 202.56752,114.35784 0.10549,0.0965 -0.14219,-0.01 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6492"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.44237,113.72725 c 0.0446,0.0577 0.0897,0.12138 0.1276,0.18294 0.0441,0.0717 0.0864,0.15071 0.12412,0.22801" />
+      <path
+         d="m 206.73874,114.12234 0.0152,0.14175 -0.10042,-0.10158"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6494"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6498"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 206.73874,114.12245 0.0152,0.14161 -0.10042,-0.10158 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6506"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.41778,107.79779 c -0.0361,0.10895 -0.0824,0.23365 -0.13713,0.34087 -0.01,0.0182 -0.0192,0.0361 -0.0299,0.0548" />
+      <path
+         d="m 193.2886,108.22119 -0.11286,0.0874 0.0338,-0.13829"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.11288889;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path6508"
+         inkscape:connector-curvature="0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6512"
+         style="fill:none;stroke:#0000ff;stroke-width:0.11288889;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 193.2886,108.22116 -0.11286,0.0874 0.0338,-0.13828 z" />
+    </g>
+    <g
+       transform="matrix(0.35277777,0,0,-0.35277777,258.78134,134.64879)"
+       id="g12312" />
+    <g
+       id="g15417"
+       transform="matrix(0.54868693,0,0,0.54868693,62.579767,63.933493)">
+      <path
+         d="m 234.15625,137.57317 h 28.83862"
+         style="fill:none;stroke:#000000;stroke-width:0.14058194;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         id="path12124"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g12126"
+         transform="matrix(0.35277777,0,0,-0.35277777,262.99487,137.57317)">
+        <g
+           id="g12128">
+          <path
+             d="M -1.19551,1.59401 C -1.09587,0.99626 0,0.09961 0.29886,0 0,-0.09961 -1.09587,-0.99626 -1.19551,-1.59401"
+             style="fill:none;stroke:#000000;stroke-width:0.31878999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path12130"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <g
+         transform="translate(0.09449405,9.2131697)"
+         id="g15279">
+        <path
+           inkscape:connector-curvature="0"
+           id="path12140"
+           style="fill:none;stroke:#000000;stroke-width:0.14058194;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           d="m 234.15625,117.57292 h 28.83862" />
+        <g
+           transform="matrix(0.35277777,0,0,-0.35277777,262.99487,117.57292)"
+           id="g12142">
+          <g
+             id="g12144">
+            <path
+               inkscape:connector-curvature="0"
+               id="path12146"
+               style="fill:none;stroke:#000000;stroke-width:0.31878999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               d="M -1.19551,1.59401 C -1.09587,0.99626 0,0.09961 0.29886,0 0,-0.09961 -1.09587,-0.99626 -1.19551,-1.59401" />
+          </g>
+        </g>
+        <g
+           id="g12148"
+           transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)">
+          <g
+             id="g12150">
+            <path
+               inkscape:connector-curvature="0"
+               id="path12152"
+               style="fill:#ccccff;fill-opacity:1;fill-rule:nonzero;stroke:#8080ff;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               d="m 25.49559,56.69362 c 0,1.55638 -1.26169,2.81807 -2.81807,2.81807 -1.5564,0 -2.81808,-1.26169 -2.81808,-2.81807 0,-1.5564 1.26168,-2.81809 2.81808,-2.81809 1.55638,0 2.81807,1.26169 2.81807,2.81809 z" />
+          </g>
+          <g
+             transform="translate(22.677,56.692)"
+             id="g12154">
+            <g
+               id="g12156" />
+            <g
+               transform="translate(-22.677,-56.692)"
+               id="g12158" />
+          </g>
+        </g>
+      </g>
+      <g
+         transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)"
+         id="g12204">
+        <g
+           id="g12206">
+          <path
+             d="m 53.8424,0 c 0,1.55638 -1.26168,2.81807 -2.81808,2.81807 -1.55639,0 -2.81808,-1.26169 -2.81808,-2.81807 0,-1.55638 1.26169,-2.81807 2.81808,-2.81807 1.5564,0 2.81808,1.26169 2.81808,2.81807 z"
+             style="fill:#ccccff;fill-opacity:1;fill-rule:nonzero;stroke:#8080ff;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path12208"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g12210"
+           transform="translate(51.023)">
+          <g
+             id="g12212" />
+          <g
+             id="g12214"
+             transform="translate(-51.023)" />
+        </g>
+      </g>
+      <text
+         y="141.65999"
+         x="243.32819"
+         style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSSI9;-inkscape-font-specification:CMSSI9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+         id="text12226">
+        <tspan
+           style="stroke-width:0.35277778"
+           x="243.32819"
+           y="141.65999"
+           id="tspan12224">x</tspan>
+      </text>
+      <text
+         y="141.65999"
+         x="244.96156"
+         style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSY9;-inkscape-font-specification:CMSY9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+         id="text12230">
+        <tspan
+           style="stroke-width:0.35277778"
+           x="244.96156"
+           y="141.65999"
+           id="tspan12228">←</tspan>
+      </text>
+      <text
+         y="141.65999"
+         x="248.58636"
+         style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSS9;-inkscape-font-specification:CMSS9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+         id="text12234">
+        <tspan
+           style="stroke-width:0.35277778"
+           x="248.58636"
+           y="141.65999"
+           id="tspan12232">2</tspan>
+      </text>
+      <g
+         transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)"
+         id="g12240">
+        <g
+           id="g12242">
+          <path
+             d="m 76.51994,0 c 0,1.55638 -1.26168,2.81807 -2.81808,2.81807 -1.5564,0 -2.81809,-1.26169 -2.81809,-2.81807 0,-1.55638 1.26169,-2.81807 2.81809,-2.81807 1.5564,0 2.81808,1.26169 2.81808,2.81807 z"
+             style="fill:#ccccff;fill-opacity:1;fill-rule:nonzero;stroke:#8080ff;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path12244"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g12246"
+           transform="translate(73.701)">
+          <g
+             id="g12248" />
+          <g
+             id="g12250"
+             transform="translate(-73.701)" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)"
+         id="g12276">
+        <g
+           id="g12278">
+          <path
+             d="m 87.8585,0 c 0,1.55638 -1.26168,2.81807 -2.81808,2.81807 -1.5564,0 -2.81808,-1.26169 -2.81808,-2.81807 0,-1.55638 1.26168,-2.81807 2.81808,-2.81807 1.5564,0 2.81808,1.26169 2.81808,2.81807 z"
+             style="fill:#ff4c4c;fill-opacity:1;fill-rule:nonzero;stroke:#990000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+             id="path12280"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g12282"
+           transform="translate(85.039)">
+          <g
+             id="g12284" />
+          <g
+             id="g12286"
+             transform="translate(-85.039)" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)"
+         id="g12316">
+        <path
+           sodipodi:nodetypes="cc"
+           d="M 23.232977,30.317635 C 50.125716,26.944358 55.128906,12.050265 71.07687,2.91658"
+           style="fill:none;stroke:#009900;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path12318"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g12320">
+          <g
+             id="g12322"
+             transform="matrix(0.669,-0.74329,0.74329,0.669,71.07687,2.91658)">
+            <g
+               id="g12324">
+              <path
+                 d="M -1.55415,2.0722 C -1.42464,1.29512 0,0.1295 0.38852,0 0,-0.1295 -1.42464,-1.29512 -1.55415,-2.0722"
+                 style="fill:none;stroke:#009900;stroke-width:0.6376;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+                 id="path12326"
+                 inkscape:connector-curvature="0" />
+            </g>
+          </g>
+        </g>
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path12330"
+         style="fill:none;stroke:#009900;stroke-width:0.28116742;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 244.21042,132.125 2.59379,4.24409"
+         sodipodi:nodetypes="cc" />
+      <g
+         transform="matrix(0.3398629,-0.09457995,-0.09457995,-0.3398629,230.23072,142.41287)"
+         id="g12332">
+        <g
+           transform="matrix(0.30565,-0.95515,0.95515,0.30565,49.82498,3.74799)"
+           id="g12334">
+          <g
+             id="g12336">
+            <path
+               inkscape:connector-curvature="0"
+               id="path12338"
+               style="fill:none;stroke:#009900;stroke-width:0.6376;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               d="M -1.55415,2.0722 C -1.42464,1.29512 0,0.1295 0.38852,0 0,-0.1295 -1.42464,-1.29512 -1.55415,-2.0722" />
+          </g>
+        </g>
+      </g>
+      <text
+         id="text15126"
+         y="135.22546"
+         x="255.25545"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:-0.01322917px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-size:2.82222223px;letter-spacing:-0.01322917px;fill:#ff0000;stroke-width:0.26458332px"
+           y="135.22546"
+           x="255.25545"
+           id="tspan15124"
+           sodipodi:role="line">x ≮ y</tspan></text>
+      <g
+         transform="translate(-2.0713388,-7.0826425)"
+         id="g15250">
+        <text
+           id="text12262-6"
+           style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSSI9;-inkscape-font-specification:CMSSI9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+           x="254.32787"
+           y="148.47365">
+          <tspan
+             id="tspan12260-1"
+             y="148.47365"
+             x="254.32787"
+             style="stroke-width:0.35277778">y</tspan>
+        </text>
+        <text
+           id="text12266-5"
+           style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSY9;-inkscape-font-specification:CMSY9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+           x="256.01517"
+           y="148.47365">
+          <tspan
+             id="tspan12264-6"
+             y="148.47365"
+             x="256.01517"
+             style="stroke-width:0.35277778">←</tspan>
+        </text>
+        <text
+           id="text12270-1"
+           style="font-variant:normal;font-weight:normal;font-size:3.16314673px;font-family:CMSS9;-inkscape-font-specification:CMSS9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+           x="259.11078"
+           y="148.47365">
+          <tspan
+             id="tspan12268-7"
+             y="148.47365"
+             x="259.11078"
+             style="stroke-width:0.35277778">1</tspan>
+        </text>
+      </g>
+      <g
+         transform="translate(0.09449405,4.6585567)"
+         id="g15262">
+        <path
+           inkscape:connector-curvature="0"
+           id="path12132"
+           style="fill:none;stroke:#000000;stroke-width:0.14058194;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           d="m 234.15625,127.57305 h 28.83862" />
+        <g
+           transform="matrix(0.35277777,0,0,-0.35277777,262.99487,127.57305)"
+           id="g12134">
+          <g
+             id="g12136">
+            <path
+               inkscape:connector-curvature="0"
+               id="path12138"
+               style="fill:none;stroke:#000000;stroke-width:0.31878999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               d="M -1.19551,1.59401 C -1.09587,0.99626 0,0.09961 0.29886,0 0,-0.09961 -1.09587,-0.99626 -1.19551,-1.59401" />
+          </g>
+        </g>
+        <g
+           id="g12176"
+           transform="matrix(0.35277777,0,0,-0.35277777,229.15619,137.57317)">
+          <g
+             id="g12178">
+            <path
+               inkscape:connector-curvature="0"
+               id="path12180"
+               style="fill:#ccccff;fill-opacity:1;fill-rule:nonzero;stroke:#8080ff;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               d="m 44.77121,28.3468 c 0,1.5564 -1.26169,2.81809 -2.81807,2.81809 -1.5564,0 -2.81808,-1.26169 -2.81808,-2.81809 0,-1.5564 1.26168,-2.81808 2.81808,-2.81808 1.55638,0 2.81807,1.26168 2.81807,2.81808 z" />
+          </g>
+          <g
+             transform="translate(41.952,28.346)"
+             id="g12182">
+            <g
+               id="g12184" />
+            <g
+               transform="translate(-41.952,-28.346)"
+               id="g12186" />
+          </g>
+        </g>
+      </g>
+      <text
+         y="125.40701"
+         x="234.22328"
+         style="font-variant:normal;font-weight:normal;font-size:2.82222223px;font-family:CMSS9;-inkscape-font-specification:CMSS9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+         id="text12234-8">
+        <tspan
+           style="font-size:2.82222223px;stroke-width:0.35277778"
+           x="234.22328"
+           y="125.40701"
+           id="tspan12232-3">send(1)</tspan>
+      </text>
+      <text
+         y="131.45462"
+         x="234.41226"
+         style="font-variant:normal;font-weight:normal;font-size:2.82222223px;font-family:CMSS9;-inkscape-font-specification:CMSS9;writing-mode:lr-tb;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277778"
+         id="text12234-8-8">
+        <tspan
+           style="font-size:2.82222223px;stroke-width:0.35277778"
+           x="234.41226"
+           y="131.45462"
+           id="tspan12232-3-7">send(2)</tspan>
+      </text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="157.55919"
+       y="83.230614"
+       id="text1028-1-4-1"><tspan
+         sodipodi:role="line"
+         x="157.55919"
+         y="83.230614"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';fill:#d40000;stroke-width:0.26458332px"
+         id="tspan15519">Your code</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="153.11177"
+       y="92.569839"
+       id="text1032-0-9-0"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-4-5"
+         x="153.11177"
+         y="92.569839"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Signals</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="153.11177"
+       y="97.710327"
+       id="text1032-0-9-3-0"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-4-9-3"
+         x="153.11177"
+         y="97.710327"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">▸ Extensions</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="152.1629"
+       y="96.588707"
+       id="text1028-1-4-1-1"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-0-8"
+         x="152.1629"
+         y="100.91529"
+         style="font-size:4.23333311px;stroke-width:0.26458332px" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="155.86807"
+       y="86.932091"
+       id="text1028-1-4-1-5"><tspan
+         sodipodi:role="line"
+         x="155.86807"
+         y="86.932091"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+         id="tspan15519-6">deep inside</tspan></text>
+    <text
+       style="font-variant:normal;font-weight:normal;font-size:0.62165904px;font-family:CMTT8;-inkscape-font-specification:CMTT8;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.08914207"
+       id="text17318"
+       x="186.39912"
+       y="66.582924">
+      <tspan
+         x="186.39912 187.05951 187.3898 187.72009 188.05037 188.38068 188.71095 189.04124 189.37152 189.70183 190.0321 190.36238 190.69267 191.02295 191.35326 192.01363 192.67404 193.00432 193.33461 193.6649 193.99518 194.32547 194.65576 194.98604 195.31631 195.64662 195.97691 196.30717 196.6375 196.96777 197.29803 197.62834 197.95863 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 200.9306 201.26086 201.59117 201.92145"
+         y="66.582924"
+         sodipodi:role="line"
+         id="tspan17218"
+         style="stroke-width:0.08914207">$./my_simulator|MSG_visualization/colorize.pl</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="67.293381"
+         sodipodi:role="line"
+         id="tspan17220"
+         style="stroke-width:0.08914207">[0.000]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.60945 200.27045 200.60013 200.93042 201.2607 201.59096 201.92128 202.25154 202.91258 203.24222 203.57253 204.23354 204.89392 205.2242 205.55449 205.8848 206.21507 206.87546 207.20575 207.86613 208.19643 208.52672 208.85699 209.18729 209.51756 209.84784"
+         y="67.293381"
+         sodipodi:role="line"
+         id="tspan17222"
+         style="stroke-width:0.08914207">[Tremblay:master]Got3workersand6taskstoprocess</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="68.003853"
+         sodipodi:role="line"
+         id="tspan17224"
+         style="stroke-width:0.08914207">[0.000]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569 207.53595"
+         y="68.003853"
+         sodipodi:role="line"
+         id="tspan17226"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_0’to’Jupiter’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="68.714302"
+         sodipodi:role="line"
+         id="tspan17228"
+         style="stroke-width:0.08914207">[0.148]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569"
+         y="68.714302"
+         sodipodi:role="line"
+         id="tspan17230"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_1’to’Fafard’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="69.424767"
+         sodipodi:role="line"
+         id="tspan17232"
+         style="stroke-width:0.08914207">[0.148]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 200.9306 201.26086 201.92128 202.25154 202.58185 202.91212 203.24242 203.57271 203.903 204.23328"
+         y="69.424767"
+         sodipodi:role="line"
+         id="tspan17234"
+         style="stroke-width:0.08914207">[Jupiter:worker]Processing’Task_0’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="70.135315"
+         sodipodi:role="line"
+         id="tspan17236"
+         style="stroke-width:0.08914207">[0.347]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569 207.53595"
+         y="70.135315"
+         sodipodi:role="line"
+         id="tspan17238"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_2’to’Ginette’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="70.845764"
+         sodipodi:role="line"
+         id="tspan17240"
+         style="stroke-width:0.08914207">[0.347]</tspan>
+      <tspan
+         x="190.36226 192.01358 192.34386 192.67416 193.00444 193.33473 193.66504 193.9953 194.32559 194.65587 194.98616 195.31645 195.64673 195.97704 197.62834 198.28871 198.61902 198.94931 199.27959 199.60988 199.94017 200.27045 200.60074 200.93042 201.2607 201.92171 202.252 202.58228 202.91258 203.24222 203.57253 203.90279 204.23309"
+         y="70.845764"
+         sodipodi:role="line"
+         id="tspan17242"
+         style="stroke-width:0.08914207">[Fafard:worker]Processing’Task_1’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="71.556252"
+         sodipodi:role="line"
+         id="tspan17244"
+         style="stroke-width:0.08914207">[0.476]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569 207.53595"
+         y="71.556252"
+         sodipodi:role="line"
+         id="tspan17246"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_3’to’Jupiter’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="72.266708"
+         sodipodi:role="line"
+         id="tspan17248"
+         style="stroke-width:0.08914207">[0.476]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 200.9306 201.26086 201.92128 202.25154 202.58185 202.91212 203.24242 203.57271 203.903 204.23328"
+         y="72.266708"
+         sodipodi:role="line"
+         id="tspan17250"
+         style="stroke-width:0.08914207">[Ginette:worker]Processing’Task_2’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="72.977173"
+         sodipodi:role="line"
+         id="tspan17252"
+         style="stroke-width:0.08914207">[0.803]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 201.2607 201.59096 201.92128 202.25154"
+         y="72.977173"
+         sodipodi:role="line"
+         id="tspan17254"
+         style="stroke-width:0.08914207">[Jupiter:worker]’Task_0’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="73.68763"
+         sodipodi:role="line"
+         id="tspan17256"
+         style="stroke-width:0.08914207">[0.951]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569"
+         y="73.68763"
+         sodipodi:role="line"
+         id="tspan17258"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_4’to’Fafard’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="74.398094"
+         sodipodi:role="line"
+         id="tspan17260"
+         style="stroke-width:0.08914207">[0.951]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 200.9306 201.26086 201.92128 202.25154 202.58185 202.91212 203.24242 203.57271 203.903 204.23328"
+         y="74.398094"
+         sodipodi:role="line"
+         id="tspan17262"
+         style="stroke-width:0.08914207">[Jupiter:worker]Processing’Task_3’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="75.108551"
+         sodipodi:role="line"
+         id="tspan17264"
+         style="stroke-width:0.08914207">[1.003]</tspan>
+      <tspan
+         x="190.36226 192.01358 192.34386 192.67416 193.00444 193.33473 193.66504 193.9953 194.32559 194.65587 194.98616 195.31645 195.64673 195.97704 197.62834 198.28871 198.61902 198.94931 199.27959 199.60988 199.94017 200.27045 200.60074 201.26114 201.59142 201.92171 202.252"
+         y="75.108551"
+         sodipodi:role="line"
+         id="tspan17266"
+         style="stroke-width:0.08914207">[Fafard:worker]’Task_1’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="75.819107"
+         sodipodi:role="line"
+         id="tspan17268"
+         style="stroke-width:0.08914207">[1.202]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145 202.25174 202.58203 202.91232 203.2426 203.903 204.23328 204.89368 205.22395 205.55424 205.88454 206.21483 206.5451 206.8754 207.20569 207.53595"
+         y="75.819107"
+         sodipodi:role="line"
+         id="tspan17270"
+         style="stroke-width:0.08914207">[Tremblay:master]Sending’Task_5’to’Ginette’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="76.529579"
+         sodipodi:role="line"
+         id="tspan17272"
+         style="stroke-width:0.08914207">[1.202]</tspan>
+      <tspan
+         x="190.36226 192.01358 192.34386 192.67416 193.00444 193.33473 193.66504 193.9953 194.32559 194.65587 194.98616 195.31645 195.64673 195.97704 197.62834 198.28871 198.61902 198.94931 199.27959 199.60988 199.94017 200.27045 200.60074 200.93042 201.2607 201.92171 202.252 202.58228 202.91258 203.24222 203.57253 203.90279 204.23309"
+         y="76.529579"
+         sodipodi:role="line"
+         id="tspan17274"
+         style="stroke-width:0.08914207">[Fafard:worker]Processing’Task_4’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="77.240028"
+         sodipodi:role="line"
+         id="tspan17276"
+         style="stroke-width:0.08914207">[1.507]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 201.2607 201.59096 201.92128 202.25154"
+         y="77.240028"
+         sodipodi:role="line"
+         id="tspan17278"
+         style="stroke-width:0.08914207">[Ginette:worker]’Task_2’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="77.9505"
+         sodipodi:role="line"
+         id="tspan17280"
+         style="stroke-width:0.08914207">[1.606]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 201.2607 201.59096 201.92128 202.25154"
+         y="77.9505"
+         sodipodi:role="line"
+         id="tspan17282"
+         style="stroke-width:0.08914207">[Jupiter:worker]’Task_3’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="78.660965"
+         sodipodi:role="line"
+         id="tspan17284"
+         style="stroke-width:0.08914207">[1.635]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.60945 199.93973 200.27002 200.60033 200.9306 201.59096 201.92128 202.25154 202.58185 202.91212 203.24242 203.57271 203.903 204.23328 204.56355 204.89384 205.55424 205.88454 206.21483 206.5451 206.8754 207.53578 207.86606 208.19637 208.52663 209.18703 209.5173 209.84761 210.1779 210.50819 210.83847 211.16876 211.49904"
+         y="78.660965"
+         sodipodi:role="line"
+         id="tspan17286"
+         style="stroke-width:0.08914207">[Tremblay:master]Alltasksdispatched.Let’sstopworkers.</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="79.371429"
+         sodipodi:role="line"
+         id="tspan17288"
+         style="stroke-width:0.08914207">[1.635]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 200.9306 201.26086 201.92128 202.25154 202.58185 202.91212 203.24242 203.57271 203.903 204.23328"
+         y="79.371429"
+         sodipodi:role="line"
+         id="tspan17290"
+         style="stroke-width:0.08914207">[Ginette:worker]Processing’Task_5’</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="80.081879"
+         sodipodi:role="line"
+         id="tspan17292"
+         style="stroke-width:0.08914207">[1.637]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.60988 199.94017 200.27045 200.60013 200.93042 201.59142 201.92171 202.252 202.91237 203.24268 203.57295 203.90324"
+         y="80.081879"
+         sodipodi:role="line"
+         id="tspan17294"
+         style="stroke-width:0.08914207">[Jupiter:worker]I’mdone.Seeyou!</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="80.792343"
+         sodipodi:role="line"
+         id="tspan17296"
+         style="stroke-width:0.08914207">[1.857]</tspan>
+      <tspan
+         x="190.36226 192.01358 192.34386 192.67416 193.00444 193.33473 193.66504 193.9953 194.32559 194.65587 194.98616 195.31645 195.64673 195.97704 197.62834 198.28871 198.61902 198.94931 199.27959 199.60988 199.94017 200.27045 200.60074 201.26114 201.59142 201.92171 202.252"
+         y="80.792343"
+         sodipodi:role="line"
+         id="tspan17298"
+         style="stroke-width:0.08914207">[Fafard:worker]’Task_4’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="81.502792"
+         sodipodi:role="line"
+         id="tspan17300"
+         style="stroke-width:0.08914207">[1.859]</tspan>
+      <tspan
+         x="190.36226 192.01358 192.34386 192.67416 193.00444 193.33473 193.66504 193.9953 194.32559 194.65587 194.98616 195.31645 195.64673 195.97704 197.62834 198.28871 198.61902 198.94931 199.6097 199.93999 200.27026 200.60056 200.93085 201.59123 201.92152 202.2518 202.9122 203.24248 203.57278 203.90305"
+         y="81.502792"
+         sodipodi:role="line"
+         id="tspan17302"
+         style="stroke-width:0.08914207">[Fafard:worker]I’mdone.Seeyou!</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="82.213356"
+         sodipodi:role="line"
+         id="tspan17304"
+         style="stroke-width:0.08914207">[2.666]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.27914 199.60945 199.93973 200.27002 200.60033 201.2607 201.59096 201.92128 202.25154"
+         y="82.213356"
+         sodipodi:role="line"
+         id="tspan17306"
+         style="stroke-width:0.08914207">[Ginette:worker]’Task_5’done</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="82.92382"
+         sodipodi:role="line"
+         id="tspan17308"
+         style="stroke-width:0.08914207">[2.668]</tspan>
+      <tspan
+         x="190.36226 191.35338 191.68304 192.01334 192.34361 192.67392 193.0042 193.33447 193.66478 193.99504 194.32535 194.65562 194.98592 195.31619 195.64651 195.97678 197.62808 198.28848 198.61876 198.94907 199.27934 199.60965 199.93991 200.27022 200.9306 201.26086 201.59117 201.92145"
+         y="82.92382"
+         sodipodi:role="line"
+         id="tspan17310"
+         style="stroke-width:0.08914207">[Tremblay:master]Goodbyenow!</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198"
+         y="83.634293"
+         sodipodi:role="line"
+         id="tspan17312"
+         style="stroke-width:0.08914207">[2.668]</tspan>
+      <tspan
+         x="190.36226 191.68347 192.01376 192.34406 192.67435 193.00462 193.33493 193.66519 193.99486 194.32515 194.65546 194.98572 195.31602 195.6463 195.97659 197.62791 198.2883 198.61859 198.94887 199.60988 199.94017 200.27045 200.60013 200.93042 201.59142 201.92171 202.252 202.91237 203.24268 203.57295 203.90324"
+         y="83.634293"
+         sodipodi:role="line"
+         id="tspan17314"
+         style="stroke-width:0.08914207">[Ginette:worker]I’mdone.Seeyou!</tspan>
+      <tspan
+         x="186.39912 188.38054 188.71083 189.04111 189.37141 189.70169 190.03198 190.36226 197.62778 198.28879 198.61909 198.94939 199.27965 199.60994 199.93961 200.2699 200.60017 200.93048 201.26074 201.92177 202.25142 202.58173 202.91202 203.57303 203.90329 204.2336 204.56387 204.89352 205.22383 205.55411"
+         y="84.344749"
+         sodipodi:role="line"
+         id="tspan17316"
+         style="stroke-width:0.08914207">[2.668][]Simulationtime2.66766</tspan>
+    </text>
+    <path
+       d="m 91.461566,136.99478 -6.671711,-3.05886"
+       style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+       id="path32636"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g32724"
+       transform="matrix(0.1204976,0,0,-0.1204976,61.800118,144.45536)">
+      <text
+         transform="matrix(1,0,0,-1,108.462,27.9004)"
+         style="font-variant:normal;font-weight:bold;font-size:4.72424984px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="text32734">
+        <tspan
+           x="0"
+           y="0"
+           id="tspan32726" />
+      </text>
+    </g>
+    <g
+       id="g2476"
+       transform="matrix(0.84514339,0,0,0.84514339,11.706398,22.73383)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32386"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 25.017752,123.41635 h 4.141532 v -2.07078 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32388"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 25.017752,123.41635 h 4.141532 v -2.07078 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32390"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 22.946968,132.94185 h 4.141533 v -2.07078 h -4.141533 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32392"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 22.946968,132.94185 h 4.141533 v -2.07078 h -4.141533 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32394"
+         style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 29.159284,132.73482 h 4.141532 v -2.07076 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32396"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 29.159284,132.73482 h 4.141532 v -2.07076 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32398"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 35.371603,132.73482 h 4.141532 v -2.07076 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32400"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 35.371603,132.73482 h 4.141532 v -2.07076 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32402"
+         style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 29.159284,141.01786 h 4.141532 v -2.07075 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32404"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 29.159284,141.01786 h 4.141532 v -2.07075 h -4.141532 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32406"
+         style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00730545"
+         d="m 33.50791,123.41635 h 3.934466 v -2.07078 H 33.50791 Z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32408"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 33.50791,123.41635 h 3.934466 v -2.07078 H 33.50791 Z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32410"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 29.642466,117.20402 v 0 c -0.266847,0 -0.483182,0.21638 -0.483182,0.48318 v 1.10444 c 0,0.26686 0.216335,0.48318 0.483182,0.48318 h 3.175153 c 0.266867,0 0.483182,-0.21632 0.483182,-0.48318 v -1.10444 c 0,-0.2668 -0.216315,-0.48318 -0.483182,-0.48318 z" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32416"
+         clip-path="url(#clipPath32420)">
+        <path
+           d="M 1140.96,3693.09 545.711,3381.29"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:37.794;stroke-dashoffset:0;stroke-opacity:1"
+           id="path32422"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32424"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 27.373811,121.13391 -0.423345,0.38193 0.552191,-0.13807" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32428"
+         clip-path="url(#clipPath32432)">
+        <path
+           d="m 1140.96,3693.09 566.92,-283.45"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:37.794;stroke-dashoffset:0;stroke-opacity:1"
+           id="path32434"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32436"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 34.745745,121.18914 0.556823,0.12426 -0.432557,-0.3728" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32440"
+         clip-path="url(#clipPath32444)">
+        <path
+           sodipodi:nodetypes="cc"
+           d="m 1112.62,716.812 -1.6168,-224.69463"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:37.794;stroke-dashoffset:0;stroke-opacity:1"
+           id="path32446"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32452"
+         clip-path="url(#clipPath32456)">
+        <path
+           d="m 1764.57,3126.18 283.45,-992.09"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32458"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32460"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 37.548188,130.09338 0.285277,0.49707 -0.02302,-0.57063" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32464"
+         clip-path="url(#clipPath32468)">
+        <path
+           d="M 516.105,3125.55 2055.58,2146.05"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32470"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32472"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 37.30426,130.35112 0.543014,0.18403 -0.395736,-0.41408" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32476"
+         clip-path="url(#clipPath32480)">
+        <path
+           d="M 1767.71,3124.29 1200.81,2132.2"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32482"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32484"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 31.855856,130.06117 -0.151805,0.55222 0.391134,-0.41415" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32488"
+         clip-path="url(#clipPath32492)">
+        <path
+           d="M 516.105,3125.55 1149.79,2130.94"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32494"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32496"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 30.838938,130.22685 0.414146,0.39574 -0.184097,-0.54301" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32500"
+         clip-path="url(#clipPath32504)">
+        <path
+           d="M 517.363,3126.18 205.566,2105.74"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32506"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32508"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 24.447123,130.22685 -0.0276,0.57063 0.289903,-0.48778" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32512"
+         clip-path="url(#clipPath32516)">
+        <path
+           d="m 233.91,1793.94 907.05,-793.67"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32518"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32520"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 30.664045,138.63418 0.510797,0.26227 -0.326772,-0.46937" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32524"
+         clip-path="url(#clipPath32528)">
+        <path
+           d="M 1140.96,1850.63 V 1000.27"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32530"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32532"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 31.091998,138.31669 0.137998,0.55214 0.138068,-0.55214" />
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32536"
+         clip-path="url(#clipPath32540)">
+        <path
+           d="M 1991.33,1850.63 1140.96,1000.27"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32542"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32544"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 31.575182,138.39946 -0.289953,0.49239 0.487783,-0.29449" />
+      <g
+         transform="translate(-0.01181176,-1.4410342)"
+         id="g42543">
+        <path
+           d="m 31.004553,144.12402 h 0.03682"
+           style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32412"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 30.884889,143.49358 0.138067,0.55219 0.138067,-0.55219"
+           style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32448"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 29.849532,144.12402 v 0 c -0.266847,0 -0.48319,0.21633 -0.48319,0.48316 v 1.10443 c 0,0.26682 0.216343,0.48316 0.48319,0.48316 h 3.175196 c 0.266795,0 0.483182,-0.21634 0.483182,-0.48319 v -1.10437 c 0,-0.26686 -0.216387,-0.48319 -0.483254,-0.48319 z"
+           style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32546"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="matrix(0.00730545,0,0,-0.00730545,22.894774,146.2545)"
+         id="g32550"
+         clip-path="url(#clipPath32554)">
+        <path
+           d="M 1764.57,3126.18 233.91,2105.74"
+           style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32556"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32558"
+         style="fill:none;stroke:#000000;stroke-width:0.03451275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 25.049969,130.40635 -0.381944,0.42335 0.533788,-0.1933" />
+      <text
+         y="122.79517"
+         x="26.881439"
+         style="font-variant:normal;font-weight:bold;font-size:1.1044085px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.07305449"
+         id="text32564">
+        <tspan
+           style="stroke-width:0.07305449"
+           x="26.881439"
+           y="122.79517"
+           id="tspan32562">1</tspan>
+      </text>
+      <text
+         y="132.32066"
+         x="24.603592"
+         style="font-variant:normal;font-weight:bold;font-size:1.1044085px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.07305449"
+         id="text32570">
+        <tspan
+           style="stroke-width:0.07305449"
+           x="24.603592"
+           y="132.32066"
+           id="tspan32568">3</tspan>
+      </text>
+      <text
+         y="132.11356"
+         x="31.022961"
+         style="font-variant:normal;font-weight:bold;font-size:1.1044085px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.07305449"
+         id="text32584">
+        <tspan
+           style="stroke-width:0.07305449"
+           x="31.022961 37.235249"
+           y="132.11356"
+           sodipodi:role="line"
+           id="tspan32574">45</tspan>
+        <tspan
+           style="stroke-width:0.07305449"
+           x="31.022961"
+           y="140.39662"
+           id="tspan32576">6</tspan>
+        <tspan
+           style="stroke-width:0.07305449"
+           x="35.164494"
+           y="122.7951"
+           id="tspan32578">2</tspan>
+        <tspan
+           style="stroke-width:0.07305449"
+           x="29.987579 30.784964 31.337172 31.889372"
+           y="118.65356"
+           sodipodi:role="line"
+           id="tspan32580">Root</tspan>
+        <tspan
+           style="stroke-width:0.07305449"
+           x="31.022961"
+           y="0"
+           sodipodi:role="line"
+           id="tspan32582" />
+      </text>
+      <text
+         y="130.65836"
+         x="30.833971"
+         style="font-variant:normal;font-weight:bold;font-size:1.1044085px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.0730545"
+         id="text32584-7">
+        <tspan
+           style="stroke-width:0.0730545"
+           x="30.212746 30.949387 31.563438"
+           y="144.11829"
+           sodipodi:role="line"
+           id="tspan32582-9">End</tspan>
+      </text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="126.59879"
+       y="87.287552"
+       id="text1028-1-4-3"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6"
+         x="126.59879"
+         y="87.287552"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Time, Energy</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="73.476288"
+       y="97.87088"
+       id="text1028-1-4-3-0"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6-3"
+         x="73.476288"
+         y="97.87088"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">(CPU, Links, Disks)</tspan></text>
+    <g
+       id="g34108"
+       transform="matrix(0.0830545,0,0,-0.0830545,77.484414,170.53818)" />
+    <g
+       id="g34354"
+       transform="matrix(0.0830545,0,0,-0.0830545,77.484414,170.53818)">
+      <text
+         transform="matrix(1,0,0,-1,63.393,73.7527)"
+         style="font-variant:normal;font-weight:normal;font-size:23.99920082px;font-family:Helvetica;-inkscape-font-specification:Helvetica;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         id="text34358">
+        <tspan
+           x="0"
+           sodipodi:role="line"
+           id="tspan34356"
+           y="21.815273" />
+      </text>
+    </g>
+    <g
+       id="g2598"
+       transform="translate(0.6903338,3.8794416)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path32616"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 63.104782,133.66268 6.671759,-0.83492" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32618"
+         style="fill:none;stroke:#000000;stroke-width:0.11385215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 63.104782,133.66268 6.671759,-0.83492" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32620"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 63.666469,137.27558 6.110072,-4.44782" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32622"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 63.666469,137.27558 6.110072,-4.44782" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32624"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 75.059312,139.77276 1.669856,-5.00192" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path32626"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 74.792042,135.42963 1.937126,-0.65879" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32628"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 82.565951,137.27558 -5.836783,-2.50474" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path32630"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 82.565951,137.27558 2.100715,-3.2985" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32632"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 88.402735,129.76899 -5.001976,1.66986" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path32634"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 85.863674,129.74375 -2.462915,1.6951" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32640"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 73.951096,130.60392 2.778072,4.16692" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32642"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 73.951096,130.60392 2.778072,4.16692" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32644"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 84.789855,133.93592 -8.060687,0.83492" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32646"
+         style="fill:none;stroke:#000000;stroke-width:0.4554086;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 84.789855,133.93592 -8.060687,0.83492" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32648"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 67.833469,128.3799 6.117627,2.22402" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32650"
+         style="fill:none;stroke:#000000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 67.833469,128.3799 6.117627,2.22402" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32652"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 79.233831,138.1105 -2.504663,-3.33966" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32654"
+         style="fill:none;stroke:#000000;stroke-width:0.34155649;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 79.233831,138.1105 -2.504663,-3.33966" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32656"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 69.776541,132.82776 -2.497168,5.28274" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32660"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 84.789855,133.93592 -1.389096,-2.49707" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32662"
+         style="fill:none;stroke:#000000;stroke-width:0.91081721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 84.789855,133.93592 -1.389096,-2.49707" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32664"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 69.776541,132.82776 4.174555,-2.22384" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32666"
+         style="fill:none;stroke:#000000;stroke-width:0.79696512;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 69.776541,132.82776 4.174555,-2.22384" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32668"
+         style="fill:#87cfff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 83.400759,131.43885 -9.449663,-0.83493" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32670"
+         style="fill:none;stroke:#000000;stroke-width:0.91081721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 83.400759,131.43885 -9.449663,-0.83493" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32672"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 72.04161,136.09375 h 2.041723 v -1.0247 H 72.04161 Z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32674"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 72.04161,136.09375 h 2.041723 v -1.0247 H 72.04161 Z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32676"
+         style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 64.835344,127.93972 h 1.943072 v -1.01708 h -1.943072 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32678"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 64.835344,127.93972 h 1.943072 v -1.01708 h -1.943072 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32680"
+         style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 64.600036,129.44256 h 2.041772 v -1.0247 h -2.041772 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32682"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 64.600036,129.44256 h 2.041772 v -1.0247 h -2.041772 z" />
+      <g
+         transform="translate(-9.1225377,1.7471971)"
+         id="g221778">
+        <path
+           d="m 91.279374,136.41789 h 2.041771 v -1.02465 h -2.041771 z"
+           style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+           id="path32684"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 91.279374,136.41789 h 2.041771 v -1.02465 h -2.041771 z"
+           style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32686"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32688"
+         style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+         d="m 62.03457,136.86571 h 2.041772 v -1.02465 H 62.03457 Z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32690"
+         style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 62.03457,136.86571 h 2.041772 v -1.02465 H 62.03457 Z" />
+      <g
+         transform="matrix(0.1204976,0,0,-0.1204976,61.800118,144.45536)"
+         id="g32736">
+        <text
+           id="text32740"
+           style="font-variant:normal;font-weight:bold;font-size:4.72424984px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           transform="matrix(1,0,0,-1,8.68555,65.5684)">
+          <tspan
+             id="tspan32738"
+             y="0"
+             x="0">3</tspan>
+        </text>
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32748"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 74.81197,136.09375 c 0,0.95993 -0.778173,1.73813 -1.738057,1.73813 -0.960004,0 -1.738178,-0.7782 -1.738178,-1.73813 0,-0.95993 0.778174,-1.73818 1.738178,-1.73818 0.959884,0 1.738057,0.77825 1.738057,1.73818 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32750"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 80.346304,138.73958 c 0,0.43594 -0.35342,0.78934 -0.78938,0.78934 -0.43596,0 -0.78938,-0.3534 -0.78938,-0.78934 0,-0.43596 0.35342,-0.78936 0.78938,-0.78936 0.43596,0 0.78938,0.3534 0.78938,0.78936 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32754"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 63.400808,137.64752 c 0,0.20537 -0.166576,0.37191 -0.37194,0.37191 -0.205367,0 -0.371899,-0.16654 -0.371899,-0.37191 0,-0.20536 0.166532,-0.37194 0.371899,-0.37194 0.205364,0 0.37194,0.16658 0.37194,0.37194 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32756"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 62.717688,133.89041 c 0,0.20536 -0.166531,0.37189 -0.371894,0.37189 -0.205364,0 -0.371943,-0.16653 -0.371943,-0.37189 0,-0.20537 0.166579,-0.37195 0.371943,-0.37195 0.205363,0 0.371894,0.16658 0.371894,0.37195 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32758"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 84.577297,137.64752 c 0,0.77128 -0.625262,1.39656 -1.396567,1.39656 -0.771305,0 -1.396567,-0.62528 -1.396567,-1.39656 0,-0.77127 0.625262,-1.39659 1.396567,-1.39659 0.771305,0 1.396567,0.62532 1.396567,1.39659 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32762"
+         style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 67.871414,128.42556 c 0,1.16534 -0.944738,2.10992 -2.110082,2.10992 -1.165344,0 -2.11007,-0.94458 -2.11007,-2.10992 0,-1.16545 0.944726,-2.11015 2.11007,-2.11015 1.165344,0 2.110082,0.9447 2.110082,2.11015 z" />
+      <g
+         transform="translate(-2.527497,-0.02266)"
+         id="g226815">
+        <path
+           d="m 88.88846,129.79165 h 2.041772 v -1.02466 H 88.88846 Z"
+           style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.01204976"
+           id="path32692"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 88.88846,129.79165 h 2.041772 v -1.02466 H 88.88846 Z"
+           style="fill:none;stroke:#000000;stroke-width:0.05692608;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32694"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g32742"
+           transform="matrix(0.1204976,0,0,-0.1204976,61.800118,144.45536)">
+          <text
+             transform="matrix(1,0,0,-1,232.426,124.212)"
+             style="font-variant:normal;font-weight:bold;font-size:4.72424984px;font-family:Times;-inkscape-font-specification:Times-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="text32746">
+            <tspan
+               x="0"
+               y="0"
+               id="tspan32744">6</tspan>
+          </text>
+        </g>
+        <path
+           d="m 91.173095,129.10854 c 0,0.81324 -0.659242,1.47261 -1.47236,1.47261 -0.813239,0 -1.472601,-0.65937 -1.472601,-1.47261 0,-0.81323 0.659362,-1.47248 1.472601,-1.47248 0.813118,0 1.47236,0.65925 1.47236,1.47248 z"
+           style="fill:none;stroke:#d10000;stroke-width:0.2277043;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32764"
+           inkscape:connector-curvature="0" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path32766"
+         style="fill:none;stroke:#d10000;stroke-width:0.4554086;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 82.869605,133.20728 h 0.0075 l 0.03037,-0.0152 0.0835,-0.0304 0.136645,-0.0455 0.174601,-0.0607 0.204966,-0.0759 0.197255,-0.0683 0.189783,-0.0683 0.159419,-0.0684 0.144235,-0.0607 0.121341,-0.0531 0.09869,-0.0456 0.08351,-0.0456 0.07591,-0.0455 0.08351,-0.0607 0.06832,-0.0683 0.05314,-0.0759 0.04555,-0.0835 0.03037,-0.0987 0.03037,-0.0986 0.01518,-0.0987 0.0076,-0.0607 0.0076,-0.0304 v -0.008" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path32768"
+         style="fill:none;stroke:#d10000;stroke-width:0.4554086;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 82.869605,131.84107 h 0.0075 l 0.03037,0.0152 0.06832,0.0304 0.11387,0.0455 0.151827,0.0683 0.16701,0.0683 0.17448,0.0834 0.16701,0.0683 0.144235,0.0683 0.129053,0.0683 0.113871,0.0607 0.09857,0.0531 0.0911,0.0531 0.0835,0.0607 0.08351,0.0607 0.0835,0.0759 0.08351,0.0759 0.08351,0.0911 0.0911,0.10629 0.09869,0.11386 0.09857,0.12902 0.08351,0.11386 0.07591,0.0987 0.04555,0.0683 0.02277,0.0228 v 0.008" />
+      <g
+         transform="translate(19.187887,-10.03448)"
+         id="g2523">
+        <path
+           d="m 69.594385,137.89041 -0.03037,0.008 -0.06072,0.0228 -0.0987,0.0379 -0.159382,0.0531 -0.197363,0.0683 -0.227668,0.0835 -0.250503,0.0911 -0.265661,0.0911 -0.258033,0.0986 -0.242875,0.0911 -0.235308,0.0835 -0.204942,0.0835 -0.189784,0.0759 -0.15937,0.0759 -0.151803,0.0607 -0.129017,0.0683 -0.113858,0.0607 -0.09866,0.0531 -0.09112,0.0607 -0.136596,0.0987 -0.113858,0.0987 -0.09108,0.10623 -0.07593,0.12149 -0.06072,0.13659 -0.05309,0.1518 -0.03798,0.15942 -0.03037,0.15181 -0.02273,0.12143 -0.0076,0.0835 -0.0076,0.0304 v 0.008"
+           style="fill:none;stroke:#d10000;stroke-width:0.4554086;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32770"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 69.594385,140.42551 -0.02279,-0.008 -0.05314,-0.0227 -0.0835,-0.038 -0.136596,-0.0531 -0.166997,-0.0759 -0.197363,-0.0835 -0.212522,-0.0911 -0.227668,-0.0987 -0.227729,-0.0987 -0.212509,-0.0987 -0.197363,-0.0911 -0.189736,-0.0911 -0.167009,-0.0835 -0.151791,-0.0759 -0.144224,-0.0759 -0.129017,-0.0759 -0.113858,-0.0683 -0.11387,-0.0683 -0.09865,-0.0759 -0.129017,-0.0911 -0.113858,-0.0987 -0.121438,-0.0987 -0.11387,-0.11386 -0.113858,-0.12144 -0.129017,-0.14422 -0.121437,-0.1518 -0.136645,-0.15937 -0.136596,-0.17458 -0.129065,-0.17459 -0.11381,-0.15179 -0.0987,-0.1366 -0.0683,-0.0911 -0.03794,-0.0531 -0.02277,-0.0304"
+           style="fill:none;stroke:#d10000;stroke-width:0.4554086;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32772"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="translate(-11.395366,-10.267752)"
+         id="g2409">
+        <g
+           id="g32774"
+           transform="matrix(0.00843483,0,0,-0.00843483,71.448742,151.5761)">
+          <g
+             id="g32776"
+             clip-path="url(#clipPath32780)">
+            <path
+               d="M 1578.46,451.598 V 26.4141 h 680.29"
+               style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               id="path32782"
+               inkscape:connector-curvature="0" />
+          </g>
+        </g>
+        <path
+           d="m 84.922205,148.49485 -0.159418,-0.63756 -0.159418,0.63756"
+           style="fill:none;stroke:#000000;stroke-width:0.03984826;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32784"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 89.773077,151.51271 0.637504,-0.15941 -0.637504,-0.15937"
+           style="fill:none;stroke:#000000;stroke-width:0.03984826;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32786"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 84.762787,149.67968 0.0053,-0.0106 0.01594,-0.0266 0.02126,-0.0372 0.0372,-0.0531 0.0372,-0.0638 0.04251,-0.0638 0.04251,-0.0584 0.04251,-0.0531 0.03711,-0.0372 0.03189,-0.0266 0.03189,-0.0106 h 0.02657 l 0.02126,0.0106 0.02657,0.0319 0.02126,0.0425 0.02126,0.0585 0.02126,0.0797 0.02126,0.0903 0.02657,0.10096 0.02126,0.10625 0.02126,0.11157 0.02657,0.11159 0.02125,0.10626 0.02126,0.0903 0.02126,0.0797 0.02657,0.0584 0.02125,0.0372 0.02126,0.0106 0.02657,-0.006 0.01594,-0.0266 0.02126,-0.0425 0.02117,-0.0585 0.02126,-0.0744 0.02126,-0.085 0.02657,-0.0957 0.02657,-0.11156 0.03189,-0.11691 0.02657,-0.1222 0.03189,-0.12751 0.03189,-0.13282 0.03188,-0.12751 0.03189,-0.1222 0.0372,-0.12221 0.03189,-0.11156 0.0372,-0.10095 0.03188,-0.0957 0.0372,-0.0797 0.0318,-0.0691 0.0372,-0.0638 0.0372,-0.0531 0.0372,-0.0479 0.04251,-0.0372 0.04251,-0.0372 0.04782,-0.0319 0.04782,-0.0265 0.04782,-0.016 0.05314,-0.0159 0.05314,-0.0106 0.05846,-0.006 h 0.111508 l 0.05846,0.006 0.05314,0.006 0.05846,0.0106 0.05845,0.0106 0.05846,0.0106 0.06377,0.0106 0.08502,0.016 0.09025,0.016 0.100966,0.016 0.100965,0.0213 0.100964,0.0213 0.106279,0.0213 0.106279,0.0265 0.106195,0.0265 0.09565,0.0265 0.09565,0.0319 0.08502,0.0319 0.0744,0.0318 0.06377,0.0319 0.06369,0.0425 0.05846,0.0478 0.04782,0.0531 0.04782,0.0584 0.0372,0.0691 0.03189,0.0744 0.02657,0.0797 0.02126,0.085 0.02126,0.0903 0.01594,0.085 0.01594,0.0903 0.01594,0.0903 0.01594,0.0903 0.01594,0.0797 0.02125,0.085 0.02126,0.085 0.02657,0.085 0.02649,0.0957 0.03197,0.0903 0.0318,0.0904 0.0372,0.085 0.0372,0.085 0.0372,0.0744 0.0372,0.0691 0.0372,0.0584 0.0372,0.0479 0.04251,0.0478 0.05314,0.0425 0.06377,0.0319 0.06908,0.0212 0.08494,0.006 0.09565,-0.006 0.106279,-0.016 0.09565,-0.016 0.069,-0.016 0.03197,-0.0106 h 0.0052"
+           style="fill:none;stroke:#00b000;stroke-width:0.07969651;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32788"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         transform="translate(-8.409135,-8.8766447)"
+         id="g2519">
+        <g
+           id="g32790"
+           transform="matrix(0.00843483,0,0,-0.00843483,65.098269,159.65543)">
+          <g
+             id="g32792"
+             clip-path="url(#clipPath32796)">
+            <path
+               d="M 983.203,1670.45 V 1245.27 H 1663.5"
+               style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+               id="path32798"
+               inkscape:connector-curvature="0" />
+          </g>
+        </g>
+        <path
+           d="m 73.550814,146.29331 -0.159393,-0.63759 -0.159367,0.63759"
+           style="fill:none;stroke:#000000;stroke-width:0.03984826;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32800"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 78.401686,149.31121 0.637589,-0.15942 -0.637589,-0.15942"
+           style="fill:none;stroke:#000000;stroke-width:0.03984826;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32802"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 73.391421,147.47815 0.0053,-0.006 0.02124,-0.0425 0.04251,-0.0796 0.06375,-0.11168 0.06905,-0.11683 0.06377,-0.10096 0.05314,-0.0744 0.04782,-0.0425 0.0372,-0.0266 0.0372,0.006 0.03189,0.016 0.03189,0.0372 0.0318,0.0531 0.03197,0.0584 0.04243,0.0638 0.0372,0.0691 0.04251,0.0531 0.04782,0.0477 0.04782,0.0267 0.05314,0.0106 0.04782,-0.005 0.05314,-0.0213 0.05837,-0.0372 0.05845,-0.0425 0.06908,-0.0531 0.06908,-0.0638 0.06908,-0.0638 0.06908,-0.0638 0.05845,-0.0584 0.05846,-0.0585 0.05305,-0.0478 0.05322,-0.0425 0.02126,-0.0213 0.02118,-0.0159 0.02657,-0.0106 0.02126,-0.0106 0.02126,-0.0106 0.01594,-0.006 h 0.04251 l 0.01594,0.006 0.01594,0.005 0.01594,0.0107 0.01594,0.0106 0.01594,0.0213 0.01594,0.016 0.01063,0.0213 0.01594,0.0266 0.01063,0.0266 0.01063,0.0319 0.01063,0.0318 0.01063,0.0319 0.01063,0.0372 0.01063,0.0372 0.01594,0.0638 0.01594,0.0744 0.01594,0.0797 0.02126,0.0903 0.01594,0.0902 0.02125,0.10097 0.02649,0.10096 0.02126,0.0957 0.02666,0.10096 0.02657,0.0903 0.02649,0.0903 0.02657,0.0797 0.02657,0.0744 0.03189,0.0638 0.02657,0.0531 0.03189,0.0478 0.03189,0.0425 0.0372,0.0424 0.0372,0.032 0.04251,0.0318 0.04782,0.0213 0.04782,0.0213 0.04782,0.0106 0.04774,0.0106 h 0.05314 l 0.05314,-0.006 0.05314,-0.0106 0.05314,-0.016 0.05314,-0.016 0.05314,-0.0265 0.06377,-0.032 0.06908,-0.0424 0.069,-0.0478 0.0744,-0.0531 0.07971,-0.0531 0.08502,-0.0585 0.08502,-0.0531 0.08502,-0.0584 0.07971,-0.0478 0.08502,-0.0478 0.07962,-0.0372 0.0744,-0.0318 0.07439,-0.0213 0.0744,-0.0107 0.06908,-0.005 0.06908,0.0106 0.07431,0.0213 0.07971,0.0318 0.08502,0.0478 0.09034,0.0584 0.100965,0.0744 0.106279,0.085 0.10088,0.0797 0.09034,0.0796 0.06377,0.0584 0.04251,0.0372 0.01594,0.016 h 0.0053"
+           style="fill:none;stroke:#b000b0;stroke-width:0.07969651;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+           id="path32804"
+           inkscape:connector-curvature="0" />
+      </g>
+      <text
+         id="text221782"
+         y="138.05142"
+         x="82.842613"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.05833328px;line-height:6.61458302px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-size:1.05833328px;stroke-width:0.26458332px"
+           y="138.05142"
+           x="82.842613"
+           id="tspan221780"
+           sodipodi:role="line">4</tspan></text>
+    </g>
+    <g
+       id="g224834"
+       transform="translate(-5.7256916,-22.55169)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34310"
+         style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 112.53757,159.46884 h 2.3542 v -3.53134 h -2.3542 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34312"
+         style="fill:none;stroke:#0000b0;stroke-width:0.15694809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 112.53757,159.46884 h 2.3542 v -3.53134 h -2.3542 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872"
+         d="m 113.70785,156.10949 v 2.54"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.21199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+    </g>
+    <g
+       id="g224801"
+       transform="translate(-4.1935235,-22.489585)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34270"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 98.412238,159.46884 h 2.354202 v -3.53134 h -2.354202 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34272"
+         style="fill:none;stroke:#0000b0;stroke-width:0.15694809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 98.412238,159.46884 h 2.354202 v -3.53134 h -2.354202 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872-6"
+         d="m 99.555199,156.21626 v 2.54"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.21199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-3)" />
+    </g>
+    <g
+       id="g224823"
+       transform="translate(-4.2389724,-22.556402)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34262"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 108.77079,159.46884 h 2.35421 v -3.53134 h -2.35421 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34264"
+         style="fill:none;stroke:#0000b0;stroke-width:0.15694809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 108.77079,159.46884 h 2.35421 v -3.53134 h -2.35421 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872-4"
+         d="m 109.94521,159.2012 v -2.54"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.21199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-30)" />
+    </g>
+    <g
+       id="g224812"
+       transform="translate(-4.7610639,-22.823672)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34302"
+         style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 96.583171,159.80293 h 2.354205 v -3.53134 h -2.354205 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34304"
+         style="fill:none;stroke:#0000b0;stroke-width:0.15694809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 96.583171,159.80293 h 2.354205 v -3.53134 h -2.354205 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872-4-2"
+         d="m 97.756055,159.4408 v -2.54"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.21199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-30-5)" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666703px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="98.08519"
+       y="137.08461"
+       id="text221870-4"><tspan
+         sodipodi:role="line"
+         id="tspan221868-9"
+         x="98.08519"
+         y="137.08461"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666703px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">10G</tspan></text>
+    <path
+       d="m 88.228608,144.72038 h 11.771148 v -6.3564 H 88.228608 Z"
+       style="fill:#a4e3f8;fill-opacity:0.62745098;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34138"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 88.228608,144.72038 h 11.771148 v -6.3564 H 88.228608 Z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34140"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 96.588786,143.77871 h 2.70472 v -0.47084 h -2.70472 z"
+       style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34214"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 96.588786,143.77871 h 2.70472 v -0.47084 h -2.70472 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34216"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 96.546926,138.83485 v 0 c -0.30339,0 -0.54932,0.24592 -0.54932,0.54932 v 4.31607 c 0,0.30334 0.24593,0.54929 0.54932,0.54929 h 2.43267 c 0.3034,0 0.54932,-0.24595 0.54932,-0.54929 v -4.31607 c 0,-0.3034 -0.24592,-0.54932 -0.54932,-0.54932 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.31389618;stroke-dashoffset:0;stroke-opacity:1"
+       id="path34218"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 96.939276,140.95363 h 0.70626 v -1.64795 h -0.70626 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34220"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 96.939276,140.95363 h 0.70626 v -1.64795 h -0.70626 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34222"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 98.116406,140.95363 h 0.70629 v -1.64795 h -0.70629 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34224"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 98.116406,140.95363 h 0.70629 v -1.64795 h -0.70629 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34226"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 97.174656,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34228"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 97.174656,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34230"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.290626,143.77871 h 2.704753 v -0.47084 h -2.704753 z"
+       style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34232"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.290626,143.77871 h 2.704753 v -0.47084 h -2.704753 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34234"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.24885,138.83485 v 0 c -0.303398,0 -0.549323,0.24592 -0.549323,0.54932 v 4.31607 c 0,0.30334 0.245925,0.54929 0.549323,0.54929 h 2.432666 c 0.303398,0 0.549322,-0.24595 0.549322,-0.54929 v -4.31607 c 0,-0.3034 -0.245924,-0.54932 -0.549322,-0.54932 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.31389618;stroke-dashoffset:0;stroke-opacity:1"
+       id="path34282"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 90.818248,140.95363 h 0.706287 v -1.64795 h -0.706287 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34284"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 90.818248,140.95363 h 0.706287 v -1.64795 h -0.706287 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34286"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.876659,142.83702 h 1.412508 v -1.64795 h -1.412508 z"
+       style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34294"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.876659,142.83702 h 1.412508 v -1.64795 h -1.412508 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34296"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.641199,140.95363 h 0.706256 v -1.64795 h -0.706256 z"
+       style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34298"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 89.641199,140.95363 h 0.706256 v -1.64795 h -0.706256 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34300"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 98.942966,143.65839 h 0.23544 v -0.23545 h -0.23544 z"
+       style="fill:#d00000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34338"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 98.942966,143.65839 h 0.23544 v -0.23545 h -0.23544 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34340"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 91.644889,143.65839 h 0.235408 v -0.23545 h -0.235408 z"
+       style="fill:#d00000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34342"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 91.644889,143.65839 h 0.235408 v -0.23545 h -0.235408 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34344"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)"
+       d="m 91.191705,139.36071 v 1.30048"
+       id="path221872-6-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-6)"
+       d="m 98.469086,139.33565 v 1.30048"
+       id="path221872-6-3-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-93)"
+       d="m 97.286306,140.91295 v -1.30048"
+       id="path221872-6-3-5-46"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-15)"
+       d="m 89.972469,140.89642 v -1.30048"
+       id="path221872-6-3-5-1"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 101.18464,144.72038 h 11.77114 v -6.3564 h -11.77114 z"
+       style="fill:#a4e3f8;fill-opacity:0.62745098;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34134"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 101.18464,144.72038 h 11.77114 v -6.3564 h -11.77114 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34136"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.24674,143.77871 h 2.70475 v -0.47084 h -2.70475 z"
+       style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34236"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.24674,143.77871 h 2.70475 v -0.47084 h -2.70475 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34238"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.20488,138.83485 v 0 c -0.3034,0 -0.54932,0.24592 -0.54932,0.54932 v 4.31607 c 0,0.30334 0.24592,0.54929 0.54932,0.54929 h 2.43266 c 0.3034,0 0.54933,-0.24595 0.54933,-0.54929 v -4.31607 c 0,-0.3034 -0.24593,-0.54932 -0.54933,-0.54932 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.31389618;stroke-dashoffset:0;stroke-opacity:1"
+       id="path34240"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.59723,140.95363 h 0.70625 v -1.64795 h -0.70625 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34242"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.59723,140.95363 h 0.70625 v -1.64795 h -0.70625 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34244"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 103.77428,140.95363 h 0.70628 v -1.64795 h -0.70628 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34246"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 103.77428,140.95363 h 0.70628 v -1.64795 h -0.70628 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34248"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.8326,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34250"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 102.8326,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34252"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 109.54482,143.77871 h 2.70472 v -0.47084 h -2.70472 z"
+       style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34254"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 109.54482,143.77871 h 2.70472 v -0.47084 h -2.70472 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34256"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 109.50296,138.83485 v 0 c -0.3034,0 -0.54932,0.24592 -0.54932,0.54932 v 4.31607 c 0,0.30334 0.24592,0.54929 0.54932,0.54929 h 2.43267 c 0.30339,0 0.54932,-0.24595 0.54932,-0.54929 v -4.31607 c 0,-0.3034 -0.24593,-0.54932 -0.54932,-0.54932 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.31389618;stroke-dashoffset:0;stroke-opacity:1"
+       id="path34288"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 109.89531,140.95363 h 0.70626 v -1.64795 h -0.70626 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34290"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 109.89531,140.95363 h 0.70626 v -1.64795 h -0.70626 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34292"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 111.07244,140.95363 h 0.70629 v -1.64795 h -0.70629 z"
+       style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34314"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 111.07244,140.95363 h 0.70629 v -1.64795 h -0.70629 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34316"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 110.13069,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34318"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 110.13069,142.83702 h 1.41254 v -1.64795 h -1.41254 z"
+       style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34320"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 104.60092,143.65839 h 0.23544 v -0.23545 h -0.23544 z"
+       style="fill:#d00000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34346"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 104.60092,143.65839 h 0.23544 v -0.23545 h -0.23544 z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34348"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 111.899,143.65839 h 0.23544 v -0.23545 H 111.899 Z"
+       style="fill:#d00000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+       id="path34350"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 111.899,143.65839 h 0.23544 v -0.23545 H 111.899 Z"
+       style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+       id="path34352"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7)"
+       d="m 104.13719,139.34401 v 1.30048"
+       id="path221872-6-3-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-1)"
+       d="m 111.43963,139.31626 v 1.30048"
+       id="path221872-6-3-5-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-9)"
+       d="m 102.93239,140.89642 v -1.30048"
+       id="path221872-6-3-5-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-98)"
+       d="m 110.23442,140.92004 v -1.30048"
+       id="path221872-6-3-5-3"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g226783"
+       transform="translate(8.4470227,6.5748244)">
+      <rect
+         ry="0.5433408"
+         y="132.38957"
+         x="90.851295"
+         height="1.8520966"
+         width="2.5466206"
+         id="rect226778"
+         style="opacity:0.93999999;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.14111111;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         id="text221870-4-7"
+         y="133.96593"
+         x="91.540489"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.76388943px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa0000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.76388943px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';fill:#aa0000;stroke-width:0.26458332px"
+           y="133.96593"
+           x="91.540489"
+           id="tspan221868-9-2"
+           sodipodi:role="line">1</tspan></text>
+    </g>
+    <g
+       id="g226312"
+       transform="rotate(90,117.03856,134.54269)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34310-7"
+         style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 112.89586,153.05537 h 2.3542 v -3.53134 h -2.3542 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34312-7"
+         style="fill:none;stroke:#0000b0;stroke-width:0.15694809;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 112.89586,153.05537 h 2.3542 v -3.53134 h -2.3542 z" />
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.488935,143.50345 v -1.46477 l -0.529167,-1.97482 c -0.151631,-3.01052 2.420032,-1.5875 2.992008,-3.1149 0,-0.53454 0.01864,-2.24627 0.01864,-2.24627 0.05675,-2.60584 1.043224,-1.92914 2.46688,-2.40929 1.60607,-0.20898 1.8415,-0.62507 4.841234,-0.6962 2.24446,-0.003 4.56765,0.55708 6.87111,1.05833 0.85711,0.17831 0.90437,1.14686 0.80181,2.64583 0,0 -0.032,1.33686 0.11001,1.59223 -0.15109,1.24912 2.27124,0.87095 3.06499,1.84736 l 0.26458,1.4551 -0.52917,1.7199 v 1.46927"
+       id="path226318"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666679px;line-height:6.61458302px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="98.153404"
+       y="134.53134"
+       id="text221870"><tspan
+         sodipodi:role="line"
+         id="tspan221868"
+         x="98.153404"
+         y="134.53134"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666679px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">13G</tspan></text>
+    <g
+       id="g226544"
+       transform="translate(-4.426977,-22.752801)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path34214-3"
+         style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 97.381099,166.53151 h 2.704721 v -0.47084 h -2.704721 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34216-7"
+         style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 97.381099,166.53151 h 2.704721 v -0.47084 h -2.704721 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34218-6"
+         style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.31389618;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 97.339239,161.58765 v 0 c -0.30339,0 -0.54932,0.24592 -0.54932,0.54932 v 4.31607 c 0,0.30334 0.24593,0.54929 0.54932,0.54929 h 2.43267 c 0.303401,0 0.549321,-0.24595 0.549321,-0.54929 v -4.31607 c 0,-0.3034 -0.24592,-0.54932 -0.549321,-0.54932 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34220-8"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 97.731589,163.70643 h 0.70626 v -1.64795 h -0.70626 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34222-1"
+         style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 97.731589,163.70643 h 0.70626 v -1.64795 h -0.70626 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34224-3"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 98.908719,163.70643 h 0.70629 v -1.64795 h -0.70629 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34226-6"
+         style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 98.908719,163.70643 h 0.70629 v -1.64795 h -0.70629 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34228-4"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 97.966969,165.58982 h 1.41254 v -1.64795 h -1.41254 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34230-0"
+         style="fill:none;stroke:#b00000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 97.966969,165.58982 h 1.41254 v -1.64795 h -1.41254 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34338-3"
+         style="fill:#d00000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.00830545"
+         d="m 99.735279,166.41119 h 0.23544 v -0.23545 h -0.23544 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path34340-5"
+         style="fill:none;stroke:#000000;stroke-width:0.03923702;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
+         d="m 99.735279,166.41119 h 0.23544 v -0.23545 h -0.23544 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872-6-3-8-8"
+         d="m 99.261399,162.08845 v 1.30048"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-6-2)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path221872-6-3-5-46-5"
+         d="m 98.078619,163.66575 v -1.30048"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.14111111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-7-93-3)" />
+    </g>
+    <g
+       id="g226783-0"
+       transform="translate(8.4706457,8.7009403)">
+      <rect
+         ry="0.5433408"
+         y="132.38957"
+         x="90.851295"
+         height="1.8520966"
+         width="2.5466206"
+         id="rect226778-9"
+         style="opacity:0.93999999;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.14111111;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         id="text221870-4-7-9"
+         y="133.96593"
+         x="90.831787"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.76388943px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:-0.02116666px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#aa0000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.76388943px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';letter-spacing:-0.18520834px;fill:#aa0000;stroke-width:0.26458332px"
+           y="133.96593"
+           x="90.831787"
+           id="tspan221868-9-2-8"
+           sodipodi:role="line">1.5</tspan></text>
+    </g>
+    <a
+       xlink:href="scenario.html#configuring-simgrid"
+       transform="translate(-0.52916667)"
+       id="a6149">
+      <text
+         id="text1024-2-7"
+         y="126.93988"
+         x="64.221893"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.29166698px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-size:5.29166698px;stroke-width:0.26458332px"
+           y="126.93988"
+           x="64.221893"
+           id="tspan1022-4-5"
+           sodipodi:role="line">Config </tspan><tspan
+           style="font-size:5.29166698px;stroke-width:0.26458332px"
+           y="133.55446"
+           x="64.221893"
+           sodipodi:role="line"
+           id="tspan2827" /></text>
+    </a>
+    <rect
+       style="opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.67541802;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect834-3"
+       width="55.5625"
+       height="32.694939"
+       x="2.645833"
+       y="112.65922"
+       ry="5.2916684"
+       rx="3.9687512" />
+    <text
+       xml:space="preserve"
+       style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="13.577628"
+       y="119.51517"
+       id="text814-5"><tspan
+         sodipodi:role="line"
+         id="tspan812-6"
+         x="13.577628"
+         y="119.51517"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px">Domains</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="126.7122"
+       y="101.55618"
+       id="text1032-0-9-3-2"><tspan
+         sodipodi:role="line"
+         id="tspan1030-6-4-9-9"
+         x="126.7122"
+         y="101.55618"
+         style="font-size:4.23333311px;stroke-width:0.26458332px">operations</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="188.00551"
+       y="129.28072"
+       id="text1028-1-4-3-1"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6-2"
+         x="188.00551"
+         y="129.28072"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Exhaustive test</tspan><tspan
+         sodipodi:role="line"
+         x="188.00551"
+         y="132.3744"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+         id="tspan2707" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="186.86519"
+       y="144.73994"
+       id="text1028-1-4-3-1-7"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6-2-0"
+         x="186.86519"
+         y="144.73994"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Counter example</tspan><tspan
+         sodipodi:role="line"
+         x="186.86519"
+         y="147.83363"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+         id="tspan2707-9" /></text>
+    <a
+       id="a6168"
+       xlink:href="http://simgrid.gforge.inria.fr/contrib/R_visualization.php"
+       transform="translate(3.9099913)">
+      <text
+         id="text1028-1-4-3-1-5"
+         y="109.58816"
+         x="184.07834"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+           y="109.58816"
+           x="184.07834"
+           id="tspan1026-2-99-6-2-1"
+           sodipodi:role="line">R visualizations</tspan><tspan
+           id="tspan2707-0"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+           y="112.68185"
+           x="184.07834"
+           sodipodi:role="line" /></text>
+    </a>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="190.76848"
+       y="87.178818"
+       id="text1028-1-4-3-1-5-3"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6-2-1-7"
+         x="190.76848"
+         y="87.178818"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Textual logs</tspan><tspan
+         sodipodi:role="line"
+         x="190.76848"
+         y="90.272514"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;line-height:2.91041636px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px"
+         id="tspan2707-0-8" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="93.981499"
+       y="102.87907"
+       id="text1028-1-4-3-0-8"><tspan
+         sodipodi:role="line"
+         id="tspan1026-2-99-6-3-6"
+         x="93.981499"
+         y="102.87907"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">(paths)</tspan></text>
+    <a
+       id="a6164"
+       xlink:href="http://simgrid.gforge.inria.fr/contrib/smpi-calibration-doc/">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.29166698px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="84.122337"
+         y="126.93988"
+         id="text1024-2-7-6"><tspan
+           sodipodi:role="line"
+           id="tspan1022-4-5-7"
+           x="84.122337"
+           y="126.93988"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.29166698px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Calibration</tspan></text>
+    </a>
+    <g
+       id="g3055"
+       transform="translate(0,-1.4688305)">
+      <text
+         id="text1036-8"
+         y="138.77264"
+         x="4.5052948"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="138.77264"
+           x="4.5052948"
+           id="tspan1034-9"
+           sodipodi:role="line">Workflows</tspan></text>
+      <text
+         id="text1036-8-2-7"
+         y="138.77264"
+         x="48.294853"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="138.77264"
+           x="48.294853"
+           id="tspan1034-9-2-4"
+           sodipodi:role="line">Fog</tspan></text>
+    </g>
+    <g
+       id="g3061">
+      <text
+         id="text1036-8-7"
+         y="143.7269"
+         x="4.5881495"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="143.7269"
+           x="4.5881495"
+           id="tspan1034-9-8"
+           sodipodi:role="line">Volunteer</tspan></text>
+      <text
+         id="text1036-8-2-7-1"
+         y="143.7269"
+         x="49.219688"
+         style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;line-height:6.61458349px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.58611107px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Oblique';stroke-width:0.26458332px"
+           y="143.7269"
+           x="49.219688"
+           id="tspan1034-9-2-4-9"
+           sodipodi:role="line">IoT</tspan></text>
+    </g>
+    <a
+       id="a6158"
+       xlink:href="http://simgrid.gforge.inria.fr/contrib/R_visualization.php"
+       transform="translate(3.9099913)">
+      <image
+         width="27.781256"
+         height="16.668753"
+         preserveAspectRatio="none"
+         style="image-rendering:optimizeQuality"
+         xlink:href="data:image/png;base64,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 gg== "
+         id="image2454"
+         x="181.23958"
+         y="89.791664" />
+    </a>
+    <a
+       xlink:href="deployment.html"
+       id="a6179">
+      <text
+         id="text1024-2"
+         y="117.80719"
+         x="65.007576"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;line-height:6.61458349px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="fill:#000000;fill-opacity:1;stroke-width:0.26458332px"
+           y="117.80719"
+           x="65.007576"
+           id="tspan1022-4"
+           sodipodi:role="line">App Deployment</tspan></text>
+    </a>
+    <rect
+       style="display:inline;opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="ConfigBox"
+       width="18.520834"
+       height="7.9375086"
+       x="63.5"
+       y="121.54166"
+       ry="2.6458309"
+       inkscape:label="#rect1020-5-9-7" />
+    <rect
+       style="display:inline;opacity:0.93999999;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="Deployment"
+       width="51.59375"
+       height="7.9374981"
+       x="63.5"
+       y="112.28125"
+       ry="2.6458309"
+       inkscape:label="#rect1020-5-9-7" />
+  </g>
+</svg>
index 0be8937..13d7d83 100644 (file)
@@ -5,18 +5,24 @@ Welcome to SimGrid's documentation!
 
 .. toctree::
    :maxdepth: 1
-   :caption: Basic Use Cases:
+   :caption: Tutorials:
 
-       Simulating Algorithms <usecase_algorithms.rst>
-       Simulating MPI Apps <usecase_mpi.rst>
-   
-.. toctree::
-   :maxdepth: 1
-   :caption: Getting Started:
+       Simulating Algorithms <tuto_s4u.rst>
+       Simulating MPI Apps <tuto_mpi.rst>
 
-       What is SimGrid <main_concepts.rst>
-       Installing SimGrid <installation.rst>
-       Start your Own Project <install_yours.rst>
+.. toctree::
+   :maxdepth: 2
+   :caption: User Manual:
+
+      Introduction <introduction.rst>
+      Describing your Application <application.rst>
+      Describing the Virtual Platform <platform.rst>
+      Describing the Experimental Scenario <scenario.rst>
+      The SimGrid Models <models.rst>
+      Simulation Outcomes <outcomes.rst>
+      Use Cases and Howto <howto.rst>
+      The SimGrid Community <community.rst>
+      Frequently Asked Questions <faq.rst>
 
 .. toctree::
    :maxdepth: 2
similarity index 55%
rename from doc/doxygen/getting_started.doc
rename to docs/source/intro_concepts.rst
index f7a049a..e827426 100644 (file)
-/*! @page getting_started Getting Started: SimGrid Main Concepts
+.. First introduction
 
-@tableofcontents
+What is SimGrid
+===============
 
-SimGrid is a framework to simulate distributed computer systems. 
+SimGrid is a framework to simulate distributed computer systems.
 
-It can be used to either assess abstract algorithms, or to profile and
+It can be used to either assess abstract algorithms or to profile and
 debug real distributed applications.  SimGrid enables studies in the
 domains of (data-)Grids, IaaS Clouds, Clusters, High Performance
-Computing, Volunteer Computing and Peer-to-Peer systems.
+Computing, Volunteer Computing, and Peer-to-Peer systems.
 
 Technically speaking, SimGrid is a library. It is neither a graphical
 interface nor a command-line simulator running user scripts. The
 interaction with SimGrid is done by writing programs with the exposed
 functions to build your own simulator.
 
-SimGrid offers many features, many options and many possibilities. The
-documentation aims at smoothing the learning curve. But nothing's
-perfect, and this documentation is really no exception here. Please
-help us improving it by reporting any issue that you see and
-proposing the content that is still missing.
-
-SimGrid is a Free Software distributed under the LGPL licence. You are
-thus welcome to use it as you wish, or even to modify and distribute
-your version (as long as your version is as free as ours). It also
+SimGrid is a Free Software distributed under the LGPLv3 license. You are
+thus welcome to use it as you wish or even to modify and distribute
+your version (provided that your version is as free as ours). It also
 means that SimGrid is developed by a vivid community of users and
 developers. We hope that you will come and join us!
 
 SimGrid is the result of almost 20 years of research from several
-groups, both in France and in the USA. It benefited of many funding
-from various research instances, including the ANR, Inria, CNRS,
-University of Lorraine, University of Hawai'i at Manoa, ENS Rennes and
+groups, both in France and in the U.S.A. It benefited of many funding
+from various research bodies, including the ANR, Inria, CNRS,
+University of Lorraine, University of Hawai'i at Manoa, ENS Rennes, and
 many others. Many thanks to our generous sponsors!
 
-@section starting_components Typical Study based on SimGrid
+SimGrid is a powerful tool, but its learning curve can be rather
+steep. This manual will hopefully help and guide you to the features
+you want to use. Please report any issue that you see in this manual,
+including typos or unclear elements. You can even propose changes by
+clicking on the "Edit on GitLab" button at the top of every page.
+
+Typical Study based on SimGrid
+------------------------------
+
+.. raw:: html
+
+   <object data="graphical-toc.svg" width="100%" type="image/svg+xml"></object>
+
 
 Any SimGrid study entails the following components:
 
  - The studied **Application**. This can be either a distributed
    algorithm described in our simple APIs, or a full featured real
-   parallel application using for example the MPI interface 
-   @ref application "(more info)".
+   parallel application using for example the MPI interface
+   :ref:`(more info) <application>`.
 
  - The **Virtual Platform**. This is a description of a given
    distributed system (machines, links, disks, clusters, etc). Most of
    the platform files are written in XML althrough a Lua interface is
    under development.  SimGrid makes it easy to augment the Virtual
    Platform with a Dynamic Scenario where for example the links are
-   slowed down (because of external usage), the machines fail. You
+   slowed down (because of external usage) or the machines fail. You
    have even support to specify the applicative workload that you want
-   to feed to your application  @ref platform "(more info)".
+   to feed to your application
+   :ref:`(more info) <platform>`.
 
  - The application's **Deployment Description**. In SimGrid
    terminology, the application is an inert set of source files and
    binaries. To make it run, you have to describe how your application
    should be deployed on the virtual platform. You need to specify
-   which process is mapped on which host, along with their parameters
-   @ref deployment "(more info)".
+   which process is mapped on which machine, along with their parameters
+   :ref:`(more info) <scenario>`.
 
  - The **Platform Models**. They describe how the virtual platform
    reacts to the actions of the application. For example, they compute
    the time taken by a given communication on the virtual platform.
    These models are already included in SimGrid, and you only need to
    pick one and maybe tweak its configuration to get your results
-   @ref models "(more info)".
+   :ref:`(more info) <models>`.
 
 These components are put together to run a **simulation**, that is an
 experiment or a probe. The result of one or many simulation provides
-an **outcome** (logs, visualization, statistical analysis) that help
+an **outcome** (logs, visualization, or statistical analysis) that help
 answering the **question** targeted by this study.
 
-The questions that SimGrid can solve include the following:
+Here are some questions on which SimGrid is particularly relevant:
 
  - **Compare an Application to another**. This is the classical use
    case for scientists, who use SimGrid to test how the solution that
-   they contribute compares to the existing solutions from the
+   they contribute to compares to the existing solutions from the
    literature.
 
  - **Design the best Virtual Platform for a given Application.**
    Tweaking the platform file is much easier than building a new real
-   platform for testing purpose. SimGrid also allows co-design of the
-   platform and the application by modifying both of them.
+   platform for testing purpose. SimGrid also allows for the co-design 
+   of the platform and the application by modifying both of them.
 
  - **Debug Real Applications**. With real systems, is sometimes
    difficult to reproduce the exact run leading to the bug that you
-   are tracking. SimGrid gives you experimental reproducibility,
-   clairevoyance (you can explore every part of the system, and your
-   probe will not change the simulated state). It also makes it easy
-   to mock some parts of the real system that are not under study.
+   are tracking. With SimGrid, you are *clairvoyant* about your
+   *reproducible experiments*: you can explore every part of the
+   system, and your probe will not change the simulated state. It also
+   makes it easy to mock some parts of the real system that are not
+   under study.
 
 Depending on the context, you may see some parts of this process as
 less important, but you should pay close attention if you want to be
 confident in the results coming out of your simulations. In
-particular, you should not trust blindly your results but always
+particular, you should not blindly trust your results but always
 strive to double-check them. Likewise, you should question the realism
 of your input configuration, and we even encourage you to doubt (and
 check) the provided performance models.
 
-To ease such questionning, you really should logically separate these
+To ease such questioning, you really should logically separate these
 parts in your experimental setup. It is seen as a very bad practice to
-merge the application, the platform and the deployment all together.
-SimGrid is versatile and your milleage may vary, but you should start
+merge the application, the platform, and the deployment all together.
+SimGrid is versatile and your mileage may vary, but you should start
 with your Application specified as a C++ or Java program, using one of
 the provided XML platform file, and with your deployment in a separate
 XML file.
 
-@section starting_gears SimGrid Execution Modes
+SimGrid Execution Modes
+-----------------------
 
 Depending on the intended study, SimGrid can be run in several execution modes.
 
-** **Simulation Mode**. This is the most common execution mode, where you want
+**Simulation Mode**. This is the most common execution mode, where you want
 to study how your application behaves on the virtual platform under
 the experimental scenario.
 
 In this mode, SimGrid can provide information about the time taken by
 your application, the amount of energy dissipated by the platform to
-run your application and the detailed usage of each resource.
+run your application, and the detailed usage of each resource.
 
-** **Model-Checking Mode**. This can be seen as a sort of exhaustive
+**Model-Checking Mode**. This can be seen as a sort of exhaustive
 testing mode, where every possible outcome of your application is
 explored. In some sense, this mode tests your application for all
 possible platforms that you could imagine (and more).
 
 You just provide the application and its deployment (amount of
-processes and parameters), and the model-checker will litterally
+processes and parameters), and the model-checker will literally
 explore all possible outcomes by testing all possible message
 interleavings: if at some point a given process can either receive the
 message A first or the message B depending on the platform
@@ -131,15 +141,15 @@ arrives first, and then rewind to the same point to explore the
 scenario where B arrives first.
 
 This is a very powerful mode, where you can evaluate the correction of
-your application. It can verify either **safety properties** (asserts) 
+your application. It can verify either **safety properties** (asserts)
 or **liveless properties** stating for example that if a given event
-occures, then another given event will occur in a finite amount of
+occurs, then another given event will occur in a finite amount of
 steps. This mode is not only usable with the abstract algorithms
 developed on top of the SimGrid APIs, but also with real MPI
-applications (to some extend).
+applications (to some extent).
 
 The main limit of Model Checking lays in the huge amount of scenarios
-to explore. SimGrid tries to explore only non-redundent scenarios
+to explore. SimGrid tries to explore only non-redundant scenarios
 thanks to classical reduction techniques (such as DPOR and stateful
 exploration) but the exploration may well never finish if you don't
 carefully adapt your application to this mode.
@@ -153,8 +163,7 @@ because of a stupid bug.
 Another limit of this mode is that it does not use the performance
 models of the simulation mode. Time becomes discrete: You can say for
 example that the application took 42 steps to run, but there is no way
-to know the amount of seconds that it took or the amount of watts that
-it dissipated.
+to know how much time it took or the amount of watts that were dissipated.
 
 Finally, the model checker only explores the interleavings of
 computations and communications. Other factors such as thread
@@ -166,8 +175,8 @@ possible outcomes *from a given initial situation*. There is no way to
 prove the correction of your application in all generality with this
 tool.
 
-** **Benchmark Recording Mode**. During debug sessions, continuous
-integration testing and other similar use cases, you are often only
+**Benchmark Recording Mode**. During debug sessions, continuous
+integration testing, and other similar use cases, you are often only
 interested in the control flow. If your application apply filters to
 huge images split in small blocks, the filtered image is probably not
 what you are interested in. You are probably looking for a way to run
@@ -177,87 +186,83 @@ and replaced by a synthetic block using the cached information. The
 virtual platform will take this block into account without requesting
 the real hosting machine to benchmark it.
 
-@section starting_limits SimGrid Limits
+SimGrid Limits
+--------------
 
 This framework is by no means the perfect holly grail able to solve
-every problem on earth. 
+every problem on earth.
 
-** **SimGrid scope is limited to distributed systems.** Real-time
-multithreaded systems are not in the scope. You could probably tweak
-SimGrid for such studies (or the framework could possibily be extended
-in this direction), but another framework specifically targeting this
-usecase would probably be more suited.
+**SimGrid scope is limited to distributed systems.** Real-time
+multi-threaded systems are out of scope. You could probably tweak
+SimGrid for such studies (or the framework could possibly be extended
+in this direction), but another framework specifically targeting such a
+use case would probably be more suited.
 
-** **There is currently no support for IoT studies and wireless networks**. 
+**There is currently no support for wireless networks**.
 The framework could certainly be improved in this direction, but this
-is still to be done.
+still has to be done.
 
-** **There is no perfect model, only models adapted to your study.**
-The SimGrid models target fast, large studies yet requesting a
+**There is no perfect model, only models adapted to your study.**
+The SimGrid models target fast and large studies yet requesting
 realistic results. In particular, our models abstract away parameters
-and phenomenon that are often irrelevant to the realism in our
-context. 
+and phenomena that are often irrelevant to the realism in our
+context.
 
 SimGrid is simply not intended to any study that would mandate the
 abstracted phenomenon. Here are some **studies that you should not do
 with SimGrid**:
 
- - Studying the effect of L3 vs L2 cache effects on your application
- - Comparing variantes of TCP
+ - Studying the effect of L3 vs. L2 cache effects on your application
+ - Comparing kernel schedulers and policies
+ - Comparing variants of TCP
  - Exploring pathological cases where TCP breaks down, resulting in
    abnormal executions.
  - Studying security aspects of your application, in presence of
    malicious agents.
 
-@section starting_successes SimGrid Success Stories
+SimGrid Success Stories
+-----------------------
 
 SimGrid was cited in over 1,500 scientific papers (according to Google
 Scholar). Among them
-<a href="http://simgrid.gforge.inria.fr/Usages.php">over 200
-publications</a> (written by about 300 individuals) use SimGrid as a
-scientific instrument to conduct their experimental evaluation. These
-numbers do not count the articles contributing to SimGrid.
-This instrument was used in many research communities, such as 
-<a href="https://hal.inria.fr/inria-00580599/">High-Performance Computing</a>,
-<a href="http://dx.doi.org/10.1109/CLOUD.2015.125">Cloud Computing</a>,
-<a href="http://dl.acm.org/citation.cfm?id=2310096.2310195">Workflow Scheduling</a>,
-<a href="https://hal.inria.fr/hal-01199200/">Big Data</a> and
-<a href="http://dx.doi.org/10.1109/WSCAD-SSC.2012.18">MapReduce</a>,
-<a href="http://ieeexplore.ieee.org/document/7515695/">Data Grid</a>,
-<a href="http://www.sciencedirect.com/science/article/pii/S1569190X17301028">Volunteer Computing</a>,
-<a href="https://hal.archives-ouvertes.fr/hal-01152469/">Peer-to-Peer Computing</a>,
-<a href="http://dx.doi.org/10.1109/TPDS.2016.2613043">Network Architecture</a>,
-<a href="http://ieeexplore.ieee.org/document/7946412/">Fog Computing</a>, or
-<a href="https://hal.archives-ouvertes.fr/hal-01333471">Batch Scheduling</a>
-<a href="http://simgrid.gforge.inria.fr/Usages.php"><b>(more info)</b></a>.
+`over 200 publications <https://simgrid.org/Usages.html>`_
+(written by about 300 individuals) use SimGrid as a scientific
+instrument to conduct their experimental evaluation. These
+numbers do not include the articles contributing to SimGrid.
+This instrument was used in many research communities, such as
+`High-Performance Computing <https://hal.inria.fr/inria-00580599/>`_,
+`Cloud Computing <http://dx.doi.org/10.1109/CLOUD.2015.125>`_,
+`Workflow Scheduling <http://dl.acm.org/citation.cfm?id=2310096.2310195>`_,
+`Big Data <https://hal.inria.fr/hal-01199200/>`_ and
+`MapReduce <http://dx.doi.org/10.1109/WSCAD-SSC.2012.18>`_,
+`Data Grid <http://ieeexplore.ieee.org/document/7515695/>`_,
+`Volunteer Computing <http://www.sciencedirect.com/science/article/pii/S1569190X17301028>`_,
+`Peer-to-Peer Computing <https://hal.archives-ouvertes.fr/hal-01152469/>`_,
+`Network Architecture <http://dx.doi.org/10.1109/TPDS.2016.2613043>`_,
+`Fog Computing <http://ieeexplore.ieee.org/document/7946412/>`_, or
+`Batch Scheduling <https://hal.archives-ouvertes.fr/hal-01333471>`_
+`(more info) <https://simgrid.org/Usages.html>`_.
 
 If your platform description is accurate enough (see
-<a href="http://hal.inria.fr/hal-00907887">here</a> or
-<a href="https://hal.inria.fr/hal-01523608">there</a>),
+`here <http://hal.inria.fr/hal-00907887>`_ or
+`there <https://hal.inria.fr/hal-01523608>`_),
 SimGrid can provide high-quality performance predictions. For example,
-we determined the speedup achieved by the Tibidabo Arm-based
+we determined the speedup achieved by the Tibidabo ARM-based
 cluster before its construction
-(<a href="http://hal.inria.fr/hal-00919507">paper</a>). In this case, 
+(`paper <http://hal.inria.fr/hal-00919507>`_). In this case,
 some differences between the prediction and the real timings were due to
-misconfiguration or other problems with the real platforms. To some extent,
+misconfiguration or other problems with the real platform. To some extent,
 SimGrid could even be used to debug the real platform :)
 
-SimGrid is also used to debug, improve and tune several large
+SimGrid is also used to debug, improve, and tune several large
 applications.
-<a href="http://bigdft.org">BigDFT</a> (a massively parallel code
+`BigDFT <http://bigdft.org>`_ (a massively parallel code
 computing the electronic structure of chemical elements developped by
-the CEA), <a href="http://starpu.gforge.inria.fr/">StarPU</a> (a
+the CEA), `StarPU <http://starpu.gforge.inria.fr/>`_ (a
 Unified Runtime System for Heterogeneous Multicore Architectures
 developped by Inria Bordeaux) and
-<a href="https://tomp2p.net/dev/simgrid/">TomP2P</a> (a high performance
-key-value pair storage library developped at University of Zurich).
+`TomP2P <https://tomp2p.net/dev/simgrid/>`_ (a high performance
+key-value pair storage library developed at University of Zurich).
 Some of these applications enjoy large user communities themselves.
 
-@section starting_next Where to proceed next?
-
-Now that you know about the basic concepts of SimGrid, you can give it
-a try. If it's not done yet, first @ref install "install it". Then,
-proceed to the section on @ref application "describing the application" that
-you want to study.
-
-*/
\ No newline at end of file
+..  LocalWords:  SimGrid
similarity index 90%
rename from docs/source/installation.rst
rename to docs/source/intro_install.rst
index 640ac75..8ab5750 100644 (file)
@@ -1,11 +1,11 @@
-.. Copyright 2005-2018 
+.. Copyright 2005-2018
 
 .. _install:
 
 Installing SimGrid
 ==================
 
-   
+
 SimGrid should work out of the box on Linux, Mac OSX, FreeBSD, and Windows (under windows, only the Java interfaces are
 available at the moment).
 
@@ -18,31 +18,31 @@ Binaries for Linux
 On Debian or Ubuntu, simply type:
 
 .. code-block:: shell
-   
+
    apt install simgrid
 
 If you build pre-compiled packages for other distributions, drop us an
 email.
-   
+
 Stable Java Package
 ^^^^^^^^^^^^^^^^^^^
 
 The jar file can be retrieved from the `Release page
 <https://framagit.org/simgrid/simgrid/tags>`_. This file is
-self-contained, including the native components for Linux, Mac OSX and
+self-contained, including the native components for Linux, Mac OS X and
 Windows. Copy it to your project's classpath and you're set.
 
 Nightly built Java Package
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-For non-Windows systems (Linux, Mac or FreeBSD), head to `Jenkins <https://ci.inria.fr/simgrid/job/SimGrid>`_.
-In the build history, pick the last green (or at least yellow) build that is not blinking (i.e., not currently under 
-build). In the list, pick a system that is close to yours, and click on the ball in the Debug row. The build artefact 
-will appear on the top of the resulting page.
+For non-Windows systems (Linux, Mac OS X, or FreeBSD), head to `Jenkins <https://ci.inria.fr/simgrid/job/SimGrid>`_.
+In the build history, pick the last green (or at least yellow) build that is not blinking (i.e., not currently under
+build). In the list, pick a system that is close to yours, and click on the ball in the Debug row. The build artefact
+will appear at the top of the resulting page.
 
 For Windows, head to `AppVeyor <https://ci.appveyor.com/project/simgrid/simgrid>`_.
 Click on the artefact link on the right, and grab your file. If the latest build failed, there will be no artefact. Then
-you will need to first click on "History" on the top and search for the last successful build.
+you will need to first click on "History" at the top and look for the last successful build.
 
 Binary Java Troubleshooting
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -58,14 +58,14 @@ Library not found: boost-context
    machine, for example with ``apt``.
 
 .. _install_src:
-   
+
 Installing from the Source
 --------------------------
 
 Getting the Dependencies
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
-C++ compiler (either g++, clang or icc).
+C++ compiler (either g++, clang, or icc).
   We use the C++11 standard, and older compilers tend to fail on
   us. It seems that g++ 5.0 or higher is required nowadays (because of
   boost).  SimGrid compiles well with `clang` or `icc` too.
@@ -77,10 +77,10 @@ cmake (v2.8.8).
   configuration options (e.g., if your python installation is not standard).
 boost (at least v1.48, v1.59 recommended)
   - On Debian / Ubuntu: ``apt install libboost-dev libboost-context-dev``
-  - On Max OS X with homebrew: ``brew install boost``  
+  - On Max OS X with homebrew: ``brew install boost``
 Java (optional):
   - Debian / Ubuntu: ``apt install default-jdk libgcj18-dev`` (or
-    any version of libgcj)      
+    any version of libgcj)
   - Mac OS X or Windows: Grab a `full JDK <http://www.oracle.com/technetwork/java/javase/downloads>`_
 Lua (optional -- must be v5.3)
   - SimGrid won't work with any other version of Lua.
@@ -114,7 +114,7 @@ and recompile it as with stable archives. You may need some extra
 dependencies.
 
 .. code-block:: shell
+
    git clone git@framagit.org:simgrid/simgrid.git
    cd simgrid
    cmake -DCMAKE_INSTALL_PREFIX=/opt/simgrid .
@@ -134,7 +134,7 @@ Generic build-time options
 """"""""""""""""""""""""""
 
 These options specify for example the path to various system elements
-(Python path, compiler to use, etc). In most case, cmake automatically
+(Python path, compiler to use, etc). In most case, CMake automatically
 discovers the right value for these ones, but you can set them
 manually on need.  Notable such variables include ``CC`` and ``CXX``,
 defining respectively the paths to the C and C++ compilers, ``CFLAGS``
@@ -146,7 +146,7 @@ The best way to discover the exact name of the option that you need to
 change is to press ``t`` in the ``ccmake`` graphical interface, as all
 options are shown (and documented) in the advanced mode.
 
-Once you know their name, there is several ways to change the value of
+Once you know their name, there are several ways to change the values of
 build-time options. You can naturally use the ccmake graphical
 interface for that, or you can use environment variables, or you can
 prefer the ``-D`` flag of ``cmake``.
@@ -155,7 +155,7 @@ For example, you can change the compilers with environment variables
 by issuing these commands before launching cmake:
 
 .. code-block:: shell
+
    export CC=gcc-5.1
    export CXX=g++-5.1
 
@@ -169,15 +169,15 @@ Note that the ending dot is mandatory (see :ref:`install_cmake_outsrc`).
 SimGrid compilation options
 """""""""""""""""""""""""""
 
-Here is the list of all SimGrid-specific build-time options (the
+Here is the list of all SimGrid-specific compile-time options (the
 default choice is in uppercase).
 
 CMAKE_INSTALL_PREFIX (path)
   Where to install SimGrid (/opt/simgrid, /usr/local, or elsewhere).
-  
+
 enable_compile_optimizations (ON/off)
   Request the compiler to produce efficient code. You probably want to
-  activate this option, unless you plan modify SimGrid itself: 
+  activate this option, unless you plan modify SimGrid itself:
   efficient code takes more time to compile, and appears mangled to debuggers.
 
 enable_compile_warnings (on/OFF)
@@ -187,9 +187,9 @@ enable_compile_warnings (on/OFF)
   regular user, this option is of little use.
 
 enable_debug (ON/off)
-  Disabling this option toto discards all log messages of gravity
+  Disabling this option discards all log messages of gravity
   debug or below at compile time (see @ref XBT_log). The resulting
-  code is faster than if you discarding these messages at
+  code is faster than if you discard these messages at
   runtime. However, it obviously becomes impossible to get any debug
   info from SimGrid if something goes wrong.
 
@@ -200,7 +200,7 @@ enable_java (on/OFF)
   Generates the java bindings of SimGrid.
 
 enable_jedule (on/OFF)
-  Produces execution traces from SimDag simulations, that can then be visualized with the 
+  Produces execution traces from SimDag simulations, that can then be visualized with the
   Jedule external tool.
 
 enable_lua (on/OFF)
@@ -215,11 +215,11 @@ enable_lto (ON/off)
   with older gcc versions.
 
 enable_maintainer_mode (on/OFF)
-  (dev only) Regenerates the XML parsers when the dtd is modified (requires flex and flexml).
+  (dev only) Regenerates the XML parsers whenever the DTD is modified (requires flex and flexml).
 
 enable_mallocators (ON/off)
   Activates our internal memory caching mechanism. This produces faster
-  code, but it may fool the debuggers. 
+  code, but it may fool the debuggers.
 
 enable_model-checking (on/OFF)
   Activates the formal verification mode. This will **hinder
@@ -241,7 +241,7 @@ enable_smpi_MPICH3_testsuite (on/OFF)
 Reset the build configuration
 """""""""""""""""""""""""""""
 
-To empty the cmake cache (either when you add a new library or when
+To empty the CMake cache (either when you add a new library or when
 things go seriously wrong), simply delete your ``CMakeCache.txt``. You
 may also want to directly edit this file in some circumstances.
 
@@ -281,7 +281,7 @@ In addition, several compilation targets are provided in SimGrid. If
 your system is well configured, the full list of targets is available
 for completion when using the ``Tab`` key. Note that some of the
 existing targets are not really for public consumption so don't worry
-if some stuff doesn't work for you.
+if some do not work for you.
 
 - **make simgrid**: Build only the SimGrid library and not any example
 - **make s4u-app-pingpong**: Build only this example (works for any example)
@@ -314,11 +314,11 @@ on `our Jenkins <https://ci.inria.fr/simgrid/>`_.
 .. code-block:: shell
 
   ctest                            # Launch all tests
-  ctest -R s4u              # Launch only the tests which name match the string "s4u"
+  ctest -R s4u              # Launch only the tests whose names match the string "s4u"
   ctest -j4                 # Launch all tests in parallel, at most 4 concurrent jobs
   ctest --verbose           # Display all details on what's going on
   ctest --output-on-failure # Only get verbose for the tests that fail
-  
+
   ctest -R s4u -j4 --output-on-failure # You changed S4U and want to check that you didn't break anything, huh?
                                        # That's fine, I do so all the time myself.
 
@@ -330,24 +330,24 @@ Mac OS X Specifics
 SimGrid compiles like a charm with clang (version 3.0 or higher) on Mac OS X:
 
 .. code-block:: shell
-               
+
   cmake -DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++ .
   make
 
 
 Troubleshooting your Mac OS X build.
-  
+
 CMake Error: Parse error in cache file build_dir/CMakeCache.txt. Offending entry: /SDKs/MacOSX10.8.sdk
   This was reported with the XCode version of clang 4.1. The work
   around is to edit the ``CMakeCache.txt`` file directly, to change
   the following entry:
-               
+
   ``CMAKE_OSX_SYSROOT:PATH=/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer``
 
   You can safely ignore the warning about "-pthread" not being used, if it appears.
-  
+
 /usr/include does not seem to exist
-  This directory does not exist by default on modern Mac OSX versions,
+  This directory does not exist by default on modern Mac OS X versions,
   and you may need to create it with ``xcode-select -install``
 
 .. _install_cmake_windows:
@@ -382,7 +382,7 @@ things should be as simple as:
    make  simgrid-java_jar # Only build the jarfile
 
 After the compilation, the file ```simgrid.jar``` is produced in the
-root directory. 
+root directory.
 
 **Troubleshooting Java Builds**
 
@@ -397,9 +397,9 @@ Sometimes, the build system fails to find the JNI headers. First locate them as
 
 
 Then, set the JAVA_INCLUDE_PATH environment variable to the right
-path, and relaunch cmake. If you have several version of jni installed
+path, and relaunch cmake. If you have several versions of JNI installed
 (as above), pick the one corresponding to the report of
-``javac -version`` 
+``javac -version``
 
 .. code-block:: shell
 
@@ -412,7 +412,7 @@ Note that the filename ```jni.h``` was removed from the path.
 Linux Multi-Arch Specifics
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-On a multiarch x86_64 Linux, it should be possible to compile a 32 bit
+On a multiarch x86_64 Linux, it should be possible to compile a 32-bit
 version of SimGrid with something like:
 
 .. code-block:: shell
@@ -429,7 +429,7 @@ version of SimGrid with something like:
 If needed, implement ``i686-linux-gnu-gfortran`` as a script:
 
 .. code-block:: shell
-               
+
   #!/usr/bin/env sh
   exec gfortran -m32 "$@"
 
similarity index 92%
rename from docs/source/install_yours.rst
rename to docs/source/intro_yours.rst
index 2258c4c..727330b 100644 (file)
@@ -3,16 +3,16 @@
 Start your Own Project
 ======================
 
-It is not advised to modify the simgrid source code directly, as it
+It is not advised to modify the SimGrid source code directly, as it
 will make it difficult to upgrade to the next version of SimGrid.
 Instead, you should create your own working directory somewhere on
-your disk (say `/home/joe/MyFirstScheduler/`), and write your code in
-there. 
+your disk (say `/home/joe/MyFirstSimulator/`), and write your code in
+there.
 
 Cloning a Template Project for S4U
 ----------------------------------
 
-If you plan to use the modern S4U interface of SimGrid, the easiest is
+If you plan to use the modern S4U interface of SimGrid, the easiest way is
 to clone the `Template Project
 <https://framagit.org/simgrid/simgrid-template-s4u>`_ directly. It
 contains the necessary configuration to use cmake and S4U together.
@@ -31,13 +31,13 @@ your project. It builds two simulators from a given set of source files.
 
    cmake_minimum_required(VERSION 2.8.8)
    project(MyFirstSimulator)
-   
+
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-   
+
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
    find_package(SimGrid REQUIRED)
    include_directories(${SimGrid_INCLUDE_DIR})
-   
+
    set(SIMULATOR_SOURCES main.c other.c util.c)
    add_executable(my_simulator ${SIMULATOR_SOURCES})
    target_link_libraries(my_simulator ${SimGrid_LIBRARY})
@@ -52,7 +52,7 @@ For that, you need `FindSimGrid.cmake
 that is located at the root of the SimGrid tree. You can either copy
 this file into the `cmake/Modules` directory of your project, or use
 the version installed on the disk. Both solutions present advantages
-and drawback: if you copy the file, you have to keep it in sync
+and drawbacks: if you copy the file, you have to keep it in sync
 manually but your project will produce relevant error messages when
 trying to compile on a machine where SimGrid is not installed. Please
 also refer to the file header for more information.
@@ -62,8 +62,8 @@ Building your project with Makefile
 
 Here is a Makefile that will work if your project is composed of three
 C files named ``util.h``, ``util.c`` and ``mysimulator.c``. You should
-take it as a starting point, and adapt it to your code. There is a
-plenty of documentation and tutorial on Makefile if the file's
+take it as a starting point, and adapt it to your code. There are
+plenty of documentation and tutorials on Makefile if the file's
 comments are not enough for you.
 
 .. code-block:: makefile
@@ -75,7 +75,7 @@ comments are not enough for you.
    # This second rule lists the dependencies of the mysimulator binary
    # How this dependencies are linked is described in an implicit rule below
    mysimulator: mysimulator.o util.o
-   
+
    # These third give the dependencies of the each source file
    mysimulator.o: mysimulator.c util.h # list every .h that you use
    util.o: util.c util.h
@@ -90,18 +90,18 @@ comments are not enough for you.
 
    # CFLAGS = -g -O0 $(WARNINGS) # Use this line to make debugging easier
    CFLAGS = -g -O2 $(WARNINGS) # Use this line to get better performance
-   
+
    # No change should be mandated past that line
    #############################################
    # The following are implicit rules, used by default to actually build
    # the targets for which you listed the dependencies above.
-   
+
    # The blanks before the $(CC) must be a Tab char, not spaces
    %: %.o
        $(CC) -L$(SIMGRID_INSTALL_PATH)/lib/    $(CFLAGS) $^ -lsimgrid -o $@
    %.o: %.c
        $(CC) -I$(SIMGRID_INSTALL_PATH)/include $(CFLAGS) -c -o $@ $<
-   
+
    clean:
        rm -f *.o *~
    .PHONY: clean
@@ -115,7 +115,8 @@ Eclipse. You have to run cmake and import it as a Makefile project.
 Next you have to activate C++11 in your build settings, add -std=c++11
 in the CDT GCC Built-in compiler settings.
 
-.. image:: images/eclipseScreenShot.png
+.. image:: /img/eclipseScreenShot.png
+   :align: center
 
 
 Building the Java examples in Eclipse
@@ -146,13 +147,13 @@ Troubleshooting your Project Setup
 Library not found
 ^^^^^^^^^^^^^^^^^
 
-When the library cannot be found, you will get such an error message similar:
+When the library cannot be found, you will get such an error message similar to:
 
 .. code-block:: shell
 
   ./masterworker1: error while loading shared libraries: libsimgrid.so: cannot open shared object file: No such file or directory
 
-To fix this, give the path to where you installed the library into the
+To fix this, add the path to where you installed the library to the
 ``LD_LIBRARY_PATH`` variable. You can add the following line to your
 ``~/.bashrc`` so that it gets executed each time you log into your
 computer.
@@ -166,7 +167,7 @@ Many undefined references
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 .. code-block:: shell
-               
+
   masterworker.c:209: undefined reference to `sg_version_check'
   masterworker.c:209: undefined reference to `MSG_init_nocheck'
   (and many other undefined references)
@@ -180,7 +181,7 @@ Only a few undefined references
 
 Sometimes, the compilation only spits very few "undefined reference"
 errors. A possible cause is that the system selected an old version of
-the SimGrid library somewhere on your disk. 
+the SimGrid library somewhere on your disk.
 
 Dicover which version is used with ``ldd name-of-yoursimulator``.
 Once you've found the obsolete copy of SimGrid, just erase it, and
diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst
new file mode 100644 (file)
index 0000000..1699548
--- /dev/null
@@ -0,0 +1,8 @@
+Introduction
+************
+
+.. include:: intro_concepts.rst
+
+.. include:: intro_install.rst
+
+.. include:: intro_yours.rst
index 051dddd..fa58412 100644 (file)
@@ -3,7 +3,7 @@
 What is SimGrid
 ===============
 
-SimGrid is a framework to simulate distributed computer systems. 
+SimGrid is a framework to simulate distributed computer systems.
 
 It can be used to either assess abstract algorithms, or to profile and
 debug real distributed applications.  SimGrid enables studies in the
@@ -40,7 +40,7 @@ Any SimGrid study entails the following components:
 
  - The studied **Application**. This can be either a distributed
    algorithm described in our simple APIs, or a full featured real
-   parallel application using for example the MPI interface 
+   parallel application using for example the MPI interface
    @ref application "(more info)".
 
  - The **Virtual Platform**. This is a description of a given
@@ -134,7 +134,7 @@ arrives first, and then rewind to the same point to explore the
 scenario where B arrives first.
 
 This is a very powerful mode, where you can evaluate the correction of
-your application. It can verify either **safety properties** (asserts) 
+your application. It can verify either **safety properties** (asserts)
 or **liveless properties** stating for example that if a given event
 occures, then another given event will occur in a finite amount of
 steps. This mode is not only usable with the abstract algorithms
@@ -184,7 +184,7 @@ SimGrid Limits
 --------------
 
 This framework is by no means the perfect holly grail able to solve
-every problem on earth. 
+every problem on earth.
 
 ** **SimGrid scope is limited to distributed systems.** Real-time
 multithreaded systems are not in the scope. You could probably tweak
@@ -192,7 +192,7 @@ SimGrid for such studies (or the framework could possibily be extended
 in this direction), but another framework specifically targeting this
 usecase would probably be more suited.
 
-** **There is currently no support for IoT studies and wireless networks**. 
+** **There is currently no support for IoT studies and wireless networks**.
 The framework could certainly be improved in this direction, but this
 is still to be done.
 
@@ -200,7 +200,7 @@ is still to be done.
 The SimGrid models target fast, large studies yet requesting a
 realistic results. In particular, our models abstract away parameters
 and phenomenon that are often irrelevant to the realism in our
-context. 
+context.
 
 SimGrid is simply not intended to any study that would mandate the
 abstracted phenomenon. Here are some **studies that you should not do
@@ -220,9 +220,9 @@ SimGrid was cited in over 1,500 scientific papers (according to Google
 Scholar). Among them
 `over 200 publications <http://simgrid.gforge.inria.fr/Usages.php>`_
 (written by about 300 individuals) use SimGrid as a scientific
-instrument to conduct their experimental evaluation. These 
+instrument to conduct their experimental evaluation. These
 numbers do not count the articles contributing to SimGrid.
-This instrument was used in many research communities, such as 
+This instrument was used in many research communities, such as
 `High-Performance Computing <https://hal.inria.fr/inria-00580599/>`_,
 `Cloud Computing <http://dx.doi.org/10.1109/CLOUD.2015.125>`_,
 `Workflow Scheduling <http://dl.acm.org/citation.cfm?id=2310096.2310195>`_,
@@ -242,7 +242,7 @@ If your platform description is accurate enough (see
 SimGrid can provide high-quality performance predictions. For example,
 we determined the speedup achieved by the Tibidabo Arm-based
 cluster before its construction
-(`paper <http://hal.inria.fr/hal-00919507>`_). In this case, 
+(`paper <http://hal.inria.fr/hal-00919507>`_). In this case,
 some differences between the prediction and the real timings were due to
 misconfiguration or other problems with the real platforms. To some extent,
 SimGrid could even be used to debug the real platform :)
diff --git a/docs/source/models.rst b/docs/source/models.rst
new file mode 100644 (file)
index 0000000..ef590e6
--- /dev/null
@@ -0,0 +1,11 @@
+.. _models:
+
+The SimGrid Models
+==================
+
+.. todo::
+
+   - Main existing models (contention, cste, LM07)
+   - Main concepts (Routing, LMM) + link to the papers
+   - How to switch on the command line
+
diff --git a/docs/source/platform.rst b/docs/source/platform.rst
new file mode 100644 (file)
index 0000000..b2209b0
--- /dev/null
@@ -0,0 +1,16 @@
+.. _platform:
+
+.. raw:: html
+
+   <object id="TOC" data="graphical-toc.svg" width="100%" type="image/svg+xml"></object>
+   <script>
+   window.onload=function() { // Wait for the SVG to be loaded before changing it
+     var elem=document.querySelector("#TOC").contentDocument.getElementById("PlatformBox")
+     elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1";
+   }
+   </script>
+   <br/>
+   <br/>
+
+Describing your Virtual Platform
+================================
diff --git a/docs/source/scenar_config.rst b/docs/source/scenar_config.rst
new file mode 100644 (file)
index 0000000..671a6b0
--- /dev/null
@@ -0,0 +1,16 @@
+.. _options:
+
+Configuring SimGrid
+===================
+
+.. raw:: html
+
+   <object id="TOC" data="graphical-toc.svg" width="100%" type="image/svg+xml"></object>
+   <script>
+   window.onload=function() { // Wait for the SVG to be loaded before changing it
+     var elem=document.querySelector("#TOC").contentDocument.getElementById("ConfigBox")
+     elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1";
+   }
+   </script>
+   <br/>
+   <br/>
diff --git a/docs/source/scenario.rst b/docs/source/scenario.rst
new file mode 100644 (file)
index 0000000..43d927a
--- /dev/null
@@ -0,0 +1,18 @@
+.. _scenario:
+
+Describing the Experimental Scenario
+************************************
+
+.. todo::
+
+   Main concepts:
+
+   - Deployment file
+   - Availability and state profiles
+   - Reproducible random number generation
+   - Command line options, in particular on the model switching
+
+.. include:: scenar_config.rst
+
+
+            
diff --git a/docs/source/tuto_s4u.rst b/docs/source/tuto_s4u.rst
new file mode 100644 (file)
index 0000000..70818ed
--- /dev/null
@@ -0,0 +1,704 @@
+.. _usecase_simalgo:
+
+Simulating Algorithms
+=====================
+
+SimGrid was conceived as a tool to study distributed algorithms. Its
+modern :ref:`S4U interface <S4U_doc>` makes it easy to assess Cloud,
+P2P, HPC, IoT and similar settings.
+
+A typical SimGrid simulation is composed of several |Actors|_, that
+execute user-provided functions. The actors have to explicitly use the
+S4U interface to express their computation, communication, disk usage
+and other |Activities|_, so that they get reflected within the
+simulator. These activities take place on **Resources** (|Hosts|_,
+|Links|_, |Storages|_). SimGrid predicts the time taken by each
+activity and orchestrates accordingly the actors waiting for the
+completion of these activities.
+
+Each actor executes a user-provided function on a simulated |Host|_
+with which it can interact. Communications are not directly sent to
+actors, but posted onto a |Mailbox|_ that serve as rendez-vous point
+between communicating processes.
+
+.. |Actors| replace:: **Actors**
+.. _Actors: api/classsimgrid_1_1s4u_1_1Actor.html
+
+.. |Activities| replace:: **Activities**
+.. _Activities: api/classsimgrid_1_1s4u_1_1Activity.html
+
+.. |Hosts| replace:: **Hosts**
+.. _Hosts: api/classsimgrid_1_1s4u_1_1Host.html
+
+.. |Links| replace:: **Links**
+.. _Links: api/classsimgrid_1_1s4u_1_1Link.html
+
+.. |Storages| replace:: **Storages**
+.. _Storages: api/classsimgrid_1_1s4u_1_1Storage.html
+
+.. |VirtualMachines| replace:: **VirtualMachines**
+.. _VirtualMachines: api/classsimgrid_1_1s4u_1_1VirtualMachine.html
+
+.. |Host| replace:: **Host**
+.. _Host: api/classsimgrid_1_1s4u_1_1Host.html
+
+.. |Link| replace:: **Link**
+.. _Link: api/classsimgrid_1_1s4u_1_1Link.html
+
+.. |Mailbox| replace:: **Mailbox**
+.. _Mailbox: api/classsimgrid_1_1s4u_1_1Mailbox.html
+
+.. |Barrier| replace:: **Barrier**
+.. _Barrier: api/classsimgrid_1_1s4u_1_1Barrier.html
+
+.. |ConditionVariable| replace:: **ConditionVariable**
+.. _ConditionVariable: api/classsimgrid_1_1s4u_1_1ConditionVariable.html
+
+.. |Mutex| replace:: **Mutex**
+.. _Mutex: api/classsimgrid_1_1s4u_1_1Mutex.html
+
+
+**In the remainder of this tutorial**, you will discover a simple yet
+fully functioning example of SimGrid simulation: the Master/Workers
+application. We will detail each part of the code and necessary
+configuration to make it working.  After this tour, several exercises
+are proposed to let you discover some of the SimGrid features, hands
+on the keyboard. This practical session will be given in C++, that you
+are supposed to know beforehand.
+
+
+Discover the Master/Workers
+---------------------------
+
+This section introduces a first example of SimGrid simulation. This
+simple application is composed of two kind of actors: the **master**
+is in charge of distributing some computational tasks to a set of
+**workers** that execute them.
+
+.. image:: /tuto_s4u/img/intro.svg
+   :align: center
+
+We first present a round-robin version of this application, where the
+master dispatches the tasks to the workers, one after the other, until
+all tasks are dispatched. Later in this tutorial, you will be given
+the opportunity to improve this scheme.
+
+The Actors
+..........
+
+Let's start with the code of the worker. It is represented by the
+*master* function below. This simple function takes at least 3
+parameters (the amount of tasks to dispatch, their computational size
+in flops to compute and their communication size in bytes to
+exchange). Every parameter after the third one must be the name of an
+host on which a worker is waiting for something to compute.
+
+Then, the tasks are sent one after the other, each on a mailbox named
+after the worker's hosts. On the other side, a given worker (which
+code is given below) wait for incoming tasks on its own
+mailbox.
+
+
+
+At the end, once all tasks are dispatched, the master dispatches
+another task per worker, but this time with a negative amount of flops
+to compute. Indeed, this application decided by convention, that the
+workers should stop when encountering such a negative compute_size.
+
+At the end of the day, the only SimGrid specific functions used in
+this example are :cpp:func:`simgrid::s4u::Mailbox::by_name` and
+:cpp:func:`simgrid::s4u::Mailbox::put`. Also, :c:macro:`XBT_INFO` is used
+as a replacement to printf() or to cout to ensure that the messages
+are nicely logged along with the simulated time and actor name.
+
+
+.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
+   :language: c++
+   :start-after: master-begin
+   :end-before: master-end
+
+Here comes the code of the worker actors. This function expects no
+parameter from its vector of strings. Its code is very simple: it
+expects messages on the mailbox that is named after its own host. As long as it gets valid
+computation requests (whose compute_amount is positive), it compute
+this task and waits for the next one.
+
+The worker retrieves its own host with
+:cpp:func:`simgrid::s4u::this_actor::get_host`. The
+:ref:`simgrid::s4u::this_actor <namespace_simgrid__s4u__this_actor>`
+namespace contains many such helping functions.
+
+.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
+   :language: c++
+   :start-after: worker-begin
+   :end-before: worker-end
+
+Starting the Simulation
+.......................
+
+And this is it. In only a few lines, we defined the algorithm of our
+master/workers examples.
+
+That being said, an algorithm alone is not enough to define a
+simulation: SimGrid is a library, not a program. So you need to define
+your own ``main()`` function as follows. This function is in charge of
+creating a SimGrid simulation engine (on line 3), register the actor
+functions to the engine (on lines 7 and 8), load the virtual platform
+from its description file (on line 11), map actors onto that platform
+(on line 12) and run the simulation until its completion on line 15.
+
+.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
+   :language: c++
+   :start-after: main-begin
+   :end-before: main-end
+   :linenos:
+
+As you can see, this also requires a platform file and a deployment
+file.
+
+Platform File
+.............
+
+Platform files define the virtual platform on which the provided
+application will take place. In contains one or several **Network
+Zone** |api_s4u_NetZone|_ that contain both |Host|_ and |Link|_
+Resources, as well as routing information.
+
+Such files can get rather long and boring, so the example below is
+only an excerpts of the full ``examples/platforms/small_platform.xml``
+file. For example, most routing information are missing, and only the
+route between the hosts Tremblay and Fafard is given. This path
+traverses 6 links (named 4, 3, 2, 0, 1 and 8). There are several
+examples of platforms in the archive under ``examples/platforms``.
+
+.. |api_s4u_NetZone| image:: /img/extlink.png
+   :align: middle
+   :width: 12
+.. _api_s4u_NetZone: api/classsimgrid_1_1s4u_1_1NetZone.html#class-documentation
+
+.. |api_s4u_Link| image:: /img/extlink.png
+   :align: middle
+   :width: 12
+.. _api_s4u_Link: api/classsimgrid_1_1s4u_1_1Link.html#class-documentation
+
+.. literalinclude:: ../../examples/platforms/small_platform.xml
+   :language: xml
+   :lines: 1-10,12-20,56-62,192-
+   :caption: (excerpts of the small_platform.xml file)
+
+Deployment File
+...............
+
+Deployment files specify the execution scenario: it lists the actors
+that should be started, along with their parameter. In the following
+example, we start 6 actors: one master and 5 workers.
+
+.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers_d.xml
+   :language: xml
+
+Execution Example
+.................
+
+This time, we have all parts: once the program is compiled, we can
+execute it as follows. Note how the XBT_INFO() requests turned into
+informative messages.
+
+.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers.tesh
+   :language: shell
+   :start-after: s4u-app-masterworkers-fun
+   :prepend: $$$ ./masterworkers platform.xml deploy.xml
+   :append: $$$
+   :dedent: 2
+
+
+Improve it Yourself
+-------------------
+
+In this section, you will modify the example presented earlier to
+explore the quality of the proposed algorithm. For now, it works and
+the simulation prints things, but the truth is that we have no idea of
+whether this is a good algorithm to dispatch tasks to the workers.
+This very simple setting raises many interesting questions:
+
+.. image:: /tuto_s4u/img/question.svg
+   :align: center
+
+- Which algorithm should the master use? Or should the worker decide
+  by themselves?
+
+    Round Robin is not an efficient algorithm when all tasks are not
+    processed at the same speed.  It would probably be more efficient
+    if the workers were asking for tasks when ready.
+
+- Should tasks be grouped in batches or sent separately?
+
+    The workers will starve if they don't get the tasks fast
+    enough. One possibility to reduce latency would be to send tasks
+    in pools instead of one by one. But if the pools are too big, the
+    load balancing will likely get uneven, in particular when
+    distributing the last tasks.
+
+- How does the quality of such algorithm dependent on the platform
+  characteristics and on the task characteristics?
+
+    Whenever the input communication time is very small compared to
+    processing time and workers are homogeneous, it is likely that the
+    round-robin algorithm performs very well. Would it still hold true
+    when transfer time is not negligible? What if some tasks are
+    performed faster on some specific nodes?
+
+- The network topology interconnecting the master and the workers
+  may be quite complicated. How does such a topology impact the
+  previous result?
+
+    When data transfers are the bottleneck, it is likely that a good
+    modeling of the platform becomes essential. The SimGrid platform
+    models are particularly handy to account for complex platform
+    topologies.
+
+- What is the best applicative topology?
+
+    Is a flat master worker deployment sufficient? Should we go for a
+    hierarchical algorithm, with some forwarders taking large pools of
+    tasks from the master, each of them distributing their tasks to a
+    sub-pool of workers? Or should we introduce super-peers,
+    dupplicating the master's role in a peer-to-peer manner?  Do the
+    algorithms require a perfect knowledge of the network?
+
+- How is such an algorithm sensitive to external workload variation?
+
+    What if bandwidth, latency and computing speed can vary with no
+    warning?  Shouldn't you study whether your algorithm is sensitive
+    to such load variations?
+
+- Although an algorithm may be more efficient than another, how does
+  it interfere with unrelated applications executing on the same
+  facilities?
+
+**SimGrid was invented to answer such questions.** Do not believe the
+fools saying that all you need to study such settings is a simple
+discrete event simulator. Do you really want to reinvent the wheel,
+debug and optimize your own tool, and validate its models against real
+settings for ages, or do you prefer to sit on the shoulders of a
+giant? With SimGrid, you can focus on your algorithm. The whole
+simulation mechanism is already working.
+
+Here is the visualization of a SimGrid simulation of two master worker
+applications (one in light gray and the other in dark gray) running in
+concurrence and showing resource usage over a long period of time. It
+was obtained with the Triva software.
+
+.. image:: /tuto_s4u/img/result.png
+   :align: center
+
+Using Docker
+............
+
+The easiest way to take the tutorial is to use the dedicated Docker
+image. Once you `installed Docker itself
+<https://docs.docker.com/install/>`_, simply do the following:
+
+.. code-block:: shell
+
+   docker pull simgrid/tuto-s4u
+   docker run -it --rm --name simgrid --volume ~/simgrid-tutorial:/src/tutorial simgrid/tuto-s4u bash
+
+This will start a new container with all you need to take this
+tutorial, and create a ``simgrid-tutorial`` directory in your home on
+your host machine that will be visible as ``/src/tutorial`` within the
+container.  You can then edit the files you want with your favorite
+editor in ``~/simgrid-tutorial``, and compile them within the
+container to enjoy the provided dependencies.
+
+.. warning::
+
+   Any change to the container out of ``/src/tutorial`` will be lost
+   when you log out of the container, so don't edit the other files!
+
+All needed dependencies are already installed in this container
+(SimGrid, a C++ compiler, cmake, pajeng and R). Vite being only
+optional in this tutorial, it is not installed to reduce the image
+size.
+
+The code template is available under ``/src/simgrid-template-s4u`` in
+the image. You should copy it to your working directory when you first
+log in:
+
+.. code-block:: shell
+
+   cp -r /src/simgrid-template-s4u/* /src/tutorial
+   cd /src/tutorial
+
+Using your Computer Natively
+............................
+
+To take the tutorial on your machine, you first need to :ref:`install
+SimGrid <install>`, a C++ compiler and also ``pajeng`` to visualize
+the traces. You may want to install `Vite
+<http://vite.gforge.inria.fr/>`_ to get a first glance at the
+traces. The provided code template requires cmake to compile. On
+Debian and Ubuntu for example, you can get them as follows:
+
+.. code-block:: shell
+
+   sudo apt install simgrid pajeng cmake g++ vite
+
+An initial version of the source code is provided on framagit. This
+template compiles with cmake. If SimGrid is correctly installed, you
+should be able to clone the `repository
+<https://framagit.org/simgrid/simgrid-template-s4u>`_ and recompile
+everything as follows:
+
+.. code-block:: shell
+
+   git clone git@framagit.org:simgrid/simgrid-template-s4u.git
+   cd simgrid-template-s4u/
+   cmake .
+   make
+
+If you struggle with the compilation, then you should double check
+your :ref:`SimGrid installation <install>`.  On need, please refer to
+the :ref:`Troubleshooting your Project Setup
+<install_yours_troubleshooting>` section.
+
+Discovering the Provided Code
+.............................
+
+Please compile and execute the provided simulator as follows:
+
+
+.. code-block:: shell
+
+   make master-workers
+   ./master-workers small_platform.xml master-workers_d.xml
+
+For a more "fancy" output, you can use simgrid-colorizer.
+
+.. code-block:: shell
+
+   ./master-workers small_platform.xml master-workers_d.xml 2>&1 | simgrid-colorizer
+
+If you installed SimGrid to a non-standard path, you may have to
+specify the full path to simgrid-colorizer on the above line, such as
+``/opt/simgrid/bin/simgrid-colorizer``. If you did not install it at all,
+you can find it in <simgrid_root_directory>/bin/colorize.
+
+For a classical Gantt-Chart vizualisation, you can use `Vite
+<http://vite.gforge.inria.fr/>`_ if you have it installed, as
+follows. But do not spend too much time installing Vite, because there
+is a better way to visualize SimGrid traces (see below).
+
+.. code-block:: shell
+
+   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/msg/process:yes
+   vite simgrid.trace
+
+.. image:: /tuto_s4u/img/vite-screenshot.png
+   :align: center
+
+If you want the full power to visualize SimGrid traces, you need
+to use R. As a start, you can download this `starter script
+<https://framagit.org/simgrid/simgrid/raw/master/docs/source/tuto_s4u/draw_gantt.R>`_
+and use it as follows:
+
+.. code-block:: shell
+
+   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/msg/process:yes
+   pj_dump --ignore-incomplete-links simgrid.trace | grep STATE > gantt.csv
+   Rscript draw_gantt.R gantt.csv
+
+It produces a ``Rplots.pdf`` with the following content:
+
+.. image:: /tuto_s4u/img/Rscript-screenshot.png
+   :align: center
+
+
+Lab 1: Simpler Deployments
+--------------------------
+
+In the provided example, adding more workers quickly becomes a pain:
+You need to start them (at the bottom of the file), and to inform the
+master of its availability with an extra parameter. This is mandatory
+if you want to inform the master of where the workers are running. But
+actually, the master does not need to have this information.
+
+We could leverage the mailbox mechanism flexibility, and use a sort of
+yellow page system: Instead of sending data to the worker running on
+Fafard, the master could send data to the third worker. Ie, instead of
+using the worker location (which should be filled in two locations),
+we could use their ID (which should be filled in one location
+only).
+
+This could be done with the following deployment file. It's clearly
+not shorter than the previous one, but it's still simpler because the
+information is only written once. It thus follows the `DRY
+<https://en.wikipedia.org/wiki/Don't_repeat_yourself>`_ `SPOT
+<http://wiki.c2.com/?SinglePointOfTruth>`_ design principle.
+
+.. literalinclude:: tuto_s4u/deployment1.xml
+   :language: xml
+
+
+Copy your ``master-workers.cpp`` into ``master-workers-lab1.cpp`` and
+add a new executable into ``CMakeLists.txt``. Then modify your worker
+function so that it gets its mailbox name not from the name of its
+host, but from the string passed as ``args[1]``. The master will send
+messages to all workers based on their number, for example as follows:
+
+.. code-block:: cpp
+
+   for (int i = 0; i < tasks_count; i++) {
+     std::string worker_rank          = std::to_string(i % workers_count);
+     std::string mailbox_name         = std::string("worker-") + worker_rank;
+     simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+     mailbox->put(...);
+
+     ...
+   }
+
+
+Wrap up
+.......
+
+The mailboxes are a very powerful mechanism in SimGrid, allowing many
+interesting application settings. They may feel surprising if you are
+used to BSD sockets or other classical systems, but you will soon
+appreciate their power. They are only used to match the
+communications, but have no impact on the communication
+timing. ``put()`` and ``get()`` are matched regardless of their
+initiators' location and then the real communication occures between
+the involved parties.
+
+Please refer to the full `API of Mailboxes
+<api/classsimgrid_1_1s4u_1_1Mailbox.html#class-documentation>`_ for
+more details.
+
+
+Lab 2: Using the Whole Platform
+-------------------------------
+
+It is now easier to add a new worker, but you still has to do it
+manually. It would be much easier if the master could start the
+workers on its own, one per available host in the platform. The new
+deployment file should be as simple as:
+
+.. literalinclude:: tuto_s4u/deployment2.xml
+   :language: xml
+
+
+Creating the workers from the master
+....................................
+
+For that, the master needs to retrieve the list of hosts declared in
+the platform with :cpp:func:`simgrid::s4u::Engine::get_all_hosts`.
+Then, the master should start the worker processes with
+:cpp:func:`simgrid::s4u::Actor::create`.
+
+``Actor::create(name, host, func, params...)`` is a very flexible
+function. Its third parameter is the function that the actor should
+execute. This function can take any kind of parameter, provided that
+you pass similar parameters to ``Actor::create()``. For example, you
+could have something like this:
+
+.. code-block:: cpp
+
+  void my_actor(int param1, double param2, std::string param3) {
+    ...
+  }
+  int main(int argc, char argv**) {
+     ...
+     simgrid::s4u::ActorPtr actor;
+     actor = simgrid::s4u::Actor::create("name", simgrid::s4u::Host::by_name("the_host"),
+                                         &my_actor, 42, 3.14, "thevalue");
+     ...
+  }
+
+
+Master-Workers Communication
+............................
+
+Previously, the workers got from their parameter the name of the
+mailbox they should use. We can still do so: the master should build
+such a parameter before using it in the ``Actor::create()`` call. The
+master could even pass directly the mailbox as a parameter to the
+workers.
+
+Since we want later to study concurrent applications, it is advised to
+use a mailbox name that is unique over the simulation even if there is
+more than one master.
+
+One possibility for that is to use the actor ID (aid) of each worker
+as a mailbox name. The master can retrieve the aid of the newly
+created actor with ``actor->get_pid()`` while the actor itself can
+retrieve its own aid with ``simgrid::s4u::this_actor::get_pid()``.
+The retrieved value is an ``aid_t``, which is an alias for ``long``.
+
+Instead of having one mailbox per worker, you could also reorganize
+completely your application to have only one mailbox per master. All
+the workers of a given master would pull their work from the same
+mailbox, which should be passed as parameter to the workers.  This
+reduces the amount of mailboxes, but prevents the master from taking
+any scheduling decision. It really depends on how you want to organize
+your application and what you want to study with your simulator. In
+this tutorial, that's probably not a good idea.
+
+Wrap up
+.......
+
+In this exercise, we reduced the amount of configuration that our
+simulator requests. This is both a good idea, and a dangerous
+trend. This simplification is another application of the good old DRY/SPOT
+programming principle (`Don't Repeat Yourself / Single Point Of Truth
+<https://en.wikipedia.org/wiki/Don%27t_repeat_yourself>`_), and you
+really want your programming artefacts to follow these software
+engineering principles.
+
+But at the same time, you should be careful in separating your
+scientific contribution (the master/workers algorithm) and the
+artefacts used to test it (platform, deployment and workload). This is
+why SimGrid forces you to express your platform and deployment files
+in XML instead of using a programming interface: it forces a clear
+separation of concerns between things of very different nature.
+
+Lab 3: Fixed Experiment Duration
+--------------------------------
+
+In the current version, the number of tasks is defined through the
+worker arguments. Hence, tasks are created at the very beginning of
+the simulation. Instead, have the master dispatching tasks for a
+predetermined amount of time.  The tasks must now be created on demand
+instead of beforehand.
+
+Of course, usual time functions like ``gettimeofday`` will give you the
+time on your real machine, which is prety useless in the
+simulation. Instead, retrieve the time in the simulated world with
+:cpp:func:`simgrid::s4u::Engine::get_clock`.
+
+You can still stop your workers with a specific task as previously,
+or you may kill them forcefully with
+:cpp:func:`simgrid::s4u::Actor::kill` (if you already have a reference
+to the actor you want to kill) or
+:cpp:func:`void simgrid::s4u::Actor::kill(aid_t)` (if you only have its ID).
+
+
+Anyway, the new deployment `deployment3.xml` file should thus look
+like this:
+
+.. literalinclude:: tuto_s4u/deployment3.xml
+   :language: xml
+
+Controlling the message verbosity
+.................................
+
+Not all messages are equally informative, so you probably want to
+change some of the ``XBT_INFO`` into ``XBT_DEBUG`` so that they are
+hidden by default. For example, you may want to use ``XBT_INFO`` once
+every 100 tasks and ``XBT_DEBUG`` when sending all the other tasks. Or
+you could show only the total number of tasks processed by
+default. You can still see the debug messages as follows:
+
+.. code-block:: shell
+
+   ./master-workers-lab3 small_platform.xml deployment3.xml --log=msg_test.thres:debug
+
+
+Lab 4: Competing Applications
+-----------------------------
+
+It is now time to start several applications at once, with the following ``deployment4.xml`` file.
+
+.. literalinclude:: tuto_s4u/deployment4.xml
+   :language: xml
+
+Things happen when you do so, but it remains utterly difficult to
+understand what's happening exactely. Even Gantt visualizations
+contain too much information to be useful: it is impossible to
+understand which task belong to which application. To fix this, we
+will categorize the tasks.
+
+Instead of starting the execution in one function call only with
+``this_actor::execute(cost)``, you need to
+create the execution activity, set its tracing category, and then start
+it and wait for its completion, as follows:
+
+.. code-block:: cpp
+
+   simgrid::s4u::ExecPtr exec = simgrid::s4u::this_actor::exec_init(compute_cost);
+   exec->set_tracing_category(category);
+   // exec->start() is optional here as wait() starts the activity on need
+   exec->wait();
+
+You can make the same code shorter as follows:
+
+.. code-block:: cpp
+
+   simgrid::s4u::this_actor::exec_init(compute_cost)->set_tracing_category(category)->wait();
+
+Visualizing the result
+.......................
+
+vite is not enough to understand the situation, because it does not
+deal with categorization. This time, you absolutely must switch to R,
+as explained on `this page
+<http://simgrid.gforge.inria.fr/contrib/R_visualization.php>`_.
+
+.. todo::
+
+   Include here the minimal setting to view something in R.
+
+
+Lab 5: Better Scheduling
+------------------------
+
+You don't need a very advanced visualization solution to notice that
+round-robin is completely suboptimal: most of the workers keep waiting
+for more work. We will move to a First-Come First-Served mechanism
+instead.
+
+For that, your workers should explicitely request for work with a
+message sent to a channel that is specific to their master. The name
+of that private channel can be the one used to categorize the
+executions, as it is already specific to each master.
+
+The master should serve in a round-robin manner the requests it
+receives, until the time is up. Changing the communication schema can
+be a bit hairy, but once it works, you will see that such as simple
+FCFS schema allows to double the amount of tasks handled over time
+here. Things may be different with another platform file.
+
+Further Improvements
+....................
+
+From this, many things can easily be added. For example, you could:
+
+- Allow workers to have several pending requests so as to overlap
+  communication and computations as much as possible. Non-blocking
+  communication will probably become handy here.
+- Add a performance measurement mechanism, enabling the master to make smart scheduling choices.
+- Test your code on other platforms, from the ``examples/platforms``
+  directory in your archive.
+
+  What is the largest number of tasks requiring 50e6 flops and 1e5
+  bytes that you manage to distribute and process in one hour on
+  ``g5k.xml`` ?
+- Optimize not only for the amount of tasks handled, but also for the
+  total energy dissipated.
+- And so on. If you come up with a really nice extension, please share
+  it with us so that we can extend this tutorial.
+
+After this Tutorial
+-------------------
+
+This tutorial is now terminated. You could keep reading the [online documentation][fn:4] or
+[tutorials][fn:7], or you could head up to the example section to read some code.
+
+.. todo::
+
+   TODO: Points to improve for the next time
+
+   - Propose equivalent exercises and skeleton in java.
+   - Propose a virtualbox image with everything (simgrid, pajeng, ...) already set up.
+   - Ease the installation on mac OS X (binary installer) and windows.
+
+..  LocalWords:  SimGrid
diff --git a/docs/source/tuto_s4u/.gitignore b/docs/source/tuto_s4u/.gitignore
new file mode 100644 (file)
index 0000000..f3328e3
--- /dev/null
@@ -0,0 +1,6 @@
+master-workers-lab1
+master-workers-lab2
+master-workers-lab3
+master-workers-lab4
+Rplots.pdf
+gantt.csv
diff --git a/docs/source/tuto_s4u/deployment1.xml b/docs/source/tuto_s4u/deployment1.xml
new file mode 100644 (file)
index 0000000..5fc2809
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
+  <!-- The master actor (with 4 arguments) -->
+  <actor host="Tremblay" function="master">
+     <argument value="5"/>         <!-- Workers count -->
+     <argument value="20"/>        <!-- Tasks count -->
+     <argument value="50000000"/>  <!-- Computation size of tasks -->
+     <argument value="1000000"/>   <!-- Communication size of tasks -->
+  </actor>
+
+  <!-- The worker processes (with one argument each: the ID of this worker) -->
+  <actor host="Tremblay" function="worker">
+     <argument value="0" />
+  </actor>
+  <actor host="Jupiter" function="worker">
+     <argument value="1" />
+  </actor>
+  <actor host="Fafard" function="worker">
+     <argument value="2" />
+  </actor>
+  <actor host="Ginette" function="worker">
+     <argument value="3" />
+  </actor>
+  <actor host="Bourassa" function="worker">
+     <argument value="4" />
+  </actor>
+</platform>
similarity index 86%
rename from doc/tuto-msg/deployment1.xml
rename to docs/source/tuto_s4u/deployment2.xml
index 2286d86..e9163f2 100644 (file)
@@ -3,7 +3,7 @@
 <platform version="4.1">
   <!-- The master actor (with some arguments) -->
   <actor host="Tremblay" function="master">
-     <argument value="20"/>       <!-- Number of tasks -->
+     <argument value="20"/>        <!-- Tasks count -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
   </actor>
diff --git a/docs/source/tuto_s4u/draw_gantt.R b/docs/source/tuto_s4u/draw_gantt.R
new file mode 100644 (file)
index 0000000..68b18ff
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/env Rscript
+args = commandArgs(trailingOnly=TRUE)
+library(ggplot2)
+df = read.csv(args[1], header=F, strip.white=T)
+names(df) = c("Type", "Actor", "Container", "Start", "End", "Duration", "Level", "State");
+ggplot(df)
+    geom_segment(aes(x=Start, xend=End,
+                     y=Actor, yend=Actor,color=State), size=5)
+    scale_fill_brewer(palette="Set1")
+    theme_bw()
+    theme (
+        plot.margin = unit(c(0,0,0,0), "cm"),
+        legend.spacing = unit(1, "mm"),
+        panel.grid = element_blank(),
+        legend.position = "top",
+        legend.justification = "left",
+        legend.box.spacing = unit(0, "pt"),
+        legend.box.margin = margin(0,0,0,0)) -> p;
+
+p.height <- length(unique(df$Actor)) * 0.05 + 2;
+pdf(height = p.height)
+plot(p)
+dev.off()
diff --git a/docs/source/tuto_s4u/img/Rscript-screenshot.png b/docs/source/tuto_s4u/img/Rscript-screenshot.png
new file mode 100644 (file)
index 0000000..22b8c3b
Binary files /dev/null and b/docs/source/tuto_s4u/img/Rscript-screenshot.png differ
diff --git a/docs/source/tuto_s4u/img/vite-screenshot.png b/docs/source/tuto_s4u/img/vite-screenshot.png
new file mode 100644 (file)
index 0000000..133bece
Binary files /dev/null and b/docs/source/tuto_s4u/img/vite-screenshot.png differ
diff --git a/docs/source/tuto_s4u/master-workers-lab1.cpp b/docs/source/tuto_s4u/master-workers-lab1.cpp
new file mode 100644 (file)
index 0000000..5caa2d4
--- /dev/null
@@ -0,0 +1,92 @@
+/* Copyright (c) 2010-2018. 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. */
+
+/****************************************************************************
+ *
+ *     This is our solution to the first lab of the S4U tutorial
+ * (available online at https://simgrid.frama.io/simgrid/tuto_s4u.html)
+ *
+ *    Reading this further before taking the tutorial will SPOIL YOU!!!
+ *
+ ****************************************************************************/
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this example");
+
+static void master(std::vector<std::string> args)
+{
+  xbt_assert(args.size() == 5, "The master function expects 4 arguments");
+
+  long workers_count        = std::stol(args[1]);
+  long tasks_count          = std::stol(args[2]);
+  double compute_cost       = std::stod(args[3]);
+  double communication_cost = std::stod(args[4]);
+
+  XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, tasks_count);
+
+  for (int i = 0; i < tasks_count; i++) { /* For each task to be executed: */
+    /* - Select a worker in a round-robin way */
+    std::string worker_rank          = std::to_string(i % workers_count);
+    std::string mailbox_name         = std::string("worker-") + worker_rank;
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    /* - Send the computation cost to that worker */
+    XBT_INFO("Sending task %d of %ld to mailbox '%s'", i, tasks_count, mailbox->get_cname());
+    mailbox->put(new double(compute_cost), communication_cost);
+  }
+
+  XBT_INFO("All tasks have been dispatched. Request all workers to stop.");
+  for (int i = 0; i < workers_count; i++) {
+    /* The workers stop when receiving a negative compute_cost */
+    std::string mailbox_name         = std::string("worker-") + std::to_string(i);
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    mailbox->put(new double(-1.0), 0);
+  }
+}
+
+static void worker(std::vector<std::string> args)
+{
+  xbt_assert(args.size() == 2, "The worker expects a single argument");
+  long id = std::stol(args[1]);
+
+  const std::string mailbox_name   = std::string("worker-") + std::to_string(id);
+  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+  double compute_cost;
+  do {
+    double* msg  = static_cast<double*>(mailbox->get());
+    compute_cost = *msg;
+    delete msg;
+
+    if (compute_cost > 0) /* If compute_cost is valid, execute a computation of that cost */
+      simgrid::s4u::this_actor::execute(compute_cost);
+
+  } while (compute_cost > 0); /* Stop when receiving an invalid compute_cost */
+
+  XBT_INFO("Exiting now.");
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
+
+  /* Register the functions representing the actors */
+  e.register_function("master", &master);
+  e.register_function("worker", &worker);
+
+  /* Load the platform description and then deploy the application */
+  e.load_platform(argv[1]);
+  e.load_deployment(argv[2]);
+
+  /* Run the simulation */
+  e.run();
+
+  XBT_INFO("Simulation is over");
+
+  return 0;
+}
diff --git a/docs/source/tuto_s4u/master-workers-lab2.cpp b/docs/source/tuto_s4u/master-workers-lab2.cpp
new file mode 100644 (file)
index 0000000..e47d33a
--- /dev/null
@@ -0,0 +1,94 @@
+/* Copyright (c) 2010-2018. 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. */
+
+/****************************************************************************
+ *
+ *     This is our solution to the second lab of the S4U tutorial
+ * (available online at https://simgrid.frama.io/simgrid/tuto_s4u.html)
+ *
+ *    Reading this further before taking the tutorial will SPOIL YOU!!!
+ *
+ ****************************************************************************/
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this example");
+
+static void worker()
+{
+  const std::string mailbox_name   = std::string("worker-") + std::to_string(simgrid::s4u::this_actor::get_pid());
+  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+  double compute_cost;
+  do {
+    double* msg  = static_cast<double*>(mailbox->get());
+    compute_cost = *msg;
+    delete msg;
+
+    if (compute_cost > 0) /* If compute_cost is valid, execute a computation of that cost */
+      simgrid::s4u::this_actor::execute(compute_cost);
+
+  } while (compute_cost > 0); /* Stop when receiving an invalid compute_cost */
+
+  XBT_INFO("Exiting now.");
+}
+
+static void master(std::vector<std::string> args)
+{
+  xbt_assert(args.size() == 4, "The master function expects 3 arguments");
+
+  long tasks_count          = std::stol(args[1]);
+  double compute_cost       = std::stod(args[2]);
+  double communication_cost = std::stod(args[3]);
+
+  std::vector<simgrid::s4u::ActorPtr> actors;
+
+  for (auto* host : simgrid::s4u::Engine::get_instance()->get_all_hosts()) {
+    simgrid::s4u::ActorPtr act = simgrid::s4u::Actor::create(std::string("Worker-") + host->get_name(), host, worker);
+    actors.push_back(act);
+  }
+
+  XBT_INFO("Got %ld tasks to process", tasks_count);
+
+  for (int i = 0; i < tasks_count; i++) { /* For each task to be executed: */
+    /* - Select a worker in a round-robin way */
+    aid_t worker_pid                 = actors.at(i % actors.size())->get_pid();
+    std::string mailbox_name         = std::string("worker-") + std::to_string(worker_pid);
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    /* - Send the computation cost to that worker */
+    XBT_INFO("Sending task %d of %ld to mailbox '%s'", i, tasks_count, mailbox->get_cname());
+    mailbox->put(new double(compute_cost), communication_cost);
+  }
+
+  XBT_INFO("All tasks have been dispatched. Request all workers to stop.");
+  for (unsigned long i = 0; i < actors.size(); i++) {
+    /* The workers stop when receiving a negative compute_cost */
+    std::string mailbox_name         = std::string("worker-") + std::to_string(actors.at(i)->get_pid());
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    mailbox->put(new double(-1.0), 0);
+  }
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
+
+  /* Register the functions representing the actors */
+  e.register_function("master", &master);
+
+  /* Load the platform description and then deploy the application */
+  e.load_platform(argv[1]);
+  e.load_deployment(argv[2]);
+
+  /* Run the simulation */
+  e.run();
+
+  XBT_INFO("Simulation is over");
+
+  return 0;
+}
diff --git a/docs/source/tuto_s4u/master-workers-lab3.cpp b/docs/source/tuto_s4u/master-workers-lab3.cpp
new file mode 100644 (file)
index 0000000..8f964ce
--- /dev/null
@@ -0,0 +1,94 @@
+/* Copyright (c) 2010-2018. 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. */
+
+/****************************************************************************
+ *
+ *     This is our solution to the third lab of the S4U tutorial
+ * (available online at https://simgrid.frama.io/simgrid/tuto_s4u.html)
+ *
+ *    Reading this further before taking the tutorial will SPOIL YOU!!!
+ *
+ ****************************************************************************/
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this example");
+
+static void worker()
+{
+  const std::string mailbox_name   = std::string("worker-") + std::to_string(simgrid::s4u::this_actor::get_pid());
+  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+  double compute_cost;
+  while (true) { // Master forcefully kills the workers by the end of the simulation
+    double* msg  = static_cast<double*>(mailbox->get());
+    compute_cost = *msg;
+    delete msg;
+
+    simgrid::s4u::this_actor::execute(compute_cost);
+  }
+}
+
+static void master(std::vector<std::string> args)
+{
+  xbt_assert(args.size() == 4, "The master function expects 3 arguments");
+
+  double simulation_duration = std::stod(args[1]);
+  double compute_cost        = std::stod(args[2]);
+  double communication_cost  = std::stod(args[3]);
+
+  std::vector<simgrid::s4u::ActorPtr> actors;
+
+  simgrid::s4u::Engine* e = simgrid::s4u::Engine::get_instance();
+
+  XBT_INFO("Asked to run for %.1f seconds", simulation_duration);
+
+  for (auto* host : e->get_all_hosts()) {
+    simgrid::s4u::ActorPtr act = simgrid::s4u::Actor::create(std::string("Worker-") + host->get_name(), host, worker);
+    actors.push_back(act);
+  }
+
+  int task_id = 0;
+  while (e->get_clock() < simulation_duration) { /* For each task: */
+    /* - Select a worker in a round-robin way */
+    aid_t worker_pid                 = actors.at(task_id % actors.size())->get_pid();
+    std::string mailbox_name         = std::string("worker-") + std::to_string(worker_pid);
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    /* - Send the computation cost to that worker */
+    if (task_id % 100 == 0)
+      XBT_INFO("Sending task %d to mailbox '%s'", task_id, mailbox->get_cname());
+    else
+      XBT_DEBUG("Sending task %d to mailbox '%s'", task_id, mailbox->get_cname());
+    mailbox->put(new double(compute_cost), communication_cost);
+
+    task_id++;
+  }
+
+  XBT_INFO("Time is up. Forcefully kill all workers.");
+  for (unsigned long i = 0; i < actors.size(); i++) {
+    actors.at(i)->kill();
+  }
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
+
+  /* Register the functions representing the actors */
+  e.register_function("master", &master);
+
+  /* Load the platform description and then deploy the application */
+  e.load_platform(argv[1]);
+  e.load_deployment(argv[2]);
+
+  /* Run the simulation */
+  e.run();
+
+  XBT_INFO("Simulation is over");
+
+  return 0;
+}
diff --git a/docs/source/tuto_s4u/master-workers-lab4.cpp b/docs/source/tuto_s4u/master-workers-lab4.cpp
new file mode 100644 (file)
index 0000000..ad2fd7f
--- /dev/null
@@ -0,0 +1,96 @@
+/* Copyright (c) 2010-2018. 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. */
+
+/****************************************************************************
+ *
+ *     This is our solution to the fourth lab of the S4U tutorial
+ * (available online at https://simgrid.frama.io/simgrid/tuto_s4u.html)
+ *
+ *    Reading this further before taking the tutorial will SPOIL YOU!!!
+ *
+ ****************************************************************************/
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this example");
+
+static void worker(std::string category)
+{
+  const std::string mailbox_name   = std::string("worker-") + std::to_string(simgrid::s4u::this_actor::get_pid());
+  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+  while (true) { // Master forcefully kills the workers by the end of the simulation
+    double* msg         = static_cast<double*>(mailbox->get());
+    double compute_cost = *msg;
+    delete msg;
+
+    // simgrid::s4u::this_actor::exec_init(compute_cost)->set_tracing_category(category)->wait();
+    /* Long form:*/
+    simgrid::s4u::ExecPtr exec = simgrid::s4u::this_actor::exec_init(compute_cost);
+    exec->set_tracing_category(category);
+    exec->wait();
+  }
+}
+
+static void master(std::vector<std::string> args)
+{
+  xbt_assert(args.size() == 4, "The master function expects 3 arguments");
+
+  double simulation_duration = std::stod(args[1]);
+  double compute_cost        = std::stod(args[2]);
+  double communication_cost  = std::stod(args[3]);
+
+  std::vector<simgrid::s4u::ActorPtr> actors;
+
+  simgrid::s4u::Engine* e = simgrid::s4u::Engine::get_instance();
+  std::string my_name     = std::string("master-") + std::to_string(simgrid::s4u::this_actor::get_pid());
+
+  XBT_INFO("Asked to run for %.1f seconds", simulation_duration);
+
+  for (auto* host : e->get_all_hosts()) {
+    simgrid::s4u::ActorPtr act =
+        simgrid::s4u::Actor::create(std::string("Worker-") + host->get_name(), host, worker, my_name);
+    actors.push_back(act);
+  }
+
+  int task_id = 0;
+  while (e->get_clock() < simulation_duration) { /* For each task: */
+    /* - Select a worker in a round-robin way */
+    aid_t worker_pid                 = actors.at(task_id % actors.size())->get_pid();
+    std::string mailbox_name         = std::string("worker-") + std::to_string(worker_pid);
+    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+
+    /* - Send the computation cost to that worker */
+    XBT_DEBUG("Sending task %d to mailbox '%s'", task_id, mailbox->get_cname());
+    mailbox->put(new double(compute_cost), communication_cost);
+
+    task_id++;
+  }
+
+  XBT_INFO("Time is up. Forcefully kill all workers.");
+  for (unsigned long i = 0; i < actors.size(); i++) {
+    actors.at(i)->kill();
+  }
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
+
+  /* Register the functions representing the actors */
+  e.register_function("master", &master);
+
+  /* Load the platform description and then deploy the application */
+  e.load_platform(argv[1]);
+  e.load_deployment(argv[2]);
+
+  /* Run the simulation */
+  e.run();
+
+  XBT_INFO("Simulation is over");
+
+  return 0;
+}
diff --git a/docs/source/usecase_algorithms.rst b/docs/source/usecase_algorithms.rst
deleted file mode 100644 (file)
index 6a15168..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-.. _usecase_simalgo:
-
-Simulating Algorithms
-=====================
-
-SimGrid was conceived as a tool to study distributed algorithms. Its
-modern S4U interface makes it easy to assess Cloud, P2P, HPC, IoT and
-similar settings.
-
-A typical SimGrid simulation is composed of several **Actors**
-|api_s4u_Actor|_ , that execute user-provided functions. The actors
-have to explicitly use the S4U interface to express their computation,
-communication, disk usage and other **Activities** |api_s4u_Activity|_
-, so that they get reflected within the simulator. These activities
-take place on **Resources** (CPUs, links, disks). SimGrid predicts the
-time taken by each activity and orchestrates accordingly the actors
-waiting for the completion of these activities.
-
-.. |api_s4u_Actor| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_Actor: api/classsimgrid_1_1s4u_1_1Actor.html#class-documentation
-
-.. |api_s4u_Activity| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_Activity: api/classsimgrid_1_1s4u_1_1Activity.html#class-documentation
-
-
-Each actor executes a user-provided function on a simulated **Host**
-|api_s4u_Host|_ with which it can interact. Communications are not
-directly sent to actors, but posted onto **Mailboxes**
-|api_s4u_Mailbox|_ that serve as rendez-vous points between
-communicating processes. 
-
-.. |api_s4u_Host| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_Host: api/classsimgrid_1_1s4u_1_1Host.html#class-documentation
-
-.. |api_s4u_Mailbox| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_Mailbox: api/classsimgrid_1_1s4u_1_1Mailbox.html#class-documentation
-
-
-Discover the Master/Workers
----------------------------
-
-This section introduces a first example of SimGrid simulation. This
-simple application is composed of two kind of actors: the **master**
-is in charge of distributing some computational tasks to a set of
-**workers** that execute them. 
-
-.. image:: /images/tuto-masterworkers-intro.svg
-   :align: center
-
-We first present a round-robin version of this application, where the
-master dispatches the tasks to the workers, one after the other, until
-all tasks are dispatched. Later in this tutorial, you will be given
-the opportunity to improve this scheme.
-
-The Actors
-..........
-
-Let's start with the code of the worker. It is represented by the
-*master* function below. This simple function takes 4 parameters,
-given as a vector of strings:
-
-   - the number of workers managed by the master.
-   - the number of tasks to dispatch
-   - the computational size (in flops to compute) of each task 
-   - the communication size (in bytes to exchange) of each task
-
-Then, the tasks are sent one after the other, each on a mailbox named
-"worker-XXX" where XXX is the number of an existing worker. On the
-other side, a given worker (which code is given below) wait for
-incoming tasks on its own mailbox. Notice how this mailbox mechanism
-allow the actors to find each other without having all information:
-the master don't have to know the actors nor even where they are, it
-simply pushes the messages on mailbox which name is predetermined. 
-
-At the end, once all tasks are dispatched, the master dispatches
-another task per worker, but this time with a negative amount of flops
-to compute. Indeed, this application decided by convention, that the
-workers should stop when encountering such a negative compute_size.
-
-At the end of the day, the only SimGrid specific functions used in
-this example are :cpp:func:`simgrid::s4u::Mailbox::by_name` and
-:cpp:func:`simgrid::s4u::Mailbox::put`. Also, :c:macro:`XBT_INFO` is used
-as a replacement to printf() or to cout to ensure that the messages
-are nicely logged along with the simulated time and actor name.
-     
-.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
-   :language: c++
-   :start-after: master-begin
-   :end-before: master-end
-
-Here comes the code of the worker actors. This function expects only one
-parameter from its vector of strings: its identifier so that it knows
-on which mailbox its incoming tasks will arrive. Its code is very
-simple: as long as it gets valid computation requests (whose
-compute_amount is positive), it compute this task and waits for the
-next one.      
-
-.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
-   :language: c++
-   :start-after: worker-begin
-   :end-before: worker-end
-
-Starting the Simulation
-.......................
-               
-And this is it. In only a few lines, we defined the algorithm of our
-master/workers examples. Well, this is true, but an algorithm alone is
-not enough to define a simulation.
-
-First, SimGrid is a library, not a program. So you need to define your
-own `main()` function, as follows. This function is in charge of
-creating a SimGrid simulation engine (on line 3), register the actor
-functions to the engine (on lines 7 and 8), load the virtual platform
-from its description file (on line 11), map actors onto that platform
-(on line 12) and run the simulation until its completion on line 15.
-
-.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
-   :language: c++
-   :start-after: main-begin
-   :end-before: main-end
-   :linenos:
-
-After that, the missing pieces are the platform and deployment
-files.
-
-Platform File
-.............
-
-Platform files define the virtual platform on which the provided
-application will take place. In contains one or several **Network
-Zone** |api_s4u_NetZone|_ that contain both **Host-** |api_s4u_Host|_
-and **Link-** |api_s4u_Link|_ Resources, as well as routing
-information.
-
-Such files can get rather long and boring, so the example below is
-only an excerpts of the full ``examples/platforms/small_platform.xml``
-file. For example, most routing information are missing, and only the
-route between the hosts Tremblay and Fafard is given. This path
-traverses 6 links (4, 3, 2, 0, 1 and 8). The full file, along with
-other examples, can be found in the archive under
-``examples/platforms``.
-               
-.. |api_s4u_NetZone| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_NetZone: api/classsimgrid_1_1s4u_1_1NetZone.html#class-documentation
-
-.. |api_s4u_Link| image:: /images/extlink.png
-   :align: middle
-   :width: 12
-.. _api_s4u_Link: api/classsimgrid_1_1s4u_1_1Link.html#class-documentation
-
-.. literalinclude:: ../../examples/platforms/small_platform.xml
-   :language: xml
-   :lines: 1-10,12-20,56-63,192-
-   :caption: (excerpts of the small_platform.xml file)
-
-Deployment File
-...............
-
-Deployment files specify the execution scenario: it lists the actors
-that should be started, along with their parameter. In the following
-example, we start 6 actors: one master and 5 workers.
-
-.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers_d.xml
-   :language: xml
-
-Execution Example
-.................
-
-This time, we have all parts: once the program is compiled, we can
-execute it as follows. Note how the XBT_INFO() requests turned into
-informative messages.
-             
-.. literalinclude:: ../../examples/s4u/app-masterworkers/s4u-app-masterworkers.tesh
-   :language: shell
-   :start-after: s4u-app-masterworkers-fun
-   :prepend: $$$ ./masterworkers platform.xml deploy.xml
-   :append: $$$
-   :dedent: 2
-             
-
-Improve it Yourself
--------------------
-
-In this section, you will modify the example presented earlier to
-explore the quality of the proposed algorithm. For now, it works and
-the simulation prints things, but the truth is that we have no idea of
-whether this is a good algorithm to dispatch tasks to the workers.
-This very simple setting raises many interesting questions:
-
-.. image:: /images/tuto-masterworkers-question.svg
-   :align: center
-
-- Which algorithm should the master use? Or should the worker decide
-  by themselves?
-
-    Round Robin is not an efficient algorithm when all tasks are not
-    processed at the same speed.  It would probably be more efficient
-    if the workers were asking for tasks when ready.
-
-- Should tasks be grouped in batches or sent separately?
-
-    The workers will starve if they don't get the tasks fast
-    enough. One possibility to reduce latency would be to send tasks
-    in pools instead of one by one. But if the pools are too big, the
-    load balancing will likely get uneven, in particular when
-    distributing the last tasks.
-
-- How does the quality of such algorithm dependent on the platform
-  characteristics and on the task characteristics?
-
-    Whenever the input communication time is very small compared to
-    processing time and workers are homogeneous, it is likely that the
-    round-robin algorithm performs very well. Would it still hold true
-    when transfer time is not negligible? What if some tasks are
-    performed faster on some specific nodes?
-          
-- The network topology interconnecting the master and the workers
-  may be quite complicated. How does such a topology impact the
-  previous result?
-
-    When data transfers are the bottleneck, it is likely that a good
-    modeling of the platform becomes essential. The SimGrid platform
-    models are particularly handy to account for complex platform
-    topologies.
-
-- What is the best applicative topology?
-
-    Is a flat master worker deployment sufficient? Should we go for a
-    hierarchical algorithm, with some forwarders taking large pools of
-    tasks from the master, each of them distributing their tasks to a
-    sub-pool of workers? Or should we introduce super-peers,
-    dupplicating the master's role in a peer-to-peer manner?  Do the
-    algorithms require a perfect knowledge of the network?
-
-- How is such an algorithm sensitive to external workload variation?
-
-    What if bandwidth, latency and computing speed can vary with no
-    warning?  Shouldn't you study whether your algorithm is sensitive
-    to such load variations?
-
-- Although an algorithm may be more efficient than another, how does
-  it interfere with unrelated applications executing on the same
-  facilities?
-
-**SimGrid was invented to answer such questions.** Do not believe the
-fools saying that all you need to study such settings is a simple
-discrete event simulator. Do you really want to reinvent the wheel,
-debug your own tool, optimize it and validate its models against real
-settings for ages, or do you prefer to sit on the shoulders of a
-giant? With SimGrid, you can focus on your algorithm. The whole
-simulation mechanism is already working.
-
-Here is the visualization of a SimGrid simulation of two master worker
-applications (one in light gray and the other in dark gray) running in
-concurrence and showing resource usage over a long period of time. It
-was obtained with the Triva software.
-
-.. image:: /images/tuto-masterworkers-result.png
-   :align: center
-
-Prerequisite
-............
-
-Before your proceed, you need to :ref:`install SimGrid <install>`, a
-C++ compiler and also ``pajeng`` to visualize the traces. The provided
-code template requires cmake to compile. On Debian and Ubuntu for
-example, you can get them as follows:
-
-.. code-block:: shell
-
-   sudo apt install simgrid pajeng cmake g++
-
-An initial version of the source code is provided on framagit. This
-template compiles with cmake. If SimGrid is correctly installed, you
-should be able to clone the `repository
-<https://framagit.org/simgrid/simgrid-template-s4u>`_ and recompile
-everything as follows:
-
-.. code-block:: shell
-
-   git clone git@framagit.org:simgrid/simgrid-template-s4u.git
-   cd simgrid-template-s4u/
-   cmake .
-   make
-
-If you struggle with the compilation, then you should double check
-your :ref:`SimGrid installation <install>`.  On need, please refer to
-the :ref:`Troubleshooting your Project Setup
-<install_yours_troubleshooting>` section.
-
-Discovering the Provided Code
-.............................
-
-Please compile and execute the provided simulator as follows:
-
-
-.. code-block:: shell
-
-   make master-workers
-   ./master-workers small_platform.xml master-workers_d.xml
-
-For a more "fancy" output, you can use simgrid-colorizer. 
-
-.. code-block:: shell
-
-   ./master-workers small_platform.xml master-workers_d.xml 2>&1 | simgrid-colorizer
-
-If you installed SimGrid to a non-standard path, you may have to
-specify the full path to simgrid-colorizer on the above line, such as
-``/opt/simgrid/bin/simgrid-colorizer``. If you did not install it at all,
-you can find it in <simgrid_root_directory>/bin/colorize.
-
-.. todo::
-
-   Explain how to generate a Gantt-Chart with S4U and pajeng.
-
-Exercise 1: Simplifying the deployment file
-...........................................
-
-In the provided example, the deployment file is tightly connected to
-the platform file ``small_platform.xml`` and adding more workers
-quickly becomes a pain: You need to start them (at the bottom of the
-file), add to inform the master that they are available by increasing
-the right parameter.
-
-Instead, modify the simulator ``master-workers.c`` into
-``master-workers-exo1.c`` so that the master launches a worker process
-on `all` the other machines at startup. The new deployment file should
-be as simple as:
-
-.. code-block:: xml
-
-   <?xml version='1.0'?>
-   <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-   <platform version="4.1">
-     <actor host="Tremblay" function="master">
-       <argument value="20"/>        <!-- Number of tasks -->
-       <argument value="50000000"/>  <!-- Computation size of tasks -->
-       <argument value="1000000"/>   <!-- Communication size of tasks -->
-     </actor>
-   </platform>
-
-Creating the workers from the master
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-For that, the master needs to retrieve the list of hosts declared in
-the platform with :cpp:func:`simgrid::s4u::Engine::get_all_host()`.
-Then, the master should start the worker processes with
-:cpp:func:`simgrid::s4u::Actor::create`.
-
-``Actor::create(name, host, func, params...)`` is a very flexible
-function. Its third parameter is the function that the actor should
-execute. This function can take any kind of parameter, provided that
-you pass similar parameters to ``Actor::create()``. For example, you
-could have something like this:
-
-.. code-block:: cpp
-
-  void my_actor(int param1, double param2, std::string param3) {
-    ...
-  }
-  int main(int argc, char argv**) {
-     ...
-     simgrid::s4u::ActorPtr actor;
-     actor = simgrid::s4u::Actor::create("name", simgrid::s4u::Host::by_name("the_host"),
-                                         &my_actor, 42, 3.14, "thevalue");
-     ...
-  }
-
-
-Master-Workers Communication
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Previously, the workers got from their parameter the name of the
-mailbox they should use. We can still do so: the master should build
-such a parameter before using it in the ``Actor::create()`` call. The
-master could even pass directly the mailbox as a parameter to the
-workers. 
-
-Since we want later to study concurrent applications, it is advised to
-use a mailbox name that is unique over the simulation even if there is
-more than one master. 
-
-One possibility for that is to use the actor ID (aid) of each worker
-as a mailbox name. The master can retrieve the aid of the newly
-created actor with ``actor->get_pid()`` while the actor itself can
-retrieve its own aid with ``simgrid::s4u::this_actor::get_pid()``.
-The retrieved value is an ``aid_t``, which is an alias for ``long``.
-
-Instead of having one mailbox per worker, you could also reorganize
-completely your application to have only one mailbox per master. All
-the workers of a given master would pull their work from the same
-mailbox, which should be passed as parameter to the workers.  This
-reduces the amount of mailboxes, but prevents the master from taking
-any scheduling decision. It really depends on how you want to organize
-your application and what you want to study with your simulator.
-
-Wrap up
-^^^^^^^
-
-In this exercise, we reduced the amount of configuration that our
-simulator requests. This is both a good idea, and a dangerous
-trend. This simplification is an application of the good old DRY/SPOT
-programming principle (Don't Repeat Yourself / Single Point Of Truth
--- `more on wikipedia
-<https://en.wikipedia.org/wiki/Don%27t_repeat_yourself>`_), and you
-really want your programming artefacts to follow these software
-engineering principles.
-
-But at the same time, you should be careful in separating your
-scientific contribution (the master/workers algorithm) and the
-artefacts used to test it (platform, deployment and workload). This is
-why SimGrid forces you to express your platform and deployment files
-in XML instead of using a programming interface: it forces a clear
-separation of concerns between things of very different nature.
-
-
-..  LocalWords:  SimGrid
index d5957e7..c9608c6 100644 (file)
@@ -5,7 +5,7 @@
 
 $ java -classpath ${classpath:=.} app/bittorrent/Main ${srcdir:=.}/../platforms/cluster.xml ${srcdir:=.}/app/bittorrent/bittorrent.xml
 > [0.000000] [java/INFO] Using regular java threads.
-> [5000.046836] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [5000.046836] [java/INFO] MSG_main finished; Terminating the simulation...
 > [node-0.acme.org:app.bittorrent.Tracker:(1) 0.000000] [java/INFO] Tracker launched.
 > [node-0.acme.org:app.bittorrent.Tracker:(1) 3000.000000] [java/INFO] Tracker is leaving
 > [node-1.acme.org:app.bittorrent.Peer:(2) 0.000000] [java/INFO] Hi, I'm joining the network with id 2
index ecacf39..5496f03 100644 (file)
@@ -11,4 +11,4 @@ $ java -classpath ${classpath:=.} app/centralizedmutex/Main ${srcdir:=.}/../plat
 > [Fafard:app.centralizedmutex.Node:(3) 0.063737] [java/INFO] Wait for a grant from the coordinator
 > [Tremblay:app.centralizedmutex.Coordinator:(1) 0.063737] [java/INFO] Got a request from app.centralizedmutex.Node. Queue empty: grant it
 > [Tremblay:app.centralizedmutex.Coordinator:(1) 0.134167] [java/INFO] we should shutdown the simulation now
-> [0.134167] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [0.134167] [java/INFO] MSG_main finished; Terminating the simulation...
index 4a30a5e..ea836e1 100644 (file)
@@ -17,4 +17,4 @@ $ java -classpath ${classpath:=.} app/masterworker/Main ${srcdir:=.}/../platform
 > [  5.628842] (7:app.masterworker.Worker@Jupiter) Received Finalize. I'm done. See you!
 > [  5.629037] (8:app.masterworker.Worker@Jacquelin) Received Finalize. I'm done. See you!
 > [  5.629037] (1:app.masterworker.Master@Jacquelin) Goodbye now!
-> [  5.629037] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  5.629037] (0:maestro@) MSG_main finished; Terminating the simulation...
index de0f5e8..003140b 100644 (file)
@@ -20,4 +20,4 @@ $ java -classpath ${classpath:=.} app/pingpong/Main ${srcdir:=.}/../platforms/sm
 > [Boivin:Receiver:(2) 3.146646] [java/INFO]  --- bw 9.533962169004266E7 ----
 > [Boivin:Receiver:(2) 3.146646] [java/INFO] Done.
 > [Jacquelin:Sender:(1) 3.146646] [java/INFO] Done.
-> [3.146646] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [3.146646] [java/INFO] MSG_main finished; Terminating the simulation...
index 648339c..e4d0f63 100644 (file)
@@ -29,7 +29,5 @@ class Main {
                }
                Msg.info("Number of hosts '"+hosts.length+"'");
                Msg.run();
-               
-               Msg.info("Simulation time "+Msg.getClock());
        }
 }
index cef0261..c7ed48b 100644 (file)
@@ -15,8 +15,7 @@ $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/r
 > [  0.101019] (6:5@host6) Host '5' received 'Token'
 > [  0.101019] (6:5@host6) Host '5' send 'Token' to Host '0'
 > [  0.131796] (1:0@host1) Host '0' received 'Token'
-> [  0.131796] (0:maestro@) MSG_main finished; Cleaning up the simulation...
-> [  0.131796] (0:maestro@) Simulation time 0.13179602061855672
+> [  0.131796] (0:maestro@) MSG_main finished; Terminating the simulation...
 
 $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/two_peers.xml '--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n'
 > [    0.000000] (0:maestro@) Using regular java threads.
@@ -25,8 +24,7 @@ $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/t
 > [    0.624423] (2:1@100036570) Host '1' received 'Token'
 > [    0.624423] (2:1@100036570) Host '1' send 'Token' to Host '0'
 > [    1.248846] (1:0@100030591) Host '0' received 'Token'
-> [    1.248846] (0:maestro@) MSG_main finished; Cleaning up the simulation...
-> [    1.248846] (0:maestro@) Simulation time 1.2488464578972847
+> [    1.248846] (0:maestro@) MSG_main finished; Terminating the simulation...
 
 $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/meta_cluster.xml '--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n'
 > [  0.000000] (0:maestro@) Using regular java threads.
@@ -151,5 +149,4 @@ $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/m
 > [  1.791501] (60:59@host-9.cluster2) Host '59' received 'Token'
 > [  1.791501] (60:59@host-9.cluster2) Host '59' send 'Token' to Host '0'
 > [  1.821865] (1:0@host-1.cluster1) Host '0' received 'Token'
-> [  1.821865] (0:maestro@) MSG_main finished; Cleaning up the simulation...
-> [  1.821865] (0:maestro@) Simulation time 1.8218653608247406
+> [  1.821865] (0:maestro@) MSG_main finished; Terminating the simulation...
index 60b948d..be3fc5e 100644 (file)
@@ -24,4 +24,4 @@ $ java -classpath ${classpath:=.} async/dsend/Main ${srcdir:=.}/../platforms/sma
 > [  2.964768] (3:Receiver@Fafard) Received a task. I'm done. See you!
 > [  4.162002] (5:Receiver@Jacquelin) Received a task. I'm done. See you!
 > [ 20.000000] (1:Sender@Boivin) Done sleeping. Goodbye now!
-> [ 20.000000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [ 20.000000] (0:maestro@) MSG_main finished; Terminating the simulation...
index 95f31ee..e9aba7e 100644 (file)
@@ -23,4 +23,4 @@ $ java -classpath ${classpath:=.} async/waitall/Main ${srcdir:=.}/../platforms/s
 > [  2.964768] (3:Receiver@Fafard) I got my task, good bye.
 > [  4.162002] (5:Receiver@Jacquelin) I got my task, good bye.
 > [  4.162002] (1:Sender@Boivin) Goodbye now!
-> [  4.162002] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  4.162002] (0:maestro@) MSG_main finished; Terminating the simulation...
index de936b4..9c7526d 100644 (file)
@@ -5,4 +5,4 @@ $ java -classpath ${classpath:=.} async/yield/Main ${srcdir:=.}/../platforms/sma
 > [  0.000000] (0:maestro@) Using regular java threads.
 > [  0.000000] (1:Yielder@Boivin) Yielded 10. Good bye now!
 > [  0.000000] (2:Yielder@Bourassa) Yielded 15. Good bye now!
-> [  0.000000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  0.000000] (0:maestro@) MSG_main finished; Terminating the simulation...
index 4010bc5..d33fcb0 100644 (file)
@@ -202,4 +202,4 @@ $ java -classpath ${classpath:=.} cloud/masterworker/Main ${srcdir:=.}/../platfo
 > [49971.662691] (1:Master@Boivin) Send some work to everyone
 > [49973.849223] (1:Master@Boivin) Suspend all VMs, wait a while, resume them, migrate them and shut them down.
 > [50971.662691] (1:Master@Boivin) XXXXXXXXXXXXXXX Step 50 done.
-> [50971.662691] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [50971.662691] (0:maestro@) MSG_main finished; Terminating the simulation...
index 5740464..71be7e6 100644 (file)
@@ -30,4 +30,4 @@ $ java -classpath ${classpath:=.} cloud/migration/Main ${srcdir:=.}/../platforms
 > [PM0:Test:(1) 183.918679] [java/INFO] End of migration of VM vm0 to node PM0
 > [PM0:Test:(1) 183.918679] [java/INFO]      - End of Migration from PM1 to PM0 (duration:43.207501264227034)
 > [PM0:Test:(1) 183.918679] [java/INFO] Forcefully destroy VMs
-> [183.918679] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [183.918679] [java/INFO] MSG_main finished; Terminating the simulation...
index cb93b6d..6f75315 100644 (file)
@@ -4,7 +4,7 @@
 
 $ java -classpath ${classpath:=.} dht/chord/Main ${srcdir:=.}/../platforms/cluster.xml ${srcdir:=.}/dht/chord/chord.xml
 > [0.000000] [java/INFO] Using regular java threads.
-> [1046.732943] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [1046.732943] [java/INFO] MSG_main finished; Terminating the simulation...
 > [node-1.acme.org:dht.chord.Node:(2) 0.000000] [java/INFO] Joining the ring with id 366680 knowing node 42
 > [node-2.acme.org:dht.chord.Node:(3) 0.000000] [java/INFO] Joining the ring with id 533744 knowing node 366680
 > [node-3.acme.org:dht.chord.Node:(4) 0.000000] [java/INFO] Joining the ring with id 1319738 knowing node 42
index c69a56d..d2c6f69 100644 (file)
@@ -4,7 +4,7 @@
 
 $ java -classpath ${classpath:=.} dht/kademlia/Main ${srcdir:=.}/../platforms/cluster.xml ${srcdir:=.}/dht/kademlia/kademlia.xml
 > [0.000000] [java/INFO] Using regular java threads.
-> [900.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [900.000000] [java/INFO] MSG_main finished; Terminating the simulation...
 > [node-0.acme.org:dht.kademlia.Node:(1) 0.000000] [java/INFO] Hi, I'm going to create the network with the id 0!
 > [node-0.acme.org:dht.kademlia.Node:(1) 900.000000] [java/INFO] 8/8 FIND_NODE have succedded.
 > [node-1.acme.org:dht.kademlia.Node:(2) 0.000000] [java/INFO] Hi, I'm going to join the network with the id 1!
index d9b7991..0fdc76e 100644 (file)
@@ -29,6 +29,5 @@ public class Main {
     new EnergyConsumer("MyHost1","energyConsumer").start();
     /* Execute the simulation */
     Msg.run();
-    Msg.info("Total simulation time: "+  Msg.getClock());
   }
 }
index 8bd70cf..4a6c3ff 100644 (file)
@@ -9,8 +9,7 @@ $ java -classpath ${classpath:=.} energy/consumption/Main ${srcdir:=.}/../platfo
 > [MyHost1:energyConsumer:(1) 10.000000] [java/INFO] Currently consumed energy after sleeping 10 sec: 1000.0
 > [MyHost1:energyConsumer:(1) 20.000000] [java/INFO] Currently consumed energy after executing 1E9 flops: 2200.0
 > [20.000000] [surf_energy/INFO] Total energy consumption: 6200.000000 Joules (used hosts: 2200.000000 Joules; unused/idle hosts: 4000.000000)
-> [20.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
-> [20.000000] [java/INFO] Total simulation time: 20.0
+> [20.000000] [java/INFO] MSG_main finished; Terminating the simulation...
 > [20.000000] [surf_energy/INFO] Energy consumption of host MyHost1: 2200.000000 Joules
 > [20.000000] [surf_energy/INFO] Energy consumption of host MyHost2: 2000.000000 Joules
 > [20.000000] [surf_energy/INFO] Energy consumption of host MyHost3: 2000.000000 Joules
index f1000a3..b35f2d2 100644 (file)
@@ -19,7 +19,7 @@ $ java -classpath ${classpath:=.} energy/pstate/Main ${srcdir:=.}/../platforms/e
 > [MyHost2:dvfs_test:(3) 6.000000] [java/INFO] Count of Processor states=3
 > [MyHost2:dvfs_test:(3) 6.000000] [java/INFO] Current power peak=2.0E7
 > [6.000000] [surf_energy/INFO] Total energy consumption: 2195.000000 Joules (used hosts: 1595.000000 Joules; unused/idle hosts: 600.000000)
-> [6.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [6.000000] [java/INFO] MSG_main finished; Terminating the simulation...
 > [6.000000] [surf_energy/INFO] Energy consumption of host MyHost1: 645.000000 Joules
 > [6.000000] [surf_energy/INFO] Energy consumption of host MyHost2: 950.000000 Joules
 > [6.000000] [surf_energy/INFO] Energy consumption of host MyHost3: 600.000000 Joules
index f3348f6..e07fb6a 100644 (file)
@@ -15,7 +15,7 @@ $ java -classpath ${classpath:=.} energy/vm/Main ${srcdir:=.}/../platforms/energ
 > [vmHost1:p11:(2) 6.000000] [java/INFO] This worker is done.
 > [vmHost3:p21:(4) 6.000000] [java/INFO] This worker is done.
 > [10.000000] [surf_energy/INFO] Total energy consumption: 4320.000000 Joules (used hosts: 4320.000000 Joules; unused/idle hosts: 0.000000)
-> [10.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [10.000000] [java/INFO] MSG_main finished; Terminating the simulation...
 > [10.000000] [surf_energy/INFO] Energy consumption of host MyHost1: 1120.000000 Joules
 > [10.000000] [surf_energy/INFO] Energy consumption of host MyHost2: 1600.000000 Joules
 > [10.000000] [surf_energy/INFO] Energy consumption of host MyHost3: 1600.000000 Joules
index 1830e42..d70cf90 100644 (file)
@@ -23,4 +23,4 @@ $ java -classpath ${classpath:=.} io/file/Main ${srcdir:=.}/../platforms/storage
 > [carl:2:(3) 0.003433] [java/INFO] Seek back to the beginning of /home/doc/simgrid/examples/platforms/g5k_cabinets.xml
 > [bob:1:(2) 0.004414] [java/INFO] Having read 104028 on /home/doc/simgrid/examples/platforms/nancy.xml
 > [carl:2:(3) 0.004533] [java/INFO] Having read 110000 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [0.004533] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [0.004533] [java/INFO] MSG_main finished; Terminating the simulation...
index 87153be..d89cae9 100644 (file)
@@ -22,4 +22,4 @@ $ java -classpath ${classpath:=.} io/storage/Main ${srcdir:=.}/../platforms/stor
 > [denise:0:(1) 0.000000] [java/INFO] Disk: Disk2
 > [denise:0:(1) 0.000000] [java/INFO] Disk: Disk3
 > [denise:0:(1) 0.000000] [java/INFO] Disk: Disk4
-> [0.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [0.000000] [java/INFO] MSG_main finished; Terminating the simulation...
index 15becff..aa210f3 100644 (file)
@@ -9,4 +9,4 @@ $ java -classpath ${classpath:=.} process/kill/Main ${srcdir:=.}/../platforms/sm
 > [Boivin:victim:(2) 10.000000] [java/INFO] OK, OK. Let's work
 > [Jacquelin:killer:(1) 11.000000] [java/INFO] Kill Process
 > [Jacquelin:killer:(1) 11.000000] [java/INFO] Ok, goodbye now.
-> [11.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [11.000000] [java/INFO] MSG_main finished; Terminating the simulation...
index 75cb358..b2a24e4 100644 (file)
@@ -8,7 +8,7 @@ $ java -classpath ${classpath:=.} process/migration/Main ${srcdir:=.}/../platfor
 > [  0.000000] (2:emigrant@Boivin) Yeah, found something to do
 > [  1.000000] (1:policeman@Boivin) Wait a bit before migrating the emigrant.
 > [  3.000000] (2:emigrant@Boivin) Moving back to home after work
-> [  7.000000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  7.000000] (0:maestro@) MSG_main finished; Terminating the simulation...
 > [  7.000000] (2:emigrant@Jacquelin) I've been moved on this new host:Jacquelin
 > [  7.000000] (2:emigrant@Jacquelin) Uh, nothing to do here. Stopping now
 > [  7.000000] (1:policeman@Boivin) I moved the emigrant
index 7e5dbd9..d3a5f48 100644 (file)
@@ -9,4 +9,4 @@ $ java -classpath ${classpath:=.} process/startkilltime/Main ${srcdir:=.}/../pla
 > [node-5.acme.org:process.startkilltime.Sleeper:(6) 5.000000] [java/INFO] Hello! I go to sleep.
 > [node-2.acme.org:process.startkilltime.Sleeper:(3) 6.000000] [java/INFO] Done sleeping
 > [node-3.acme.org:process.startkilltime.Sleeper:(4) 7.000000] [java/INFO] Done sleeping
-> [10.000000] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [10.000000] [java/INFO] MSG_main finished; Terminating the simulation...
index 7c771a2..45e219b 100644 (file)
@@ -6,7 +6,7 @@ $ java -classpath ${classpath:=.} process/suspend/Main ${srcdir:=.}/../platforms
 > [  0.000000] (1:DreamMaster@Jacquelin) Let's create a lazy guy.
 > [  0.000000] (1:DreamMaster@Jacquelin) Let's wait a little bit...
 > [  0.000000] (2:Lazy@Jacquelin) Nobody's watching me ? Let's go to sleep.
-> [ 10.000000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [ 10.000000] (0:maestro@) MSG_main finished; Terminating the simulation...
 > [ 10.000000] (1:DreamMaster@Jacquelin) Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!
 > [ 10.000000] (1:DreamMaster@Jacquelin) OK, goodbye now.
 > [ 10.000000] (2:Lazy@Jacquelin) Uuuh ? Did somebody call me ?
index f88e895..195fe6a 100644 (file)
@@ -7,5 +7,5 @@ $ java -classpath ${classpath:=.} task/priority/Main ${srcdir:=.}/../platforms/s
 > [  0.000000] (1:task.priority.Test@Fafard) Hello! Running a task of size 7.6296E7 with priority 1.0
 > [  0.000000] (2:task.priority.Test@Fafard) Hello! Running a task of size 7.6296E7 with priority 2.0
 > [  1.500000] (2:task.priority.Test@Fafard) Goodbye now!
-> [  2.000000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  2.000000] (0:maestro@) MSG_main finished; Terminating the simulation...
 > [  2.000000] (1:task.priority.Test@Fafard) Goodbye now!
index 84b951b..7e1fee9 100644 (file)
@@ -7,7 +7,7 @@ $ java -classpath ${classpath:=.} trace/pingpong/Main ${srcdir:=.}/../platforms/
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'simulation.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/platform' to 'yes'
-> [3.817809] [java/INFO] MSG_main finished; Cleaning up the simulation...
+> [3.817809] [java/INFO] MSG_main finished; Terminating the simulation...
 > [Boivin:Receiver:(2) 0.000000] [java/INFO] hello!
 > [Boivin:Receiver:(2) 0.000000] [java/INFO] try to get a task
 > [Boivin:Receiver:(2) 1.048882] [java/INFO] Got at time 1.0488818628325232
index 938f27c..219a3db 100644 (file)
@@ -58,7 +58,7 @@ set(xml_files    ${xml_files}     ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/a
                                   ${CMAKE_CURRENT_SOURCE_DIR}/network-ns3/one_cluster_d.xml        PARENT_SCOPE)
 
 foreach(x app-masterworker cloud-masterworker
-          dht-pastry dht-kademlia platform-failures
+          dht-pastry dht-kademlia # FIXME: platform-failures is disabled
           energy-vm
           process-create 
           synchro-semaphore)
index f7656af..9da8dcd 100644 (file)
@@ -13,8 +13,6 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example")
 
 static int master(int argc, char *argv[])
 {
-  int i;
-
   long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");
   double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");
   double task_comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");
@@ -22,7 +20,7 @@ static int master(int argc, char *argv[])
 
   XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, number_of_tasks);
 
-  for (i = 0; i < number_of_tasks; i++) {
+  for (int i = 0; i < number_of_tasks; i++) {
     char mailbox[256];
     snprintf(mailbox, 255, "worker-%ld", i % workers_count);
     XBT_INFO("Send a message to %s", mailbox);
@@ -58,7 +56,7 @@ static int master(int argc, char *argv[])
   }
 
   XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (i = 0; i < workers_count; i++) {
+  for (int i = 0; i < workers_count; i++) {
     char mailbox[256];
     snprintf(mailbox, 255, "worker-%ld", i % workers_count);
     msg_task_t task = MSG_task_create("finalize", 0, 0, FINALIZE);
@@ -101,7 +99,6 @@ static int worker(int argc, char *argv[])
   snprintf(mailbox, 79,"worker-%ld", id);
 
   while (1) {
-    double time1 = MSG_get_clock();
     msg_task_t task = NULL;
     XBT_INFO("Waiting a message on %s", mailbox);
     int retcode = MSG_task_receive( &(task), mailbox);
@@ -110,8 +107,6 @@ static int worker(int argc, char *argv[])
         MSG_task_destroy(task);
         break;
       }
-      if (time1 < *((double *) task->data))
-        time1 = *((double *) task->data);
       XBT_INFO("Start execution...");
       retcode = MSG_task_execute(task);
       if (retcode == MSG_OK) {
index 33043db..ea83fff 100644 (file)
@@ -3,7 +3,7 @@
 p Testing a simple master/worker example application handling failures TCP crosstraffic DISABLED
 
 ! output sort 19
-$ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+$ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --log=surf_cpu.t:verbose
 > [  0.000000] (0:maestro@) Cannot launch process 'worker' on failed host 'Fafard'
 > [  0.000000] (1:master@Tremblay) Got 5 workers and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Send a message to worker-0
@@ -110,7 +110,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:criti
 p Testing a simple master/worker example application handling failures. TCP crosstraffic ENABLED
 
 ! output sort 19
-$ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+$ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --log=surf_cpu.t:verbose
 > [  0.000000] (0:maestro@) Cannot launch process 'worker' on failed host 'Fafard'
 > [  0.000000] (1:master@Tremblay) Got 5 workers and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Send a message to worker-0
@@ -214,109 +214,11 @@ $ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:criti
 > [ 43.774742] (1:master@Tremblay) Goodbye now!
 > [ 43.774742] (0:maestro@) Simulation time 43.7747
 
-p Testing a simple master/worker example application handling failures. CPU_TI optimization enabled
+p NOT testing the mixure of failures and CpuTI: 
+p This test leads to a deadlock because of a bug somewhere in surf_solve.
+p We should debug this instead of ignoring the issue, but it's utterly
+p   complex with such an integration test. One day, we will setup a set of
+p   unit tests for the surf solver, and such issues will be addressable again.
+p For the time being, I just give up, sorry.
 
-! output sort 19
-$ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} --cfg=cpu/optim:TI "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:maestro@) Cannot launch process 'worker' on failed host 'Fafard'
-> [  0.000000] (1:master@Tremblay) Got 5 workers and 20 tasks to process
-> [  0.000000] (1:master@Tremblay) Send a message to worker-0
-> [  0.000000] (2:worker@Tremblay) Waiting a message on worker-0
-> [  0.000000] (3:worker@Jupiter) Waiting a message on worker-1
-> [  0.000000] (4:worker@Ginette) Waiting a message on worker-3
-> [  0.000000] (5:worker@Bourassa) Waiting a message on worker-4
-> [  0.010825] (1:master@Tremblay) Send to worker-0 completed
-> [  0.010825] (1:master@Tremblay) Send a message to worker-1
-> [  0.010825] (2:worker@Tremblay) Start execution...
-> [  1.000000] (0:maestro@) Restart processes on host Fafard
-> [  1.000000] (1:master@Tremblay) Mmh. Something went wrong with 'worker-1'. Nevermind. Let's keep going!
-> [  1.000000] (1:master@Tremblay) Send a message to worker-2
-> [  1.000000] (3:worker@Jupiter) Gloups. The cpu on which I'm running just turned off!. See you!
-> [  1.000000] (6:worker@Fafard) Waiting a message on worker-2
-> [  2.000000] (0:maestro@) Restart processes on host Jupiter
-> [  2.000000] (1:master@Tremblay) Mmh. Something went wrong with 'worker-2'. Nevermind. Let's keep going!
-> [  2.000000] (1:master@Tremblay) Send a message to worker-3
-> [  2.000000] (6:worker@Fafard) Gloups. The cpu on which I'm running just turned off!. See you!
-> [  2.000000] (7:worker@Jupiter) Waiting a message on worker-1
-> [  2.010825] (2:worker@Tremblay) Execution complete.
-> [  2.010825] (2:worker@Tremblay) Waiting a message on worker-0
-> [  3.082474] (1:master@Tremblay) Send to worker-3 completed
-> [  3.082474] (1:master@Tremblay) Send a message to worker-4
-> [  3.082474] (4:worker@Ginette) Start execution...
-> [  4.164948] (1:master@Tremblay) Send to worker-4 completed
-> [  4.164948] (1:master@Tremblay) Send a message to worker-0
-> [  4.164948] (5:worker@Bourassa) Start execution...
-> [  4.175773] (1:master@Tremblay) Send to worker-0 completed
-> [  4.175773] (1:master@Tremblay) Send a message to worker-1
-> [  4.175773] (2:worker@Tremblay) Start execution...
-> [  5.082474] (4:worker@Ginette) Execution complete.
-> [  5.082474] (4:worker@Ginette) Waiting a message on worker-3
-> [  5.258247] (1:master@Tremblay) Send to worker-1 completed
-> [  5.258247] (1:master@Tremblay) Send a message to worker-2
-> [  5.258247] (7:worker@Jupiter) Start execution...
-> [  6.164948] (5:worker@Bourassa) Execution complete.
-> [  6.164948] (5:worker@Bourassa) Waiting a message on worker-4
-> [  6.175773] (2:worker@Tremblay) Execution complete.
-> [  6.175773] (2:worker@Tremblay) Waiting a message on worker-0
-> [  7.258247] (7:worker@Jupiter) Execution complete.
-> [  7.258247] (7:worker@Jupiter) Waiting a message on worker-1
-> [ 15.258247] (1:master@Tremblay) Mmh. Got timeouted while speaking to 'worker-2'. Nevermind. Let's keep going!
-> [ 15.258247] (1:master@Tremblay) Send a message to worker-3
-> [ 15.258247] (1:master@Tremblay) Mmh. Something went wrong with 'worker-3'. Nevermind. Let's keep going!
-> [ 15.258247] (1:master@Tremblay) Send a message to worker-4
-> [ 15.258247] (4:worker@Ginette) Mmh. Something went wrong. Nevermind. Let's keep going!
-> [ 15.258247] (4:worker@Ginette) Waiting a message on worker-3
-> [ 16.340722] (1:master@Tremblay) Send to worker-4 completed
-> [ 16.340722] (1:master@Tremblay) Send a message to worker-0
-> [ 16.340722] (5:worker@Bourassa) Start execution...
-> [ 16.351546] (1:master@Tremblay) Send to worker-0 completed
-> [ 16.351546] (1:master@Tremblay) Send a message to worker-1
-> [ 16.351546] (2:worker@Tremblay) Start execution...
-> [ 17.434021] (1:master@Tremblay) Send to worker-1 completed
-> [ 17.434021] (1:master@Tremblay) Send a message to worker-2
-> [ 17.434021] (7:worker@Jupiter) Start execution...
-> [ 18.340722] (5:worker@Bourassa) Execution complete.
-> [ 18.340722] (5:worker@Bourassa) Waiting a message on worker-4
-> [ 18.351546] (2:worker@Tremblay) Execution complete.
-> [ 18.351546] (2:worker@Tremblay) Waiting a message on worker-0
-> [ 19.434021] (7:worker@Jupiter) Execution complete.
-> [ 19.434021] (7:worker@Jupiter) Waiting a message on worker-1
-> [ 27.434021] (1:master@Tremblay) Mmh. Got timeouted while speaking to 'worker-2'. Nevermind. Let's keep going!
-> [ 27.434021] (1:master@Tremblay) Send a message to worker-3
-> [ 28.516495] (1:master@Tremblay) Send to worker-3 completed
-> [ 28.516495] (1:master@Tremblay) Send a message to worker-4
-> [ 28.516495] (1:master@Tremblay) Mmh. Something went wrong with 'worker-4'. Nevermind. Let's keep going!
-> [ 28.516495] (1:master@Tremblay) Send a message to worker-0
-> [ 28.516495] (4:worker@Ginette) Start execution...
-> [ 28.516495] (5:worker@Bourassa) Mmh. Something went wrong. Nevermind. Let's keep going!
-> [ 28.516495] (5:worker@Bourassa) Waiting a message on worker-4
-> [ 28.527320] (1:master@Tremblay) Send to worker-0 completed
-> [ 28.527320] (1:master@Tremblay) Send a message to worker-1
-> [ 28.527320] (2:worker@Tremblay) Start execution...
-> [ 29.609794] (1:master@Tremblay) Send to worker-1 completed
-> [ 29.609794] (1:master@Tremblay) Send a message to worker-2
-> [ 29.609794] (7:worker@Jupiter) Start execution...
-> [ 30.516495] (4:worker@Ginette) Execution complete.
-> [ 30.516495] (4:worker@Ginette) Waiting a message on worker-3
-> [ 30.527320] (2:worker@Tremblay) Execution complete.
-> [ 30.527320] (2:worker@Tremblay) Waiting a message on worker-0
-> [ 31.609794] (7:worker@Jupiter) Execution complete.
-> [ 31.609794] (7:worker@Jupiter) Waiting a message on worker-1
-> [ 39.609794] (1:master@Tremblay) Mmh. Got timeouted while speaking to 'worker-2'. Nevermind. Let's keep going!
-> [ 39.609794] (1:master@Tremblay) Send a message to worker-3
-> [ 40.692268] (1:master@Tremblay) Send to worker-3 completed
-> [ 40.692268] (1:master@Tremblay) Send a message to worker-4
-> [ 40.692268] (4:worker@Ginette) Start execution...
-> [ 41.000000] (4:worker@Ginette) Gloups. The cpu on which I'm running just turned off!. See you!
-> [ 41.774742] (1:master@Tremblay) Send to worker-4 completed
-> [ 41.774742] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 41.774742] (2:worker@Tremblay) I'm done. See you!
-> [ 41.774742] (5:worker@Bourassa) Start execution...
-> [ 41.774742] (7:worker@Jupiter) I'm done. See you!
-> [ 42.774742] (1:master@Tremblay) Mmh. Got timeouted while speaking to 'worker-2'. Nevermind. Let's keep going!
-> [ 43.774742] (0:maestro@) Simulation time 43.7747
-> [ 43.774742] (1:master@Tremblay) Mmh. Got timeouted while speaking to 'worker-3'. Nevermind. Let's keep going!
-> [ 43.774742] (1:master@Tremblay) Goodbye now!
-> [ 43.774742] (5:worker@Bourassa) Execution complete.
-> [ 43.774742] (5:worker@Bourassa) Waiting a message on worker-4
-> [ 43.774742] (5:worker@Bourassa) I'm done. See you!
+p $ $SG_TEST_EXENV ${bindir:=.}/platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir}/../app-masterworker/app-masterworker_d.xml --cfg=path:${srcdir} --cfg=cpu/optim:TI "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --log=surf_cpu.t:verbose
index 279b14f..620a1d8 100644 (file)
@@ -250,7 +250,7 @@ $ tail -n +3 procmig.trace
 > 5 9 7 sleep "1 1 0"
 > 5 10 7 receive "1 0 0"
 > 5 11 7 send "0 0 1"
-> 5 12 7 task_execute "0 1 1"
+> 5 12 7 execute "0 1 1"
 > 4 13 0 6 6 ACTOR_LINK
 > 4 14 0 6 6 ACTOR_TASK_LINK
 > 6 0.000000 33 6 1 "policeman-2"
index 2185d6a..6e0b997 100644 (file)
@@ -3,7 +3,7 @@
 foreach (example actor-create actor-daemon actor-join actor-kill
                  actor-lifetime actor-migration actor-suspend actor-yield
                  app-chainsend app-pingpong app-token-ring
-                 async-wait async-waitany async-waitall async-ready
+                 async-ready async-wait async-waitany async-waitall async-waituntil
                  cloud-capping cloud-migration cloud-simple
                  energy-exec energy-boot energy-link energy-vm
                  engine-filtering
@@ -73,15 +73,18 @@ set(xml_files     ${xml_files}    ${CMAKE_CURRENT_SOURCE_DIR}/actor-create/s4u-a
                                   ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworkers/s4u-app-masterworkers_d.xml
+                                  ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/async-waitany/s4u-async-waitany_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/async-ready/s4u-ready-wait_d.xml
+                                  ${CMAKE_CURRENT_SOURCE_DIR}/async-waituntil/s4u-async-waituntil_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/dht-kademlia/s4u-dht-kademlia_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/energy-boot/platform_boot.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/io-file-remote/s4u-io-file-remote_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/platform-properties/s4u-platform-properties_d.xml
+                                  ${CMAKE_CURRENT_SOURCE_DIR}/platform-failures/s4u-masterworker-failures_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/replay-comm/s4u-replay-comm-split_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/replay-comm/s4u-replay-comm_d.xml
                                   ${CMAKE_CURRENT_SOURCE_DIR}/replay-storage/s4u-replay-storage_d.xml
@@ -96,13 +99,13 @@ set(txt_files     ${txt_files}    ${CMAKE_CURRENT_SOURCE_DIR}/replay-comm/s4u-re
 foreach(example actor-create actor-daemon actor-join actor-kill
                 actor-lifetime actor-migration actor-suspend actor-yield
                 app-bittorrent app-chainsend app-masterworkers app-pingpong app-token-ring 
-                async-wait async-waitall async-waitany async-ready
+                async-ready async-wait async-waitall async-waitany async-waituntil
                 cloud-capping cloud-migration cloud-simple
                 dht-chord dht-kademlia
                 energy-exec energy-boot energy-link energy-vm
                 engine-filtering
                 exec-async exec-basic exec-dvfs exec-monitor exec-ptask exec-remote
-                platform-failures platform-properties plugin-hostload mutex
+                platform-properties plugin-hostload mutex # FIXME: platform-failures is disabled
                 io-async io-file-system io-file-remote io-storage-raw
                 replay-comm replay-storage
                 routing-get-clusters
index 21fefba..0a1ac9f 100644 (file)
@@ -5,7 +5,6 @@
 
 #include <algorithm>
 #include <climits>
-#include <xbt/ex.hpp>
 
 #include "s4u-peer.hpp"
 #include "s4u-tracker.hpp"
@@ -92,12 +91,10 @@ bool Peer::getPeersFromTracker()
   try {
     XBT_DEBUG("Sending a peer request to the tracker.");
     tracker_mailbox->put(peer_request, TRACKER_COMM_SIZE, GET_PEERS_TIMEOUT);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Timeout expired when requesting peers to tracker");
-      delete peer_request;
-      return false;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Timeout expired when requesting peers to tracker");
+    delete peer_request;
+    return false;
   }
 
   try {
@@ -107,11 +104,9 @@ bool Peer::getPeersFromTracker()
       if (id != peer_id)
         connected_peers[peer_id] = new Connection(peer_id);
     delete answer;
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Timeout expired when requesting peers to tracker");
-      return false;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Timeout expired when requesting peers to tracker");
+    return false;
   }
   return true;
 }
index 65bf93f..d84f370 100644 (file)
@@ -3,6 +3,10 @@
 /* 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. */
 
+/* ************************************************************************* */
+/* Take this tutorial online: https://simgrid.frama.io/simgrid/tuto_s4u.html */
+/* ************************************************************************* */
+
 #include <simgrid/s4u.hpp>
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this s4u example");
@@ -11,27 +15,27 @@ class Master {
   long tasks_count                 = 0;
   double compute_cost              = 0;
   double communicate_cost          = 0;
-  long workers_count               = 0;
-  simgrid::s4u::MailboxPtr mailbox = nullptr;
+  std::vector<simgrid::s4u::MailboxPtr> workers;
 
 public:
   explicit Master(std::vector<std::string> args)
   {
-    xbt_assert(args.size() == 5, "The master actor expects 4 arguments from the XML deployment file");
+    xbt_assert(args.size() > 4, "The master function expects 3 arguments plus the workers' names");
 
-    workers_count    = std::stol(args[1]);
-    tasks_count      = std::stol(args[2]);
-    compute_cost     = std::stod(args[3]);
-    communicate_cost = std::stod(args[4]);
+    tasks_count      = std::stol(args[1]);
+    compute_cost     = std::stod(args[2]);
+    communicate_cost = std::stod(args[3]);
+    for (unsigned int i = 4; i < args.size(); i++)
+      workers.push_back(simgrid::s4u::Mailbox::by_name(args[i]));
 
-    XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, tasks_count);
+    XBT_INFO("Got %zu workers and %ld tasks to process", workers.size(), tasks_count);
   }
 
   void operator()()
   {
     for (int i = 0; i < tasks_count; i++) { /* For each task to be executed: */
       /* - Select a worker in a round-robin way */
-      mailbox = simgrid::s4u::Mailbox::by_name(std::string("worker-") + std::to_string(i % workers_count));
+      simgrid::s4u::MailboxPtr mailbox = workers[i % workers.size()];
 
       /* - Send the computation amount to the worker */
       if (tasks_count < 10000 || (tasks_count < 100000 && i % 10000 == 0) || i % 100000 == 0)
@@ -40,25 +44,23 @@ public:
     }
 
     XBT_INFO("All tasks have been dispatched. Request all workers to stop.");
-    for (int i = 0; i < workers_count; i++) {
+    for (unsigned int i = 0; i < workers.size(); i++) {
       /* The workers stop when receiving a negative compute_cost */
-      mailbox = simgrid::s4u::Mailbox::by_name(std::string("worker-") + std::to_string(i));
+      simgrid::s4u::MailboxPtr mailbox = workers[i % workers.size()];
       mailbox->put(new double(-1.0), 0);
     }
   }
 };
 
 class Worker {
-  long id                          = -1;
   simgrid::s4u::MailboxPtr mailbox = nullptr;
 
 public:
   explicit Worker(std::vector<std::string> args)
   {
-    xbt_assert(args.size() == 2, "The worker expects a single argument from the XML deployment file: "
-                                 "its worker ID (its numerical rank)");
-    id      = std::stol(args[1]);
-    mailbox = simgrid::s4u::Mailbox::by_name(std::string("worker-") + std::to_string(id));
+    xbt_assert(args.size() == 1, "The worker expects to not get any argument");
+
+    mailbox = simgrid::s4u::Mailbox::by_name(simgrid::s4u::this_actor::get_host()->get_name());
   }
 
   void operator()()
index 0cfae30..e3727c0 100644 (file)
@@ -3,6 +3,10 @@
 /* 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. */
 
+/* ************************************************************************* */
+/* Take this tutorial online: https://simgrid.frama.io/simgrid/tuto_s4u.html */
+/* ************************************************************************* */
+
 #include <simgrid/s4u.hpp>
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this example");
@@ -10,20 +14,20 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_app_masterworker, "Messages specific for this e
 // master-begin
 static void master(std::vector<std::string> args)
 {
-  xbt_assert(args.size() == 5, "The master function expects 4 arguments");
+  xbt_assert(args.size() > 4, "The master function expects at least 3 arguments");
 
-  long workers_count        = std::stol(args[1]);
-  long tasks_count          = std::stol(args[2]);
-  double compute_cost       = std::stod(args[3]);
-  double communication_cost = std::stod(args[4]);
+  long tasks_count          = std::stol(args[1]);
+  double compute_cost       = std::stod(args[2]);
+  double communication_cost = std::stod(args[3]);
+  std::vector<simgrid::s4u::MailboxPtr> workers;
+  for (unsigned int i = 4; i < args.size(); i++)
+    workers.push_back(simgrid::s4u::Mailbox::by_name(args[i]));
 
-  XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, tasks_count);
+  XBT_INFO("Got %zu workers and %ld tasks to process", workers.size(), tasks_count);
 
   for (int i = 0; i < tasks_count; i++) { /* For each task to be executed: */
     /* - Select a worker in a round-robin way */
-    std::string worker_rank          = std::to_string(i % workers_count);
-    std::string mailbox_name         = std::string("worker-") + worker_rank;
-    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+    simgrid::s4u::MailboxPtr mailbox = workers[i % workers.size()];
 
     /* - Send the computation cost to that worker */
     XBT_INFO("Sending task %d of %ld to mailbox '%s'", i, tasks_count, mailbox->get_cname());
@@ -31,10 +35,9 @@ static void master(std::vector<std::string> args)
   }
 
   XBT_INFO("All tasks have been dispatched. Request all workers to stop.");
-  for (int i = 0; i < workers_count; i++) {
+  for (unsigned int i = 0; i < workers.size(); i++) {
     /* The workers stop when receiving a negative compute_cost */
-    std::string mailbox_name         = std::string("worker-") + std::to_string(i);
-    simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+    simgrid::s4u::MailboxPtr mailbox = workers[i % workers.size()];
 
     mailbox->put(new double(-1.0), 0);
   }
@@ -44,11 +47,10 @@ static void master(std::vector<std::string> args)
 // worker-begin
 static void worker(std::vector<std::string> args)
 {
-  xbt_assert(args.size() == 2, "The worker expects a single argument");
-  long id                          = std::stol(args[1]);
+  xbt_assert(args.size() == 1, "The worker expects no argument");
 
-  const std::string mailbox_name   = std::string("worker-") + std::to_string(id);
-  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
+  simgrid::s4u::Host* my_host      = simgrid::s4u::this_actor::get_host();
+  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(my_host->get_name());
 
   double compute_cost;
   do {
index 206dd72..4abff13 100644 (file)
@@ -5,26 +5,26 @@ p Testing a simple master/workers example application
 ! output sort 19
 $ $SG_TEST_EXENV ${bindir:=.}/s4u-app-masterworkers-class$EXEEXT ${platfdir}/small_platform.xml s4u-app-masterworkers_d.xml --trace "--log=root.fmt:[%10.6r]%e(%P@%h)%e%m%n"
 > [  0.000000] (master@Tremblay) Got 5 workers and 20 tasks to process
-> [  0.000000] (master@Tremblay) Sending task 0 of 20 to mailbox 'worker-0'
-> [  0.002265] (master@Tremblay) Sending task 1 of 20 to mailbox 'worker-1'
-> [  0.171420] (master@Tremblay) Sending task 2 of 20 to mailbox 'worker-2'
-> [  0.329817] (master@Tremblay) Sending task 3 of 20 to mailbox 'worker-3'
-> [  0.453549] (master@Tremblay) Sending task 4 of 20 to mailbox 'worker-4'
-> [  0.586168] (master@Tremblay) Sending task 5 of 20 to mailbox 'worker-0'
-> [  0.588433] (master@Tremblay) Sending task 6 of 20 to mailbox 'worker-1'
-> [  0.995917] (master@Tremblay) Sending task 7 of 20 to mailbox 'worker-2'
-> [  1.154314] (master@Tremblay) Sending task 8 of 20 to mailbox 'worker-3'
-> [  1.608379] (master@Tremblay) Sending task 9 of 20 to mailbox 'worker-4'
-> [  1.749885] (master@Tremblay) Sending task 10 of 20 to mailbox 'worker-0'
-> [  1.752150] (master@Tremblay) Sending task 11 of 20 to mailbox 'worker-1'
-> [  1.921304] (master@Tremblay) Sending task 12 of 20 to mailbox 'worker-2'
-> [  2.079701] (master@Tremblay) Sending task 13 of 20 to mailbox 'worker-3'
-> [  2.763209] (master@Tremblay) Sending task 14 of 20 to mailbox 'worker-4'
-> [  2.913601] (master@Tremblay) Sending task 15 of 20 to mailbox 'worker-0'
-> [  2.915867] (master@Tremblay) Sending task 16 of 20 to mailbox 'worker-1'
-> [  3.085021] (master@Tremblay) Sending task 17 of 20 to mailbox 'worker-2'
-> [  3.243418] (master@Tremblay) Sending task 18 of 20 to mailbox 'worker-3'
-> [  3.918038] (master@Tremblay) Sending task 19 of 20 to mailbox 'worker-4'
+> [  0.000000] (master@Tremblay) Sending task 0 of 20 to mailbox 'Tremblay'
+> [  0.002265] (master@Tremblay) Sending task 1 of 20 to mailbox 'Jupiter'
+> [  0.171420] (master@Tremblay) Sending task 2 of 20 to mailbox 'Fafard'
+> [  0.329817] (master@Tremblay) Sending task 3 of 20 to mailbox 'Ginette'
+> [  0.453549] (master@Tremblay) Sending task 4 of 20 to mailbox 'Bourassa'
+> [  0.586168] (master@Tremblay) Sending task 5 of 20 to mailbox 'Tremblay'
+> [  0.588433] (master@Tremblay) Sending task 6 of 20 to mailbox 'Jupiter'
+> [  0.995917] (master@Tremblay) Sending task 7 of 20 to mailbox 'Fafard'
+> [  1.154314] (master@Tremblay) Sending task 8 of 20 to mailbox 'Ginette'
+> [  1.608379] (master@Tremblay) Sending task 9 of 20 to mailbox 'Bourassa'
+> [  1.749885] (master@Tremblay) Sending task 10 of 20 to mailbox 'Tremblay'
+> [  1.752150] (master@Tremblay) Sending task 11 of 20 to mailbox 'Jupiter'
+> [  1.921304] (master@Tremblay) Sending task 12 of 20 to mailbox 'Fafard'
+> [  2.079701] (master@Tremblay) Sending task 13 of 20 to mailbox 'Ginette'
+> [  2.763209] (master@Tremblay) Sending task 14 of 20 to mailbox 'Bourassa'
+> [  2.913601] (master@Tremblay) Sending task 15 of 20 to mailbox 'Tremblay'
+> [  2.915867] (master@Tremblay) Sending task 16 of 20 to mailbox 'Jupiter'
+> [  3.085021] (master@Tremblay) Sending task 17 of 20 to mailbox 'Fafard'
+> [  3.243418] (master@Tremblay) Sending task 18 of 20 to mailbox 'Ginette'
+> [  3.918038] (master@Tremblay) Sending task 19 of 20 to mailbox 'Bourassa'
 > [  4.077318] (master@Tremblay) All tasks have been dispatched. Request all workers to stop.
 > [  4.077513] (worker@Tremblay) Exiting now.
 > [  4.096528] (worker@Jupiter) Exiting now.
@@ -36,26 +36,26 @@ $ $SG_TEST_EXENV ${bindir:=.}/s4u-app-masterworkers-class$EXEEXT ${platfdir}/sma
 ! output sort 19
 $ $SG_TEST_EXENV ${bindir:=.}/s4u-app-masterworkers-fun$EXEEXT ${platfdir}/small_platform.xml s4u-app-masterworkers_d.xml --trace "--log=root.fmt:[%10.6r]%e(%P@%h)%e%m%n"
 > [  0.000000] (master@Tremblay) Got 5 workers and 20 tasks to process
-> [  0.000000] (master@Tremblay) Sending task 0 of 20 to mailbox 'worker-0'
-> [  0.002265] (master@Tremblay) Sending task 1 of 20 to mailbox 'worker-1'
-> [  0.171420] (master@Tremblay) Sending task 2 of 20 to mailbox 'worker-2'
-> [  0.329817] (master@Tremblay) Sending task 3 of 20 to mailbox 'worker-3'
-> [  0.453549] (master@Tremblay) Sending task 4 of 20 to mailbox 'worker-4'
-> [  0.586168] (master@Tremblay) Sending task 5 of 20 to mailbox 'worker-0'
-> [  0.588433] (master@Tremblay) Sending task 6 of 20 to mailbox 'worker-1'
-> [  0.995917] (master@Tremblay) Sending task 7 of 20 to mailbox 'worker-2'
-> [  1.154314] (master@Tremblay) Sending task 8 of 20 to mailbox 'worker-3'
-> [  1.608379] (master@Tremblay) Sending task 9 of 20 to mailbox 'worker-4'
-> [  1.749885] (master@Tremblay) Sending task 10 of 20 to mailbox 'worker-0'
-> [  1.752150] (master@Tremblay) Sending task 11 of 20 to mailbox 'worker-1'
-> [  1.921304] (master@Tremblay) Sending task 12 of 20 to mailbox 'worker-2'
-> [  2.079701] (master@Tremblay) Sending task 13 of 20 to mailbox 'worker-3'
-> [  2.763209] (master@Tremblay) Sending task 14 of 20 to mailbox 'worker-4'
-> [  2.913601] (master@Tremblay) Sending task 15 of 20 to mailbox 'worker-0'
-> [  2.915867] (master@Tremblay) Sending task 16 of 20 to mailbox 'worker-1'
-> [  3.085021] (master@Tremblay) Sending task 17 of 20 to mailbox 'worker-2'
-> [  3.243418] (master@Tremblay) Sending task 18 of 20 to mailbox 'worker-3'
-> [  3.918038] (master@Tremblay) Sending task 19 of 20 to mailbox 'worker-4'
+> [  0.000000] (master@Tremblay) Sending task 0 of 20 to mailbox 'Tremblay'
+> [  0.002265] (master@Tremblay) Sending task 1 of 20 to mailbox 'Jupiter'
+> [  0.171420] (master@Tremblay) Sending task 2 of 20 to mailbox 'Fafard'
+> [  0.329817] (master@Tremblay) Sending task 3 of 20 to mailbox 'Ginette'
+> [  0.453549] (master@Tremblay) Sending task 4 of 20 to mailbox 'Bourassa'
+> [  0.586168] (master@Tremblay) Sending task 5 of 20 to mailbox 'Tremblay'
+> [  0.588433] (master@Tremblay) Sending task 6 of 20 to mailbox 'Jupiter'
+> [  0.995917] (master@Tremblay) Sending task 7 of 20 to mailbox 'Fafard'
+> [  1.154314] (master@Tremblay) Sending task 8 of 20 to mailbox 'Ginette'
+> [  1.608379] (master@Tremblay) Sending task 9 of 20 to mailbox 'Bourassa'
+> [  1.749885] (master@Tremblay) Sending task 10 of 20 to mailbox 'Tremblay'
+> [  1.752150] (master@Tremblay) Sending task 11 of 20 to mailbox 'Jupiter'
+> [  1.921304] (master@Tremblay) Sending task 12 of 20 to mailbox 'Fafard'
+> [  2.079701] (master@Tremblay) Sending task 13 of 20 to mailbox 'Ginette'
+> [  2.763209] (master@Tremblay) Sending task 14 of 20 to mailbox 'Bourassa'
+> [  2.913601] (master@Tremblay) Sending task 15 of 20 to mailbox 'Tremblay'
+> [  2.915867] (master@Tremblay) Sending task 16 of 20 to mailbox 'Jupiter'
+> [  3.085021] (master@Tremblay) Sending task 17 of 20 to mailbox 'Fafard'
+> [  3.243418] (master@Tremblay) Sending task 18 of 20 to mailbox 'Ginette'
+> [  3.918038] (master@Tremblay) Sending task 19 of 20 to mailbox 'Bourassa'
 > [  4.077318] (master@Tremblay) All tasks have been dispatched. Request all workers to stop.
 > [  4.077513] (worker@Tremblay) Exiting now.
 > [  4.096528] (worker@Jupiter) Exiting now.
index 29fddca..292e3bb 100644 (file)
@@ -3,25 +3,20 @@
 <platform version="4.1">
   <!-- The master actor (with some arguments) -->
   <actor host="Tremblay" function="master">
-    <argument value="5"/>         <!-- Number of workers -->
     <argument value="20"/>        <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
+    <!-- name of hosts on which the workers are running -->
+    <argument value="Tremblay"/>
+    <argument value="Jupiter" />
+    <argument value="Fafard" />
+    <argument value="Ginette" />
+    <argument value="Bourassa" />
   </actor>
-  <!-- The worker processes (with mailbox to listen on as argument) -->
-  <actor host="Tremblay" function="worker">
-    <argument value="0"/> 
-  </actor>
-  <actor host="Jupiter" function="worker">
-    <argument value="1"/> 
-  </actor>
-  <actor host="Fafard" function="worker">
-    <argument value="2"/> 
-  </actor>
-  <actor host="Ginette" function="worker">
-    <argument value="3"/> 
-  </actor>
-  <actor host="Bourassa" function="worker">
-    <argument value="4"/> 
-  </actor>
+  <!-- The worker processes (with no argument) -->
+  <actor host="Tremblay" function="worker" />
+  <actor host="Jupiter" function="worker" />
+  <actor host="Fafard" function="worker" />
+  <actor host="Ginette" function="worker" />
+  <actor host="Bourassa" function="worker" />
 </platform>
index 91e9224..24ffcbe 100644 (file)
@@ -25,39 +25,40 @@ static int sender(int argc, char** argv)
   double msg_size      = std::stol(argv[2]); /* - communication cost in bytes */
   long receivers_count = std::stod(argv[3]); /* - number of receivers */
 
+  /* Vector in which we store all ongoing communications */
   std::vector<simgrid::s4u::CommPtr> pending_comms;
 
+  /* Make a vector of the mailboxes to use */
+  std::vector<simgrid::s4u::MailboxPtr> mboxes;
+  for (int i = 0; i < receivers_count; i++)
+    mboxes.push_back(simgrid::s4u::Mailbox::by_name(std::string("receiver-") + std::to_string(i)));
+
   /* Start dispatching all messages to receivers, in a round robin fashion */
   for (int i = 0; i < messages_count; i++) {
+    std::string msg_content = std::string("Message ") + std::to_string(i);
+    // Copy the data we send: 'msg_content' is not a stable storage location.
+    // It will be destroyed when this actor leaves the loop, ie before the receiver gets it
+    std::string* payload = new std::string(msg_content);
+
+    XBT_INFO("Send '%s' to '%s'", msg_content.c_str(), mboxes[i % receivers_count]->get_cname());
 
-    std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-    simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-    std::string msgName           = std::string("Message ") + std::to_string(i);
-    std::string* payload          = new std::string(msgName); // copy the data we send:
-    // 'msgName' is not a stable storage location
-    XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str());
-    /* Create a communication representing the ongoing communication */
-    simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size);
-    /* Add this comm to the vector of all known comms */
+    /* Create a communication representing the ongoing communication, and store it in pending_comms */
+    simgrid::s4u::CommPtr comm = mboxes[i % receivers_count]->put_async(payload, msg_size);
     pending_comms.push_back(comm);
   }
 
   /* Start sending messages to let the workers know that they should stop */
   for (int i = 0; i < receivers_count; i++) {
-    std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-    simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-    std::string* payload          = new std::string("finalize"); // Make a copy of the data we will send
-
-    simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0);
+    XBT_INFO("Send 'finalize' to 'receiver-%d'", i);
+    simgrid::s4u::CommPtr comm = mboxes[i]->put_async(new std::string("finalize"), 0);
     pending_comms.push_back(comm);
-    XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count);
   }
   XBT_INFO("Done dispatching all messages");
 
   /* Now that all message exchanges were initiated, wait for their completion, in order of creation. */
   while (not pending_comms.empty()) {
     simgrid::s4u::CommPtr comm = pending_comms.back();
-    comm->wait();             // we could provide a timeout as a parameter
+    comm->wait();
     pending_comms.pop_back(); // remove it from the list
   }
 
index 6ac940d..f49f7bf 100644 (file)
@@ -34,37 +34,41 @@ public:
   }
   void operator()()
   {
+    // sphinx-doc: init-begin (this line helps the doc to build; ignore it)
+    /* Vector in which we store all ongoing communications */
     std::vector<simgrid::s4u::CommPtr> pending_comms;
 
+    /* Make a vector of the mailboxes to use */
+    std::vector<simgrid::s4u::MailboxPtr> mboxes;
+    for (int i = 0; i < receivers_count; i++)
+      mboxes.push_back(simgrid::s4u::Mailbox::by_name(std::string("receiver-") + std::to_string(i)));
+    // sphinx-doc: init-end
+
     /* Start dispatching all messages to receivers, in a round robin fashion */
     for (int i = 0; i < messages_count; i++) {
+      std::string msg_content = std::string("Message ") + std::to_string(i);
+      // Copy the data we send: 'msg_content' is not a stable storage location.
+      // It will be destroyed when this actor leaves the loop, ie before the receiver gets it
+      std::string* payload = new std::string(msg_content);
+
+      XBT_INFO("Send '%s' to '%s'", msg_content.c_str(), mboxes[i % receivers_count]->get_cname());
 
-      std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-      simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-      std::string msgName           = std::string("Message ") + std::to_string(i);
-      std::string* payload          = new std::string(msgName); // copy the data we send:
-                                                                // 'msgName' is not a stable storage location
-      XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str());
-      /* Create a communication representing the ongoing communication */
-      simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size);
-      /* Add this comm to the vector of all known comms */
+      /* Create a communication representing the ongoing communication, and store it in pending_comms */
+      simgrid::s4u::CommPtr comm = mboxes[i % receivers_count]->put_async(payload, msg_size);
       pending_comms.push_back(comm);
     }
 
-    /* Start sending messages to let the workers know that they should stop */
+    /* Start sending messages to let the workers know that they should stop */ // sphinx-doc: put-begin
     for (int i = 0; i < receivers_count; i++) {
-      std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-      simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-      std::string* payload          = new std::string("finalize"); // Make a copy of the data we will send
-
-      simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0);
+      XBT_INFO("Send 'finalize' to 'receiver-%d'", i);
+      simgrid::s4u::CommPtr comm = mboxes[i]->put_async(new std::string("finalize"), 0);
       pending_comms.push_back(comm);
-      XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count);
     }
     XBT_INFO("Done dispatching all messages");
 
     /* Now that all message exchanges were initiated, wait for their completion in one single call */
     simgrid::s4u::Comm::wait_all(&pending_comms);
+    // sphinx-doc: put-end
 
     XBT_INFO("Goodbye now!");
   }
index afcbc90..93799e9 100644 (file)
@@ -39,32 +39,33 @@ public:
   }
   void operator()()
   {
+    /* Vector in which we store all ongoing communications */
     std::vector<simgrid::s4u::CommPtr> pending_comms;
 
+    /* Make a vector of the mailboxes to use */
+    std::vector<simgrid::s4u::MailboxPtr> mboxes;
+    for (int i = 0; i < receivers_count; i++)
+      mboxes.push_back(simgrid::s4u::Mailbox::by_name(std::string("receiver-") + std::to_string(i)));
+
     /* Start dispatching all messages to receivers, in a round robin fashion */
     for (int i = 0; i < messages_count; i++) {
+      std::string msg_content = std::string("Message ") + std::to_string(i);
+      // Copy the data we send: 'msg_content' is not a stable storage location.
+      // It will be destroyed when this actor leaves the loop, ie before the receiver gets it
+      std::string* payload = new std::string(msg_content);
+
+      XBT_INFO("Send '%s' to '%s'", msg_content.c_str(), mboxes[i % receivers_count]->get_cname());
 
-      std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-      simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-      std::string msgName           = std::string("Message ") + std::to_string(i);
-      std::string* payload          = new std::string(msgName); // copy the data we send:
-                                                                // 'msgName' is not a stable storage location
-      XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str());
-      /* Create a communication representing the ongoing communication */
-      simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size);
-      /* Add this comm to the vector of all known comms */
+      /* Create a communication representing the ongoing communication, and store it in pending_comms */
+      simgrid::s4u::CommPtr comm = mboxes[i % receivers_count]->put_async(payload, msg_size);
       pending_comms.push_back(comm);
     }
 
     /* Start sending messages to let the workers know that they should stop */
     for (int i = 0; i < receivers_count; i++) {
-      std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
-      simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
-      std::string* payload          = new std::string("finalize"); // Make a copy of the data we will send
-
-      simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0);
+      XBT_INFO("Send 'finalize' to 'receiver-%d'", i);
+      simgrid::s4u::CommPtr comm = mboxes[i]->put_async(new std::string("finalize"), 0);
       pending_comms.push_back(comm);
-      XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count);
     }
     XBT_INFO("Done dispatching all messages");
 
diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil.cpp b/examples/s4u/async-waituntil/s4u-async-waituntil.cpp
new file mode 100644 (file)
index 0000000..0c10dcd
--- /dev/null
@@ -0,0 +1,97 @@
+/* Copyright (c) 2010-2018. 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. */
+
+/* This example shows how to use simgrid::s4u::Activity::wait_until() and
+ * simgrid::s4u::Activity::wait_for() on a given communication.
+ *
+ * It is very similar to the async-wait example, but the sender initially
+ * does some waits that are too short before doing an infinite wait.
+ */
+
+#include "simgrid/s4u.hpp"
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_async_wait, "Messages specific for this s4u example");
+
+static int sender(int argc, char** argv)
+{
+  xbt_assert(argc == 4, "Expecting 3 parameters from the XML deployment file but got %d", argc);
+  long messages_count  = std::stol(argv[1]); /* - number of tasks */
+  double msg_size      = std::stol(argv[2]); /* - communication cost in bytes */
+  long receivers_count = std::stod(argv[3]); /* - number of receivers */
+
+  std::vector<simgrid::s4u::CommPtr> pending_comms;
+
+  /* Start dispatching all messages to receivers, in a round robin fashion */
+  for (int i = 0; i < messages_count; i++) {
+
+    std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
+    simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
+    std::string msgName           = std::string("Message ") + std::to_string(i);
+    std::string* payload          = new std::string(msgName); // copy the data we send:
+    // 'msgName' is not a stable storage location
+    XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str());
+    /* Create a communication representing the ongoing communication */
+    simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size);
+    /* Add this comm to the vector of all known comms */
+    pending_comms.push_back(comm);
+  }
+
+  /* Start sending messages to let the workers know that they should stop */
+  for (int i = 0; i < receivers_count; i++) {
+    std::string mboxName          = std::string("receiver-") + std::to_string(i % receivers_count);
+    simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName);
+    std::string* payload          = new std::string("finalize"); // Make a copy of the data we will send
+
+    simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0);
+    pending_comms.push_back(comm);
+    XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count);
+  }
+  XBT_INFO("Done dispatching all messages");
+
+  /* Now that all message exchanges were initiated, wait for their completion, in order of creation. */
+  while (not pending_comms.empty()) {
+    simgrid::s4u::CommPtr comm = pending_comms.back();
+    comm->wait_for(1);
+    pending_comms.pop_back(); // remove it from the list
+  }
+
+  XBT_INFO("Goodbye now!");
+  return 0;
+}
+
+/* Receiver actor expects 1 argument: its ID */
+static int receiver(int argc, char** argv)
+{
+  xbt_assert(argc == 2, "Expecting one parameter from the XML deployment file but got %d", argc);
+  simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(std::string("receiver-") + argv[1]);
+
+  XBT_INFO("Wait for my first message");
+  for (bool cont = true; cont;) {
+    std::string* received = static_cast<std::string*>(mbox->get());
+    XBT_INFO("I got a '%s'.", received->c_str());
+    if (*received == "finalize")
+      cont = false; // If it's a finalize message, we're done.
+    delete received;
+  }
+  return 0;
+}
+
+int main(int argc, char* argv[])
+{
+  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
+
+  simgrid::s4u::Engine e(&argc, argv);
+  e.register_function("sender", &sender);
+  e.register_function("receiver", &receiver);
+
+  e.load_platform(argv[1]);
+  e.load_deployment(argv[2]);
+  e.run();
+
+  return 0;
+}
diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil.tesh b/examples/s4u/async-waituntil/s4u-async-waituntil.tesh
new file mode 100644 (file)
index 0000000..6d77ade
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/env tesh
+
+p Test1 Sleep_sender > Sleep_receiver
+
+$ $SG_TEST_EXENV ${bindir:=.}/s4u-async-waituntil ${platfdir}/small_platform_fatpipe.xml s4u-async-waituntil_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (1:sender@Tremblay) Send 'Message 0' to 'receiver-0'
+> [  0.000000] (2:receiver@Ruby) Wait for my first message
+> [  0.000000] (1:sender@Tremblay) Send 'Message 1' to 'receiver-0'
+> [  0.000000] (1:sender@Tremblay) Send 'Message 2' to 'receiver-0'
+> [  0.000000] (1:sender@Tremblay) Send 'finalize' to 'receiver-0'
+> [  0.000000] (1:sender@Tremblay) Done dispatching all messages
+> [  0.105458] (2:receiver@Ruby) I got a 'Message 0'.
+> [  0.210917] (2:receiver@Ruby) I got a 'Message 1'.
+> [  0.316375] (2:receiver@Ruby) I got a 'Message 2'.
+> [  0.318326] (2:receiver@Ruby) I got a 'finalize'.
+> [  0.318326] (1:sender@Tremblay) Goodbye now!
\ No newline at end of file
diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil_d.xml b/examples/s4u/async-waituntil/s4u-async-waituntil_d.xml
new file mode 100644 (file)
index 0000000..88df6ec
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
+    <argument value="3"/>       <!-- Number of tasks -->
+    <argument value="50000000"/>  <!-- Computation size of tasks -->
+    <argument value="1"/>         <!-- Number of receivers -->
+  </actor>
+  <!-- The receiver processes --> 
+  <actor host="Ruby" function="receiver">
+    <argument value="0"/> <!-- id -->
+  </actor>
+</platform>
index 90ae8c1..cc7ccec 100644 (file)
@@ -118,11 +118,9 @@ void Node::notifyAndQuit()
   XBT_DEBUG("Sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
   try {
     simgrid::s4u::Mailbox::by_name(std::to_string(fingers_[0]))->put(pred_msg, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
-      delete pred_msg;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
+    delete pred_msg;
   }
 
   if (pred_id_ != -1 && pred_id_ != id_) {
@@ -134,11 +132,9 @@ void Node::notifyAndQuit()
 
     try {
       simgrid::s4u::Mailbox::by_name(std::to_string(pred_id_))->put(succ_msg, 10, timeout);
-    } catch (xbt_ex& e) {
-      if (e.category == timeout_error) {
-        XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_);
-        delete succ_msg;
-      }
+    } catch (simgrid::TimeoutError& e) {
+      XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_);
+      delete succ_msg;
     }
   }
 }
@@ -226,27 +222,24 @@ void Node::checkPredecessor()
   XBT_DEBUG("Sending a 'Predecessor Alive' request to my predecessor %d", pred_id_);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_);
-      delete message;
-      return;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_);
+    delete message;
+    return;
   }
+
   // receive the answer
   XBT_DEBUG("Sent 'Predecessor Alive' request to %d, waiting for the answer on my mailbox '%s'", pred_id_,
             message->answer_to->get_cname());
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     XBT_DEBUG("Received the answer to my 'Predecessor Alive': my predecessor %d is alive", pred_id_);
     delete static_cast<ChordMessage*>(data);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request");
-      pred_id_ = -1;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request");
+    pred_id_ = -1;
   }
 }
 
@@ -270,12 +263,10 @@ int Node::remoteGetPredecessor(int ask_to)
   XBT_DEBUG("Sending a 'Get Predecessor' request to %d", ask_to);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to);
-      delete message;
-      return predecessor_id;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to);
+    delete message;
+    return predecessor_id;
   }
 
   // receive the answer
@@ -284,17 +275,15 @@ int Node::remoteGetPredecessor(int ask_to)
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     ChordMessage* answer = static_cast<ChordMessage*>(data);
     XBT_DEBUG("Received the answer to my 'Get Predecessor' request: the predecessor of node %d is %d", ask_to,
               answer->answer_id);
     predecessor_id = answer->answer_id;
     delete answer;
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request");
-      delete static_cast<ChordMessage*>(data);
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request");
+    delete static_cast<ChordMessage*>(data);
   }
 
   return predecessor_id;
@@ -346,30 +335,27 @@ int Node::remoteFindSuccessor(int ask_to, int id)
   XBT_DEBUG("Sending a 'Find Successor' request to %d for id %d", ask_to, id);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_);
-      delete message;
-      return successor;
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_);
+    delete message;
+    return successor;
   }
   // receive the answer
   XBT_DEBUG("Sent a 'Find Successor' request to %d for key %d, waiting for the answer", ask_to, id);
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     ChordMessage* answer = static_cast<ChordMessage*>(data);
     XBT_DEBUG("Received the answer to my 'Find Successor' request for id %d: the successor of key %d is %d",
               answer->request_id, id_, answer->answer_id);
     successor = answer->answer_id;
     delete answer;
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request");
-      delete static_cast<ChordMessage*>(data);
-    }
+  } catch (simgrid::TimeoutError& e) {
+    XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request");
+    delete static_cast<ChordMessage*>(data);
   }
+
   return successor;
 }
 
index ea6e86b..8fca9e6 100644 (file)
@@ -8,7 +8,6 @@
 #include "simgrid/s4u.hpp"
 #include <string>
 #include <xbt/RngStream.h>
-#include <xbt/ex.hpp>
 #include <xbt/str.h>
 
 #define MAX_SIMULATION_TIME 1000
index c27bb2d..d23af26 100644 (file)
@@ -38,7 +38,6 @@ static void privileged()
 int main(int argc, char* argv[])
 {
   simgrid::s4u::Engine e(&argc, argv);
-  std::vector<std::string> args;
   xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]);
 
   e.load_platform(argv[1]);
index ef3bac1..e5b9b6b 100644 (file)
@@ -20,8 +20,6 @@
 
 #include "simgrid/plugins/energy.h"
 #include <simgrid/s4u.hpp>
-#include <xbt/ex.hpp>
-#include <xbt/log.h>
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_energyptask, "Messages specific for this s4u example");
 
diff --git a/examples/s4u/platform-failures/s4u-masterworker-failures_d.xml b/examples/s4u/platform-failures/s4u-masterworker-failures_d.xml
new file mode 100644 (file)
index 0000000..feadead
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
+    <argument value="20"/>       <!-- Number of tasks -->
+    <argument value="50000000"/>  <!-- Computation size of tasks -->
+    <argument value="1000000"/>   <!-- Communication size of tasks -->
+    <argument value="5"/>         <!-- Number of workers -->
+  </actor>
+  <!-- The worker processes (with mailbox to listen on as argument) -->
+  <actor host="Tremblay" function="worker" on_failure="RESTART">
+    <argument value="0"/> 
+  </actor>
+  <actor host="Jupiter" function="worker" on_failure="RESTART">
+    <argument value="1"/> 
+  </actor>
+  <actor host="Fafard" function="worker" on_failure="RESTART">
+    <argument value="2"/> 
+  </actor>
+  <actor host="Ginette" function="worker" on_failure="RESTART">
+    <argument value="3"/> 
+  </actor>
+  <actor host="Bourassa" function="worker" on_failure="RESTART">
+    <argument value="4"/> 
+  </actor>
+</platform>
index 8b54502..c7a6378 100644 (file)
@@ -4,7 +4,6 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "simgrid/s4u.hpp"
-#include "xbt/ex.hpp"
 #include "xbt/str.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
@@ -28,18 +27,17 @@ static int master(int argc, char* argv[])
       XBT_INFO("Send a message to %s", mailbox->get_cname());
       mailbox->put(payload, comm_size, 10.0);
       XBT_INFO("Send to %s completed", mailbox->get_cname());
+    } catch (simgrid::HostFailureException& e) {
+      XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
+      return -1;
+    } catch (simgrid::TimeoutError& e) {
+      delete payload;
+      XBT_INFO("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
     } catch (xbt_ex& e) {
       switch (e.category) {
-        case host_error:
-          XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
-          return -1;
-          break;
         case network_error:
           XBT_INFO("Mmh. Something went wrong with '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
           break;
-        case timeout_error:
-          XBT_INFO("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
-          break;
         default:
           xbt_die("Unexpected behavior");
       }
@@ -54,18 +52,19 @@ static int master(int argc, char* argv[])
     double* payload = new double(-1.0);
     try {
       mailbox->put(payload, 0, 1.0);
+    } catch (simgrid::HostFailureException& e) {
+      delete payload;
+      XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
+      return -1;
+    } catch (simgrid::TimeoutError& e) {
+      delete payload;
+      XBT_INFO("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
     } catch (xbt_ex& e) {
       delete payload;
       switch (e.category) {
-        case host_error:
-          XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
-          break;
         case network_error:
           XBT_INFO("Mmh. Something went wrong with '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
           break;
-        case timeout_error:
-          XBT_INFO("Mmh. Got timeouted while speaking to '%s'. Nevermind. Let's keep going!", mailbox->get_cname());
-          break;
         default:
           xbt_die("Unexpected behavior");
       }
@@ -91,6 +90,7 @@ static int worker(int argc, char* argv[])
       xbt_assert(payload != nullptr, "mailbox->get() failed");
       if (comp_size < 0) { /* - Exit when -1.0 is received */
         XBT_INFO("I'm done. See you!");
+        delete payload;
         break;
       }
       /*  - Otherwise, process the task */
@@ -98,25 +98,23 @@ static int worker(int argc, char* argv[])
         XBT_INFO("Start execution...");
         simgrid::s4u::this_actor::execute(comp_size);
         XBT_INFO("Execution complete.");
-      } catch (xbt_ex& e) {
-        if (e.category == host_error) {
-          XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
-          return -1;
-        } else
-          xbt_die("Unexpected behavior");
+        delete payload;
+      } catch (simgrid::HostFailureException& e) {
+        delete payload;
+        XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
+        return -1;
       }
-
+    } catch (simgrid::HostFailureException& e) {
+      XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
       delete payload;
+      return -1;
     } catch (xbt_ex& e) {
       switch (e.category) {
-        case host_error:
-          XBT_INFO("Gloups. The cpu on which I'm running just turned off!. See you!");
-          return -1;
         case network_error:
           XBT_INFO("Mmh. Something went wrong. Nevermind. Let's keep going!");
           break;
         default:
-          xbt_die("Unexpected behavior");
+          xbt_die("Unexpected behavior. Category: %s", xbt_ex_catname(e.category));
       }
     }
   }
index 4b365e8..12343ec 100644 (file)
@@ -2,8 +2,7 @@
 
 p Testing a simple master/worker example application handling failures TCP crosstraffic DISABLED
 
-! output sort 19
-$ $SG_TEST_EXENV ${bindir:=.}/s4u-platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${bindir}/../app-masterworker/s4u-app-masterworker_d.xml --cfg=path:${srcdir} --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+$ $SG_TEST_EXENV ${bindir:=.}/s4u-platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir:=.}/s4u-masterworker-failures_d.xml --cfg=path:${srcdir} --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --log=surf_cpu.t:verbose
 > [  0.000000] (0:maestro@) Cannot launch process 'worker' on failed host 'Fafard'
 > [  0.000000] (1:master@Tremblay) Got 5 workers and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Send a message to worker-0
@@ -110,7 +109,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/s4u-platform-failures$EXEEXT --log=xbt_cfg.thres:c
 p Testing a simple master/worker example application handling failures. TCP crosstraffic ENABLED
 
 ! output sort 19
-$ $SG_TEST_EXENV ${bindir:=.}/s4u-platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${bindir}/../app-masterworker/s4u-app-masterworker_d.xml --cfg=path:${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+$ $SG_TEST_EXENV ${bindir:=.}/s4u-platform-failures$EXEEXT --log=xbt_cfg.thres:critical --log=no_loc ${platfdir}/small_platform_with_failures.xml ${srcdir:=.}/s4u-masterworker-failures_d.xml --cfg=path:${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --log=surf_cpu.t:verbose
 > [  0.000000] (0:maestro@) Cannot launch process 'worker' on failed host 'Fafard'
 > [  0.000000] (1:master@Tremblay) Got 5 workers and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Send a message to worker-0
index 085464e..b0298ce 100644 (file)
@@ -51,30 +51,27 @@ static void test_host(std::string hostname)
   thehost->set_property(exist, "180");
 }
 
-static int alice(int argc, char* argv[])
+static void alice(std::vector<std::string> /*args*/)
 {
   /* Dump what we have on the current host */
   test_host("host1");
-  return 0;
 }
 
-static int carole(int argc, char* argv[])
+static void carole(std::vector<std::string> /*args*/)
 {
   /* Dump what we have on a remote host */
   simgrid::s4u::this_actor::sleep_for(1); // Wait for alice to be done with its experiment
   test_host("host1");
-  return 0;
 }
 
-static int david(int argc, char* argv[])
+static void david(std::vector<std::string> /*args*/)
 {
   /* Dump what we have on a remote host */
   simgrid::s4u::this_actor::sleep_for(2); // Wait for alice and carole to be done with its experiment
   test_host("node-0.acme.org");
-  return 0;
 }
 
-static int bob(int argc, char* argv[])
+static void bob(std::vector<std::string> /*args*/)
 {
   /* this host also tests the properties of the AS*/
   simgrid::s4u::NetZone* root = simgrid::s4u::Engine::get_instance()->get_netzone_root();
@@ -96,7 +93,6 @@ static int bob(int argc, char* argv[])
 
   value = simgrid::s4u::Actor::self()->get_property(noexist);
   xbt_assert(not value, "The property is defined (it should not)");
-  return 0;
 }
 
 int main(int argc, char* argv[])
index 3e5822b..89e1a9f 100644 (file)
@@ -5,11 +5,9 @@
 
 #include "simgrid/s4u.hpp"
 #include "simgrid/simdag.h"
-#include "xbt/ex.h"
-#include "xbt/log.h"
+
 #include <cmath>
 #include <set>
-#include <xbt/ex.hpp>
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_test, "Logging specific to this SimDag example");
 
index be6bb15..bc3d78f 100644 (file)
@@ -5,7 +5,7 @@
 p Test if the load balancing code gets traced correctly
 ! timeout 60
 
-$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:${bindir:=.}/smpi_trace.trace --cfg=tracing/smpi/format/ti-one-file:yes -no-privatize -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/simulate-computation:no -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./ampi/smpi_ampi ${srcdir:=.}/replay/actions_bcast.txt --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning
+$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:${bindir:=.}/smpi_trace.trace --cfg=tracing/smpi/format/ti-one-file:yes -no-privatize -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/simulate-computation:no -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./ampi/smpi_ampi ${srcdir:=.}/replay/actions_bcast.txt --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
 
 $ bash -c "cat ${bindir:=.}/smpi_trace.trace_files/*"
 > 0 init
index 1895a49..ce5bf0d 100644 (file)
@@ -1,5 +1,6 @@
 p Test smpi bindings for dvfs functions (C example)
-$ ${bindir:=.}/../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${platfdir}/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/../examples/smpi/energy/smpi_energy --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning
+
+$ ${bindir:=.}/../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${platfdir}/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/../examples/smpi/energy/smpi_energy --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
 > [0.000000] [rank 0] Pstates: 3; Powers: 100000000, 50000000, 20000000
 > [0.000000] [rank 1] Pstates: 3; Powers: 100000000, 50000000, 20000000
 > [0.000000] [rank 0] Current pstate: 0; Current power: 100000000
index c9de94b..a311eb6 100644 (file)
@@ -1,6 +1,6 @@
 p Test smpi bindings for dvfs functions (Fortran 77 example)
 
-$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/../../platforms/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/f77/sef --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning
+$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/../../platforms/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/f77/sef --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
 > [     0.00000000] [rank  0]  3 pstates available
 > [     0.00000000] [rank  1]  3 pstates available
 > [     0.00000000] [rank  0] Power:  100000000.0000
index 5394bfc..033b99d 100644 (file)
@@ -1,6 +1,6 @@
 p Test smpi bindings for dvfs functions (Fortran 90 example)
 
-$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/../../platforms/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/f90/sef90 --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning
+$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/../../platforms/energy_platform.xml --cfg=smpi/simulate-computation:no ${bindir:=.}/f90/sef90 --cfg=plugin:host_energy --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
 > [     0.00000000] [rank  0]  3 pstates available
 > [     0.00000000] [rank  1]  3 pstates available
 > [     0.00000000] [rank  0] Power:  100000000.0000
diff --git a/include/simgrid/Exception.hpp b/include/simgrid/Exception.hpp
new file mode 100644 (file)
index 0000000..9ea27ab
--- /dev/null
@@ -0,0 +1,137 @@
+/* Copyright (c) 2018. 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 SIMGRID_EXCEPTIONS_HPP
+#define SIMGRID_EXCEPTIONS_HPP
+
+/** @file exception.hpp SimGrid-specific Exceptions
+ *
+ *  Defines all possible exception that could occur in a SimGrid library.
+ */
+
+#include <xbt/backtrace.hpp>
+#include <xbt/ex.h>
+
+#include <atomic>
+#include <stdexcept>
+#include <string>
+
+namespace simgrid {
+namespace xbt {
+
+/** Contextual information about an execution location (file:line:func and backtrace, procname, pid)
+ *
+ *  Constitute the contextual information of where an exception was thrown
+ *
+ *  These tuples (__FILE__, __LINE__, __func__, backtrace, procname, pid)
+ *  are best created with @ref XBT_THROW_POINT.
+ *
+ *  @ingroup XBT_ex
+ */
+class ThrowPoint {
+public:
+  ThrowPoint() = default;
+  explicit ThrowPoint(const char* file, int line, const char* function, Backtrace bt, std::string actor_name, int pid)
+      : file_(file), line_(line), function_(function), backtrace_(bt), procname_(actor_name), pid_(pid)
+  {
+  }
+
+  const char* file_     = nullptr;
+  int line_             = 0;
+  const char* function_ = nullptr;
+  Backtrace backtrace_;
+  std::string procname_ = ""; /**< Name of the process who thrown this */
+  int pid_              = 0;  /**< PID of the process who thrown this */
+};
+
+/** Create a ThrowPoint with (__FILE__, __LINE__, __func__) */
+#define XBT_THROW_POINT                                                                                                \
+  ::simgrid::xbt::ThrowPoint(__FILE__, __LINE__, __func__, simgrid::xbt::backtrace(), xbt_procname(), xbt_getpid())
+} // namespace xbt
+
+/** Ancestor class of all SimGrid exception */
+class Exception : public std::runtime_error {
+public:
+  Exception(simgrid::xbt::ThrowPoint throwpoint, std::string message)
+      : std::runtime_error(message), throwpoint_(throwpoint)
+  {
+  }
+
+  /** Return the information about where the exception was thrown */
+  xbt::ThrowPoint const& throw_point() const { return throwpoint_; }
+
+private:
+  xbt::ThrowPoint throwpoint_;
+};
+
+} // namespace simgrid
+
+/** A legacy exception
+ *
+ *  It is defined by a category and a value within that category (as well as
+ *  an optional error message).
+ *
+ *  This used to be a structure for C exceptions but it has been retrofitted
+ *  as a C++ exception and some of its data has been moved in the
+ *  @ref WithContextException base class. We should deprecate it and replace it
+ *  with either C++ different exceptions or `std::system_error` which already
+ *  provides this (category + error code) logic.
+ *
+ *  @ingroup XBT_ex_c
+ */
+class XBT_PUBLIC xbt_ex : public simgrid::Exception {
+public:
+  /**
+   *
+   * @param throwpoint Throw point (use XBT_THROW_POINT)
+   * @param message    Exception message
+   */
+  xbt_ex(simgrid::xbt::ThrowPoint throwpoint, std::string message) : simgrid::Exception(throwpoint, message) {}
+
+  ~xbt_ex(); // DO NOT define it here -- see ex.cpp for a rationale
+
+  /** Category (what went wrong) */
+  xbt_errcat_t category = unknown_error;
+
+  /** Why did it went wrong */
+  int value = 0;
+};
+
+namespace simgrid {
+
+/** Exception raised when a timeout elapsed */
+class TimeoutError : public xbt_ex {
+public:
+  TimeoutError(simgrid::xbt::ThrowPoint throwpoint, std::string message) : xbt_ex(throwpoint, message)
+  {
+    category = timeout_error;
+  }
+};
+
+/** Exception raised when an host fails */
+class HostFailureException : public xbt_ex {
+public:
+  HostFailureException(simgrid::xbt::ThrowPoint throwpoint, std::string message) : xbt_ex(throwpoint, message)
+  {
+    category = host_error;
+  }
+};
+
+/** Exception raised when a communication fails because of the network */
+class NetworkFailureException : public xbt_ex {
+public:
+  NetworkFailureException(simgrid::xbt::ThrowPoint throwpoint, std::string message) : xbt_ex(throwpoint, message)
+  {
+    category = network_error;
+  }
+};
+
+/** Exception raised when something got canceled before completion */
+class CancelException : public xbt_ex {
+};
+
+} // namespace simgrid
+
+#endif
index 0d07099..38d662d 100644 (file)
@@ -16,33 +16,57 @@ namespace simgrid {
 
 namespace s4u {
 class Activity;
+
 class Actor;
-using ActorPtr = boost::intrusive_ptr<Actor>;
+/** Smart pointer to a simgrid::s4u::Actor */
+typedef boost::intrusive_ptr<Actor> ActorPtr;
 XBT_PUBLIC void intrusive_ptr_release(Actor* actor);
 XBT_PUBLIC void intrusive_ptr_add_ref(Actor* actor);
+
 class Barrier;
+
 class Comm;
-using CommPtr = boost::intrusive_ptr<Comm>;
+/** Smart pointer to a simgrid::s4u::Comm */
+typedef boost::intrusive_ptr<Comm> CommPtr;
 XBT_PUBLIC void intrusive_ptr_release(Comm* c);
 XBT_PUBLIC void intrusive_ptr_add_ref(Comm* c);
+
+class ConditionVariable;
+/** Smart pointer to a simgrid::s4u::ConditionVariable */
+typedef boost::intrusive_ptr<ConditionVariable> ConditionVariablePtr;
+XBT_PUBLIC void intrusive_ptr_release(ConditionVariable* c);
+XBT_PUBLIC void intrusive_ptr_add_ref(ConditionVariable* c);
+
 class Engine;
+
 class Exec;
-using ExecPtr = boost::intrusive_ptr<Exec>;
+/** Smart pointer to a simgrid::s4u::Exec */
+typedef boost::intrusive_ptr<Exec> ExecPtr;
 XBT_PUBLIC void intrusive_ptr_release(Exec* e);
 XBT_PUBLIC void intrusive_ptr_add_ref(Exec* e);
+
 class Host;
+
 class Io;
-using IoPtr = boost::intrusive_ptr<Io>;
+/** Smart pointer to a simgrid::s4u::Io */
+typedef boost::intrusive_ptr<Io> IoPtr;
 XBT_PUBLIC void intrusive_ptr_release(Io* i);
 XBT_PUBLIC void intrusive_ptr_add_ref(Io* i);
+
 class Link;
+
 class Mailbox;
-using MailboxPtr = boost::intrusive_ptr<Mailbox>;
+/** Smart pointer to a simgrid::s4u::Mailbox */
+typedef boost::intrusive_ptr<Mailbox> MailboxPtr;
 XBT_PUBLIC void intrusive_ptr_release(Mailbox* m);
 XBT_PUBLIC void intrusive_ptr_add_ref(Mailbox* m);
+
 class Mutex;
 XBT_PUBLIC void intrusive_ptr_release(Mutex* m);
 XBT_PUBLIC void intrusive_ptr_add_ref(Mutex* m);
+/** Smart pointer to a simgrid::s4u::Mutex */
+typedef boost::intrusive_ptr<Mutex> MutexPtr;
+
 class NetZone;
 class VirtualMachine;
 class File;
@@ -57,29 +81,29 @@ namespace kernel {
 class EngineImpl;
 namespace actor {
 class ActorImpl;
-using ActorImplPtr = boost::intrusive_ptr<ActorImpl>;
+typedef boost::intrusive_ptr<ActorImpl> ActorImplPtr;
 } // namespace actor
 
 namespace activity {
   class ActivityImpl;
-  using ActivityImplPtr = boost::intrusive_ptr<ActivityImpl>;
+  typedef boost::intrusive_ptr<ActivityImpl> ActivityImplPtr;
   XBT_PUBLIC void intrusive_ptr_add_ref(ActivityImpl* activity);
   XBT_PUBLIC void intrusive_ptr_release(ActivityImpl* activity);
 
   class ConditionVariableImpl;
 
   class CommImpl;
-  using CommImplPtr = boost::intrusive_ptr<CommImpl>;
+  typedef boost::intrusive_ptr<CommImpl> CommImplPtr;
   class ExecImpl;
-  using ExecImplPtr = boost::intrusive_ptr<ExecImpl>;
+  typedef boost::intrusive_ptr<ExecImpl> ExecImplPtr;
   class IoImpl;
-  using IoImplPtr = boost::intrusive_ptr<IoImpl>;
+  typedef boost::intrusive_ptr<IoImpl> IoImplPtr;
   class MutexImpl;
-  using MutexImplPtr = boost::intrusive_ptr<MutexImpl>;
+  typedef boost::intrusive_ptr<MutexImpl> MutexImplPtr;
   class RawImpl;
-  using RawImplPtr = boost::intrusive_ptr<RawImpl>;
+  typedef boost::intrusive_ptr<RawImpl> RawImplPtr;
   class SleepImpl;
-  using SleepImplPtr = boost::intrusive_ptr<SleepImpl>;
+  typedef boost::intrusive_ptr<SleepImpl> SleepImplPtr;
 
   class MailboxImpl;
 }
@@ -152,7 +176,6 @@ typedef simgrid::kernel::actor::ActorImpl* smx_actor_t;
 typedef simgrid::kernel::activity::ConditionVariableImpl* smx_cond_t;
 typedef simgrid::kernel::activity::MutexImpl* smx_mutex_t;
 typedef simgrid::kernel::activity::MailboxImpl* smx_mailbox_t;
-typedef simgrid::surf::StorageImpl* surf_storage_t;
 
 #else
 
@@ -171,7 +194,6 @@ typedef struct s_smx_actor* smx_actor_t;
 typedef struct s_smx_cond_t* smx_cond_t;
 typedef struct s_smx_mutex* smx_mutex_t;
 typedef struct s_smx_mailbox* smx_mailbox_t;
-typedef struct s_surf_storage* surf_storage_t;
 
 #endif
 
index cd02cf1..485ed2d 100644 (file)
@@ -20,4 +20,6 @@
 #include <simgrid/s4u/NetZone.hpp>
 #include <simgrid/s4u/Storage.hpp>
 
+#include <simgrid/Exception.hpp>
+
 #endif /* SIMGRID_S4U_S4U_H */
index 6cd6276..9906f0b 100644 (file)
@@ -7,6 +7,7 @@
 #define SIMGRID_S4U_ACTIVITY_HPP
 
 #include <simgrid/forward.h>
+#include <xbt/signal.hpp>
 
 namespace simgrid {
 namespace s4u {
@@ -27,25 +28,25 @@ namespace s4u {
  * - Synchronization activities may possibly be connected to no action.
  */
 class XBT_PUBLIC Activity {
-#ifndef DOXYGEN
-  friend Comm;
+  friend simgrid::s4u::Comm;
   friend XBT_PUBLIC void intrusive_ptr_release(Comm * c);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(Comm * c);
-  friend Exec;
+  friend simgrid::s4u::Exec;
   friend XBT_PUBLIC void intrusive_ptr_release(Exec * e);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(Exec * e);
-  friend Io;
+  friend simgrid::s4u::Io;
   friend XBT_PUBLIC void intrusive_ptr_release(Io* i);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(Io* i);
-#endif
 
 protected:
   Activity()  = default;
   virtual ~Activity() = default;
 
 public:
+#ifndef DOXYGEN
   Activity(Activity const&) = delete;
   Activity& operator=(Activity const&) = delete;
+#endif
 
   enum class State { INITED = 0, STARTED, CANCELED, ERRORED, FINISHED };
 
@@ -60,11 +61,17 @@ public:
   virtual Activity* wait() = 0;
   /** Blocks until the activity is terminated, or until the timeout is elapsed
    *  Raises: timeout exception.*/
-  virtual Activity* wait(double timeout) = 0;
+  virtual Activity* wait_for(double timeout) = 0;
+  /** Blocks until the activity is terminated, or until the time limit is reached
+   * Raises: timeout exception. */
+  void wait_until(double time_limit);
+
   /** Cancel that activity */
   virtual Activity* cancel() = 0;
   /** Retrieve the current state of the activity */
   Activity::State get_state() { return state_; }
+  /** Returns whether this activity is completed */
+  virtual bool test() = 0;
 
   /** Get the remaining amount of work that this Activity entails. When it's 0, it's done. */
   virtual double get_remaining();
@@ -83,22 +90,20 @@ public:
   /** Retrieve the user data of the Activity */
   void* get_user_data() { return user_data_; }
 
-  /** @deprecated See Activity::get_state()*/
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v324("Please use Activity::wait_for()") virtual void wait(double timeout) = 0;
   XBT_ATTRIB_DEPRECATED_v323("Please use Activity::get_state()") Activity::State getState() { return state_; }
-  /** @deprecated See Activity::get_remaining() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Activity::get_remaining()") double getRemains() { return get_remaining(); }
-  /** @deprecated See Activity::set_remaining() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Activity::set_remaining()") Activity* setRemains(double remains)
   {
     return set_remaining(remains);
   }
-  /** @deprecated See Activity::set_user_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Activity::set_user_data()") Activity* setUserData(void* data)
   {
     return set_user_data(data);
   }
-  /** @deprecated See Activity::get_user_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Activity::get_user_data()") void* getUserData() { return user_data_; }
+#endif
 
 private:
   simgrid::kernel::activity::ActivityImplPtr pimpl_ = nullptr;
index cf5f0f1..dcab10e 100644 (file)
@@ -121,22 +121,12 @@ namespace s4u {
 
 /** @brief Simulation Agent */
 class XBT_PUBLIC Actor : public simgrid::xbt::Extendable<Actor> {
-#ifndef DOXYGEN
-  friend Exec;
-  friend Mailbox;
+  friend simgrid::s4u::Exec;
+  friend simgrid::s4u::Mailbox;
   friend simgrid::kernel::actor::ActorImpl;
   friend simgrid::kernel::activity::MailboxImpl;
-#endif
-  kernel::actor::ActorImpl* pimpl_ = nullptr;
 
-  /** Wrap a (possibly non-copyable) single-use task into a `std::function` */
-  template<class F, class... Args>
-  static std::function<void()> wrap_task(F f, Args... args)
-  {
-    typedef decltype(f(std::move(args)...)) R;
-    auto task = std::make_shared<simgrid::xbt::Task<R()>>(simgrid::xbt::make_task(std::move(f), std::move(args)...));
-    return [task] { (*task)(); };
-  }
+  kernel::actor::ActorImpl* pimpl_ = nullptr;
 
   explicit Actor(smx_actor_t pimpl) : pimpl_(pimpl) {}
 
@@ -171,7 +161,7 @@ public:
   /** Signal indicating that the given actor is about to disappear */
   static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_destruction;
 
-  /** Create an actor from a std::function
+  /** Create an actor from a std::function<void()>
    *
    *  If the actor is restarted, the actor has a fresh copy of the function.
    */
@@ -181,25 +171,20 @@ public:
    *
    *  If the actor is restarted, the actor has a fresh copy of the function.
    */
-  static ActorPtr create(std::string name, s4u::Host* host, std::function<void(std::vector<std::string>*)> code,
-                         std::vector<std::string>* args)
+  template <class F> static ActorPtr create(std::string name, s4u::Host* host, F code)
   {
-    return create(name, host, [code](std::vector<std::string>* args) { code(args); }, args);
+    return create(name, host, std::function<void()>(std::move(code)));
   }
 
-  /** Create an actor using code
+  /** Create an actor using a callable thing and its arguments.
    *
-   *  Using this constructor, move-only type can be used. The consequence is
-   *  that we cannot copy the value and restart the actor in its initial
-   *  state. In order to use auto-restart, an explicit `function` must be passed
-   *  instead.
-   */
+   * Note that the arguments will be copied, so move-only parameters are forbidden */
   template <class F, class... Args,
             // This constructor is enabled only if the call code(args...) is valid:
             typename = typename std::result_of<F(Args...)>::type>
   static ActorPtr create(std::string name, s4u::Host* host, F code, Args... args)
   {
-    return create(name, host, wrap_task(std::move(code), std::move(args)...));
+    return create(name, host, std::bind(std::move(code), std::move(args)...));
   }
 
   // Create actor from function name:
@@ -272,6 +257,7 @@ public:
    */
   void kill();
 
+  /** Kill an actor from its ID */
   static void kill(aid_t pid);
 
   /** Retrieves the actor that have the given PID (or nullptr if not existing) */
@@ -456,16 +442,18 @@ XBT_PUBLIC bool is_suspended();
 /** @brief kill the actor. */
 XBT_PUBLIC void exit();
 
-#ifndef DOXYGEN
-/** @deprecated Please use std::function<void(int, void*)> for first parameter */
-XBT_ATTRIB_DEPRECATED_v323("Please use std::function<void(int, void*)> for first parameter.") XBT_PUBLIC
-    void on_exit(int_f_pvoid_pvoid_t fun, void* data);
 /** @brief Add a function to the list of "on_exit" functions. */
 XBT_PUBLIC void on_exit(std::function<void(int, void*)> fun, void* data);
 
 /** @brief Migrate the actor to a new host. */
 XBT_PUBLIC void migrate(Host* new_host);
 
+/** @} */
+
+#ifndef DOXYGEN
+/** @deprecated Please use std::function<void(int, void*)> for first parameter */
+XBT_ATTRIB_DEPRECATED_v323("Please use std::function<void(int, void*)> for first parameter.") XBT_PUBLIC
+    void on_exit(int_f_pvoid_pvoid_t fun, void* data);
 /** @deprecated See this_actor::get_name() */
 XBT_ATTRIB_DEPRECATED_v323("Please use this_actor::get_name()") XBT_PUBLIC std::string getName();
 /** @deprecated See this_actor::get_cname() */
@@ -487,7 +475,6 @@ XBT_ATTRIB_DEPRECATED_v324("Please use this_actor::exit()") XBT_PUBLIC void kill
 #endif
 }
 
-/** @} */
 
 }} // namespace simgrid::s4u
 
index dd24d51..ff9c373 100644 (file)
@@ -23,10 +23,14 @@ class XBT_PUBLIC Comm : public Activity {
 public:
   friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Comm * c);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Comm * c);
-  friend Mailbox; // Factory of comms
+  friend simgrid::s4u::Mailbox; // Factory of comms
 
   virtual ~Comm();
 
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_sender_start;
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_receiver_start;
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_completion;
+
   /*! take a vector s4u::CommPtr and return when one of them is finished.
    * The return value is the rank of the first finished CommPtr. */
   static int wait_any(std::vector<CommPtr> * comms) { return wait_any_for(comms, -1); }
@@ -40,7 +44,8 @@ public:
 
   Activity* start() override;
   Activity* wait() override;
-  Activity* wait(double timeout) override;
+  Activity* wait_for(double timeout) override;
+  bool test() override;
 
   /** Start the comm, and ignore its result. It can be completely forgotten after that. */
   Activity* detach();
@@ -68,46 +73,40 @@ public:
   /** Retrieve the size of the received data */
   size_t get_dst_data_size();
 
-  bool test();
   Activity* cancel() override;
 
   /** Retrieve the mailbox on which this comm acts */
   MailboxPtr get_mailbox();
 
-  /** @deprecated See Comm::set_rate() */
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v324("Please use Comm::wait_for()") void wait(double t) override { wait_for(t); }
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_rate()") Activity* setRate(double rate) { return set_rate(rate); }
-  /** @deprecated See Comm::set_src_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_src_data()") Activity* setSrcData(void* buff)
   {
     return set_src_data(buff);
   }
-  /** @deprecated See Comm::set_src_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_src_data()") Activity* setSrcData(void* buff, size_t size)
   {
     return set_src_data(buff, size);
   }
-  /** @deprecated See Comm::set_src_data_size() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_src_data_size()") Activity* setSrcDataSize(size_t size)
   {
     return set_src_data_size(size);
   }
-  /** @deprecated See Comm::set_dst_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_dst_data()") Activity* setDstData(void** buff)
   {
     return set_dst_data(buff);
   }
-  /** @deprecated See Comm::set_dst_data() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::set_dst_data()") Activity* setDstData(void** buff, size_t size)
   {
     return set_dst_data(buff, size);
   }
-  /** @deprecated See Comm::get_dst_data_size() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::get_dst_data_size()") size_t getDstDataSize()
   {
     return get_dst_data_size();
   }
-  /** @deprecated See Comm::get_mailbox() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Comm::get_mailbox()") MailboxPtr getMailbox() { return get_mailbox(); }
+#endif
 
 private:
   double rate_        = -1;
index e2f5cce..12e0be1 100644 (file)
@@ -23,10 +23,9 @@ namespace s4u {
  */
 class XBT_PUBLIC ConditionVariable {
 private:
-#ifndef DOXYGEN
-  friend kernel::activity::ConditionVariableImpl;
+  friend simgrid::kernel::activity::ConditionVariableImpl;
   smx_cond_t cond_;
-#endif
+
   explicit ConditionVariable(smx_cond_t cond) : cond_(cond) {}
 public:
   ConditionVariable(ConditionVariable const&) = delete;
@@ -34,12 +33,14 @@ public:
 
   friend XBT_PUBLIC void intrusive_ptr_add_ref(ConditionVariable * cond);
   friend XBT_PUBLIC void intrusive_ptr_release(ConditionVariable * cond);
-  using Ptr = boost::intrusive_ptr<ConditionVariable>;
 
-  static Ptr create();
+  static ConditionVariablePtr create();
 
   /** @deprecated See Comm::get_mailbox() */
-  XBT_ATTRIB_DEPRECATED_v323("Please use Comm::get_mailbox()") Ptr createConditionVariable() { return create(); }
+  XBT_ATTRIB_DEPRECATED_v323("Please use Comm::get_mailbox()") ConditionVariablePtr createConditionVariable()
+  {
+    return create();
+  }
 
   //  Wait functions without time:
 
@@ -100,7 +101,6 @@ public:
   void notify_all();
 };
 
-using ConditionVariablePtr = ConditionVariable::Ptr;
 }
 } // namespace simgrid::s4u
 
index 26af5d0..18f0028 100644 (file)
@@ -28,11 +28,14 @@ public:
 
   ~Exec() = default;
 
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_start;
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_completion;
+
   Activity* start() override;
   Activity* wait() override;
-  Activity* wait(double timeout) override;
+  Activity* wait_for(double timeout) override;
   Activity* cancel() override;
-  bool test();
+  bool test() override;
 
   ExecPtr set_priority(double priority);
   ExecPtr set_bound(double bound);
@@ -44,23 +47,21 @@ public:
   double get_remaining() override;
   double get_remaining_ratio();
 
+#ifndef DOXYGEN
   //////////////// Deprecated functions
-  /** @deprecated See Exec::set_priority() */
+  XBT_ATTRIB_DEPRECATED_v324("Please use Exec::wait_for()") void wait(double t) override { wait_for(t); }
   XBT_ATTRIB_DEPRECATED_v323("Please use Exec::set_priority()") ExecPtr setPriority(double priority)
   {
     return set_priority(priority);
   }
-  /** @deprecated See Exec::set_bound() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Exec::set_bound()") ExecPtr setBound(double bound) { return set_bound(bound); }
-  /** @deprecated See Exec::set_host() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Exec::set_host()") ExecPtr setHost(Host* host) { return set_host(host); }
-  /** @deprecated See Exec::get_host() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Exec::get_host()") Host* getHost() { return get_host(); }
-  /** @deprecated See Exec::get_remaining_ratio() */
   XBT_ATTRIB_DEPRECATED_v323("Please use Exec::get_remaining_ratio()") double getRemainingRatio()
   {
     return get_remaining_ratio();
   }
+#endif
 
 private:
   Host* host_                   = nullptr;
index 26568e8..9153fbe 100644 (file)
@@ -25,20 +25,19 @@ namespace s4u {
  *
  * @tableofcontents
  *
- * An host represents some physical resource with computing and networking capabilities.
+ * Some physical resource with computing and networking capabilities on which Actors execute.
  *
  * All hosts are automatically created during the call of the method
- * @ref simgrid::s4u::Engine::loadPlatform().
+ * @ref simgrid::s4u::Engine::load_platform().
  * You cannot create a host yourself.
  *
- * You can retrieve a particular host using simgrid::s4u::Host::byName()
- * and actors can retrieve the host on which they run using simgrid::s4u::Host::current().
+ * You can retrieve a particular host using @ref simgrid::s4u::Host::by_name()
+ * and actors can retrieve the host on which they run using @ref simgrid::s4u::Host::current() or
+ * @ref simgrid::s4u::this_actor::get_host().
  */
 class XBT_PUBLIC Host : public simgrid::xbt::Extendable<Host> {
-#ifndef DOXYGEN
   friend simgrid::vm::VMModel;            // Use the pimpl_cpu to compute the VM sharing
   friend simgrid::vm::VirtualMachineImpl; // creates the the pimpl_cpu
-#endif
 
 public:
   explicit Host(std::string name);
@@ -154,6 +153,9 @@ public:
    * The actor will not be migrated in this case. Such remote execution are easy in simulation.
    */
   void execute(double flops);
+  /** Start an asynchronous computation on that host (possibly remote) */
+  ExecPtr exec_async(double flops_amounts);
+
   /** Block the calling actor on an execution located on the called host (with explicit priority) */
   void execute(double flops, double priority);
 
index 72b5ea2..2fb16f1 100644 (file)
@@ -29,18 +29,23 @@ private:
 public:
   friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Io* i);
   friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Io* i);
-  friend Storage; // Factory of IOs
+  friend simgrid::s4u::Storage; // Factory of IOs
 
   ~Io() = default;
 
   Activity* start() override;
   Activity* wait() override;
-  Activity* wait(double timeout) override;
+  Activity* wait_for(double timeout) override;
   Activity* cancel() override;
+  bool test() override;
 
   double get_remaining() override;
   sg_size_t get_performed_ioops();
 
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v324("Please use Io::wait_for()") void wait(double t) override { wait_for(t); }
+#endif
+
 private:
   sg_size_t size_       = 0;
   sg_storage_t storage_ = nullptr;
index c6dd56d..bd4a84b 100644 (file)
@@ -22,9 +22,7 @@ namespace simgrid {
 namespace s4u {
 /** @brief A Link represents the network facilities between [hosts](@ref simgrid::s4u::Host) */
 class XBT_PUBLIC Link : public simgrid::xbt::Extendable<Link> {
-#ifndef DOXYGEN
   friend simgrid::kernel::resource::LinkImpl;
-#endif
 
   // Links are created from the NetZone, and destroyed by their private implementation when the simulation ends
   explicit Link(kernel::resource::LinkImpl* pimpl) : pimpl_(pimpl) {}
index 7895026..5fbcf2f 100644 (file)
@@ -15,11 +15,8 @@ namespace simgrid {
 namespace s4u {
 
 /** @brief Mailboxes: Network rendez-vous points.
- *  @ingroup s4u_api
  *
- * @tableofcontents
- *
- * @section s4u_mb_what What are mailboxes
+ * <b>What are mailboxes?</b>
  *
  * Rendez-vous point for network communications, similar to URLs on
  * which you could post and retrieve data. Actually, the mailboxes are
@@ -31,27 +28,43 @@ namespace s4u {
  * find the receiver. The twitter hashtag, which help senders and
  * receivers to find each others. In TCP, the pair {host name, host
  * port} to which you can connect to find your interlocutor. In HTTP,
- * URLs through which the clients can connect to the servers.
+ * URLs through which the clients can connect to the servers. In ZeroMQ
+ * and other queuing systems, the queues are used to match senders
+ * and receivers.
  *
- * One big difference with most of these systems is that usually, no
- * actor is the exclusive owner of a mailbox, neither in sending nor
- * in receiving. Many actors can send into and/or receive from the
+ * One big difference with most of these systems is that no actor is
+ * the exclusive owner of a mailbox, neither in sending nor in
+ * receiving. Many actors can send into and/or receive from the
  * same mailbox.  This is a big difference to the socket ports for
  * example, that are definitely exclusive in receiving.
  *
+ * Mailboxes can optionally have a @i receiver with `simgrid::s4u::Mailbox::set_receiver()`.
+ * It means that the data exchange starts as soon as the sender has
+ * done the `put()`, even before the corresponding `get()`
+ * (usually, it starts as soon as both  `put()` and `get()` are posted).
+ * This is closer to the BSD semantic and can thus help to improve
+ * the timing accuracy, but this is not mandatory at all.
+ *
  * A big difference with twitter hashtags is that SimGrid does not
  * offer easy support to broadcast a given message to many
  * receivers. So that would be like a twitter tag where each message
  * is consumed by the first coming receiver.
  *
+ * A big difference with the ZeroMQ queues is that you cannot filter
+ * on the data you want to get from the mailbox. To model such settings
+ * in SimGrid, you'd have one mailbox per potential topic, and subscribe
+ * to each topic individually with a `get_async()` on each mailbox.
+ * Then, use `Comm::wait_any()` to get the first message on any of the
+ * mailbox you are subscribed onto.
+ *
  * The mailboxes are not located on the network, and you can access
  * them without any latency. The network delay are only related to the
  * location of the sender and receiver once the match between them is
  * done on the mailbox. This is just like the phone number that you
  * can use locally, and the geographical distance only comes into play
- * once you start the communication by dialling this number.
+ * once you start the communication by dialing this number.
  *
- * @section s4u_mb_howto How to use mailboxes?
+ * <b>How to use mailboxes?</b>
  *
  * Any existing mailbox can be retrieve from its name (which are
  * unique strings, just like with twitter tags). This results in a
@@ -60,7 +73,7 @@ namespace s4u {
  *
  * For something close to classical socket communications, use
  * "hostname:port" as mailbox names, and make sure that only one actor
- * reads into that mailbox. It's hard to build a prefectly realistic
+ * reads into that mailbox. It's hard to build a perfectly realistic
  * model of the TCP sockets, but most of the time, this system is too
  * cumbersome for your simulations anyway. You probably want something
  * simpler, that turns our to be easy to build with the mailboxes.
@@ -74,16 +87,16 @@ namespace s4u {
  * the first relevant actor that can deal with the request will handle
  * it.
  *
- * @section s4u_mb_matching How are sends and receives matched?
+ * <b>How are sends and receives matched?</b>
  *
  * The matching algorithm is as simple as a first come, first
  * serve. When a new send arrives, it matches the oldest enqueued
- * receive. If no receive is currently enqueued, then the incomming
+ * receive. If no receive is currently enqueued, then the incoming
  * send is enqueued. As you can see, the mailbox cannot contain both
  * send and receive requests: all enqueued requests must be of the
  * same sort.
  *
- * @section s4u_mb_receiver Declaring a receiving actor
+ * <b>Declaring a receiving actor</b>
  *
  * The last twist is that by default in the simulator, the data starts
  * to be exchanged only when both the sender and the receiver are
@@ -99,13 +112,12 @@ namespace s4u {
  * start as soon as possible, and the data will already be there on
  * the receiver host when the receiver actor posts its receive().
  *
- * @section s4u_mb_api The API
+ * <b>The API</b>
+ *
  */
 class XBT_PUBLIC Mailbox {
-#ifndef DOXYGEN
-  friend Comm;
+  friend simgrid::s4u::Comm;
   friend simgrid::kernel::activity::MailboxImpl;
-#endif
 
   simgrid::kernel::activity::MailboxImpl* pimpl_;
 
@@ -143,7 +155,13 @@ public:
    *
    * It means that the communications sent to this mailbox will start flowing to
    * its host even before he does a recv(). This models the real behavior of TCP
-   * and MPI communications, amongst other.
+   * and MPI communications, amongst other. It will improve the accuracy of
+   * predictions, in particular if your application exhibits swarms of small messages.
+   *
+   * SimGrid does not enforces any kind of ownership over the mailbox. Even if a receiver
+   * was declared, any other actors can still get() data from the mailbox. The timings
+   * will then probably be off tracks, so you should strive on your side to not get data
+   * from someone else's mailbox.
    */
   void set_receiver(ActorPtr actor);
 
index ae785f4..60c4525 100644 (file)
@@ -12,8 +12,6 @@
 namespace simgrid {
 namespace s4u {
 
-class ConditionVariable;
-
 /** @brief A classical mutex, but blocking in the simulation world
  *  @ingroup s4u_api
  *
@@ -29,10 +27,9 @@ class ConditionVariable;
  *
  */
 class XBT_PUBLIC Mutex {
-#ifndef DOXYGEN
-  friend ConditionVariable;
+  friend simgrid::s4u::ConditionVariable;
   friend simgrid::kernel::activity::MutexImpl;
-#endif
+
   simgrid::kernel::activity::MutexImpl* pimpl_;
   explicit Mutex(simgrid::kernel::activity::MutexImpl* mutex) : pimpl_(mutex) {}
 
@@ -41,8 +38,6 @@ class XBT_PUBLIC Mutex {
   friend XBT_PUBLIC void intrusive_ptr_release(Mutex* mutex);
 
 public:
-  using Ptr = boost::intrusive_ptr<Mutex>;
-
   // No copy:
   /** You cannot create a new mutex by copying an existing one. Use MutexPtr instead */
   Mutex(Mutex const&) = delete;
@@ -50,7 +45,7 @@ public:
   Mutex& operator=(Mutex const&) = delete;
 
   /** Constructs a new mutex */
-  static Ptr create();
+  static MutexPtr create();
 
   void lock();
   void unlock();
@@ -58,11 +53,9 @@ public:
 
   // deprecated
   /** @deprecated Mutex::create() */
-  XBT_ATTRIB_DEPRECATED_v323("Please use Mutex::create()") static Ptr createMutex() { return create(); }
+  XBT_ATTRIB_DEPRECATED_v323("Please use Mutex::create()") static MutexPtr createMutex() { return create(); }
 };
 
-using MutexPtr = Mutex::Ptr;
-
 }} // namespace simgrid::s4u
 
 #endif /* SIMGRID_S4U_MUTEX_HPP */
index ab145b9..8156699 100644 (file)
@@ -25,9 +25,7 @@ namespace s4u {
  */
 class XBT_PUBLIC NetZone {
 protected:
-#ifndef DOXYGEN
   friend simgrid::kernel::routing::NetZoneImpl;
-#endif
 
   explicit NetZone(kernel::routing::NetZoneImpl* impl);
   ~NetZone();
index 85005c1..2f5f89d 100644 (file)
@@ -24,14 +24,16 @@ namespace s4u {
 XBT_ATTRIB_DEPRECATED_v322("Please use Engine::get_all_storages()") XBT_PUBLIC void getStorageList(std::map<std::string, Storage*>* whereTo);
 #endif
 
-/** Storage represent the disk resources, usually associated to a given host */
+/** Storage represent the disk resources, usually associated to a given host
+ *
+ * By default, SimGrid does not keep track of the actual data being written but
+ * only computes the time taken by the corresponding data movement.
+ */
 
 class XBT_PUBLIC Storage : public simgrid::xbt::Extendable<Storage> {
-#ifndef DOXYGEN
-  friend s4u::Engine;
-  friend s4u::Io;
+  friend simgrid::s4u::Engine;
+  friend simgrid::s4u::Io;
   friend simgrid::surf::StorageImpl;
-#endif /* DOXYGEN */
 
 public:
   explicit Storage(std::string name, surf::StorageImpl * pimpl);
index 7f20595..18451af 100644 (file)
@@ -214,7 +214,8 @@ XBT_PUBLIC smx_actor_t simcall_process_create(std::string name, xbt_main_func_t
                                               std::unordered_map<std::string, std::string>* properties);
 #endif
 
-XBT_PUBLIC void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char* mesg);
+XBT_ATTRIB_DEPRECATED_v324("Please use ActorImpl::throw_exception") XBT_PUBLIC
+    void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char* mesg);
 
 /* Process handling */
 XBT_PUBLIC void simcall_process_suspend(smx_actor_t process);
index 02caf33..89a7177 100644 (file)
 #include <memory>
 #include <sstream>
 
-#define CHECK_ACTION_PARAMS(action, mandatory, optional)                                                             \
-{                                                                                                                    \
-  if (action.size() < static_cast<unsigned long>(mandatory + 2)) {                                                   \
-    std::stringstream ss;                                                                                            \
-    for (const auto& elem : action) {                                                                                \
-      ss << elem << " ";                                                                                             \
-    }                                                                                                                \
-    THROWF(arg_error, 0, "%s replay failed.\n"                                                                       \
-                         "%zu items were given on the line. First two should be process_id and action.  "            \
-                         "This action needs after them %lu mandatory arguments, and accepts %lu optional ones. \n"   \
-                         "The full line that was given is:\n   %s\n"                                                 \
-                         "Please contact the Simgrid team if support is needed",                                     \
-           __func__, action.size(), static_cast<unsigned long>(mandatory), static_cast<unsigned long>(optional),     \
-           ss.str().c_str());                                                                                        \
-  }                                                                                                                  \
-}
+#define CHECK_ACTION_PARAMS(action, mandatory, optional)                                                               \
+  {                                                                                                                    \
+    if (action.size() < static_cast<unsigned long>(mandatory + 2)) {                                                   \
+      std::stringstream ss;                                                                                            \
+      ss << __func__ << " replay failed.\n"                                                                            \
+         << action.size() << " items were given on the line. First two should be process_id and action.  "             \
+         << "This action needs after them " << mandatory << " mandatory arguments, and accepts " << optional           \
+         << " optional ones. \n"                                                                                       \
+         << "The full line that was given is:\n   ";                                                                   \
+      for (const auto& elem : action) {                                                                                \
+        ss << elem << " ";                                                                                             \
+      }                                                                                                                \
+      ss << "\nPlease contact the Simgrid team if support is needed";                                                  \
+      throw std::invalid_argument(ss.str());                                                                           \
+    }                                                                                                                  \
+  }
 
 XBT_PRIVATE void* smpi_get_tmp_sendbuffer(int size);
 XBT_PRIVATE void* smpi_get_tmp_recvbuffer(int size);
index 0c78541..8977aa2 100644 (file)
@@ -6,6 +6,7 @@
 #ifndef SMPI_HELPERS_INTERNAL_H
 #define SMPI_HELPERS_INTERNAL_H
 
+#include <getopt.h>
 #include <unistd.h>
 
 #include <sys/time.h>
@@ -25,7 +26,6 @@ int smpi_clock_gettime(clockid_t clk_id, struct timespec* tp);
 unsigned int smpi_sleep(unsigned int secs);
 int smpi_gettimeofday(struct timeval* tv, struct timezone* tz);
 
-struct option;
 int smpi_getopt_long_only(int argc, char* const* argv, const char* options, const struct option* long_options,
                           int* opt_index);
 int smpi_getopt_long(int argc, char* const* argv, const char* options, const struct option* long_options,
index 6367997..761a4b6 100644 (file)
@@ -1,12 +1,11 @@
 /* Copyright (c) 2005-2018. 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 XBT_BACKTRACE_H
 #define XBT_BACKTRACE_H
 
-#ifdef __cplusplus
-#include <cstddef>
-#endif
-
 #include <xbt/base.h>
 
 SG_BEGIN_DECL()
index ae378b7..291f792 100644 (file)
@@ -1,5 +1,7 @@
-/* Copyright (c) 2005-2018. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2005-2018. 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 SIMGRIX_XBT_BACKTRACE_HPP
 #define SIMGRIX_XBT_BACKTRACE_HPP
 #include <memory>
 #include <vector>
 
-#include <xbt/base.h>
 #include <xbt/backtrace.h>
 
 namespace simgrid {
 namespace xbt {
 
+/** A backtrace
+ *
+ *  This is used (among other things) in exceptions to store the associated
+ *  backtrace.
+ *
+ *  @ingroup XBT_ex
+ */
+typedef std::vector<xbt_backtrace_location_t> Backtrace;
+
 /** Try to demangle a C++ name
  *
  *  Return the origin string if this fails.
@@ -27,7 +37,7 @@ XBT_PUBLIC std::vector<xbt_backtrace_location_t> backtrace();
 
 /* Translate the backtrace in a human friendly form
  *
- *  Try ro resolve symbols and source code location.
+ *  Try resolve symbols and source code location.
  */
 XBT_PUBLIC std::vector<std::string> resolve_backtrace(xbt_backtrace_location_t const* loc, std::size_t count);
 XBT_ATTRIB_DEPRECATED_v323("Please use xbt::resolve_backtrace()") XBT_PUBLIC std::vector<std::string> resolveBacktrace(xbt_backtrace_location_t const* loc, std::size_t count);
index dc6596c..ed40566 100644 (file)
@@ -70,23 +70,17 @@ XBT_ATTRIB_NORETURN XBT_PUBLIC void _xbt_throw(char* message, xbt_errcat_t errca
  */
 #define THROWF(c, v, ...)       _xbt_throw(bprintf(__VA_ARGS__), (xbt_errcat_t) c, v, __FILE__, __LINE__, __func__)
 
-/** Throw an exception because someting impossible happened
+XBT_ATTRIB_NORETURN void xbt_throw_impossible(const char* file, int line, const char* func);
+/** Throw an exception because something impossible happened
  *  @ingroup XBT_ex_c
  */
-#define THROW_IMPOSSIBLE \
-  THROWF(unknown_error, 0, "The Impossible Did Happen (yet again)")
+#define THROW_IMPOSSIBLE xbt_throw_impossible(__FILE__, __LINE__, __func__)
 
-/** Throw an exception because someting unimplemented stuff has been attempted
+/** Throw an exception because something unimplemented stuff has been attempted
  *  @ingroup XBT_ex_c
  */
-#define THROW_UNIMPLEMENTED \
-  THROWF(unknown_error, 0, "Function %s unimplemented",__func__)
-
-/** Throw an exception because some dead code was reached
- *  @ingroup XBT_ex_c
- */
-#define THROW_DEADCODE \
-  THROWF(unknown_error, 0, "Function %s was supposed to be DEADCODE, but it's not",__func__)
+XBT_ATTRIB_NORETURN void xbt_throw_unimplemented(const char* file, int line, const char* func);
+#define THROW_UNIMPLEMENTED xbt_throw_unimplemented(__FILE__, __LINE__, __func__)
 
 /** Die because something impossible happened
  *  @ingroup XBT_ex_c
diff --git a/include/xbt/ex.hpp b/include/xbt/ex.hpp
deleted file mode 100644 (file)
index 9b6ff5f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2005-2018. 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 SIMGRID_XBT_EX_HPP
-#define SIMGRID_XBT_EX_HPP
-
-#include <stdexcept>
-#include <xbt/exception.hpp>
-
-#include <xbt/ex.h>
-
-/** A legacy exception
- *
- *  It is defined by a category and a value within that category (as well as
- *  an optional error message).
- *
- *  This used to be a structure for C exceptions but it has been retrofitted
- *  as a C++ exception and some of its data has been moved in the
- *  @ref WithContextException base class. We should deprecate it and replace it
- *  with either C++ different exceptions or `std::system_error` which already
- *  provides this (category + error code) logic.
- *
- *  @ingroup XBT_ex_c
- */
-class XBT_PUBLIC xbt_ex : public std::runtime_error, public simgrid::xbt::WithContextException {
-public:
-  xbt_ex() :
-    std::runtime_error("")
-  {}
-
-  /**
-   *
-   * @param throwpoint Throw point (use XBT_THROW_POINT)
-   * @param message    Exception message
-   */
-  xbt_ex(simgrid::xbt::ThrowPoint throwpoint, const char* message) :
-    std::runtime_error(message),
-    simgrid::xbt::WithContextException(throwpoint, simgrid::xbt::backtrace())
-  {}
-
-  ~xbt_ex(); // DO NOT define it here -- see ex.cpp for a rationale
-
-  /** Category (what went wrong) */
-  xbt_errcat_t category = unknown_error;
-
-  /** Why did it went wrong */
-  int value = 0;
-
-};
-
-#endif
diff --git a/include/xbt/exception.hpp b/include/xbt/exception.hpp
deleted file mode 100644 (file)
index 544f6ae..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Copyright (c) 2005-2018. 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 SIMGRID_XBT_EXCEPTION_HPP
-#define SIMGRID_XBT_EXCEPTION_HPP
-
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <xbt/base.h>
-#include <xbt/backtrace.h>
-#include <xbt/backtrace.hpp>
-#include <xbt/log.h>
-#include <xbt/misc.h>  // xbt_procname
-#include <xbt/virtu.h> // xbt_getpid
-
-/** @addtogroup XBT_ex
- *  @brief Exceptions support
- */
-
-namespace simgrid {
-namespace xbt {
-
-/** A backtrace
- *
- *  This is used (among other things) in exceptions to store the associated
- *  backtrace.
- *
- *  @ingroup XBT_ex
- */
-typedef std::vector<xbt_backtrace_location_t> Backtrace;
-
-/** The location of where an exception has been throwed
- *
- *  This is a tuple (__FILE__, __LINE__, __func__) and can be created with
- *  @ref XBT_THROW_POINT.
- *
- *  @ingroup XBT_ex
- */
-class ThrowPoint {
- public:
-  ThrowPoint() = default;
-  explicit ThrowPoint(const char* file, int line, const char* function) : file(file), line(line), function(function) {}
-  const char* file = nullptr;
-  int line = 0;
-  const char* function = nullptr;
-};
-
-/** Create a ThrowPoint with (__FILE__, __LINE__, __func__) */
-#define XBT_THROW_POINT ::simgrid::xbt::ThrowPoint(__FILE__, __LINE__, __func__)
-
-/** A base class for exceptions with context
- *
- *  This is a base class for exceptions which store additional contextual
- *  infomations about them: backtrace, throw point, simulated process name
- *  and PID, etc.
- *
- *  You are not expected to inherit from it. Instead of you use should
- *  @ref XBT_THROW an exception which will throw a subclass of your original
- *  exception with those additional features.
- *
- *  However, you can try `dynamic_cast` an exception to this type in order to
- *  get contextual information about the exception.
- */
-class XBT_PUBLIC WithContextException {
-public:
-  WithContextException() :
-    backtrace_(simgrid::xbt::backtrace()),
-    procname_(xbt_procname()),
-    pid_(xbt_getpid())
-  {}
-  explicit WithContextException(Backtrace bt) : backtrace_(std::move(bt)), procname_(xbt_procname()), pid_(xbt_getpid())
-  {}
-  explicit WithContextException(ThrowPoint throwpoint, Backtrace bt)
-      : backtrace_(std::move(bt)), procname_(xbt_procname()), pid_(xbt_getpid()), throwpoint_(throwpoint)
-  {}
-  virtual ~WithContextException();
-  Backtrace const& backtrace() const
-  {
-    return backtrace_;
-  }
-  int pid() const { return pid_; }
-  std::string const& process_name() const { return procname_; }
-  ThrowPoint& throw_point() { return throwpoint_; }
-
-  // deprecated
-  XBT_ATTRIB_DEPRECATED_v323("Please use WithContextException::process_name()") std::string const& processName() const
-  {
-    return process_name();
-  }
-  XBT_ATTRIB_DEPRECATED_v323("Please use WithContextException::throw_point()") ThrowPoint& throwPoint()
-  {
-    return throw_point();
-  }
-
-private:
-  Backtrace backtrace_;
-  std::string procname_; /**< Name of the process who thrown this */
-  int pid_;              /**< PID of the process who thrown this */
-  ThrowPoint throwpoint_;
-};
-
-/** Internal class used to mixin an exception E with WithContextException */
-template<class E>
-class WithContext : public E, public WithContextException
-{
-public:
-  static_assert(not std::is_base_of<WithContextException, E>::value, "Trying to appli WithContext twice");
-
-  explicit WithContext(E exception) : E(std::move(exception)) {}
-  WithContext(E exception, ThrowPoint throwpoint, Backtrace backtrace) :
-    E(std::move(exception)),
-    WithContextException(throwpoint, std::move(backtrace)) {}
-  WithContext(E exception, Backtrace backtrace) :
-    E(std::move(exception)),
-    WithContextException(std::move(backtrace)) {}
-  WithContext(E exception, WithContextException context) :
-    E(std::move(exception)),
-    WithContextException(std::move(context)) {}
-  ~WithContext() override = default;
-};
-
-/** Throw a C++ exception with some context
- *
- *  @param e Exception to throw
- *  @ingroup XBT_ex
- */
-#define XBT_THROW(e) \
-  throw WithContext<E>(std::move(exception), throwpoint, simgrid::xbt::backtrace())
-
-/** Throw a C++ exception with a context and a nexted exception/cause
- *
- *  @param e Exception to throw
- *  @ingroup XBT_ex
- */
-#define XBT_THROW_NESTED(e) \
-  std::throw_with_nested(WithContext<E>(std::move(exception), throwpoint, simgrid::xbt::backtrace()))
-
-}
-}
-
-#endif
index a0c4f26..e6f7ca7 100644 (file)
@@ -51,46 +51,12 @@ public:
       code_(argc, nullptr);
   }
 };
-class MainStdFunction {
-private:
-  void (*code_)(std::vector<std::string>);
-  std::shared_ptr<const std::vector<std::string>> args_;
-
-public:
-  MainStdFunction(void (*code)(std::vector<std::string>), std::vector<std::string> args)
-      : code_(std::move(code)), args_(std::make_shared<const std::vector<std::string>>(std::move(args)))
-  {
-  }
-  void operator()() const
-  {
-    std::vector<std::string> args = *args_;
-    code_(args);
-  }
-};
-
-template <class F>
-inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(
-    F code, std::vector<std::string> args)
-{
-  return MainFunction<F>(std::move(code), std::move(args));
-}
 
 template <class F> inline std::function<void()> wrap_main(F code, std::vector<std::string> args)
 {
   return MainFunction<F>(std::move(code), std::move(args));
 }
-inline std::function<void()> wrap_main(void (*code)(std::vector<std::string>), std::vector<std::string> args)
-{
-  return MainStdFunction(std::move(code), std::move(args));
-}
 
-template <class F>
-inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(F code, int argc,
-                                                                                           const char* const argv[])
-{
-  std::vector<std::string> args(argv, argv + argc);
-  return MainFunction<F>(std::move(code), std::move(args));
-}
 template <class F> inline std::function<void()> wrap_main(F code, int argc, const char* const argv[])
 {
   std::vector<std::string> args(argv, argv + argc);
@@ -320,20 +286,36 @@ public:
   }
 };
 
-template <class F, class... Args>
-XBT_ATTRIB_DEPRECATED_v323("Please use make_task()") auto makeTask(F code, Args... args)
-    -> Task<decltype(code(std::move(args)...))()>
+template <class F, class... Args> auto make_task(F code, Args... args) -> Task<decltype(code(std::move(args)...))()>
 {
   TaskImpl<F, Args...> task(std::move(code), std::make_tuple(std::move(args)...));
   return Task<decltype(code(std::move(args)...))()>(std::move(task));
 }
 
-template <class F, class... Args> auto make_task(F code, Args... args) -> Task<decltype(code(std::move(args)...))()>
+// Deprecated
+template <class F, class... Args>
+XBT_ATTRIB_DEPRECATED_v323("Please use make_task()") auto makeTask(F code, Args... args)
+    -> Task<decltype(code(std::move(args)...))()>
 {
   TaskImpl<F, Args...> task(std::move(code), std::make_tuple(std::move(args)...));
   return Task<decltype(code(std::move(args)...))()>(std::move(task));
 }
+
+template <class F>
+inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(
+    F code, std::vector<std::string> args)
+{
+  return MainFunction<F>(std::move(code), std::move(args));
 }
+
+template <class F>
+inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(F code, int argc,
+                                                                                           const char* const argv[])
+{
+  std::vector<std::string> args(argv, argv + argc);
+  return MainFunction<F>(std::move(code), std::move(args));
 }
 
+} // namespace xbt
+} // namespace simgrid
 #endif
index 083ce2d..4aaff8a 100644 (file)
@@ -3,8 +3,8 @@
 /* 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 <simgrid/Exception.hpp>
 #include <xbt/log.h>
-#include <xbt/exception.hpp>
 
 namespace simgrid {
 namespace xbt {
index e602914..5fe1c0c 100644 (file)
@@ -7,8 +7,8 @@
 
 #include "JavaContext.hpp"
 #include "jxbt_utilities.hpp"
+#include "simgrid/Exception.hpp"
 #include "src/simix/smx_private.hpp"
-#include "xbt/ex.hpp"
 
 #include <functional>
 #include <utility>
@@ -29,6 +29,7 @@ ContextFactory* java_factory()
 
 JavaContextFactory::JavaContextFactory(): ContextFactory("JavaContextFactory")
 {
+  xbt_binary_name = xbt_strdup("java"); // Used by the backtrace displayer
 }
 
 JavaContextFactory::~JavaContextFactory()=default;
@@ -38,80 +39,32 @@ JavaContext* JavaContextFactory::self()
   return static_cast<JavaContext*>(xbt_os_thread_get_extra_data());
 }
 
-JavaContext* JavaContextFactory::create_context(
-  std::function<void()> code,
-  void_pfn_smxprocess_t cleanup, smx_actor_t process)
+JavaContext* JavaContextFactory::create_context(std::function<void()> code, void_pfn_smxprocess_t cleanup_fun,
+                                                smx_actor_t actor)
 {
-  return this->new_context<JavaContext>(std::move(code), cleanup, process);
+  return this->new_context<JavaContext>(std::move(code), cleanup_fun, actor);
 }
 
 void JavaContextFactory::run_all()
 {
-  for (smx_actor_t const& process : simgrid::simix::process_get_runnable()) {
-    static_cast<JavaContext*>(process->context_)->resume();
-  }
+  SerialThreadContext::run_all();
 }
 
-JavaContext::JavaContext(std::function<void()> code,
-        void_pfn_smxprocess_t cleanup_func,
-        smx_actor_t process)
-  : Context(std::move(code), cleanup_func, process)
+JavaContext::JavaContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
+    : SerialThreadContext(std::move(code), cleanup_func, process, false /* not maestro */)
 {
-  static int thread_amount=0;
-  thread_amount++;
-
-  /* If the user provided a function for the process then use it otherwise is the context for maestro */
-  if (has_code()) {
-    this->jprocess = nullptr;
-    this->begin = xbt_os_sem_init(0);
-    this->end = xbt_os_sem_init(0);
-
-    try {
-       this->thread = xbt_os_thread_create(
-         nullptr, JavaContext::wrapper, this, nullptr);
-    }
-    catch (xbt_ex& ex) {
-      char* str = bprintf(
-        "Failed to create context #%d. You may want to switch to Java coroutines to increase your limits (error: %s)."
-        "See the Install section of simgrid-java documentation (in doc/install.html) for more on coroutines.",
-        thread_amount, ex.what());
-      xbt_ex new_exception(XBT_THROW_POINT, str);
-      new_exception.category = ex.category;
-      new_exception.value = ex.value;
-      std::throw_with_nested(std::move(new_exception));
-    }
-  } else {
-    this->thread = nullptr;
-    xbt_os_thread_set_extra_data(this);
-  }
+  /* ThreadContext already does all we need */
 }
 
-JavaContext::~JavaContext()
+void JavaContext::start_hook()
 {
-  if (this->thread) {
-    // We are not in maestro context
-    xbt_os_thread_join(this->thread, nullptr);
-    xbt_os_sem_destroy(this->begin);
-    xbt_os_sem_destroy(this->end);
-  }
-}
+  xbt_os_thread_set_extra_data(this); // We need to attach it also for maestro, in contrary to our ancestor
 
-void* JavaContext::wrapper(void *data)
-{
-  JavaContext* context = static_cast<JavaContext*>(data);
-  xbt_os_thread_set_extra_data(context);
   //Attach the thread to the JVM
-
   JNIEnv *env;
   XBT_ATTRIB_UNUSED jint error = __java_vm->AttachCurrentThread((void**)&env, nullptr);
   xbt_assert((error == JNI_OK), "The thread could not be attached to the JVM");
-  context->jenv = env;
-  //Wait for the first scheduling round to happen.
-  xbt_os_sem_acquire(context->begin);
-  //Create the "Process" object if needed.
-  (*context)();
-  context->stop();
-  return nullptr;
+  this->jenv_ = env;
 }
 
 void JavaContext::stop()
@@ -119,7 +72,7 @@ void JavaContext::stop()
   /* I was asked to die (either with kill() or because of a failed element) */
   if (this->iwannadie) {
     this->iwannadie = 0;
-    JNIEnv *env = get_current_thread_env();
+    JNIEnv* env     = this->jenv_;
     XBT_DEBUG("Gonna launch Killed Error");
     // When the process wants to stop before its regular end, we should cut its call stack quickly.
     // The easiest way to do so is to raise an exception that will be catched in its top calling level.
@@ -152,32 +105,16 @@ void JavaContext::stop()
     // In other words, we need to do in C++ what we do in Java for sake of uniformity.
     //
     // Plus, C++ RAII would work in that case, too.
-
     XBT_DEBUG("Trigger a cancel error at the C level");
     THROWF(cancel_error, 0, "process cancelled");
   } else {
-    Context::stop();
-    /* detach the thread and kills it */
-    JNIEnv *env = this->jenv;
-    env->DeleteGlobalRef(this->jprocess);
+    ThreadContext::stop();
+    JNIEnv* env = this->jenv_;
+    env->DeleteGlobalRef(this->jprocess_);
     XBT_ATTRIB_UNUSED jint error = __java_vm->DetachCurrentThread();
     xbt_assert((error == JNI_OK), "The thread couldn't be detached.");
-    xbt_os_sem_release(this->end);
     xbt_os_thread_exit(nullptr);
   }
 }
 
-void JavaContext::suspend()
-{
-  xbt_os_sem_release(this->end);
-  xbt_os_sem_acquire(this->begin);
-}
-
-// FIXME: inline those functions
-void JavaContext::resume()
-{
-  xbt_os_sem_release(this->begin);
-  xbt_os_sem_acquire(this->end);
-}
-
 }}} // namespace simgrid::kernel::context
index 462f9a2..0a07f01 100644 (file)
@@ -12,6 +12,7 @@
 #include <jni.h>
 
 #include "simgrid/simix.h"
+#include "src/kernel/context/ContextThread.hpp"
 #include "src/simix/smx_private.hpp"
 #include "xbt/xbt_os_thread.h"
 
@@ -24,28 +25,20 @@ namespace context {
 class JavaContext;
 class JavacontextFactory;
 
-class JavaContext : public simgrid::kernel::context::Context {
+class JavaContext : public simgrid::kernel::context::SerialThreadContext {
 public:
   // The java process instance bound with the msg process structure:
-  jobject jprocess = nullptr;
+  jobject jprocess_ = nullptr;
   // JNI interface pointer associated to this thread:
-  JNIEnv *jenv = nullptr;
-  xbt_os_thread_t thread = nullptr;
-  // Sempahore used to schedule/yield the process:
-  xbt_os_sem_t begin = nullptr;
-  // Semaphore used to schedule/unschedule the process:
-  xbt_os_sem_t end = nullptr;
+  JNIEnv* jenv_           = nullptr;
 
   friend class JavaContextFactory;
   JavaContext(std::function<void()> code,
           void_pfn_smxprocess_t cleanup_func,
           smx_actor_t process);
-  ~JavaContext() override;
+
+  void start_hook() override;
   void stop() override;
-  void suspend() override;
-  void resume();
-private:
-  static void* wrapper(void *data);
 };
 
 class JavaContextFactory : public simgrid::kernel::context::ContextFactory {
index 6e5cbdd..143a28b 100644 (file)
@@ -9,6 +9,7 @@
 #include <clocale>
 #include <string>
 
+#include "simgrid/Exception.hpp"
 #include "simgrid/msg.h"
 #include "simgrid/plugins/energy.h"
 #include "simgrid/plugins/file_system.h"
@@ -29,7 +30,6 @@
 
 #include "JavaContext.hpp"
 
-#include <xbt/ex.hpp>
 
 /* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */
 #ifndef JNIEXPORT
@@ -50,7 +50,7 @@ JNIEnv *get_current_thread_env()
 {
   using simgrid::kernel::context::JavaContext;
   JavaContext* ctx = static_cast<JavaContext*>(xbt_os_thread_get_extra_data());
-  return ctx->jenv;
+  return ctx->jenv_;
 }
 
 void jmsg_throw_status(JNIEnv *env, msg_error_t status) {
@@ -132,7 +132,7 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass
   jxbt_check_res("MSG_main()", rv, MSG_OK,
                  xbt_strdup("unexpected error : MSG_main() failed .. please report this bug "));
 
-  XBT_INFO("MSG_main finished; Cleaning up the simulation...");
+  XBT_INFO("MSG_main finished; Terminating the simulation...");
   /* Cleanup java hosts */
   xbt_dynar_t hosts = MSG_hosts_as_dynar();
   for (unsigned long index = 0; index < xbt_dynar_length(hosts) - 1; index++) {
@@ -140,13 +140,16 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass
     jobject jhost = (jobject) msg_host->extension(JAVA_HOST_LEVEL);
     if (jhost)
       jhost_unref(env, jhost);
-
   }
   xbt_dynar_free(&hosts);
 
   /* Cleanup java storages */
   for (auto const& elm : java_storage_map)
     jstorage_unref(env, elm.second);
+
+  /* FIXME: don't be of such an EXTREM BRUTALITY to stop the jvm. Sorry I don't get it working otherwise.
+   * See the comment in ActorImpl.cpp::SIMIX_process_kill() */
+  exit(0);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile)
@@ -250,9 +253,11 @@ static void run_jprocess(JNIEnv *env, jobject jprocess)
   jdouble startTime = env->GetDoubleField(jprocess, jprocess_field_Process_startTime);
   if (startTime > MSG_get_clock())
     MSG_process_sleep(startTime - MSG_get_clock());
+
   //Execution of the "run" method.
   jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V");
-  xbt_assert((id != nullptr), "Method run() not found...");
+  xbt_assert((id != nullptr), "Method Process.run() not found...");
+
   env->CallVoidMethod(jprocess, id);
 }
 
@@ -288,13 +293,13 @@ static int java_main(int argc, char *argv[])
   //bind the process to the context
   msg_process_t process = MSG_process_self();
 
-  context->jprocess = jprocess;
+  context->jprocess_ = jprocess;
   /* sets the PID and the PPID of the process */
   env->SetIntField(jprocess, jprocess_field_Process_pid, static_cast<jint>(MSG_process_get_PID(process)));
   env->SetIntField(jprocess, jprocess_field_Process_ppid, static_cast<jint>(MSG_process_get_PPID(process)));
   jprocess_bind(jprocess, process, env);
 
-  run_jprocess(env, context->jprocess);
+  run_jprocess(env, context->jprocess_);
   return 0;
 }
 
@@ -307,9 +312,9 @@ void java_main_jprocess(jobject jprocess)
 {
   JNIEnv *env = get_current_thread_env();
   simgrid::kernel::context::JavaContext* context = static_cast<simgrid::kernel::context::JavaContext*>(SIMIX_context_self());
-  context->jprocess = jprocess;
-  jprocess_bind(context->jprocess, MSG_process_self(), env);
+  context->jprocess_                             = jprocess;
+  jprocess_bind(context->jprocess_, MSG_process_self(), env);
 
-  run_jprocess(env, context->jprocess);
+  run_jprocess(env, context->jprocess_);
 }
 }}}
index 2c392a7..7580858 100644 (file)
@@ -5,14 +5,13 @@
 /* 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/ex.hpp>
-
 #include "jmsg_process.h"
 
 #include "JavaContext.hpp"
 #include "jmsg.hpp"
 #include "jmsg_host.h"
 #include "jxbt_utilities.hpp"
+#include "simgrid/Exception.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java);
 
@@ -27,7 +26,7 @@ jobject jprocess_from_native(msg_process_t process)
 {
   simgrid::kernel::context::JavaContext* context =
       (simgrid::kernel::context::JavaContext*)process->get_impl()->context_;
-  return context->jprocess;
+  return context->jprocess_;
 }
 
 jobject jprocess_ref(jobject jprocess, JNIEnv* env)
@@ -227,7 +226,11 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cl
  {
   double time =  ((double)jmillis) / 1000 + ((double)jnanos) / 1000000000;
   msg_error_t rv;
-  rv = MSG_process_sleep(time);
+  try {
+    rv = MSG_process_sleep(time);
+  } catch (simgrid::kernel::context::Context::StopRequest const&) {
+    rv = MSG_HOST_FAILURE;
+  }
   if (rv != MSG_OK) {
     XBT_DEBUG("Something during the MSG_process_sleep invocation was wrong, trigger a HostFailureException");
 
index 259def3..e79910c 100644 (file)
@@ -5,11 +5,10 @@
 /* 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/ex.hpp>
-
-#include "jmsg.hpp"
 #include "jmsg_synchro.h"
+#include "jmsg.hpp"
 #include "jxbt_utilities.hpp"
+#include "simgrid/Exception.hpp"
 #include "xbt/synchro.h"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java);
index 7eb0812..16bff65 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef MSG_JSYNCHRO_H
 #define MSG_JSYNCHRO_H
 
+#include "xbt/base.h"
 #include <jni.h>
 
 SG_BEGIN_DECL()
index 6bdf53e..9b04afb 100644 (file)
@@ -8,9 +8,9 @@
 #include "jmsg_vm.h"
 #include "jmsg_host.h"
 #include "jxbt_utilities.hpp"
+#include "simgrid/Exception.hpp"
 #include "simgrid/plugins/live_migration.h"
 #include "src/plugins/vm/VirtualMachineImpl.hpp"
-#include "xbt/ex.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java);
 
index da9801d..7fb1103 100644 (file)
@@ -79,7 +79,7 @@ public final class NativeLib {
                        System.err.println();
                        cause.printStackTrace();
                } else {
-                       System.err.println("This jar file does not seem to fit your system, and no usable SimGrid installation found on disk.");
+                       System.err.println("This jar file does not seem to fit your system, and no usable SimGrid installation found on disk for "+name+".");
                }
                System.exit(1);
        }
index 5881002..c55c99f 100644 (file)
@@ -137,8 +137,7 @@ void TRACE_declare_mark(const char *mark_type)
   if (not TRACE_is_enabled() || not TRACE_needs_platform())
     return;
 
-  if (not mark_type)
-    THROWF (tracing_error, 1, "mark_type is nullptr");
+  xbt_assert(mark_type, "mark_type is nullptr");
 
   //check if mark_type is already declared
   if (declared_marks.find(mark_type) != declared_marks.end()) {
@@ -171,10 +170,8 @@ void TRACE_declare_mark_value_with_color (const char *mark_type, const char *mar
   if (not TRACE_is_enabled() || not TRACE_needs_platform())
     return;
 
-  if (not mark_type)
-    THROWF (tracing_error, 1, "mark_type is nullptr");
-  if (not mark_value)
-    THROWF (tracing_error, 1, "mark_value is nullptr");
+  xbt_assert(mark_type, "mark_type is nullptr");
+  xbt_assert(mark_value, "mark_value is nullptr");
 
   simgrid::instr::EventType* type =
       static_cast<simgrid::instr::EventType*>(simgrid::instr::Container::get_root()->type_->by_name(mark_type));
@@ -226,10 +223,8 @@ void TRACE_mark(const char *mark_type, const char *mark_value)
   if (not TRACE_is_enabled() || not TRACE_needs_platform())
     return;
 
-  if (not mark_type)
-    THROWF (tracing_error, 1, "mark_type is nullptr");
-  if (not mark_value)
-    THROWF (tracing_error, 1, "mark_value is nullptr");
+  xbt_assert(mark_type, "mark_type is nullptr");
+  xbt_assert(mark_value, "mark_value is nullptr");
 
   //check if mark_type is already declared
   simgrid::instr::EventType* type =
index 52994b4..e0c22b1 100644 (file)
@@ -129,8 +129,7 @@ Container* Container::by_name_or_null(std::string name)
 Container* Container::by_name(std::string name)
 {
   Container* ret = Container::by_name_or_null(name);
-  if (ret == nullptr)
-    THROWF(tracing_error, 1, "container with name %s not found", name.c_str());
+  xbt_assert(ret != nullptr, "container with name %s not found", name.c_str());
 
   return ret;
 }
index 6a564f9..5ec364e 100644 (file)
@@ -8,7 +8,9 @@
 #include "simgrid/kernel/routing/NetPoint.hpp"
 #include "simgrid/kernel/routing/NetZoneImpl.hpp"
 #include "simgrid/s4u/Actor.hpp"
+#include "simgrid/s4u/Comm.hpp"
 #include "simgrid/s4u/Engine.hpp"
+#include "simgrid/s4u/Exec.hpp"
 #include "simgrid/s4u/Host.hpp"
 #include "simgrid/s4u/VirtualMachine.hpp"
 #include "src/surf/cpu_interface.hpp"
@@ -298,7 +300,7 @@ static void instr_actor_on_creation(simgrid::s4u::ActorPtr actor)
   state->add_entity_value("sleep", "1 1 0");
   state->add_entity_value("receive", "1 0 0");
   state->add_entity_value("send", "0 0 1");
-  state->add_entity_value("task_execute", "0 1 1");
+  state->add_entity_value("execute", "0 1 1");
   root->type_->by_name_or_create("ACTOR_LINK", actor_type, actor_type);
   root->type_->by_name_or_create("ACTOR_TASK_LINK", actor_type, actor_type);
 
@@ -345,7 +347,7 @@ static void instr_vm_on_creation(simgrid::s4u::Host& host)
   state->add_entity_value("sleep", "1 1 0");
   state->add_entity_value("receive", "1 0 0");
   state->add_entity_value("send", "0 0 1");
-  state->add_entity_value("task_execute", "0 1 1");
+  state->add_entity_value("execute", "0 1 1");
   root->type_->by_name_or_create("VM_LINK", vm, vm);
   root->type_->by_name_or_create("VM_ACTOR_LINK", vm, vm);
 }
@@ -370,6 +372,11 @@ void instr_define_callbacks()
 
   if (TRACE_actor_is_enabled()) {
     simgrid::s4u::Actor::on_creation.connect(instr_actor_on_creation);
+    simgrid::s4u::Actor::on_destruction.connect([](simgrid::s4u::ActorPtr actor) {
+      auto container = simgrid::instr::Container::by_name_or_null(instr_pid(actor.get()));
+      if (container != nullptr)
+        container->remove_from_parent();
+    });
     simgrid::s4u::Actor::on_suspend.connect([](simgrid::s4u::ActorPtr actor) {
       simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("suspend");
     });
@@ -382,6 +389,21 @@ void instr_define_callbacks()
     simgrid::s4u::Actor::on_wake_up.connect([](simgrid::s4u::ActorPtr actor) {
       simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->pop_event();
     });
+    simgrid::s4u::Exec::on_start.connect([](simgrid::s4u::ActorPtr actor) {
+      simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("execute");
+    });
+    simgrid::s4u::Exec::on_completion.connect([](simgrid::s4u::ActorPtr actor) {
+      simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->pop_event();
+    });
+    simgrid::s4u::Comm::on_sender_start.connect([](simgrid::s4u::ActorPtr actor) {
+      simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("send");
+    });
+    simgrid::s4u::Comm::on_receiver_start.connect([](simgrid::s4u::ActorPtr actor) {
+      simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("receive");
+    });
+    simgrid::s4u::Comm::on_completion.connect([](simgrid::s4u::ActorPtr actor) {
+      simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->pop_event();
+    });
     simgrid::s4u::Actor::on_migration_start.connect(instr_actor_on_migration_start);
     simgrid::s4u::Actor::on_migration_end.connect(instr_actor_on_migration_end);
   }
index bf594db..f31fd92 100644 (file)
@@ -14,7 +14,6 @@
 #include "src/instr/instr_paje_events.hpp"
 #include "src/instr/instr_paje_types.hpp"
 #include "src/instr/instr_paje_values.hpp"
-#include "src/internal_config.h"
 #include "xbt/graph.h"
 
 #include <fstream>
index ddd34cd..12f2e02 100644 (file)
@@ -4,10 +4,10 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "src/kernel/activity/ConditionVariableImpl.hpp"
+#include "simgrid/Exception.hpp"
 #include "src/kernel/activity/MutexImpl.hpp"
 #include "src/kernel/activity/SynchroRaw.hpp"
 #include "src/simix/smx_synchro_private.hpp"
-#include "xbt/ex.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ConditionVariable, simix_synchro, "Condition variables");
 
index b02cda8..f9c159b 100644 (file)
@@ -3,17 +3,17 @@
 /* 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 "simgrid/s4u/Host.hpp"
-
-#include "simgrid/kernel/resource/Action.hpp"
 #include "src/kernel/activity/SleepImpl.hpp"
+#include "simgrid/Exception.hpp"
+#include "simgrid/kernel/resource/Action.hpp"
+#include "simgrid/s4u/Host.hpp"
 #include "src/kernel/context/Context.hpp"
 
+#include "simgrid/Exception.hpp"
 #include "src/simix/ActorImpl.hpp"
 #include "src/simix/popping_private.hpp"
 #include "src/simix/smx_private.hpp"
 #include "src/surf/surf_interface.hpp"
-#include "xbt/ex.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
 
@@ -37,7 +37,8 @@ void simgrid::kernel::activity::SleepImpl::post()
       /* If the host running the synchro failed, notice it. This way, the asking
        * actor can be killed if it runs on that host itself */
       result = SIMIX_SRC_HOST_FAILURE;
-      SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
+      simcall->issuer->throw_exception(
+          std::make_exception_ptr(simgrid::HostFailureException(XBT_THROW_POINT, "Host failed")));
     }
 
     switch (surf_sleep->get_state()) {
index dfa1791..7104651 100644 (file)
@@ -8,6 +8,8 @@
 #include "src/kernel/context/Context.hpp"
 #include "src/simix/smx_private.hpp"
 
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
+
 /**
  * @brief creates a new context for a user level process
  * @param code a main function
@@ -58,9 +60,8 @@ Context* ContextFactory::create_maestro(std::function<void()> code, smx_actor_t
     "Try using --cfg=contexts/factory:thread instead.\n");
 }
 
-Context::Context(std::function<void()> code,
-    void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
-  : code_(std::move(code)), process_(process), iwannadie(false)
+Context::Context(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t actor)
+    : code_(std::move(code)), actor_(actor)
 {
   /* If the user provided a function for the process then use it.
      Otherwise, it is the context for maestro and we should set it as the
@@ -76,11 +77,11 @@ Context::~Context() = default;
 void Context::stop()
 {
   if (this->cleanup_func_)
-    this->cleanup_func_(this->process_);
-  this->process_->suspended_ = 0;
+    this->cleanup_func_(this->actor_);
+  this->actor_->suspended_ = 0;
 
   this->iwannadie = false;
-  simgrid::simix::simcall([this] { SIMIX_process_cleanup(this->process_); });
+  simgrid::simix::simcall([this] { SIMIX_process_cleanup(this->actor_); });
   this->iwannadie = true;
 }
 
index 674f02d..50f140c 100644 (file)
@@ -52,17 +52,23 @@ class XBT_PUBLIC Context {
 private:
   std::function<void()> code_;
   void_pfn_smxprocess_t cleanup_func_ = nullptr;
-  smx_actor_t process_                = nullptr;
+  smx_actor_t actor_                  = nullptr;
 
 public:
   class StopRequest {
     /** @brief Exception launched to kill a process, in order to properly unwind its stack and release RAII stuff
      *
-     * Nope, Sonar, this should not inherit of std::exception.
+     * Nope, Sonar, this should not inherit of std::exception nor of simgrid::Exception.
      * Otherwise, users may accidentally catch it with a try {} catch (std::exception)
      */
+  public:
+    StopRequest() = default;
+    explicit StopRequest(std::string msg) : msg_(msg) {}
+
+  private:
+    std::string msg_;
   };
-  bool iwannadie;
+  bool iwannadie = false;
 
   Context(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
   Context(const Context&) = delete;
@@ -70,7 +76,7 @@ public:
 
   void operator()() { code_(); }
   bool has_code() const { return static_cast<bool>(code_); }
-  smx_actor_t process() { return this->process_; }
+  smx_actor_t process() { return this->actor_; }
   void set_cleanup(void_pfn_smxprocess_t cleanup) { cleanup_func_ = cleanup; }
 
   // Virtual methods
@@ -81,8 +87,8 @@ public:
 
 class XBT_PUBLIC AttachContext : public Context {
 public:
-  AttachContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
-      : Context(std::move(code), cleanup_func, process)
+  AttachContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t actor)
+      : Context(std::move(code), cleanup_func, actor)
   {
   }
 
index a0fb566..256f677 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "ContextBoost.hpp"
 #include "context_private.hpp"
+#include "simgrid/Exception.hpp"
 #include "src/simix/smx_private.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
@@ -113,10 +114,13 @@ void BoostContext::wrapper(BoostContext::arg_type arg)
 #endif
   try {
     (*context)();
-    context->Context::stop();
   } catch (StopRequest const&) {
     XBT_DEBUG("Caught a StopRequest");
+  } catch (simgrid::Exception const& e) {
+    XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get());
+    throw;
   }
+  context->Context::stop();
   ASAN_ONLY(context->asan_stop_ = true);
   context->suspend();
 }
index f76faf6..423f13d 100644 (file)
@@ -6,6 +6,7 @@
 #include "ContextRaw.hpp"
 #include "context_private.hpp"
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "src/simix/smx_private.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
@@ -261,10 +262,14 @@ void RawContext::wrapper(void* arg)
   ASAN_FINISH_SWITCH(nullptr, &context->asan_ctx_->asan_stack_, &context->asan_ctx_->asan_stack_size_);
   try {
     (*context)();
-    context->Context::stop();
   } catch (StopRequest const&) {
     XBT_DEBUG("Caught a StopRequest");
+  } catch (simgrid::Exception const& e) {
+    XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get());
+    throw;
   }
+  context->Context::stop();
+
   ASAN_ONLY(context->asan_stop_ = true);
   context->suspend();
 }
index d18e04c..008f641 100644 (file)
@@ -3,16 +3,17 @@
 /* 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 <utility>
-#include <functional>
+#include "src/kernel/context/ContextThread.hpp"
 
+#include "simgrid/Exception.hpp"
 #include "src/internal_config.h" /* loads context system definitions */
 #include "src/simix/smx_private.hpp"
 #include "src/xbt_modinter.h" /* prototype of os thread module's init/exit in XBT */
 #include "xbt/function_types.h"
 #include "xbt/xbt_os_thread.h"
 
-#include "src/kernel/context/ContextThread.hpp"
+#include <functional>
+#include <utility>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
@@ -57,9 +58,8 @@ void ThreadContextFactory::run_all()
 
 // ThreadContext
 
-ThreadContext::ThreadContext(std::function<void()> code, void_pfn_smxprocess_t cleanup, smx_actor_t process,
-                             bool maestro)
-    : AttachContext(std::move(code), cleanup, process), is_maestro_(maestro)
+ThreadContext::ThreadContext(std::function<void()> code, void_pfn_smxprocess_t cleanup, smx_actor_t actor, bool maestro)
+    : AttachContext(std::move(code), cleanup, actor), is_maestro_(maestro)
 {
   // We do not need the semaphores when maestro is in main,
   // but creating them anyway simplifies things when maestro is externalized
@@ -115,12 +115,15 @@ void *ThreadContext::wrapper(void *param)
 
   try {
     (*context)();
-    if (not context->is_maestro()) // really?
-      context->Context::stop();
   } catch (StopRequest const&) {
     XBT_DEBUG("Caught a StopRequest");
-    xbt_assert(not context->is_maestro(), "I'm not supposed to be maestro here.");
+    xbt_assert(not context->is_maestro(), "Maestro shall not receive StopRequests, even when detached.");
+  } catch (simgrid::Exception const& e) {
+    XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get());
+    throw;
   }
+  if (not context->is_maestro()) // Just in case somebody detached maestro
+    context->Context::stop();
 
   // Signal to the caller (normally the maestro) that we have finished:
   context->yield();
index 819e07c..cd83102 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2009-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2009-2018. 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. */
@@ -9,14 +8,15 @@
 #ifndef SIMGRID_SIMIX_THREAD_CONTEXT_HPP
 #define SIMGRID_SIMIX_THREAD_CONTEXT_HPP
 
-#include <simgrid/simix.hpp>
-
+#include "simgrid/simix.hpp"
+#include "src/kernel/context/Context.hpp"
+#include "xbt/xbt_os_thread.h"
 
 namespace simgrid {
 namespace kernel {
 namespace context {
 
-class ThreadContext : public AttachContext {
+class XBT_PUBLIC ThreadContext : public AttachContext {
 public:
   ThreadContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process, bool maestro);
   ~ThreadContext() override;
@@ -40,13 +40,13 @@ private:
 
   void start();                // match a call to release()
   void yield();                // match a call to yield()
-  virtual void start_hook() { /* empty placeholder, called after start() */}
-  virtual void yield_hook() { /* empty placeholder, called before yield() */}
+  virtual void start_hook() { /* empty placeholder, called after start(). Used in parallel mode and Java */}
+  virtual void yield_hook() { /* empty placeholder, called before yield(). Used in parallel mode */}
 
   static void* wrapper(void *param);
 };
 
-class SerialThreadContext : public ThreadContext {
+class XBT_PUBLIC SerialThreadContext : public ThreadContext {
 public:
   SerialThreadContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process, bool maestro)
       : ThreadContext(std::move(code), cleanup_func, process, maestro)
index 3e98fc7..4bd1ddc 100644 (file)
@@ -5,13 +5,15 @@
 
 /* \file UContext.cpp Context switching with ucontexts from System V        */
 
-#include "ContextUnix.hpp"
 #include "context_private.hpp"
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "src/mc/mc_ignore.hpp"
 #include "src/simix/ActorImpl.hpp"
 
+#include "ContextUnix.hpp"
+
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
 /** Many integers are needed to store a pointer
@@ -121,10 +123,13 @@ void UContext::smx_ctx_sysv_wrapper(int i1, int i2)
   ASAN_FINISH_SWITCH(nullptr, &context->asan_ctx_->asan_stack_, &context->asan_ctx_->asan_stack_size_);
   try {
     (*context)();
-    context->Context::stop();
   } catch (simgrid::kernel::context::Context::StopRequest const&) {
     XBT_DEBUG("Caught a StopRequest");
+  } catch (simgrid::Exception const& e) {
+    XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get());
+    throw;
   }
+  context->Context::stop();
   ASAN_ONLY(context->asan_stop_ = true);
   context->suspend();
 }
index e455118..39e3f33 100644 (file)
@@ -49,9 +49,7 @@ void TRACE_msg_task_execute_start(msg_task_t task)
   XBT_DEBUG("EXEC,in %p, %lld, %s", task, task->counter, task->category);
 
   if (TRACE_actor_is_enabled())
-    simgrid::instr::Container::by_name(instr_pid(MSG_process_self()))
-        ->get_state("ACTOR_STATE")
-        ->push_event("task_execute");
+    simgrid::instr::Container::by_name(instr_pid(MSG_process_self()))->get_state("ACTOR_STATE")->push_event("execute");
 }
 
 void TRACE_msg_task_execute_end(msg_task_t task)
index 84d1c06..3c8121b 100644 (file)
@@ -3,7 +3,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 <xbt/ex.hpp>
+#include "simgrid/Exception.hpp"
 
 #include "simgrid/s4u/Mailbox.hpp"
 #include "src/instr/instr_private.hpp"
@@ -78,21 +78,15 @@ msg_error_t MSG_parallel_task_execute_with_timeout(msg_task_t task, double timeo
     simdata->setNotUsed();
 
     XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state);
-  }
-  catch (xbt_ex& e) {
-    switch (e.category) {
-    case cancel_error:
+  } catch (simgrid::HostFailureException& e) {
+    status = MSG_HOST_FAILURE;
+  } catch (simgrid::TimeoutError& e) {
+    status = MSG_TIMEOUT;
+  } catch (xbt_ex& e) {
+    if (e.category == cancel_error)
       status = MSG_TASK_CANCELED;
-      break;
-    case host_error:
-      status = MSG_HOST_FAILURE;
-      break;
-    case timeout_error:
-      status = MSG_TIMEOUT;
-      break;
-    default:
+    else
       throw;
-    }
   }
 
   /* action ended, set comm and compute = nullptr, the actions is already destroyed in the main function */
@@ -117,8 +111,9 @@ msg_error_t MSG_process_sleep(double nb_sec)
 
   try {
     simgrid::s4u::this_actor::sleep_for(nb_sec);
-  }
-  catch(xbt_ex& e) {
+  } catch (simgrid::HostFailureException& e) {
+    status = MSG_HOST_FAILURE;
+  } catch (xbt_ex& e) {
     if (e.category == cancel_error) {
       XBT_DEBUG("According to the JAVA API, a sleep call should only deal with HostFailureException, I'm lost.");
       // adsein: MSG_TASK_CANCELED is assigned when someone kills the process that made the sleep, this is not
@@ -280,19 +275,18 @@ msg_error_t MSG_task_receive_ext_bounded(msg_task_t * task, const char *alias, d
                       timeout, rate);
     XBT_DEBUG("Got task %s from %s", (*task)->name, mailbox->get_cname());
     (*task)->simdata->setNotUsed();
-  }
-  catch (xbt_ex& e) {
+  } catch (simgrid::HostFailureException& e) {
+    ret = MSG_HOST_FAILURE;
+  } catch (simgrid::TimeoutError& e) {
+    ret = MSG_TIMEOUT;
+  } catch (xbt_ex& e) {
     switch (e.category) {
-    case host_error:
     case cancel_error:
       ret = MSG_HOST_FAILURE;
       break;
     case network_error:
       ret = MSG_TRANSFER_FAILURE;
       break;
-    case timeout_error:
-      ret = MSG_TIMEOUT;
-      break;
     default:
       throw;
     }
@@ -484,19 +478,16 @@ int MSG_comm_test(msg_comm_t comm)
       /* I am the receiver */
       (*comm->task_received)->simdata->setNotUsed();
     }
+  } catch (simgrid::TimeoutError& e) {
+    comm->status = MSG_TIMEOUT;
+    finished     = true;
   }
   catch (xbt_ex& e) {
-    switch (e.category) {
-      case network_error:
-        comm->status = MSG_TRANSFER_FAILURE;
-        finished     = true;
-        break;
-      case timeout_error:
-        comm->status = MSG_TIMEOUT;
-        finished     = true;
-        break;
-      default:
-        throw;
+    if (e.category == network_error) {
+      comm->status = MSG_TRANSFER_FAILURE;
+      finished     = true;
+    } else {
+      throw;
     }
   }
 
@@ -526,6 +517,9 @@ int MSG_comm_testany(xbt_dynar_t comms)
   msg_error_t status = MSG_OK;
   try {
     finished_index = simcall_comm_testany(s_comms.data(), s_comms.size());
+  } catch (simgrid::TimeoutError& e) {
+    finished_index = e.value;
+    status         = MSG_TIMEOUT;
   }
   catch (xbt_ex& e) {
     switch (e.category) {
@@ -533,10 +527,6 @@ int MSG_comm_testany(xbt_dynar_t comms)
         finished_index = e.value;
         status = MSG_TRANSFER_FAILURE;
         break;
-      case timeout_error:
-        finished_index = e.value;
-        status = MSG_TIMEOUT;
-        break;
       default:
         throw;
     }
@@ -585,18 +575,14 @@ msg_error_t MSG_comm_wait(msg_comm_t comm, double timeout)
     }
 
     /* FIXME: these functions are not traceable */
+  } catch (simgrid::TimeoutError& e) {
+    comm->status = MSG_TIMEOUT;
   }
   catch (xbt_ex& e) {
-    switch (e.category) {
-    case network_error:
+    if (e.category == network_error)
       comm->status = MSG_TRANSFER_FAILURE;
-      break;
-    case timeout_error:
-      comm->status = MSG_TIMEOUT;
-      break;
-    default:
+    else
       throw;
-    }
   }
 
   return comm->status;
@@ -639,19 +625,16 @@ int MSG_comm_waitany(xbt_dynar_t comms)
   msg_error_t status = MSG_OK;
   try {
     finished_index = simcall_comm_waitany(s_comms, -1);
+  } catch (simgrid::TimeoutError& e) {
+    finished_index = e.value;
+    status         = MSG_TIMEOUT;
   }
   catch(xbt_ex& e) {
-    switch (e.category) {
-      case network_error:
-        finished_index = e.value;
-        status = MSG_TRANSFER_FAILURE;
-        break;
-      case timeout_error:
-        finished_index = e.value;
-        status = MSG_TIMEOUT;
-        break;
-      default:
-        throw;
+    if (e.category == network_error) {
+      finished_index = e.value;
+      status         = MSG_TRANSFER_FAILURE;
+    } else {
+      throw;
     }
   }
 
@@ -798,6 +781,8 @@ msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char *alias, doubl
       simcall_set_category(comm, task->category);
     t_simdata->comm = boost::static_pointer_cast<simgrid::kernel::activity::CommImpl>(comm);
     simcall_comm_wait(comm, timeout);
+  } catch (simgrid::TimeoutError& e) {
+    ret = MSG_TIMEOUT;
   }
   catch (xbt_ex& e) {
     switch (e.category) {
@@ -807,9 +792,6 @@ msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char *alias, doubl
     case network_error:
       ret = MSG_TRANSFER_FAILURE;
       break;
-    case timeout_error:
-      ret = MSG_TIMEOUT;
-      break;
     default:
       throw;
     }
index 16311de..590bd24 100644 (file)
@@ -32,9 +32,6 @@ std::string instr_pid(msg_process_t proc)
  */
 void MSG_process_cleanup_from_SIMIX(smx_actor_t smx_actor)
 {
-  if (TRACE_actor_is_enabled())
-    simgrid::instr::Container::by_name(instr_pid(smx_actor->ciface()))->remove_from_parent();
-
   // free the data if a function was provided
   void* userdata = smx_actor->get_user_data();
   if (userdata && msg_global->process_data_cleanup) {
index 99290b1..c24469b 100644 (file)
@@ -3,9 +3,8 @@
 /* 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/ex.hpp"
-
 #include "msg_private.hpp"
+#include "simgrid/Exception.hpp"
 #include "src/simix/smx_private.hpp"
 #include "src/simix/smx_synchro_private.hpp"
 #include "xbt/synchro.h"
index 2cdd524..74a45e8 100644 (file)
@@ -4,10 +4,10 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "src/plugins/vm/VmLiveMigration.hpp"
+#include "simgrid/Exception.hpp"
 #include "src/instr/instr_private.hpp"
 #include "src/plugins/vm/VirtualMachineImpl.hpp"
 #include "src/plugins/vm/VmHostExt.hpp"
-#include "xbt/ex.hpp"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(vm_live_migration, "S4U virtual machines live migration");
 
@@ -104,9 +104,9 @@ sg_size_t MigrationTx::sendMigrationData(sg_size_t size, int stage, int stage2_r
   s4u::Activity* comm = nullptr;
   try {
     if (mig_speed > 0)
-      comm = mbox->put_init(msg, size)->set_rate(mig_speed)->wait(timeout);
+      comm = mbox->put_init(msg, size)->set_rate(mig_speed)->wait_for(timeout);
     else
-      comm = mbox->put_async(msg, size)->wait();
+      comm = mbox->put_async(msg, size)->wait_for(timeout);
   } catch (xbt_ex& e) {
     if (comm) {
       sg_size_t remaining = static_cast<sg_size_t>(comm->get_remaining());
index 9ef1d5f..da7b040 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2006-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2006-2018. 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. */
@@ -8,6 +7,7 @@
 #include "xbt/log.h"
 
 #include "simgrid/s4u/Activity.hpp"
+#include "simgrid/s4u/Engine.hpp"
 
 XBT_LOG_EXTERNAL_CATEGORY(s4u);
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
@@ -15,6 +15,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
 namespace simgrid {
 namespace s4u {
 
+void Activity::wait_until(double time_limit)
+{
+  double now = Engine::get_clock();
+  if (time_limit > now)
+    wait_for(time_limit - now);
+}
+
 double Activity::get_remaining()
 {
   return remains_;
index b933c63..945dfb4 100644 (file)
@@ -76,14 +76,12 @@ void Actor::join(double timeout)
 void Actor::set_auto_restart(bool autorestart)
 {
   simgrid::simix::simcall([this, autorestart]() {
+    xbt_assert(autorestart && not pimpl_->auto_restart_); // FIXME: handle all cases
     pimpl_->set_auto_restart(autorestart);
 
-    std::map<std::string, kernel::actor::ProcessArg*> actors_map = pimpl_->host_->pimpl_->actors_at_boot_;
-    if (actors_map.find(pimpl_->name_) == actors_map.end()) {
-      simgrid::kernel::actor::ProcessArg* arg = new simgrid::kernel::actor::ProcessArg(pimpl_->host_, pimpl_);
-      XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
-      actors_map.insert({arg->name, arg});
-    }
+    simgrid::kernel::actor::ProcessArg* arg = new simgrid::kernel::actor::ProcessArg(pimpl_->host_, pimpl_);
+    XBT_DEBUG("Adding Process %s to the actors_at_boot_ list of Host %s", arg->name.c_str(), arg->host->get_cname());
+    pimpl_->host_->pimpl_->actors_at_boot_.emplace_back(arg);
   });
 }
 
index a8ce588..d19fb26 100644 (file)
@@ -6,12 +6,11 @@
 #include <exception>
 #include <mutex>
 
-#include <xbt/ex.hpp>
-#include <xbt/log.hpp>
-
+#include "simgrid/Exception.hpp"
 #include "simgrid/barrier.h"
 #include "simgrid/s4u/Barrier.hpp"
 #include "simgrid/simix.h"
+#include "xbt/log.hpp"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_barrier, "S4U barrier");
 
index 0b57262..1474137 100644 (file)
@@ -13,6 +13,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm, s4u_activity, "S4U asynchronous commun
 
 namespace simgrid {
 namespace s4u {
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Comm::on_sender_start;
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Comm::on_receiver_start;
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Comm::on_completion;
+
 Comm::~Comm()
 {
   if (state_ == State::STARTED && not detached_ && (pimpl_ == nullptr || pimpl_->state_ == SIMIX_RUNNING)) {
@@ -49,9 +53,8 @@ void Comm::wait_all(std::vector<CommPtr>* comms)
 {
   // TODO: this should be a simcall or something
   // TODO: we are missing a version with timeout
-  for (CommPtr comm : *comms) {
+  for (CommPtr comm : *comms)
     comm->wait();
-  }
 }
 
 Activity* Comm::set_rate(double rate)
@@ -110,10 +113,12 @@ Activity* Comm::start()
   xbt_assert(state_ == State::INITED);
 
   if (src_buff_ != nullptr) { // Sender side
+    on_sender_start(Actor::self());
     pimpl_ = simcall_comm_isend(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_,
                                 clean_fun_, copy_data_function_, user_data_, detached_);
   } else if (dst_buff_ != nullptr) { // Receiver side
     xbt_assert(not detached_, "Receive cannot be detached");
+    on_receiver_start(Actor::self());
     pimpl_ = simcall_comm_irecv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_,
                                 copy_data_function_, user_data_, rate_);
 
@@ -127,7 +132,7 @@ Activity* Comm::start()
 /** @brief Block the calling actor until the communication is finished */
 Activity* Comm::wait()
 {
-  return this->wait(-1);
+  return this->wait_for(-1);
 }
 
 /** @brief Block the calling actor until the communication is finished, or until timeout
@@ -136,7 +141,7 @@ Activity* Comm::wait()
  *
  * @param timeout the amount of seconds to wait for the comm termination.
  *                Negative values denote infinite wait times. 0 as a timeout returns immediately. */
-Activity* Comm::wait(double timeout)
+Activity* Comm::wait_for(double timeout)
 {
   switch (state_) {
     case State::FINISHED:
@@ -144,9 +149,12 @@ Activity* Comm::wait(double timeout)
 
     case State::INITED: // It's not started yet. Do it in one simcall
       if (src_buff_ != nullptr) {
+        on_sender_start(Actor::self());
         simcall_comm_send(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_,
                           copy_data_function_, user_data_, timeout);
+
       } else { // Receiver
+        on_receiver_start(Actor::self());
         simcall_comm_recv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_,
                           user_data_, timeout, rate_);
       }
@@ -155,6 +163,7 @@ Activity* Comm::wait(double timeout)
 
     case State::STARTED:
       simcall_comm_wait(pimpl_, timeout);
+      on_completion(Actor::self());
       state_ = State::FINISHED;
       return this;
 
index 2a08728..4d053ae 100644 (file)
@@ -3,15 +3,13 @@
 /* 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 <exception>
-#include <mutex>
-
-#include <xbt/ex.hpp>
-#include <xbt/log.hpp>
-
 #include "simgrid/s4u/ConditionVariable.hpp"
 #include "simgrid/simix.h"
 #include "src/kernel/activity/ConditionVariableImpl.hpp"
+#include "xbt/log.hpp"
+
+#include <exception>
+#include <mutex>
 
 namespace simgrid {
 namespace s4u {
index fda9b5b..8250f94 100644 (file)
@@ -12,11 +12,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous execut
 
 namespace simgrid {
 namespace s4u {
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_start;
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Exec::on_completion;
 
 Activity* Exec::start()
 {
   pimpl_ = simcall_execution_start(name_, tracing_category_, flops_amount_, 1. / priority_, bound_, host_);
   state_ = State::STARTED;
+  on_start(Actor::self());
   return this;
 }
 
@@ -29,12 +32,15 @@ Activity* Exec::cancel()
 
 Activity* Exec::wait()
 {
+  if (state_ == State::INITED)
+    start();
   simcall_execution_wait(pimpl_);
   state_ = State::FINISHED;
+  on_completion(Actor::self());
   return this;
 }
 
-Activity* Exec::wait(double timeout)
+Activity* Exec::wait_for(double timeout)
 {
   THROW_UNIMPLEMENTED;
   return this;
index e78c4eb..27d5e96 100644 (file)
@@ -284,6 +284,11 @@ std::unordered_map<std::string, Storage*> const& Host::get_mounted_storages()
   return *mounts_;
 }
 
+ExecPtr Host::exec_async(double flops)
+{
+  return this_actor::exec_init(flops)->set_host(this);
+}
+
 void Host::execute(double flops)
 {
   execute(flops, 1.0 /* priority */);
index e77c117..25cb012 100644 (file)
@@ -38,12 +38,27 @@ Activity* Io::wait()
   return this;
 }
 
-Activity* Io::wait(double timeout)
+Activity* Io::wait_for(double timeout)
 {
   THROW_UNIMPLEMENTED;
   return this;
 }
 
+bool Io::test()
+{
+  xbt_assert(state_ == State::INITED || state_ == State::STARTED || state_ == State::FINISHED);
+
+  if (state_ == State::FINISHED)
+    return true;
+
+  if (state_ == State::INITED)
+    this->start();
+
+  THROW_UNIMPLEMENTED;
+
+  return false;
+}
+
 /** @brief Returns the amount of flops that remain to be done */
 double Io::get_remaining()
 {
index 8156900..bcf0309 100644 (file)
@@ -114,7 +114,7 @@ void Mailbox::put(void* payload, uint64_t simulated_size_in_bytes, double timeou
   c->set_remaining(simulated_size_in_bytes);
   c->set_src_data(payload);
   // c->start() is optional.
-  c->wait(timeout);
+  c->wait_for(timeout);
 }
 
 s4u::CommPtr Mailbox::get_init()
@@ -145,7 +145,7 @@ void* Mailbox::get(double timeout)
   void* res = nullptr;
   CommPtr c = get_init();
   c->set_dst_data(&res, sizeof(res));
-  c->wait(timeout);
+  c->wait_for(timeout);
   return res;
 }
 } // namespace s4u
index 8c60d57..5842df4 100644 (file)
@@ -4,6 +4,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "smx_private.hpp"
 #include "src/kernel/activity/CommImpl.hpp"
 #include "src/kernel/activity/ExecImpl.hpp"
@@ -17,7 +18,6 @@
 #include "src/simix/smx_synchro_private.hpp"
 #include "src/surf/HostImpl.hpp"
 #include "src/surf/cpu_interface.hpp"
-#include "xbt/ex.hpp"
 
 #ifdef HAVE_SMPI
 #include "src/smpi/include/private.hpp"
@@ -101,7 +101,8 @@ void SIMIX_process_cleanup(smx_actor_t process)
     comm->cancel();
   }
 
-  XBT_DEBUG("%p should not be run anymore",process);
+  XBT_DEBUG("%s@%s(%ld) should not run anymore", process->get_cname(), process->iface()->get_host()->get_cname(),
+            process->pid_);
   simix_global->process_list.erase(process->pid_);
   if (process->host_ && process->host_process_list_hook.is_linked())
     simgrid::xbt::intrusive_erase(process->host_->pimpl_->process_list_, *process);
@@ -229,7 +230,8 @@ void ActorImpl::resume()
 smx_activity_t ActorImpl::sleep(double duration)
 {
   if (host_->is_off())
-    THROWF(host_error, 0, "Host %s failed, you cannot sleep there.", host_->get_cname());
+    throw_exception(std::make_exception_ptr(simgrid::HostFailureException(
+        XBT_THROW_POINT, std::string("Host ") + std::string(host_->get_cname()) + " failed, you cannot sleep there.")));
 
   simgrid::kernel::activity::SleepImpl* synchro = new simgrid::kernel::activity::SleepImpl();
   synchro->host                                 = host_;
@@ -240,6 +242,55 @@ smx_activity_t ActorImpl::sleep(double duration)
   return synchro;
 }
 
+void ActorImpl::throw_exception(std::exception_ptr e)
+{
+  exception = e;
+
+  if (suspended_)
+    resume();
+
+  /* cancel the blocking synchro if any */
+  if (waiting_synchro) {
+
+    simgrid::kernel::activity::ExecImplPtr exec =
+        boost::dynamic_pointer_cast<simgrid::kernel::activity::ExecImpl>(waiting_synchro);
+    if (exec != nullptr && exec->surf_action_)
+      exec->surf_action_->cancel();
+
+    simgrid::kernel::activity::CommImplPtr comm =
+        boost::dynamic_pointer_cast<simgrid::kernel::activity::CommImpl>(waiting_synchro);
+    if (comm != nullptr) {
+      comms.remove(comm);
+      comm->cancel();
+    }
+
+    simgrid::kernel::activity::SleepImplPtr sleep =
+        boost::dynamic_pointer_cast<simgrid::kernel::activity::SleepImpl>(waiting_synchro);
+    if (sleep != nullptr) {
+      SIMIX_process_sleep_destroy(waiting_synchro);
+      if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), this) ==
+              end(simix_global->process_to_run) &&
+          this != SIMIX_process_self()) {
+        XBT_DEBUG("Inserting %s in the to_run list", get_cname());
+        simix_global->process_to_run.push_back(this);
+      }
+    }
+
+    simgrid::kernel::activity::RawImplPtr raw =
+        boost::dynamic_pointer_cast<simgrid::kernel::activity::RawImpl>(waiting_synchro);
+    if (raw != nullptr) {
+      SIMIX_synchro_stop_waiting(this, &simcall);
+    }
+
+    simgrid::kernel::activity::IoImplPtr io =
+        boost::dynamic_pointer_cast<simgrid::kernel::activity::IoImpl>(waiting_synchro);
+    if (io != nullptr) {
+      delete io.get();
+    }
+  }
+  waiting_synchro = nullptr;
+}
+
 void create_maestro(simgrid::simix::ActorCode code)
 {
   smx_actor_t maestro = nullptr;
@@ -448,11 +499,35 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) {
   process->suspended_          = false;
   process->exception = nullptr;
 
+  // Forcefully kill the actor if its host is turned off. Not an HostFailureException because you should not survive that
+  if (process->host_->is_off()) {
+    /* HORRIBLE HACK: Don't throw an StopRequest exception in Java, because it breaks sometimes.
+     *
+     * It seems to break for the actors started from the Java world, with new Process()
+     * while it works for the ones started from the C world, with the deployment file.
+     * When it happens, the simulation stops brutally with a message "untrapped exception StopRequest".
+     *
+     * From what I understand, it works for the native actors because they have a nice try/catch block around their main
+     * but I fail to have something like that for pure Java actors. That's probably a story of C->Java vs Java->C
+     * calling conventions. The right solution may be to have try/catch(StopRequest) blocks around each native call in
+     * JNI. ie, protect every Java->C++ call from C++ exceptions. But this sounds long and painful to do before we
+     * switch to an automatic generator such as SWIG. For now, we don't throw here that exception that we sometimes fail
+     * to catch.
+     *
+     * One of the unfortunate outcome is that the threads started from the deployment file are not stopped anymore.
+     * Or maybe this is the actors stopping gracefully as opposed to the killed ones? Or maybe this is absolutely all
+     * actors of the Java simulation? I'm not sure. Anyway. Because of them, the simulation hangs at the end, waiting
+     * for them to stop but they won't. The current answer to that is very brutal:
+     * we do a "exit(0)" to kill the JVM from the C code after the call to MSG_run(). Definitely unpleasant.
+     */
+
+    if (simgrid::kernel::context::factory_initializer == nullptr) // Only Java sets a factory_initializer, for now
+      process->throw_exception(std::make_exception_ptr(simgrid::kernel::context::Context::StopRequest("Host failed")));
+  }
+
   /* destroy the blocking synchro if any */
   if (process->waiting_synchro != nullptr) {
-    if (process->host_->is_off()) {
-      SMX_EXCEPTION(process, host_error, 0, "Host failed");
-    }
+
     simgrid::kernel::activity::ExecImplPtr exec =
         boost::dynamic_pointer_cast<simgrid::kernel::activity::ExecImpl>(process->waiting_synchro);
     simgrid::kernel::activity::CommImplPtr comm =
@@ -487,7 +562,9 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) {
     } else if (io != nullptr) {
       delete io.get();
     } else {
-      xbt_die("Unknown type of activity");
+      simgrid::kernel::activity::ActivityImplPtr activity = process->waiting_synchro;
+      xbt_die("Activity %s is of unknown type %s", activity->name_.c_str(),
+              simgrid::xbt::demangle(typeid(activity).name()).get());
     }
 
     process->waiting_synchro = nullptr;
@@ -500,13 +577,8 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) {
   }
 }
 
-/** @brief Ask another process to raise the given exception
- *
- * @param process The process that should raise that exception
- * @param cat category of exception
- * @param value value associated to the exception
- * @param msg string information associated to the exception
- */
+/** @deprecated When this function gets removed, also remove the xbt_ex class, that is only there to help users to
+ * transition */
 void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const char *msg) {
   SMX_EXCEPTION(process, cat, value, msg);
 
@@ -710,6 +782,8 @@ void SIMIX_process_yield(smx_actor_t self)
 
     XBT_DEBUG("Process %s@%s is dead", self->get_cname(), self->host_->get_cname());
     self->context_->stop();
+    xbt_backtrace_display_current();
+    xbt_die("I should be dead by now.");
   }
 
   if (self->suspended_) {
index 5c1bfca..babf410 100644 (file)
@@ -101,6 +101,8 @@ public:
   smx_activity_t sleep(double duration);
   void set_user_data(void* data) { userdata_ = data; }
   void* get_user_data() { return userdata_; }
+  /** Ask the actor to throw an exception right away */
+  void throw_exception(std::exception_ptr e);
 };
 
 class ProcessArg {
@@ -112,6 +114,7 @@ public:
   double kill_time                                                         = 0.0;
   std::shared_ptr<std::unordered_map<std::string, std::string>> properties = nullptr;
   bool auto_restart                                                        = false;
+  bool daemon_                                                             = false;
   ProcessArg()                                                             = default;
 
   explicit ProcessArg(std::string name, std::function<void()> code, void* data, s4u::Host* host, double kill_time,
@@ -133,6 +136,7 @@ public:
       , host(host)
       , kill_time(SIMIX_timer_get_date(actor->kill_timer))
       , auto_restart(actor->auto_restart_)
+      , daemon_(actor->is_daemon())
   {
     properties.reset(actor->get_properties(), [](decltype(actor->get_properties())) {});
   }
index d340908..0dbe5b1 100644 (file)
@@ -31,7 +31,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
  * @brief Creates a synchro that executes some computation of an host.
  *
  * This function creates a SURF action and allocates the data necessary
- * to create the SIMIX synchro. It can raise a host_error exception if the host crashed.
+ * to create the SIMIX synchro. It can raise a HostFailureException exception if the host crashed.
  *
  * @param name Name of the execution synchro to create
  * @param category Tracing category
@@ -211,7 +211,7 @@ void simcall_process_set_kill_time(smx_actor_t process, double kill_time)
  * @brief Creates a new sleep SIMIX synchro.
  *
  * This function creates a SURF action and allocates the data necessary
- * to create the SIMIX synchro. It can raise a host_error exception if the
+ * to create the SIMIX synchro. It can raise a HostFailureException if the
  * host crashed. The default SIMIX name of the synchro is "sleep".
  *
  *   @param duration Time duration of the sleep.
index d07d747..6f32bb1 100644 (file)
@@ -101,7 +101,7 @@ void SIMIX_context_mod_init()
 #endif
 
   /* select the context factory to use to create the contexts */
-  if (simgrid::kernel::context::factory_initializer) { // Give Java a chance to hijack the factory mechanism
+  if (simgrid::kernel::context::factory_initializer != nullptr) { // Give Java a chance to hijack the factory mechanism
     simix_global->context_factory = simgrid::kernel::context::factory_initializer();
     return;
   }
index 79045d9..b549d91 100644 (file)
@@ -3,11 +3,11 @@
 /* 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 "simgrid/Exception.hpp"
 #include "simgrid/s4u/Host.hpp"
 #include "smx_private.hpp"
 #include "src/surf/xml/platf_private.hpp" // FIXME: KILLME. There must be a better way than mimicking XML here
 #include <simgrid/engine.h>
-#include <xbt/ex.hpp>
 
 #include <string>
 #include <vector>
@@ -69,7 +69,7 @@ static simgrid::simix::ActorCodeFactory toActorCodeFactory(xbt_main_func_t code)
 }
 static simgrid::simix::ActorCodeFactory toActorCodeFactory(void (*code)(std::vector<std::string>))
 {
-  return [code](std::vector<std::string> args) { return simgrid::xbt::wrap_main(code, std::move(args)); };
+  return [code](std::vector<std::string> args) { return std::bind(std::move(code), std::move(args)); };
 }
 
 /**
index dde40f2..70150a9 100644 (file)
@@ -7,8 +7,8 @@
 #include "src/include/surf/surf.hpp"
 #include "xbt/xbt_os_time.h"
 
+#include <simgrid/Exception.hpp>
 #include <simgrid/engine.h>
-#include <xbt/ex.hpp>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix, "Logging specific to SIMIX (environment)");
 
index eecd1d4..d61721f 100644 (file)
@@ -503,13 +503,6 @@ void SIMIX_run()
       SIMIX_wake_processes();
     } while (again);
 
-    /* Autorestart all process */
-    for (auto const& host : host_that_restart) {
-      XBT_INFO("Restart processes on host %s", host->get_cname());
-      host->turn_on();
-    }
-    host_that_restart.clear();
-
     /* Clean processes to destroy */
     SIMIX_process_empty_trash();
 
index dc7f150..745a67d 100644 (file)
@@ -4,13 +4,13 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "smx_private.hpp"
 #include "src/kernel/activity/CommImpl.hpp"
 #include "src/kernel/activity/ExecImpl.hpp"
 #include "src/mc/mc_replay.hpp"
 #include "src/plugins/vm/VirtualMachineImpl.hpp"
 #include "src/simix/smx_host_private.hpp"
-#include "xbt/ex.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_host, simix, "SIMIX hosts");
 
@@ -129,7 +129,8 @@ void SIMIX_execution_finish(smx_activity_t synchro)
       case SIMIX_FAILED:
         XBT_DEBUG("SIMIX_execution_finished: host '%s' failed", simcall->issuer->host_->get_cname());
         simcall->issuer->context_->iwannadie = 1;
-        SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
+        simcall->issuer->exception =
+            std::make_exception_ptr(simgrid::HostFailureException(XBT_THROW_POINT, "Host failed"));
         break;
 
       case SIMIX_CANCELED:
@@ -139,7 +140,7 @@ void SIMIX_execution_finish(smx_activity_t synchro)
 
       case SIMIX_TIMEOUT:
         XBT_DEBUG("SIMIX_execution_finished: execution timeouted");
-        SMX_EXCEPTION(simcall->issuer, timeout_error, 0, "Timeouted");
+        simcall->issuer->exception = std::make_exception_ptr(simgrid::TimeoutError(XBT_THROW_POINT, "Timeouted"));
         break;
 
       default:
index 98d4b23..c4e8562 100644 (file)
@@ -4,9 +4,9 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "simgrid/s4u/Host.hpp"
 #include "simgrid/s4u/Io.hpp"
-#include "xbt/ex.hpp"
 
 #include "smx_private.hpp"
 #include "src/kernel/activity/IoImpl.hpp"
index a295cae..464c6dd 100644 (file)
@@ -4,12 +4,12 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "mc/mc.h"
+#include "simgrid/Exception.hpp"
 #include "src/kernel/activity/MailboxImpl.hpp"
 #include "src/mc/mc_replay.hpp"
 #include "src/simix/smx_private.hpp"
 #include "src/surf/cpu_interface.hpp"
 #include "src/surf/network_interface.hpp"
-#include "xbt/ex.hpp"
 
 #include <boost/circular_buffer.hpp>
 #include <boost/range/algorithm.hpp>
@@ -521,7 +521,8 @@ void SIMIX_comm_finish(smx_activity_t synchro)
 
     if (simcall->issuer->host_->is_off()) {
       simcall->issuer->context_->iwannadie = 1;
-      SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
+      simcall->issuer->exception =
+          std::make_exception_ptr(simgrid::HostFailureException(XBT_THROW_POINT, "Host failed"));
     } else {
       switch (comm->state_) {
 
@@ -531,25 +532,29 @@ void SIMIX_comm_finish(smx_activity_t synchro)
           break;
 
         case SIMIX_SRC_TIMEOUT:
-          SMX_EXCEPTION(simcall->issuer, timeout_error, 0, "Communication timeouted because of sender");
+          simcall->issuer->exception = std::make_exception_ptr(
+              simgrid::TimeoutError(XBT_THROW_POINT, "Communication timeouted because of the sender"));
           break;
 
         case SIMIX_DST_TIMEOUT:
-          SMX_EXCEPTION(simcall->issuer, timeout_error, 0, "Communication timeouted because of receiver");
+          simcall->issuer->exception = std::make_exception_ptr(
+              simgrid::TimeoutError(XBT_THROW_POINT, "Communication timeouted because of the receiver"));
           break;
 
         case SIMIX_SRC_HOST_FAILURE:
           if (simcall->issuer == comm->src_proc)
             simcall->issuer->context_->iwannadie = 1;
           else
-            SMX_EXCEPTION(simcall->issuer, network_error, 0, "Remote peer failed");
+            simcall->issuer->exception =
+                std::make_exception_ptr(simgrid::NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
           break;
 
         case SIMIX_DST_HOST_FAILURE:
           if (simcall->issuer == comm->dst_proc)
             simcall->issuer->context_->iwannadie = 1;
           else
-            SMX_EXCEPTION(simcall->issuer, network_error, 0, "Remote peer failed");
+            simcall->issuer->exception =
+                std::make_exception_ptr(simgrid::NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
           break;
 
         case SIMIX_LINK_FAILURE:
@@ -565,7 +570,8 @@ void SIMIX_comm_finish(smx_activity_t synchro)
           } else {
             XBT_DEBUG("I'm neither source nor dest");
           }
-          SMX_EXCEPTION(simcall->issuer, network_error, 0, "Link failure");
+          simcall->issuer->throw_exception(
+              std::make_exception_ptr(simgrid::NetworkFailureException(XBT_THROW_POINT, "Link failure")));
           break;
 
         case SIMIX_CANCELED:
@@ -581,29 +587,39 @@ void SIMIX_comm_finish(smx_activity_t synchro)
     }
 
     /* if there is an exception during a waitany or a testany, indicate the position of the failed communication */
-    if (simcall->issuer->exception) {
+    if (simcall->issuer->exception &&
+        (simcall->call == SIMCALL_COMM_WAITANY || simcall->call == SIMCALL_COMM_TESTANY)) {
+      // First retrieve the rank of our failing synchro
+      int rank = -1;
+      if (simcall->call == SIMCALL_COMM_WAITANY) {
+        rank = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &synchro);
+      } else if (simcall->call == SIMCALL_COMM_TESTANY) {
+        rank         = -1;
+        auto* comms  = simcall_comm_testany__get__comms(simcall);
+        auto count   = simcall_comm_testany__get__count(simcall);
+        auto element = std::find(comms, comms + count, synchro);
+        if (element == comms + count)
+          rank = -1;
+        else
+          rank = element - comms;
+      }
+
       // In order to modify the exception we have to rethrow it:
       try {
         std::rethrow_exception(simcall->issuer->exception);
-      }
-      catch(xbt_ex& e) {
-        if (simcall->call == SIMCALL_COMM_WAITANY) {
-          e.value = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &synchro);
-        }
-        else if (simcall->call == SIMCALL_COMM_TESTANY) {
-          e.value = -1;
-          auto* comms  = simcall_comm_testany__get__comms(simcall);
-          auto count = simcall_comm_testany__get__count(simcall);
-          auto element = std::find(comms, comms + count, synchro);
-          if (element == comms + count)
-            e.value = -1;
-          else
-            e.value = element - comms;
-        }
+      } catch (simgrid::TimeoutError& e) {
+        e.value                    = rank;
         simcall->issuer->exception = std::make_exception_ptr(e);
-      }
-      catch(...) {
-        // Nothing to do
+      } catch (simgrid::NetworkFailureException& e) {
+        e.value                    = rank;
+        simcall->issuer->exception = std::make_exception_ptr(e);
+      } catch (xbt_ex& e) {
+        if (e.category == cancel_error) {
+          e.value                    = rank;
+          simcall->issuer->exception = std::make_exception_ptr(e);
+        } else {
+          xbt_die("Unexpected xbt_ex(%s). Please enhance this code", xbt_ex_catname(e.category));
+        }
       }
     }
 
diff --git a/src/smpi/colls/barrier/barrier-mpich-smp.cpp b/src/smpi/colls/barrier/barrier-mpich-smp.cpp
new file mode 100644 (file)
index 0000000..2820a06
--- /dev/null
@@ -0,0 +1,68 @@
+/* Copyright (c) 2013-2018. 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. */
+
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2001 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+
+#include "../coll_tuned_topo.hpp"
+#include "../colls_private.hpp"
+
+namespace simgrid{
+namespace smpi{
+int Coll_barrier_mpich_smp::barrier(MPI_Comm comm)
+{
+    int mpi_errno = MPI_SUCCESS;
+    int mpi_errno_ret = MPI_SUCCESS;
+    MPI_Comm shmem_comm = MPI_COMM_NULL, leader_comm = MPI_COMM_NULL;
+    int local_rank = -1;
+    
+    if(comm->get_leaders_comm()==MPI_COMM_NULL){
+      comm->init_smp();
+    }
+
+    shmem_comm = comm->get_intra_comm();
+    local_rank = shmem_comm->rank();
+    /* do the intranode barrier on all nodes */
+    if (shmem_comm != NULL) {
+        mpi_errno = Coll_barrier_mpich::barrier(shmem_comm);
+        if (mpi_errno) {
+          mpi_errno_ret+=mpi_errno;
+        }
+    }
+
+    leader_comm = comm->get_leaders_comm();
+    /* do the barrier across roots of all nodes */
+    if (leader_comm != NULL && local_rank == 0) {
+        mpi_errno = Coll_barrier_mpich::barrier(leader_comm);
+        if (mpi_errno) {
+          mpi_errno_ret+=mpi_errno;
+        }
+    }
+
+    /* release the local processes on each node with a 1-byte
+     * broadcast (0-byte broadcast just returns without doing
+     * anything) */
+    if (shmem_comm != NULL) {
+        int i = 0;
+        mpi_errno = Coll_bcast_mpich::bcast(&i, 1, MPI_BYTE, 0, shmem_comm);
+        if (mpi_errno) {
+          mpi_errno_ret+=mpi_errno;
+        }
+    }
+
+    if (mpi_errno_ret)
+        mpi_errno = mpi_errno_ret;
+    return mpi_errno;
+}
+
+}
+}
+
index 2d96a01..f13079a 100644 (file)
@@ -276,9 +276,9 @@ int Coll_reduce_default::reduce(void *sendbuf, void *recvbuf, int count, MPI_Dat
 int Coll_allreduce_default::allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
 {
   int ret;
-  ret = Colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
+  ret = Coll_reduce_default::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
   if(ret==MPI_SUCCESS)
-    ret = Colls::bcast(recvbuf, count, datatype, 0, comm);
+    ret = Coll_bcast_default::bcast(recvbuf, count, datatype, 0, comm);
   return ret;
 }
 
index 18ef3bd..2aab898 100644 (file)
@@ -68,6 +68,14 @@ int Coll_allreduce_mpich::allreduce(void *sbuf, void *rbuf, int count,
     dsize = dtype->size();
     block_dsize = dsize * count;
 
+    /*MPICH uses SMP algorithms for all commutative ops now*/
+    if(!comm->is_smp_comm()){
+      if(comm->get_leaders_comm()==MPI_COMM_NULL){
+        comm->init_smp();
+      }
+      if(op->is_commutative())
+        return Coll_allreduce_mvapich2_two_level::allreduce (sbuf, rbuf,count, dtype, op, comm);
+    }
 
     /* find nearest power-of-two less than or equal to comm_size */
     int pof2 = 1;
@@ -76,14 +84,10 @@ int Coll_allreduce_mpich::allreduce(void *sbuf, void *rbuf, int count,
 
     if (block_dsize > large_message && count >= pof2 && (op==MPI_OP_NULL || op->is_commutative())) {
       //for long messages
-       return (Coll_allreduce_rab_rdb::allreduce (sbuf, rbuf,
-                                                                   count, dtype,
-                                                                   op, comm));
+       return Coll_allreduce_rab_rdb::allreduce (sbuf, rbuf, count, dtype, op, comm);
     }else {
       //for short ones and count < pof2
-      return (Coll_allreduce_rdb::allreduce (sbuf, rbuf,
-                                                                   count, dtype,
-                                                                   op, comm));
+      return Coll_allreduce_rdb::allreduce (sbuf, rbuf, count, dtype, op, comm);
     }
 }
 
@@ -169,11 +173,11 @@ int Coll_alltoall_mpich::alltoall( void *sbuf, int scount,
                                                     comm);
 
     } else if (block_dsize < medium_size) {
-        return Coll_alltoall_basic_linear::alltoall(sbuf, scount, sdtype,
+        return Coll_alltoall_mvapich2_scatter_dest::alltoall(sbuf, scount, sdtype,
                                                            rbuf, rcount, rdtype,
                                                            comm);
     }else if (communicator_size%2){
-        return Coll_alltoall_ring::alltoall(sbuf, scount, sdtype,
+        return Coll_alltoall_pair::alltoall(sbuf, scount, sdtype,
                                                            rbuf, rcount, rdtype,
                                                            comm);
     }
@@ -259,6 +263,14 @@ int Coll_bcast_mpich::bcast(void *buff, int count,
     //int segsize = 0;
     size_t message_size, dsize;
 
+    if(!comm->is_smp_comm()){
+      if(comm->get_leaders_comm()==MPI_COMM_NULL){
+        comm->init_smp();
+      }
+      if(comm->is_uniform())
+        return Coll_bcast_SMP_binomial::bcast(buff, count, datatype, root, comm);
+    }
+
     communicator_size = comm->size();
 
     /* else we need data size for decision function */
@@ -348,8 +360,16 @@ int Coll_reduce_mpich::reduce( void *sendbuf, void *recvbuf,
                                             )
 {
     int communicator_size=0;
-    //int segsize = 0;
     size_t message_size, dsize;
+
+    if(!comm->is_smp_comm()){
+      if(comm->get_leaders_comm()==MPI_COMM_NULL){
+        comm->init_smp();
+      }
+      if (op->is_commutative() == 1)
+        return Coll_reduce_mvapich2_two_level::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
+    }
+
     communicator_size = comm->size();
 
     /* need data size for decision function */
@@ -363,8 +383,7 @@ int Coll_reduce_mpich::reduce( void *sendbuf, void *recvbuf,
     if ((count < pof2) || (message_size < 2048) || (op != MPI_OP_NULL && not op->is_commutative())) {
       return Coll_reduce_binomial::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
     }
-        return Coll_reduce_scatter_gather::reduce(sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
-                                                     segsize, max_requests*/);
+        return Coll_reduce_scatter_gather::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
 }
 
 
index 4a25997..23271f6 100644 (file)
@@ -96,7 +96,7 @@ int Coll_alltoallv_ompi::alltoallv(void *sbuf, int *scounts, int *sdisps,
                                               )
 {
     /* For starters, just keep the original algorithm. */
-    return Coll_alltoallv_ompi_basic_linear::alltoallv(sbuf, scounts, sdisps, sdtype,
+    return Coll_alltoallv_ring::alltoallv(sbuf, scounts, sdisps, sdtype,
                                                         rbuf, rcounts, rdisps,rdtype,
                                                         comm);
 }
@@ -491,10 +491,7 @@ int Coll_allgatherv_ompi::allgatherv(void *sbuf, int scount,
 
     /* Decision based on allgather decision.   */
     if (total_dsize < 50000) {
-/*        return Coll_allgatherv_intra_bruck::allgatherv(sbuf, scount, sdtype,
-                                                      rbuf, rcounts, rdispls, rdtype,
-                                                      comm, module);*/
-    return Coll_allgatherv_ring::allgatherv(sbuf, scount, sdtype,
+        return Coll_allgatherv_ompi_bruck::allgatherv(sbuf, scount, sdtype,
                                                       rbuf, rcounts, rdispls, rdtype,
                                                       comm);
 
index d650bf8..7c591b7 100644 (file)
@@ -10,7 +10,6 @@
 #include "smpi/smpi.h"
 #include "smpi/smpi_helpers_internal.h"
 #include "src/instr/instr_smpi.hpp"
-#include "src/internal_config.h"
 #include <unordered_map>
 #include <vector>
 
@@ -425,14 +424,13 @@ XBT_PRIVATE smpi_privatization_region_t smpi_init_global_memory_segment_process(
  */
 #define TOPAGE(addr) (void*)(((unsigned long)(addr) / xbt_pagesize) * xbt_pagesize)
 
-#if HAVE_PAPI
+/** Used only if PAPI is compiled in, but integrated anyway so that this file does not depend on internal_config.h (to speed builds) */
 typedef std::vector<std::pair</* counter name */ std::string, /* counter value */ long long>> papi_counter_t;
 struct papi_process_data {
   papi_counter_t counter_data;
   int event_set;
 };
 extern std::map</* computation unit name */ std::string, papi_process_data> units2papi_setup;
-#endif
 
 extern std::unordered_map<std::string, double> location2speedup;
 
index 7f468aa..d5fcef4 100644 (file)
@@ -398,6 +398,7 @@ 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_smp)   COLL_sep \
 COLL_APPLY(action, COLL_BARRIER_SIG, mpich)   COLL_sep \
 COLL_APPLY(action, COLL_BARRIER_SIG, mvapich2_pair)   COLL_sep \
 COLL_APPLY(action, COLL_BARRIER_SIG, mvapich2)   COLL_sep \
index 5cb1b7a..6e30cb6 100644 (file)
@@ -28,7 +28,7 @@ class Comm : public F2C, public Keyval{
     int is_uniform_;
     int* non_uniform_map_; //set if smp nodes have a different number of processes allocated
     int is_blocked_;// are ranks allocated on the same smp node contiguous ?
-
+    int is_smp_comm_;// set to 0 in case this is already an intra-comm or a leader-comm to avoid recursivity
     std::list<MPI_Win> rma_wins_; // attached windows for synchronization.
 
   public:
@@ -36,7 +36,7 @@ class Comm : public F2C, public Keyval{
     static int keyval_id_;
 
     Comm() = default;
-    Comm(MPI_Group group, MPI_Topology topo);
+    Comm(MPI_Group group, MPI_Topology topo, int smp=0);
     int dup(MPI_Comm* newcomm);
     MPI_Group group();
     MPI_Topology topo();
@@ -51,6 +51,7 @@ class Comm : public F2C, public Keyval{
     MPI_Comm get_intra_comm();
     int is_uniform();
     int is_blocked();
+    int is_smp_comm();
     MPI_Comm split(int color, int key);
     void cleanup_smp();
     void ref();
index 85191c7..9793546 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_bench, smpi, "Logging specific to SMPI (benchmarking)");
 
+static simgrid::config::Flag<double>
+    smpi_wtime_sleep("smpi/wtime",
+                     "Minimum time to inject inside a call to MPI_Wtime(), gettimeofday() and clock_gettime()",
+                     1e-8 /* Documented to be 10 ns */);
+
 double smpi_cpu_threshold = -1;
 double smpi_host_speed;
 
@@ -35,6 +40,7 @@ SharedMallocType smpi_cfg_shared_malloc = SharedMallocType::GLOBAL;
 double smpi_total_benched_time = 0;
 
 extern "C" XBT_PUBLIC void smpi_execute_flops_(double* flops);
+
 void smpi_execute_flops_(double *flops)
 {
   smpi_execute_flops(*flops);
@@ -177,7 +183,7 @@ void smpi_bench_end()
   smpi_total_benched_time += xbt_os_timer_elapsed(timer);
 }
 
-/* Private sleep function used by smpi_sleep() and smpi_usleep() */
+/* Private sleep function used by smpi_sleep(), smpi_usleep() and friends */
 static unsigned int private_sleep(double secs)
 {
   smpi_bench_end();
@@ -232,6 +238,8 @@ int smpi_gettimeofday(struct timeval* tv, struct timezone* tz)
     tv->tv_usec = static_cast<suseconds_t>((now - tv->tv_sec) * 1e6);
 #endif
   }
+  if (smpi_wtime_sleep > 0)
+    simcall_process_sleep(smpi_wtime_sleep);
   smpi_bench_begin();
   return 0;
 }
@@ -248,11 +256,28 @@ int smpi_clock_gettime(clockid_t clk_id, struct timespec* tp)
     tp->tv_sec = static_cast<time_t>(now);
     tp->tv_nsec = static_cast<long int>((now - tp->tv_sec) * 1e9);
   }
+  if (smpi_wtime_sleep > 0)
+    simcall_process_sleep(smpi_wtime_sleep);
   smpi_bench_begin();
   return 0;
 }
 #endif
 
+double smpi_mpi_wtime()
+{
+  double time;
+  if (smpi_process()->initialized() && not smpi_process()->finalized() && not smpi_process()->sampling()) {
+    smpi_bench_end();
+    time = SIMIX_get_clock();
+    if (smpi_wtime_sleep > 0)
+      simcall_process_sleep(smpi_wtime_sleep);
+    smpi_bench_begin();
+  } else {
+    time = SIMIX_get_clock();
+  }
+  return time;
+}
+
 extern double sg_surf_precision;
 unsigned long long smpi_rastro_resolution ()
 {
index e75aef9..aaef32d 100644 (file)
@@ -95,8 +95,6 @@ MPI_Errhandler *MPI_ERRHANDLER_NULL = nullptr;
 // No instance gets manually created; check also the smpirun.in script as
 // this default name is used there as well (when the <actor> tag is generated).
 static const std::string smpi_default_instance_name("smpirun");
-static simgrid::config::Flag<double> smpi_wtime_sleep(
-  "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0);
 static simgrid::config::Flag<double> smpi_init_sleep(
   "smpi/init", "Time to inject inside a call to MPI_Init", 0.0);
 
@@ -745,24 +743,3 @@ void smpi_mpi_init() {
   if(smpi_init_sleep > 0)
     simcall_process_sleep(smpi_init_sleep);
 }
-
-double smpi_mpi_wtime(){
-  double time;
-  if (smpi_process()->initialized() != 0 && smpi_process()->finalized() == 0 && smpi_process()->sampling() == 0) {
-    smpi_bench_end();
-    time = SIMIX_get_clock();
-    // to avoid deadlocks if used as a break condition, such as
-    //     while (MPI_Wtime(...) < time_limit) {
-    //       ....
-    //     }
-    // because the time will not normally advance when only calls to MPI_Wtime
-    // are made -> deadlock (MPI_Wtime never reaches the time limit)
-    if(smpi_wtime_sleep > 0)
-      simcall_process_sleep(smpi_wtime_sleep);
-    smpi_bench_begin();
-  } else {
-    time = SIMIX_get_clock();
-  }
-  return time;
-}
-
index d4ef053..57c61d2 100644 (file)
@@ -29,7 +29,7 @@ namespace smpi{
 std::unordered_map<int, smpi_key_elem> Comm::keyvals_;
 int Comm::keyval_id_=0;
 
-Comm::Comm(MPI_Group group, MPI_Topology topo) : group_(group), topo_(topo)
+Comm::Comm(MPI_Group group, MPI_Topology topo, int smp) : group_(group), topo_(topo),is_smp_comm_(smp)
 {
   refcount_        = 1;
   topoType_        = MPI_INVALID_TOPO;
@@ -169,6 +169,12 @@ int Comm::is_blocked(){
   return is_blocked_;
 }
 
+int Comm::is_smp_comm(){
+  if (this == MPI_COMM_UNINITIALIZED)
+    return smpi_process()->comm_world()->is_smp_comm();
+  return is_smp_comm_;
+}
+
 MPI_Comm Comm::split(int color, int key)
 {
   if (this == MPI_COMM_UNINITIALIZED)
@@ -321,7 +327,7 @@ void Comm::init_smp(){
     }
   }
 
-  MPI_Comm comm_intra = new  Comm(group_intra, nullptr);
+  MPI_Comm comm_intra = new  Comm(group_intra, nullptr, 1);
   leader=min_index;
 
   int* leaders_map = new int[comm_size];
@@ -329,7 +335,7 @@ void Comm::init_smp(){
   std::fill_n(leaders_map, comm_size, 0);
   std::fill_n(leader_list, comm_size, -1);
 
-  Coll_allgather_mpich::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
+  Coll_allgather_ring::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
 
   if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
@@ -363,7 +369,7 @@ void Comm::init_smp(){
     //create leader_communicator
     for (i=0; i< leader_group_size;i++)
       leaders_group->set_mapping(simgrid::s4u::Actor::by_pid(leader_list[i]), i);
-    leader_comm = new  Comm(leaders_group, nullptr);
+    leader_comm = new  Comm(leaders_group, nullptr,1);
     this->set_leaders_comm(leader_comm);
     this->set_intra_comm(comm_intra);
 
@@ -373,7 +379,7 @@ void Comm::init_smp(){
       leaders_group->set_mapping(simgrid::s4u::Actor::by_pid(leader_list[i]), i);
 
     if(this->get_leaders_comm()==MPI_COMM_NULL){
-      leader_comm = new  Comm(leaders_group, nullptr);
+      leader_comm = new  Comm(leaders_group, nullptr,1);
       this->set_leaders_comm(leader_comm);
     }else{
       leader_comm=this->get_leaders_comm();
@@ -387,7 +393,7 @@ void Comm::init_smp(){
   if(comm_intra->rank()==0) {
     int is_uniform       = 1;
     int* non_uniform_map = xbt_new0(int,leader_group_size);
-    Coll_allgather_mpich::allgather(&my_local_size, 1, MPI_INT,
+    Coll_allgather_ring::allgather(&my_local_size, 1, MPI_INT,
         non_uniform_map, 1, MPI_INT, leader_comm);
     for(i=0; i < leader_group_size; i++) {
       if(non_uniform_map[0] != non_uniform_map[i]) {
@@ -402,7 +408,7 @@ void Comm::init_smp(){
     }
     is_uniform_=is_uniform;
   }
-  Coll_bcast_mpich::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra );
+  Coll_bcast_scatter_LR_allgather::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra );
 
   if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
     // we need to switch as the called function may silently touch global variables
index 9ac105a..0b64447 100644 (file)
@@ -1,15 +1,13 @@
-/* Copyright (c) 2007-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2018. 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 "smpi_info.hpp"
-#include "xbt/ex.hpp"
-#include "xbt/sysdep.h"
+#include "simgrid/Exception.hpp"
 
-namespace simgrid{
-namespace smpi{
+namespace simgrid {
+namespace smpi {
 
 Info::Info(Info* info) : map_(info->map_)
 {
index 4a76651..ebd900a 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "mc/mc.h"
 #include "private.hpp"
+#include "simgrid/Exception.hpp"
 #include "simgrid/s4u/Exec.hpp"
 #include "smpi_comm.hpp"
 #include "smpi_datatype.hpp"
 #include "src/simix/ActorImpl.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 #include "xbt/config.hpp"
-#include <xbt/ex.hpp>
 
 #include <algorithm>
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_request, smpi, "Logging specific to SMPI (reques)");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_request, smpi, "Logging specific to SMPI (request)");
 
 static simgrid::config::Flag<double> smpi_iprobe_sleep(
   "smpi/iprobe", "Minimum time to inject inside a call to MPI_Iprobe", 1e-4);
index 8fa9326..f718d80 100644 (file)
@@ -115,7 +115,7 @@ HostImpl::~HostImpl()
     THROWF(arg_error, 0, "%s", msg.c_str());
   }
   for (auto const& arg : actors_at_boot_)
-    delete arg.second;
+    delete arg;
   actors_at_boot_.clear();
 }
 
@@ -125,8 +125,7 @@ HostImpl::~HostImpl()
  */
 void HostImpl::turn_on()
 {
-  for (auto const& elm : actors_at_boot_) {
-    kernel::actor::ProcessArg* arg = elm.second;
+  for (auto const& arg : actors_at_boot_) {
     XBT_DEBUG("Booting Actor %s(%s) right now", arg->name.c_str(), arg->host->get_cname());
     smx_actor_t actor = simix_global->create_process_function(arg->name.c_str(), arg->code, nullptr, arg->host,
                                                               arg->properties.get(), nullptr);
@@ -134,8 +133,11 @@ void HostImpl::turn_on()
       simcall_process_set_kill_time(actor, arg->kill_time);
     if (arg->auto_restart)
       actor->auto_restart_ = arg->auto_restart;
+    if (arg->daemon_)
+      actor->daemonize();
   }
 }
+
 /** Kill all actors hosted here */
 void HostImpl::turn_off()
 {
@@ -148,14 +150,13 @@ void HostImpl::turn_off()
   }
   // When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
   // Then get rid of the others.
-  auto elm = actors_at_boot_.begin();
-  while (elm != actors_at_boot_.end()) {
-    if (not elm->second->auto_restart) {
-      delete elm->second;
-      actors_at_boot_.erase(elm);
-    } else
-      ++elm;
-  }
+  auto elm = remove_if(begin(actors_at_boot_), end(actors_at_boot_), [](kernel::actor::ProcessArg* arg) {
+    if (arg->auto_restart)
+      return false;
+    delete arg;
+    return true;
+  });
+  actors_at_boot_.erase(elm, end(actors_at_boot_));
 }
 
 std::vector<s4u::ActorPtr> HostImpl::get_all_actors()
index cca54d6..95b583a 100644 (file)
@@ -66,7 +66,7 @@ public:
 
   // FIXME: make these private
   ActorList process_list_;
-  std::map<std::string, kernel::actor::ProcessArg*> actors_at_boot_;
+  std::vector<kernel::actor::ProcessArg*> actors_at_boot_;
 };
 }
 }
index b594980..344e8ca 100644 (file)
@@ -131,7 +131,7 @@ void CpuCas01::apply_event(tmgr_trace_event_t event, double value)
 
     if (value > 0) {
       if (is_off()) {
-        host_that_restart.push_back(get_host());
+        XBT_VERB("Restart processes on host %s", get_host()->get_cname());
         get_host()->turn_on();
       }
     } else {
index c7f6266..d78897b 100644 (file)
@@ -399,7 +399,7 @@ void CpuTi::apply_event(tmgr_trace_event_t event, double value)
   } else if (event == state_event_) {
     if (value > 0) {
       if (is_off()) {
-        host_that_restart.push_back(get_host());
+        XBT_VERB("Restart processes on host %s", get_host()->get_cname());
         get_host()->turn_on();
       }
     } else {
index 6e75461..75f1027 100644 (file)
@@ -317,7 +317,7 @@ void CpuL07::apply_event(tmgr_trace_event_t triggered, double value)
   } else if (triggered == state_event_) {
     if (value > 0) {
       if (is_off()) {
-        host_that_restart.push_back(get_host());
+        XBT_VERB("Restart processes on host %s", get_host()->get_cname());
         get_host()->turn_on();
       }
     } else
index 55de705..e3e5253 100644 (file)
@@ -444,7 +444,7 @@ void sg_platf_new_actor(simgrid::kernel::routing::ActorCreationArgs* actor)
   simgrid::kernel::actor::ProcessArg* arg =
       new simgrid::kernel::actor::ProcessArg(actor_name, code, nullptr, host, kill_time, properties, auto_restart);
 
-  host->pimpl_->actors_at_boot_.insert({actor_name, arg});
+  host->pimpl_->actors_at_boot_.emplace_back(arg);
 
   if (start_time > SIMIX_get_clock()) {
 
index 30481fa..875c7cc 100644 (file)
@@ -31,7 +31,6 @@ std::vector<simgrid::kernel::resource::Model*> all_existing_models; /* to destro
 
 simgrid::trace_mgr::future_evt_set future_evt_set;
 std::vector<std::string> surf_path;
-std::vector<simgrid::s4u::Host*> host_that_restart;
 /**  set of hosts for which one want to be notified if they ever restart. */
 std::set<std::string> watched_hosts;
 extern std::map<std::string, simgrid::surf::StorageType*> storage_types;
index 5e937a8..17a3994 100644 (file)
@@ -52,11 +52,6 @@ static inline int double_equals(double value1, double value2, double precision)
   return (fabs(value1 - value2) < precision);
 }
 
-/** @ingroup SURF_simulation
- *  @brief List of hosts that have just restarted and whose autorestart process should be restarted.
- */
-XBT_PUBLIC_DATA std::vector<sg_host_t> host_that_restart;
-
 /** @ingroup SURF_models
  *  @brief Initializes the CPU model with the model Cas01
  *
index 05de4d7..0c380c8 100644 (file)
@@ -79,7 +79,7 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ELEMENT platform ((config|random)*,(include|cluster|cabinet|peer|AS|zone|trace|trace_connect)*,(process|actor)*)>
 <!ATTLIST platform version CDATA "0.0">
 
-<!-- tag include is deprecated. Not documented, and soon removed -->
+<!-- tag include is deprecated. Not documented, and removed in v3.22 -->
 <!ELEMENT include (include|cluster|cabinet|peer|AS|zone|trace|trace_connect)*>
 <!ATTLIST include file CDATA #REQUIRED>
 
@@ -107,7 +107,14 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ATTLIST AS id CDATA #REQUIRED>
 <!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|ClusterTorus|ClusterFatTree|ClusterDragonfly) #REQUIRED>
 
-<!ELEMENT zone ((prop*), ((AS|zone|ASroute|zoneRoute|include|storage_type|storage|link|backbone|cabinet|router|host|cluster|peer|host_link)*,(route|ASroute|zoneRoute|trace|trace_connect|bypassRoute|bypassASroute|bypassZoneRoute)*))>
+<!-- A zone is either an internal node that contains other zones, 
+     or a  leaf containing hosts and other leaf-like elements -->
+<!ELEMENT zone ((prop*),
+          (((AS|zone|include|link|backbone|cabinet|cluster|peer|trace|trace_connect)*,
+            (zoneRoute|ASroute|trace|trace_connect|bypassASroute)*,
+           (trace|trace_connect)*)
+          |((include|storage_type|storage|host|cabinet|router|link|backbone|trace|trace_connect|host_link)*,
+            (route|trace|trace_connect|bypassRoute)*)))>
 <!ATTLIST zone id CDATA #REQUIRED>
 <!ATTLIST zone routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|ClusterTorus|ClusterFatTree|ClusterDragonfly) #REQUIRED>
 
index d858021..890825c 100644 (file)
@@ -5,11 +5,17 @@
 
 #define yy_create_buffer surf_parse__create_buffer
 #define yy_delete_buffer surf_parse__delete_buffer
-#define yy_flex_debug surf_parse__flex_debug
+#define yy_scan_buffer surf_parse__scan_buffer
+#define yy_scan_string surf_parse__scan_string
+#define yy_scan_bytes surf_parse__scan_bytes
 #define yy_init_buffer surf_parse__init_buffer
 #define yy_flush_buffer surf_parse__flush_buffer
 #define yy_load_buffer_state surf_parse__load_buffer_state
 #define yy_switch_to_buffer surf_parse__switch_to_buffer
+#define yypush_buffer_state surf_parse_push_buffer_state
+#define yypop_buffer_state surf_parse_pop_buffer_state
+#define yyensure_buffer_stack surf_parse_ensure_buffer_stack
+#define yy_flex_debug surf_parse__flex_debug
 #define yyin surf_parse_in
 #define yyleng surf_parse_leng
 #define yylex surf_parse_lex
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 1
+#define YY_FLEX_SUBMINOR_VERSION 4
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
 
+#ifdef yy_create_buffer
+#define surf_parse__create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer surf_parse__create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define surf_parse__delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer surf_parse__delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define surf_parse__scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer surf_parse__scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define surf_parse__scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string surf_parse__scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define surf_parse__scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes surf_parse__scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define surf_parse__init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer surf_parse__init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define surf_parse__flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer surf_parse__flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define surf_parse__load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state surf_parse__load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define surf_parse__switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer surf_parse__switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define surf_parse_push_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state surf_parse_push_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define surf_parse_pop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state surf_parse_pop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define surf_parse_ensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack surf_parse_ensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define surf_parse_lex_ALREADY_DEFINED
+#else
+#define yylex surf_parse_lex
+#endif
+
+#ifdef yyrestart
+#define surf_parse_restart_ALREADY_DEFINED
+#else
+#define yyrestart surf_parse_restart
+#endif
+
+#ifdef yylex_init
+#define surf_parse_lex_init_ALREADY_DEFINED
+#else
+#define yylex_init surf_parse_lex_init
+#endif
+
+#ifdef yylex_init_extra
+#define surf_parse_lex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra surf_parse_lex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define surf_parse_lex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy surf_parse_lex_destroy
+#endif
+
+#ifdef yyget_debug
+#define surf_parse_get_debug_ALREADY_DEFINED
+#else
+#define yyget_debug surf_parse_get_debug
+#endif
+
+#ifdef yyset_debug
+#define surf_parse_set_debug_ALREADY_DEFINED
+#else
+#define yyset_debug surf_parse_set_debug
+#endif
+
+#ifdef yyget_extra
+#define surf_parse_get_extra_ALREADY_DEFINED
+#else
+#define yyget_extra surf_parse_get_extra
+#endif
+
+#ifdef yyset_extra
+#define surf_parse_set_extra_ALREADY_DEFINED
+#else
+#define yyset_extra surf_parse_set_extra
+#endif
+
+#ifdef yyget_in
+#define surf_parse_get_in_ALREADY_DEFINED
+#else
+#define yyget_in surf_parse_get_in
+#endif
+
+#ifdef yyset_in
+#define surf_parse_set_in_ALREADY_DEFINED
+#else
+#define yyset_in surf_parse_set_in
+#endif
+
+#ifdef yyget_out
+#define surf_parse_get_out_ALREADY_DEFINED
+#else
+#define yyget_out surf_parse_get_out
+#endif
+
+#ifdef yyset_out
+#define surf_parse_set_out_ALREADY_DEFINED
+#else
+#define yyset_out surf_parse_set_out
+#endif
+
+#ifdef yyget_leng
+#define surf_parse_get_leng_ALREADY_DEFINED
+#else
+#define yyget_leng surf_parse_get_leng
+#endif
+
+#ifdef yyget_text
+#define surf_parse_get_text_ALREADY_DEFINED
+#else
+#define yyget_text surf_parse_get_text
+#endif
+
+#ifdef yyget_lineno
+#define surf_parse_get_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno surf_parse_get_lineno
+#endif
+
+#ifdef yyset_lineno
+#define surf_parse_set_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno surf_parse_set_lineno
+#endif
+
+#ifdef yywrap
+#define surf_parse_wrap_ALREADY_DEFINED
+#else
+#define yywrap surf_parse_wrap
+#endif
+
+#ifdef yyalloc
+#define surf_parse_alloc_ALREADY_DEFINED
+#else
+#define yyalloc surf_parse_alloc
+#endif
+
+#ifdef yyrealloc
+#define surf_parse_realloc_ALREADY_DEFINED
+#else
+#define yyrealloc surf_parse_realloc
+#endif
+
+#ifdef yyfree
+#define surf_parse_free_ALREADY_DEFINED
+#else
+#define yyfree surf_parse_free
+#endif
+
+#ifdef yytext
+#define surf_parse_text_ALREADY_DEFINED
+#else
+#define yytext surf_parse_text
+#endif
+
+#ifdef yyleng
+#define surf_parse_leng_ALREADY_DEFINED
+#else
+#define yyleng surf_parse_leng
+#endif
+
+#ifdef yyin
+#define surf_parse_in_ALREADY_DEFINED
+#else
+#define yyin surf_parse_in
+#endif
+
+#ifdef yyout
+#define surf_parse_out_ALREADY_DEFINED
+#else
+#define yyout surf_parse_out
+#endif
+
+#ifdef yy_flex_debug
+#define surf_parse__flex_debug_ALREADY_DEFINED
+#else
+#define yy_flex_debug surf_parse__flex_debug
+#endif
+
+#ifdef yylineno
+#define surf_parse_lineno_ALREADY_DEFINED
+#else
+#define yylineno surf_parse_lineno
+#endif
+
 /* First, we deal with  platform-specific or compiler-specific issues. */
 
 /* begin standard C headers. */
@@ -100,10 +340,16 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#ifndef SIZE_MAX
+#define SIZE_MAX               (~(size_t)0)
+#endif
+
 #endif /* ! C99 */
 
 #endif /* ! FLEXINT_H */
 
+/* begin standard C++ headers. */
+
 /* TODO: this is always defined, so inline it */
 #define yyconst const
 
@@ -116,32 +362,26 @@ typedef unsigned int flex_uint32_t;
 /* Returned upon end-of-file. */
 #define YY_NULL 0
 
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
+/* Promotes a possibly negative, possibly signed char to an
+ *   integer in range [0..255] for use as an array index.
  */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
 
 /* Enter a start condition.  This macro really ought to take a parameter,
  * but we do it the disgusting crufty way forced on us by the ()-less
  * definition of BEGIN.
  */
 #define BEGIN (yy_start) = 1 + 2 *
-
 /* Translate the current start state into a value that can be later handed
  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  * compatibility.
  */
 #define YY_START (((yy_start) - 1) / 2)
 #define YYSTATE YY_START
-
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE surf_parse_restart(surf_parse_in  )
-
+#define YY_NEW_FILE yyrestart( yyin  )
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
@@ -171,50 +411,49 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
 typedef size_t yy_size_t;
 #endif
 
-extern unsigned int surf_parse_leng;
+extern int yyleng;
 
-extern FILE *surf_parse_in, *surf_parse_out;
+extern FILE *yyin, *yyout;
 
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
-
+    
     /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
      *       access to the local variable yy_act. Since yyless() is a macro, it would break
-     *       existing scanners that call yyless() from OUTSIDE surf_parse_lex.
+     *       existing scanners that call yyless() from OUTSIDE yylex.
      *       One obvious solution it to make yy_act a global. I tried that, and saw
-     *       a 5% performance hit in a non-surf_parse_lineno scanner, because yy_act is
+     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
      *       normally declared as a variable-- so it is not worth it.
      */
     #define  YY_LESS_LINENO(n) \
             do { \
-                unsigned int yyl;\
-                for ( yyl = n; yyl < surf_parse_leng; ++yyl )\
-                    if ( surf_parse_text[yyl] == '\n' )\
-                        --surf_parse_lineno;\
+                int yyl;\
+                for ( yyl = n; yyl < yyleng; ++yyl )\
+                    if ( yytext[yyl] == '\n' )\
+                        --yylineno;\
             }while(0)
     #define YY_LINENO_REWIND_TO(dst) \
             do {\
                 const char *p;\
                 for ( p = yy_cp-1; p >= (dst); --p)\
                     if ( *p == '\n' )\
-                        --surf_parse_lineno;\
+                        --yylineno;\
             }while(0)
     
 /* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
        do \
                { \
-               /* Undo effects of setting up surf_parse_text. */ \
+               /* Undo effects of setting up yytext. */ \
         int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
                *yy_cp = (yy_hold_char); \
                YY_RESTORE_YY_MORE_OFFSET \
                (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-               YY_DO_BEFORE_ACTION; /* set up surf_parse_text again */ \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
                } \
        while ( 0 )
-
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -274,8 +513,8 @@ struct yy_buffer_state
         * possible backing-up.
         *
         * When we actually see the EOF, we change the status to "new"
-        * (via surf_parse_restart()), so that the user can continue scanning by
-        * just pointing surf_parse_in at a new input file.
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
         */
 #define YY_BUFFER_EOF_PENDING 2
 
@@ -296,111 +535,103 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
 #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
                           ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
                           : NULL)
-
 /* Same as previous macro, but useful when we know that the buffer stack is not
  * NULL or when we need an lvalue. For internal use only.
  */
 #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
 
-/* yy_hold_char holds the character lost when surf_parse_text is formed. */
+/* yy_hold_char holds the character lost when yytext is formed. */
 static char yy_hold_char;
 static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-unsigned int surf_parse_leng;
+int yyleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = NULL;
 static int yy_init = 0;                /* whether we need to initialize */
 static int yy_start = 0;       /* start state number */
 
-/* Flag which is used to allow surf_parse_wrap()'s to do buffer switches
- * instead of setting up a fresh surf_parse_in.  A bit of a hack ...
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
  */
 static int yy_did_buffer_switch_on_eof;
 
-void surf_parse_restart (FILE *input_file  );
-void surf_parse__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE surf_parse__create_buffer (FILE *file,int size  );
-void surf_parse__delete_buffer (YY_BUFFER_STATE b  );
-void surf_parse__flush_buffer (YY_BUFFER_STATE b  );
-void surf_parse_push_buffer_state (YY_BUFFER_STATE new_buffer  );
-void surf_parse_pop_buffer_state (void );
+void yyrestart ( FILE *input_file  );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
+void yy_delete_buffer ( YY_BUFFER_STATE b  );
+void yy_flush_buffer ( YY_BUFFER_STATE b  );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
+void yypop_buffer_state ( void );
 
-static void surf_parse_ensure_buffer_stack (void );
-static void surf_parse__load_buffer_state (void );
-static void surf_parse__init_buffer (YY_BUFFER_STATE b,FILE *file  );
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
 
-#define YY_FLUSH_BUFFER surf_parse__flush_buffer(YY_CURRENT_BUFFER )
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );
 
-YY_BUFFER_STATE surf_parse__scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE surf_parse__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE surf_parse__scan_bytes (yyconst char *bytes,int len  );
-
-void *surf_parse_alloc (yy_size_t  );
-void *surf_parse_realloc (void *,yy_size_t  );
-void surf_parse_free (void *  );
-
-#define yy_new_buffer surf_parse__create_buffer
+void *yyalloc ( yy_size_t  );
+void *yyrealloc ( void *, yy_size_t  );
+void yyfree ( void *  );
 
+#define yy_new_buffer yy_create_buffer
 #define yy_set_interactive(is_interactive) \
        { \
        if ( ! YY_CURRENT_BUFFER ){ \
-        surf_parse_ensure_buffer_stack (); \
+        yyensure_buffer_stack (); \
                YY_CURRENT_BUFFER_LVALUE =    \
-            surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
        } \
        YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
        }
-
 #define yy_set_bol(at_bol) \
        { \
        if ( ! YY_CURRENT_BUFFER ){\
-        surf_parse_ensure_buffer_stack (); \
+        yyensure_buffer_stack (); \
                YY_CURRENT_BUFFER_LVALUE =    \
-            surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE ); \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
        } \
        YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
        }
-
 #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
 
 /* Begin user sect3 */
 
 #define surf_parse_wrap() (/*CONSTCOND*/1)
 #define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
 
-typedef unsigned char YY_CHAR;
-
-FILE *surf_parse_in = NULL, *surf_parse_out = NULL;
+FILE *yyin = NULL, *yyout = NULL;
 
 typedef int yy_state_type;
 
-extern int surf_parse_lineno;
-
-int surf_parse_lineno = 1;
+extern int yylineno;
+int yylineno = 1;
 
-extern char *surf_parse_text;
+extern char *yytext;
 #ifdef yytext_ptr
 #undef yytext_ptr
 #endif
-#define yytext_ptr surf_parse_text
+#define yytext_ptr yytext
 
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yynoreturn yy_fatal_error (yyconst char* msg  );
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg  );
 
 /* Done after the current pattern has been matched and before the
- * corresponding action - sets up surf_parse_text.
+ * corresponding action - sets up yytext.
  */
 #define YY_DO_BEFORE_ACTION \
        (yytext_ptr) = yy_bp; \
-       surf_parse_leng = (int) (yy_cp - yy_bp); \
+       yyleng = (int) (yy_cp - yy_bp); \
        (yy_hold_char) = *yy_cp; \
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 651
-#define YY_END_OF_BUFFER 652
+#define YY_NUM_RULES 663
+#define YY_END_OF_BUFFER 664
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -408,7 +639,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3930] =
+static const flex_int16_t yy_accept[4018] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -441,396 +672,406 @@ static yyconst flex_int16_t yy_accept[3930] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      652,  650,   15,   10,   10,   15,   15,  630,   10,  630,
-
-        5,    6,    5,    8,    9,    8,  646,  638,  639,  647,
-      644,  647,  645,  649,  638,  639,  649,   42,   10,   42,
-       42,   42,   40,   42,   42,   46,   10,   46,   46,  650,
-       46,  650,  650,   46,   63,   10,   63,   63,   63,   61,
-       63,   63,   63,   67,   10,   67,  650,   67,   84,   10,
-       84,   84,   84,   82,   84,   84,   84,   84,   84,   88,
-       10,   88,  650,   88,   95,   10,   95,   95,   95,   93,
-       95,   99,   10,   99,  110,   10,  110,  110,  110,  108,
-      110,  110,  110,  114,   10,  114,  127,   10,  127,  127,
-      127,  125,  127,  127,  127,  131,   10,  131,  131,  140,
-
-       10,  140,  140,  140,  138,  140,  140,  144,   10,  144,
-      144,  157,   10,  157,  157,  157,  155,  157,  157,  157,
-      161,   10,  161,  161,  180,   10,  180,  180,  180,  178,
-      180,  180,  180,  180,  180,  180,  184,   10,  184,  239,
-       10,  239,  239,  239,  237,  239,  239,  239,  239,  239,
-      239,  239,  239,  243,   10,  243,  243,  250,   10,  250,
-      250,  250,  248,  250,  254,   10,  254,  254,  273,   10,
-      273,  273,  273,  271,  273,  273,  273,  273,  273,  277,
-       10,  277,  650,  277,  288,   10,  288,  288,  288,  286,
-      288,  288,  288,  292,   10,  292,  299,   10,  299,  299,
-
-      299,  297,  299,  303,   10,  303,  650,  303,  328,   10,
-      328,  328,  328,  326,  328,  328,  328,  328,  332,   10,
-      332,  332,  345,   10,  345,  345,  345,  343,  345,  345,
-      349,   10,  349,  358,   10,  358,  358,  358,  356,  358,
-      358,  362,   10,  362,  371,   10,  371,  371,  371,  369,
-      371,  371,  375,   10,  375,  396,   10,  396,  396,  396,
-      394,  396,  396,  396,  396,  396,  396,  400,   10,  400,
-      650,  407,   10,  407,  407,  407,  405,  407,  411,   10,
-      411,  411,  650,  411,  650,  411,  428,   10,  428,  428,
-      428,  426,  428,  428,  428,  428,  428,  432,   10,  432,
-
-      432,  441,   10,  441,  441,  441,  439,  441,  441,  445,
-       10,  445,  472,   10,  472,  472,  472,  470,  472,  472,
-      472,  472,  472,  476,   10,  476,  489,   10,  489,  489,
-      489,  487,  489,  489,  493,   10,  493,  493,  502,   10,
-      502,  502,  502,  500,  502,  502,  506,   10,  506,  519,
-       10,  519,  519,  519,  517,  519,  519,  519,  519,  523,
-       10,  523,  523,  536,   10,  536,  536,  536,  534,  536,
-      536,  536,  536,  540,   10,  540,  650,  540,  551,   10,
-      551,  551,  551,  549,  551,  551,  551,  647,  646,  573,
-       10,  573,  573,  573,  571,  573,  573,  573,  577,   10,
-
-      577,  604,   10,  604,  604,  604,  602,  604,  604,  608,
-       10,  608,  608,  608,  608,  625,   10,  625,  625,  625,
-      623,  625,  625,  625,  629,   10,  629,  629,   10,    0,
-        2,    2,    0,    4,    7,  641,  640,    0,    0,    0,
-        0,    0,    0,   41,   43,   43,   43,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,  664,  662,   15,   10,
+       10,   15,   15,  642,   10,  642,    5,    6,    5,    8,
+        9,    8,  658,  650,  651,  659,  656,  659,  657,  661,
+      650,  651,  661,   42,   10,   42,   42,   42,   40,   42,
+       42,   46,   10,   46,   46,  662,   46,  662,  662,   46,
+       67,   10,   67,   67,   67,   65,   67,   67,   67,   71,
+       10,   71,  662,   71,   88,   10,   88,   88,   88,   86,
+       88,   88,   88,   88,   88,   92,   10,   92,  662,   92,
+       99,   10,   99,   99,   99,   97,   99,  103,   10,  103,
+      114,   10,  114,  114,  114,  112,  114,  114,  114,  118,
+
+       10,  118,  131,   10,  131,  131,  131,  129,  131,  131,
+      131,  135,   10,  135,  135,  144,   10,  144,  144,  144,
+      142,  144,  144,  148,   10,  148,  148,  161,   10,  161,
+      161,  161,  159,  161,  161,  161,  165,   10,  165,  165,
+      184,   10,  184,  184,  184,  182,  184,  184,  184,  184,
+      184,  184,  188,   10,  188,  243,   10,  243,  243,  243,
+      241,  243,  243,  243,  243,  243,  243,  243,  243,  247,
+       10,  247,  247,  254,   10,  254,  254,  254,  252,  254,
+      258,   10,  258,  258,  277,   10,  277,  277,  277,  275,
+      277,  277,  277,  277,  277,  281,   10,  281,  662,  281,
+
+      292,   10,  292,  292,  292,  290,  292,  292,  292,  296,
+       10,  296,  303,   10,  303,  303,  303,  301,  303,  307,
+       10,  307,  662,  307,  332,   10,  332,  332,  332,  330,
+      332,  332,  332,  332,  336,   10,  336,  336,  349,   10,
+      349,  349,  349,  347,  349,  349,  353,   10,  353,  362,
+       10,  362,  362,  362,  360,  362,  362,  366,   10,  366,
+      375,   10,  375,  375,  375,  373,  375,  375,  379,   10,
+      379,  400,   10,  400,  400,  400,  398,  400,  400,  400,
+      400,  400,  400,  404,   10,  404,  662,  411,   10,  411,
+      411,  411,  409,  411,  415,   10,  415,  415,  662,  415,
+
+      662,  415,  432,   10,  432,  432,  432,  430,  432,  432,
+      432,  432,  432,  436,   10,  436,  436,  445,   10,  445,
+      445,  445,  443,  445,  445,  449,   10,  449,  476,   10,
+      476,  476,  476,  474,  476,  476,  476,  476,  476,  480,
+       10,  480,  497,   10,  497,  497,  497,  495,  497,  497,
+      501,   10,  501,  501,  510,   10,  510,  510,  510,  508,
+      510,  510,  514,   10,  514,  527,   10,  527,  527,  527,
+      525,  527,  527,  527,  527,  531,   10,  531,  531,  544,
+       10,  544,  544,  544,  542,  544,  544,  544,  544,  548,
+       10,  548,  662,  548,  559,   10,  559,  559,  559,  557,
+
+      559,  559,  559,  659,  658,  581,   10,  581,  581,  581,
+      579,  581,  581,  581,  585,   10,  585,  612,   10,  612,
+      612,  612,  610,  612,  612,  616,   10,  616,  616,  616,
+      662,  616,  616,  662,  662,  616,  662,  616,  662,  616,
+      637,   10,  637,  637,  637,  635,  637,  637,  637,  641,
+       10,  641,  641,   10,    0,    2,    2,    0,    4,    7,
+      653,  652,    0,    0,    0,    0,    0,    0,   41,   43,
+       43,   43,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       62,   64,   64,   64,   64,   64,    0,    0,   83,   85,
-       85,   85,   85,   85,   85,    0,    0,   94,   96,   96,
-
-        0,  109,  111,  111,  111,  111,    0,  126,  128,  128,
-      128,  128,    0,  139,  141,  141,  141,    0,  156,  158,
-      158,  158,  158,    0,  179,  181,  181,  181,  181,  181,
-      181,  181,  181,    0,  238,  240,  240,  240,  240,  240,
-      240,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-        0,  249,  251,  251,    0,  272,  274,  274,  274,  274,
-      274,  274,  274,    0,    0,  287,  289,  289,  289,  289,
-        0,  298,  300,  300,    0,    0,    0,  327,  329,  329,
-      329,  329,  329,  329,    0,  344,  346,  346,  346,    0,
-      357,  359,  359,  359,    0,  370,  372,  372,  372,    0,
-
-      395,  397,  397,  397,  397,  397,  397,  397,  397,    0,
-        0,  406,  408,  408,    0,    0,    0,    0,    0,    0,
-        0,  427,  429,  429,  429,  429,  429,  429,    0,  440,
-      442,  442,  442,    0,  471,  473,  473,  473,  473,  473,
-      473,  473,  473,  473,    0,  488,  490,  490,  490,  490,
-        0,  501,  503,  503,  503,    0,  518,  520,  520,  520,
-      520,  520,    0,  535,  537,  537,  537,  537,  537,    0,
-        0,  550,  552,  552,  552,  552,    0,    0,    0,  572,
-      574,  574,  574,  574,    0,  603,  605,  605,  605,    0,
-      624,  626,  626,  626,  626,  626,    0,    0,    0,    0,
-
-        0,    3,    0,    0,    0,    0,    0,    0,    0,  648,
-        0,    0,   43,    0,    0,   17,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   16,
-        0,    0,    0,   64,   64,   64,   64,    0,    0,    0,
-       85,   85,   85,   85,   85,    0,    0,    0,   96,    0,
-        0,  111,    0,    0,  111,    0,    0,  128,  128,  128,
-        0,    0,  141,  141,    0,    0,  158,  158,  158,    0,
-        0,    0,    0,    0,    0,  181,  181,  181,  181,  181,
-
-        0,    0,  240,    0,    0,  240,    0,    0,  240,  240,
-      240,  240,  240,  240,  240,  240,  240,  240,    0,    0,
-        0,    0,    0,    0,  274,  274,  274,    0,    0,  274,
-      274,  274,    0,    0,    0,  289,    0,    0,    0,    0,
-        0,    0,  300,    0,    0,   17,    0,  329,    0,    0,
-      329,  329,  329,    0,    0,  346,    0,    0,    0,    0,
-        0,    0,  359,    0,    0,  372,  372,    0,    0,  397,
-      397,  397,    0,    0,  397,  397,  397,    0,    0,    0,
-      408,    0,    0,    0,    0,    0,    0,  429,  429,  429,
-      429,  429,    0,    0,    0,    0,  442,    0,    0,  473,
-
-        0,    0,  473,  473,  473,  473,  473,  473,    0,    0,
-      490,  490,  490,    0,    0,  503,    0,    0,    0,    0,
-      520,  520,    0,    0,  520,    0,    0,  537,    0,    0,
-      537,  537,    0,    0,    0,  552,    0,    0,  552,    0,
-        0,    0,  643,  574,  574,  574,    0,    0,    0,    0,
-      605,    0,    0,  626,  626,  626,  626,    0,    0,    0,
-       14,    1,    0,    0,  636,    0,    0,    0,  633,  632,
-        0,    0,   19,   18,   43,    0,    0,   45,    0,   17,
+
+        0,    0,    0,    0,    0,   66,   68,   68,   68,   68,
+       68,    0,    0,   87,   89,   89,   89,   89,   89,   89,
+        0,    0,   98,  100,  100,    0,  113,  115,  115,  115,
+      115,    0,  130,  132,  132,  132,  132,    0,  143,  145,
+      145,  145,    0,  160,  162,  162,  162,  162,    0,  183,
+      185,  185,  185,  185,  185,  185,  185,  185,    0,  242,
+      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
+      244,  244,  244,  244,  244,    0,  253,  255,  255,    0,
+      276,  278,  278,  278,  278,  278,  278,  278,    0,    0,
+      291,  293,  293,  293,  293,    0,  302,  304,  304,    0,
+
+        0,    0,  331,  333,  333,  333,  333,  333,  333,    0,
+      348,  350,  350,  350,    0,  361,  363,  363,  363,    0,
+      374,  376,  376,  376,    0,  399,  401,  401,  401,  401,
+      401,  401,  401,  401,    0,    0,  410,  412,  412,    0,
+        0,    0,    0,    0,    0,    0,  431,  433,  433,  433,
+      433,  433,  433,    0,  444,  446,  446,  446,    0,  475,
+      477,  477,  477,  477,  477,  477,  477,  477,  477,    0,
+      496,  498,  498,  498,  498,    0,  509,  511,  511,  511,
+        0,  526,  528,  528,  528,  528,  528,    0,  543,  545,
+      545,  545,  545,  545,    0,    0,  558,  560,  560,  560,
+
+      560,    0,    0,    0,  580,  582,  582,  582,  582,    0,
+      611,  613,  613,  613,    0,    0,    0,    0,    0,    0,
+        0,  636,  638,  638,  638,  638,  638,    0,    0,    0,
+        0,    0,    3,    0,    0,    0,    0,    0,    0,    0,
+      660,    0,    0,   43,    0,    0,   17,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   16,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
-        0,    0,   16,    0,    0,    0,    0,    0,    0,    0,
+       16,    0,    0,    0,   68,   68,   68,   68,    0,    0,
+        0,   89,   89,   89,   89,   89,    0,    0,    0,  100,
+
+        0,    0,  115,    0,    0,  115,    0,    0,  132,  132,
+      132,    0,    0,  145,  145,    0,    0,  162,  162,  162,
+        0,    0,    0,    0,    0,    0,  185,  185,  185,  185,
+      185,    0,    0,  244,    0,    0,  244,    0,    0,  244,
+      244,  244,  244,  244,  244,  244,  244,  244,  244,    0,
+        0,    0,    0,    0,    0,  278,  278,  278,    0,    0,
+      278,  278,  278,    0,    0,    0,  293,    0,    0,    0,
+        0,    0,    0,  304,    0,    0,   17,    0,  333,    0,
+        0,  333,  333,  333,    0,    0,  350,    0,    0,    0,
+        0,    0,    0,  363,    0,    0,  376,  376,    0,    0,
+
+      401,  401,  401,    0,    0,  401,  401,  401,    0,    0,
+        0,  412,    0,    0,    0,    0,    0,    0,  433,  433,
+      433,  433,  433,    0,    0,    0,    0,  446,    0,    0,
+      477,    0,    0,  477,  477,  477,  477,  477,  477,    0,
+        0,  498,  498,  498,    0,    0,  511,    0,    0,    0,
+        0,  528,  528,    0,    0,  528,    0,    0,  545,    0,
+        0,  545,  545,    0,    0,    0,  560,    0,    0,  560,
+        0,    0,    0,  655,  582,  582,  582,    0,    0,    0,
+        0,  613,    0,    0,    0,    0,    0,  638,  638,  638,
+      638,    0,    0,    0,   14,    1,    0,    0,  648,    0,
+
+        0,    0,  645,  644,    0,    0,   19,   18,   43,    0,
+        0,   45,    0,   17,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   64,   64,    0,    0,   64,    0,    0,   66,    0,
-        0,   85,   85,   85,   85,   85,    0,    0,   87,    0,
-        0,   96,    0,    0,   98,    0,  111,    0,  105,  104,
-      111,    0,    0,  113,    0,    0,    0,  128,  128,    0,
-        0,    0,    0,  130,    0,    0,    0,    0,    0,    0,
-        0,  143,    0,    0,    0,  158,  158,    0,    0,    0,
-        0,  160,    0,    0,  165,  164,    0,  167,  166,    0,
-        0,  181,  181,  181,  181,    0,    0,  183,    0,  240,
-
-      240,  240,    0,  196,  195,  240,    0,  200,  199,    0,
-        0,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-        0,    0,  242,    0,    0,  247,  246,    0,    0,  253,
-        0,  274,  274,  274,    0,  264,  263,  274,  274,  274,
-        0,    0,  276,    0,    0,  289,    0,  283,  282,    0,
-      285,  284,    0,    0,  291,    0,  300,    0,    0,  302,
-        0,    0,  329,    0,  311,  310,  329,  329,  329,    0,
-        0,  331,    0,  346,    0,  342,  341,    0,    0,  348,
-        0,    0,  353,  352,  359,    0,    0,  361,    0,  372,
-      372,    0,    0,  374,    0,  397,  397,  397,  397,    0,
-
-      387,  386,    0,    0,  397,  397,    0,    0,  399,    0,
-        0,  408,    0,    0,  410,    0,    0,    0,    0,    0,
-      429,  429,  429,  429,  429,    0,    0,  431,    0,    0,
-      436,  435,  442,    0,    0,  444,    0,  473,    0,  457,
-      456,    0,    0,  473,    0,    0,  473,  473,  473,    0,
-        0,  475,    0,    0,    0,    0,    0,  490,    0,    0,
-      492,    0,  503,    0,  499,  498,    0,    0,  505,    0,
-      520,  520,    0,  514,  513,  520,    0,    0,  522,    0,
-      537,    0,  529,  528,  537,  537,    0,    0,  539,    0,
-        0,  552,    0,  546,  545,  552,    0,    0,    0,  554,
-
-        0,  574,  574,  574,    0,    0,  576,    0,    0,  581,
-      580,  605,    0,    0,  607,    0,    0,    0,  626,  626,
-        0,    0,  626,    0,    0,  628,    0,    0,    0,  637,
-      631,    0,    0,   43,    0,   44,    0,    0,    0,    0,
-        0,    0,    0,    0,  256,    0,  305,    0,    0,  377,
-        0,    0,  434,    0,    0,    0,    0,  579,  433,    0,
-        0,    0,    0,    0,  255,    0,  304,  376,    0,    0,
-        0,  578,    0,  578,    0,    0,   50,   49,   64,   64,
-        0,   56,   55,   64,    0,  304,   85,    0,    0,   85,
-       85,   85,    0,    0,   96,    0,  111,  111,    0,    0,
-
-      118,  117,  128,  128,    0,  124,  123,    0,    0,  135,
-      134,    0,  137,  136,    0,    0,  148,  147,  158,  158,
-        0,  154,  153,    0,    0,  169,  168,  181,  181,  181,
-      181,    0,  240,  240,  240,    0,    0,    0,  202,  201,
-      240,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-        0,    0,  274,  274,    0,    0,  274,  274,  274,    0,
-        0,    0,    0,    0,    0,    0,    0,  579,  329,  329,
-      329,  329,    0,  346,    0,  359,    0,    0,    0,  372,
-        0,  397,  397,  397,  397,    0,  389,  388,  397,  397,
-        0,    0,  408,    0,    0,    0,    0,    0,  429,    0,
-
-        0,  429,  429,  429,    0,  442,    0,  473,    0,  459,
-      458,    0,    0,    0,  463,  462,  473,    0,    0,  473,
-        0,    0,  480,  479,    0,  482,  481,  490,    0,  503,
-        0,  520,  520,  520,    0,  537,  537,    0,    0,    0,
-        0,    0,    0,  552,    0,    0,  574,    0,    0,  574,
-        0,  605,    0,    0,  612,  611,  626,  626,    0,  618,
-      617,  626,    0,    0,    0,    0,   12,    0,  634,  635,
-       43,    0,   68,    0,    0,    0,    0,    0,    0,  256,
-        0,    0,  305,    0,    0,  363,  377,    0,    0,  434,
-        0,  478,    0,  542,  579,    0,  433,    0,    0,    0,
-
-        0,    0,  255,    0,    0,  304,  376,  477,    0,  541,
-      578,    0,  478,  477,   64,   64,   64,    0,    0,   85,
-        0,   73,   72,   85,   85,   85,    0,    0,    0,    0,
-        0,  111,  111,    0,  128,  128,    0,    0,  158,  158,
-        0,  181,  181,    0,    0,  181,    0,    0,    0,  240,
-      240,    0,  198,  197,  240,  240,  240,  240,  240,  240,
-        0,    0,  240,  240,  240,    0,    0,  274,  274,    0,
-      262,  261,  274,    0,    0,  274,    0,  364,    0,  281,
-      280,    0,    0,  296,  295,    0,  329,  329,  329,  329,
-        0,  346,    0,    0,    0,    0,    0,  366,  365,  372,
-
-        0,  397,    0,    0,  397,  397,    0,    0,  397,    0,
-        0,  408,    0,   69,    0,    0,    0,  429,    0,  417,
-      416,  429,  429,  429,    0,    0,    0,    0,  473,    0,
-      461,  460,  473,    0,  467,  466,  473,    0,  490,    0,
-      503,    0,  520,  520,  520,    0,  537,    0,    0,    0,
-      533,  532,    0,    0,    0,  544,  543,  552,    0,    0,
-      574,    0,    0,    0,    0,    0,    0,  605,    0,  626,
-      626,  626,    0,    0,    0,    0,   11,   43,    0,   68,
-        0,    0,    0,    0,    0,  244,    0,    0,    0,    0,
-      363,    0,    0,  446,  478,  495,    0,  542,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,  477,  494,    0,
-      541,    0,    0,    0,    0,    0,    0,   64,    0,    0,
-       85,   85,   85,   85,    0,    0,    0,   92,   91,    0,
-      111,  111,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  181,    0,  175,  174,
-        0,    0,    0,    0,  188,  187,    0,    0,  240,  240,
-      240,    0,    0,  240,  240,  240,    0,  224,  223,    0,
-        0,  240,  240,    0,    0,  274,  274,    0,    0,    0,
-      268,  267,  274,    0,  275,  364,    0,    0,  329,  329,
-      329,  329,    0,  330,  346,    0,    0,  355,  354,    0,
-
-      372,    0,  397,    0,  381,  380,    0,    0,  397,    0,
-      391,  390,  397,    0,  398,    0,  408,    0,   69,  245,
-        0,  447,  429,  429,  429,  429,    0,    0,  438,  437,
-        0,  443,  473,  473,  473,    0,  490,    0,  503,    0,
-        0,    0,  520,    0,    0,    0,  537,    0,  531,  530,
-        0,    0,  552,    0,    0,  574,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  570,  569,    0,  605,    0,
-      606,    0,    0,    0,    0,  626,    0,    0,    0,    0,
-        0,    0,   48,    0,    0,    0,    0,    0,  163,  186,
-      244,    0,  294,    0,    0,    0,  412,  446,  495,  508,
-
-        0,    0,   47,    0,    0,    0,    0,  162,  185,    0,
-      293,  494,  507,    0,    0,    0,   52,   51,    0,   54,
-       53,   64,    0,    0,   85,   85,   85,   85,    0,   86,
-        0,    0,  111,    0,    0,    0,    0,  120,  119,    0,
-      122,  121,    0,    0,    0,  150,  149,    0,  152,  151,
-        0,    0,  171,  170,    0,    0,    0,  177,  176,    0,
-        0,  190,  189,  240,  240,  240,    0,  210,  209,    0,
-        0,  240,  240,    0,  226,  225,  240,  240,    0,    0,
-      274,  274,    0,  266,  265,  274,    0,    0,  329,    0,
-        0,  329,  329,  329,  346,    0,    0,  372,    0,  373,
-
-      397,    0,  383,  382,  397,  397,    0,    0,    0,    0,
-      245,  413,  447,  429,  429,  429,  429,    0,  473,    0,
-        0,  473,    0,  490,    0,  491,  503,    0,    0,  510,
-      509,    0,    0,    0,  516,  515,    0,    0,    0,    0,
-        0,  552,    0,    0,  553,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  614,  613,    0,  616,  615,  626,    0,    0,    0,
-        0,    0,    0,    0,   48,   89,  101,    0,    0,    0,
-      163,  186,    0,  294,  333,    0,  401,  412,  508,    0,
-        0,    0,   47,  100,    0,    0,    0,  162,  185,    0,
-
-      293,  507,    0,    0,    0,   64,    0,  334,    0,    0,
-       85,   85,   85,   90,    0,  111,    0,  107,  106,    0,
-        0,    0,    0,    0,  173,  172,    0,  240,  240,  240,
-        0,  212,  211,  240,  240,  240,    0,    0,    0,    0,
-      252,  274,  274,  274,    0,    0,  329,    0,  313,  312,
-      329,  329,  329,  346,    0,    0,  372,  397,  397,  397,
-      402,    0,  404,  403,    0,  413,    0,    0,  429,  429,
-      429,    0,  473,    0,  465,  464,  473,    0,  474,  490,
-      503,    0,  504,    0,  512,  511,    0,    0,  527,  526,
-        0,    0,  552,  642,    0,  558,  557,    0,    0,    0,
-
+        0,    0,    0,    0,    0,   68,   68,    0,    0,   68,
+        0,    0,   70,    0,    0,   89,   89,   89,   89,   89,
+        0,    0,   91,    0,    0,  100,    0,    0,  102,    0,
+      115,    0,  109,  108,  115,    0,    0,  117,    0,    0,
+        0,  132,  132,    0,    0,    0,    0,  134,    0,    0,
+
+        0,    0,    0,    0,    0,  147,    0,    0,    0,  162,
+      162,    0,    0,    0,    0,  164,    0,    0,  169,  168,
+        0,  171,  170,    0,    0,  185,  185,  185,  185,    0,
+        0,  187,    0,  244,  244,  244,    0,  200,  199,  244,
+        0,  204,  203,    0,    0,  244,  244,  244,  244,  244,
+      244,  244,  244,  244,    0,    0,  246,    0,    0,  251,
+      250,    0,    0,  257,    0,  278,  278,  278,    0,  268,
+      267,  278,  278,  278,    0,    0,  280,    0,    0,  293,
+        0,  287,  286,    0,  289,  288,    0,    0,  295,    0,
+      304,    0,    0,  306,    0,    0,  333,    0,  315,  314,
+
+      333,  333,  333,    0,    0,  335,    0,  350,    0,  346,
+      345,    0,    0,  352,    0,    0,  357,  356,  363,    0,
+        0,  365,    0,  376,  376,    0,    0,  378,    0,  401,
+      401,  401,  401,    0,  391,  390,    0,    0,  401,  401,
+        0,    0,  403,    0,    0,  412,    0,    0,  414,    0,
+        0,    0,    0,    0,  433,  433,  433,  433,  433,    0,
+        0,  435,    0,    0,  440,  439,  446,    0,    0,  448,
+        0,  477,    0,  461,  460,    0,    0,  477,    0,    0,
+      477,  477,  477,    0,    0,  479,    0,    0,    0,    0,
+        0,  498,    0,    0,  500,    0,  511,    0,  507,  506,
+
+        0,    0,  513,    0,  528,  528,    0,  522,  521,  528,
+        0,    0,  530,    0,  545,    0,  537,  536,  545,  545,
+        0,    0,  547,    0,    0,  560,    0,  554,  553,  560,
+        0,    0,    0,  562,    0,  582,  582,  582,    0,    0,
+      584,    0,    0,  589,  588,  613,    0,    0,  615,    0,
+        0,    0,    0,    0,    0,  638,  638,    0,    0,  638,
+        0,    0,  640,    0,    0,    0,  649,  643,    0,    0,
+       43,    0,   44,    0,    0,    0,    0,    0,    0,    0,
+        0,  260,    0,  309,    0,    0,  381,    0,    0,  438,
+        0,    0,    0,    0,  587,  437,    0,    0,    0,    0,
+
+        0,  259,    0,  308,  380,    0,    0,    0,  586,    0,
+      586,    0,    0,   50,   49,   68,   68,    0,   56,   55,
+       68,    0,  308,   89,    0,    0,   89,   89,   89,    0,
+        0,  100,    0,  115,  115,    0,    0,  122,  121,  132,
+      132,    0,  128,  127,    0,    0,  139,  138,    0,  141,
+      140,    0,    0,  152,  151,  162,  162,    0,  158,  157,
+        0,    0,  173,  172,  185,  185,  185,  185,    0,  244,
+      244,  244,    0,    0,    0,  206,  205,  244,  244,  244,
+      244,  244,  244,  244,  244,  244,  244,    0,    0,  278,
+      278,    0,    0,  278,  278,  278,    0,    0,    0,    0,
+
+        0,    0,    0,    0,  587,  333,  333,  333,  333,    0,
+      350,    0,  363,    0,    0,    0,  376,    0,  401,  401,
+      401,  401,    0,  393,  392,  401,  401,    0,    0,  412,
+        0,    0,    0,    0,    0,  433,    0,    0,  433,  433,
+      433,    0,  446,    0,  477,    0,  463,  462,    0,    0,
+        0,  467,  466,  477,    0,    0,  477,    0,    0,  484,
+      483,    0,  486,  485,  498,    0,  511,    0,  528,  528,
+      528,    0,  545,  545,    0,    0,    0,    0,    0,    0,
+      560,    0,    0,  582,    0,    0,  582,    0,  613,    0,
+        0,    0,    0,    0,  620,  619,  638,  638,    0,  626,
+
+      625,  638,    0,    0,    0,    0,   12,    0,  646,  647,
+       43,    0,   72,    0,    0,    0,    0,    0,    0,  260,
+        0,    0,  309,    0,    0,  367,  381,    0,    0,  438,
+        0,  482,    0,  550,  587,    0,  437,    0,    0,    0,
+        0,    0,  259,    0,    0,  308,  380,  481,    0,  549,
+      586,    0,  482,  481,   68,   68,   68,    0,    0,   89,
+        0,   77,   76,   89,   89,   89,    0,    0,    0,    0,
+        0,  115,  115,    0,  132,  132,    0,    0,  162,  162,
+        0,  185,  185,    0,    0,  185,    0,    0,    0,  244,
+      244,    0,  202,  201,  244,  244,  244,  244,  244,  244,
+
+        0,    0,  244,  244,  244,    0,    0,  278,  278,    0,
+      266,  265,  278,    0,    0,  278,    0,  368,    0,  285,
+      284,    0,    0,  300,  299,    0,  333,  333,  333,  333,
+        0,  350,    0,    0,    0,    0,    0,  370,  369,  376,
+        0,  401,    0,    0,  401,  401,    0,    0,  401,    0,
+        0,  412,    0,   73,    0,    0,    0,  433,    0,  421,
+      420,  433,  433,  433,    0,    0,    0,    0,  477,    0,
+      465,  464,  477,    0,  471,  470,  477,    0,  498,    0,
+      511,    0,  528,  528,  528,    0,  545,    0,    0,    0,
+      541,  540,    0,    0,    0,  552,  551,  560,    0,    0,
+
+      582,    0,    0,    0,    0,    0,    0,  613,    0,    0,
+        0,    0,  638,  638,  638,    0,    0,    0,    0,   11,
+       43,    0,   72,    0,    0,    0,    0,    0,  248,    0,
+        0,    0,    0,  367,    0,    0,  450,  482,  503,    0,
+      550,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      481,  502,    0,  549,    0,    0,    0,    0,    0,    0,
+       68,    0,    0,   89,   89,   89,   89,    0,    0,    0,
+       96,   95,    0,  115,  115,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  185,
+        0,  179,  178,    0,    0,    0,    0,  192,  191,    0,
+
+        0,  244,  244,  244,    0,    0,  244,  244,  244,    0,
+      228,  227,    0,    0,  244,  244,    0,    0,  278,  278,
+        0,    0,    0,  272,  271,  278,    0,  279,  368,    0,
+        0,  333,  333,  333,  333,    0,  334,  350,    0,    0,
+      359,  358,    0,  376,    0,  401,    0,  385,  384,    0,
+        0,  401,    0,  395,  394,  401,    0,  402,    0,  412,
+        0,   73,  249,    0,  451,  433,  433,  433,  433,    0,
+        0,  442,  441,    0,  447,  477,  477,  477,    0,  498,
+        0,  511,    0,    0,    0,  528,    0,    0,    0,  545,
+        0,  539,  538,    0,    0,  560,    0,    0,  582,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,  578,  577,
+        0,  613,    0,  614,    0,    0,    0,    0,    0,    0,
+        0,  638,    0,    0,    0,    0,    0,    0,   48,    0,
+        0,    0,    0,    0,  167,  190,  248,    0,  298,    0,
+        0,    0,  416,  450,  503,  516,    0,    0,   47,    0,
+        0,    0,    0,  166,  189,    0,  297,  502,  515,    0,
+        0,    0,   52,   51,    0,   54,   53,   68,    0,    0,
+       89,   89,   89,   89,    0,   90,    0,    0,  115,    0,
+        0,    0,    0,  124,  123,    0,  126,  125,    0,    0,
+        0,  154,  153,    0,  156,  155,    0,    0,  175,  174,
+
+        0,    0,    0,  181,  180,    0,    0,  194,  193,  244,
+      244,  244,    0,  214,  213,    0,    0,  244,  244,    0,
+      230,  229,  244,  244,    0,    0,  278,  278,    0,  270,
+      269,  278,    0,    0,  333,    0,    0,  333,  333,  333,
+      350,    0,    0,  376,    0,  377,  401,    0,  387,  386,
+      401,  401,    0,    0,    0,    0,  249,  417,  451,  433,
+      433,  433,  433,    0,  477,    0,    0,  477,    0,  498,
+        0,  499,  511,    0,    0,  518,  517,    0,    0,    0,
+      524,  523,    0,    0,    0,    0,    0,  560,    0,    0,
+      561,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  622,  621,    0,
+      624,  623,  638,    0,    0,    0,    0,    0,    0,    0,
+       48,   93,  105,    0,    0,    0,  167,  190,    0,  298,
+      337,    0,  405,  416,  516,    0,    0,    0,   47,  104,
+        0,    0,    0,  166,  189,    0,  297,  515,    0,    0,
+        0,   68,    0,  338,    0,    0,   89,   89,   89,   94,
+        0,  115,    0,  111,  110,    0,    0,    0,    0,    0,
+      177,  176,    0,  244,  244,  244,    0,  216,  215,  244,
+      244,  244,    0,    0,    0,    0,  256,  278,  278,  278,
+        0,    0,  333,    0,  317,  316,  333,  333,  333,  350,
+
+        0,    0,  376,  401,  401,  401,  406,    0,  408,  407,
+        0,  417,    0,    0,  433,  433,  433,    0,  477,    0,
+      469,  468,  477,    0,  478,  498,  511,    0,  512,    0,
+      520,  519,    0,    0,  535,  534,    0,    0,  560,  654,
+        0,  566,  565,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  638,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  626,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   89,  101,    0,    0,
-        0,  279,  333,    0,  401,    0,    0,  610,  100,    0,
-        0,    0,  278,    0,    0,  609,   64,    0,   65,  334,
-        0,   71,   70,    0,    0,   85,   85,   90,    0,    0,
-        0,    0,    0,    0,    0,    0,  182,  240,  240,  240,
-      240,    0,    0,  240,  240,    0,    0,    0,    0,  241,
-      274,  274,  274,    0,    0,  301,    0,    0,  329,  329,
-      329,  329,    0,    0,    0,    0,    0,    0,  397,  397,
-
-      397,  402,    0,    0,  415,  414,    0,    0,  429,  429,
-        0,  430,    0,    0,  473,  490,  503,    0,  521,    0,
-        0,  552,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   93,  105,    0,    0,    0,  283,  337,    0,
+      405,    0,    0,  618,  104,    0,    0,    0,  282,    0,
+        0,  617,   68,    0,   69,  338,    0,   75,   74,    0,
+
+        0,   89,   89,   94,    0,    0,    0,    0,    0,    0,
+        0,    0,  186,  244,  244,  244,  244,    0,    0,  244,
+      244,    0,    0,    0,    0,  245,  278,  278,  278,    0,
+        0,  305,    0,    0,  333,  333,  333,  333,    0,    0,
+        0,    0,    0,    0,  401,  401,  401,  406,    0,    0,
+      419,  418,    0,    0,  433,  433,    0,  434,    0,    0,
+      477,  498,  511,    0,  529,    0,    0,  560,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  626,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  638,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  279,  350,    0,    0,  610,    0,    0,
-        0,  278,    0,    0,  609,   64,    0,   75,   74,    0,
-        0,    0,    0,    0,   97,    0,  103,  102,    0,  112,
-        0,    0,    0,  240,  240,  240,  240,    0,  214,  213,
-
-      240,  240,    0,    0,    0,    0,    0,    0,  274,  274,
-        0,    0,    0,    0,  307,  306,  329,  329,  329,    0,
-        0,    0,    0,    0,    0,  347,    0,    0,  368,  367,
-      397,  397,    0,    0,    0,  409,    0,  419,  418,    0,
-        0,    0,    0,    0,    0,    0,  473,  490,  503,    0,
-      351,  552,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  283,
+      354,    0,    0,  618,    0,    0,    0,  282,    0,    0,
+      617,   68,    0,   79,   78,    0,    0,    0,    0,    0,
+      101,    0,  107,  106,    0,  116,    0,    0,    0,  244,
+      244,  244,  244,    0,  218,  217,  244,  244,    0,    0,
+        0,    0,    0,    0,  278,  278,    0,    0,    0,    0,
+      311,  310,  333,  333,  333,    0,    0,    0,    0,    0,
+        0,  351,    0,    0,  372,  371,  401,  401,    0,    0,
+        0,  413,    0,  423,  422,    0,    0,    0,    0,    0,
+        0,    0,  477,  498,  511,    0,  355,  560,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  626,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  133,    0,  350,    0,    0,    0,  132,
-
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   81,
-       80,    0,    0,    0,  240,  240,    0,    0,  240,  240,
-      240,    0,    0,    0,    0,    0,    0,    0,    0,  274,
-        0,    0,    0,  270,  269,    0,  290,  329,  329,  329,
-        0,  325,  324,    0,    0,    0,    0,    0,    0,    0,
-      397,    0,    0,    0,  393,  392,    0,    0,    0,    0,
-      425,  424,    0,    0,    0,    0,    0,    0,  473,    0,
-        0,    0,    0,    0,  351,    0,    0,    0,    0,    0,
-        0,  562,    0,    0,    0,    0,  561,    0,    0,    0,
+        0,  638,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  137,
+        0,  354,    0,    0,    0,  136,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   85,   84,    0,    0,    0,
+      244,  244,    0,    0,  244,  244,  244,    0,    0,    0,
+        0,    0,    0,    0,    0,  278,    0,    0,    0,  274,
+      273,    0,  294,  333,  333,  333,    0,  329,  328,    0,
+        0,    0,    0,    0,    0,    0,  401,    0,    0,    0,
+
+      397,  396,    0,    0,    0,    0,  429,  428,    0,    0,
+        0,    0,    0,    0,  477,    0,    0,    0,    0,    0,
+      355,    0,    0,    0,    0,    0,    0,  570,    0,    0,
+        0,    0,  569,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  639,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
-        0,    0,    0,  627,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  137,    0,  533,    0,
+        0,  136,    0,  532,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  244,    0,    0,    0,  210,
+      209,    0,    0,  244,  244,    0,    0,    0,    0,    0,
+
+        0,    0,    0,  278,    0,  264,  263,  333,    0,    0,
+      333,    0,    0,    0,    0,    0,    0,    0,  364,  401,
+        0,  389,  388,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  477,    0,    0,    0,    0,
+      505,  504,    0,    0,  556,  555,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      133,    0,  525,    0,    0,  132,    0,  524,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  240,
-        0,    0,    0,  206,  205,    0,    0,  240,  240,    0,
-        0,    0,    0,    0,    0,    0,    0,  274,    0,  260,
-      259,  329,    0,    0,  329,    0,    0,    0,    0,    0,
-        0,    0,  360,  397,    0,  385,  384,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  473,
-        0,    0,    0,    0,  497,  496,    0,    0,  548,  547,
-
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   21,   29,    0,
+        0,    0,    0,   20,   28,    0,  120,    0,  533,  564,
+      119,    0,  532,  563,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,  146,    0,
+      244,    0,  208,  207,    0,  212,  211,  244,  244,    0,
+        0,    0,    0,    0,    0,    0,    0,  278,  333,    0,
+      319,  318,  333,    0,    0,  340,    0,    0,  339,  401,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   21,   29,    0,    0,    0,    0,   20,   28,    0,
-      116,    0,  525,  556,  115,    0,  524,  555,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  142,    0,
-      240,    0,  204,  203,    0,  208,  207,  240,  240,    0,
-        0,    0,    0,    0,    0,    0,    0,  274,  329,    0,
-      315,  314,  329,    0,    0,  336,    0,    0,  335,  397,
+        0,    0,    0,    0,    0,  576,    0,    0,    0,  575,
+        0,    0,    0,    0,    0,  591,  599,    0,    0,    0,
+        0,  590,  598,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
+       23,    0,    0,    0,   22,    0,  120,    0,  564,  119,
+        0,  563,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  244,    0,    0,  244,
+        0,    0,  234,    0,    0,    0,  233,    0,  278,    0,
+        0,    0,    0,    0,    0,    0,    0,  401,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  568,    0,    0,    0,  567,    0,    0,    0,    0,
-        0,  583,  591,    0,    0,    0,    0,  582,  590,    0,
+        0,  473,  472,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  546,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  593,    0,    0,    0,  592,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   23,    0,    0,    0,   22,    0,  116,    0,
-      556,  115,    0,  555,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  240,    0,    0,  240,    0,    0,
-      230,    0,    0,    0,  229,    0,  274,    0,    0,    0,
-        0,    0,    0,    0,    0,  397,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  469,
-
-      468,    0,    0,    0,    0,    0,  538,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  585,    0,    0,    0,
-      584,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  146,  145,
-       60,    0,   59,    0,   77,    0,   76,    0,    0,  129,
-        0,  240,    0,    0,    0,    0,    0,    0,    0,  232,
-        0,    0,  231,  274,    0,  309,  308,    0,    0,    0,
-      338,  340,  337,  339,  397,  421,    0,  420,    0,    0,
-      455,  451,    0,    0,  454,  450,    0,  486,    0,  485,
-        0,  566,    0,    0,  565,    0,    0,    0,  575,    0,
-
-        0,    0,    0,    0,    0,  622,    0,  621,    0,    0,
-        0,    0,   12,    0,   12,    0,   33,    0,    0,    0,
-        0,   31,   32,    0,    0,    0,    0,   30,  146,  145,
-       58,   57,    0,    0,    0,  240,    0,    0,    0,    0,
-        0,  228,  227,    0,    0,    0,    0,  274,    0,    0,
-        0,    0,  397,    0,    0,    0,    0,    0,    0,  484,
-      483,  560,  564,  559,  563,  595,    0,    0,    0,    0,
-      593,  594,    0,    0,    0,    0,  592,  620,  619,    0,
-        0,    0,    0,    0,    0,    0,    0,   25,    0,    0,
-        0,    0,   24,    0,    0,    0,    0,  159,    0,    0,
 
+        0,    0,    0,    0,    0,    0,    0,    0,  150,  149,
+       60,    0,   64,    0,   59,    0,   63,    0,   81,    0,
+       80,    0,    0,  133,    0,  244,    0,    0,    0,    0,
+        0,    0,    0,  236,    0,    0,  235,  278,    0,  313,
+      312,    0,    0,    0,  342,  344,  341,  343,  401,  425,
+        0,  424,    0,    0,  459,  455,    0,    0,  458,  454,
+        0,  490,    0,  494,    0,  489,    0,  493,    0,  574,
+        0,    0,  573,    0,    0,    0,  583,    0,    0,    0,
+        0,    0,    0,  630,    0,  634,    0,  629,    0,  633,
+        0,    0,    0,    0,   12,    0,   12,    0,   33,    0,
+
+        0,    0,    0,   31,   32,    0,    0,    0,    0,   30,
+      150,  149,   58,   62,   57,   61,    0,    0,    0,  244,
+        0,    0,    0,    0,    0,  232,  231,    0,    0,    0,
+        0,  278,    0,    0,    0,    0,  401,    0,    0,    0,
+        0,    0,    0,  488,  492,  487,  491,  568,  572,  567,
+      571,  603,    0,    0,    0,    0,  601,  602,    0,    0,
+        0,    0,  600,  628,  632,  627,  631,    0,    0,    0,
+        0,    0,    0,    0,    0,   25,    0,    0,    0,    0,
+       24,    0,    0,    0,    0,  163,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  587,    0,    0,    0,    0,  586,    0,
+        0,  595,    0,    0,    0,    0,  594,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  234,    0,  233,    0,  258,  257,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  379,
-      378,    0,    0,  449,    0,  448,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   11,    0,    0,    0,
-
-        0,    0,    0,    0,    0,   79,   78,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  236,
-      235,    0,    0,    0,    0,    0,    0,    0,    0,  423,
-      422,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  238,    0,  237,    0,  262,  261,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  383,  382,    0,
+        0,  453,    0,  452,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   11,    0,    0,    0,    0,    0,
+        0,    0,    0,   83,   82,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  240,  239,    0,
+        0,    0,    0,    0,    0,    0,    0,  427,  426,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      453,  452,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   35,    0,    0,    0,   34,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  457,  456,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
+        0,   35,    0,    0,    0,   34,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  597,    0,    0,    0,  596,    0,    0,    0,    0,
-       27,    0,    0,   26,    0,    0,    0,    0,    0,    0,
-      216,    0,    0,    0,  215,    0,    0,    0,  317,    0,
-        0,    0,  316,    0,    0,    0,  589,    0,    0,  588,
-        0,    0,   37,    0,   36,    0,    0,    0,    0,  222,
-        0,    0,  221,    0,    0,  323,    0,    0,  322,    0,
-        0,    0,  599,    0,  598,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  605,
+
+        0,    0,    0,  604,    0,    0,    0,    0,   27,    0,
+        0,   26,    0,    0,    0,    0,    0,    0,  220,    0,
+        0,    0,  219,    0,    0,    0,  321,    0,    0,    0,
+      320,    0,    0,    0,  597,    0,    0,  596,    0,    0,
+       37,    0,   36,    0,    0,    0,    0,  226,    0,    0,
+      225,    0,    0,  327,    0,    0,  326,    0,    0,    0,
+      607,    0,  606,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   39,   38,    0,  192,    0,  191,    0,
+        0,   39,   38,    0,  196,    0,  195,    0,    0,    0,
+        0,    0,    0,    0,    0,  609,  608,    0,    0,  198,
 
-        0,    0,    0,    0,    0,    0,    0,  601,  600,    0,
-        0,  194,  193,  220,    0,  219,    0,  321,    0,  320,
-        0,    0,    0,  218,  217,  319,  318,    0,    0,    0,
+      197,  224,    0,  223,    0,  325,    0,  324,    0,    0,
+        0,  222,  221,  323,  322,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -838,13 +1079,13 @@ static yyconst flex_int16_t yy_accept[3930] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
         0,    0,    0,    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,    0,    0,   13,    0
     } ;
 
-static yyconst YY_CHAR yy_ec[256] =
+static const YY_CHAR yy_ec[256] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    2,    4,    1,    1,    1,    1,    1,    1,    1,
@@ -876,7 +1117,7 @@ static yyconst YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst YY_CHAR yy_meta[76] =
+static const YY_CHAR yy_meta[76] =
     {   0,
         1,    2,    2,    2,    1,    1,    1,    1,    1,    3,
         3,    1,    4,    4,    4,    5,    6,    1,    7,    8,
@@ -888,7 +1129,7 @@ static yyconst YY_CHAR yy_meta[76] =
         5,    5,    5,    5,    5
     } ;
 
-static yyconst flex_uint16_t yy_base[4482] =
+static const flex_int16_t yy_base[4570] =
     {   0,
         0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
        14,   17,   33,   36,   49,   55,   45,   61,  109,  176,
@@ -919,4081 +1160,4120 @@ static yyconst flex_uint16_t yy_base[4482] =
      2405, 2408, 2411, 2416, 2433, 2473, 2476, 2479, 3739, 3804,
       204, 2495, 3869, 3938, 2484, 2502, 4007, 4074, 2542, 2545,
      2548, 2552, 2609, 2612, 2615, 2620, 2677, 2680, 2683, 2688,
-     2705, 2708, 2748, 2751, 2754, 2759, 2776, 2779, 4141, 4209,
-     2819, 2822, 2825, 2830, 2847, 2887, 2890, 2893,    0,    0,
-    10472,13842,13842,   96,  100,   29,   41,13842,  103,   51,
-
-    13842,13842,10453,13842,13842,10442,13842,10457,10453,  674,
-    13842,13842,13842,13842,10451,10451,10401,13842,  160,10428,
-        0,   87,13842,10394,10378,13842,  166, 4273,10376, 4344,
-     2906, 1200,10428,   31,13842,  169,10415,    0,  120,13842,
-    10366,10361,   21,13842,  256,  154,   84,  153,13842,  261,
-    10408,    0,  211,13842,10357,10362,10363,10357,10350,13842,
-      264,   16,10364,  237,13842,  326,10393,    0,  248,13842,
-    10362,13842,  329,  305,13842,  332,10387,    0,  282,13842,
-    10356,10352,10350,13842,  394,  373,13842,  397,10379,    0,
-      350,13842,10330,10321,10325,13842,  400,  453,  249,13842,
-
-      466,10371,    0,  418,13842,10318,10318,13842,  534,  521,
-      381,13842,  597,10364,    0,  439,13842,10311,10306,10310,
-    13842,  600,  595,  426,13842,  668,10352,    0,  442,13842,
-    10299,10317,10315,10297,10313,   81,13842,  671,  716,13842,
-      674,10338,    0,  445,13842,  141,10293,10303,   90,10284,
-       27,  450,10286,13842,  796,10337,  441,13842,  799,10324,
-        0,  507,13842,10290,13842,  862,10330,  509,13842,  865,
-    10317,    0,  554,13842,10265,10271,10277,10261,  242,13842,
-      868,  313,10266,  594,13842,  930,10303,    0,  584,13842,
-    10258,10268,10251,13842,  933,  784,13842,  936,10295,    0,
-
-      625,13842,10256,13842,  995, 2911,10297,  713,13842,  998,
-    10288,    0,  696,13842,10257,10249,10251,  164,13842, 1001,
-    10288,  726,13842, 1004,10275,    0,  818,13842,10236,10240,
-    13842, 1063,  841,13842, 1066,10268,    0,  886,13842,10234,
-    10236,13842, 1069,  909,13842, 1072,10261,    0,  954,13842,
-    10230,10210,13842, 1134, 1113,13842, 1137,10254,    0, 1022,
-    13842,10202,10200,10203,10213,10215,  514,13842, 1140, 1181,
-     1187,13842, 1202,10240,    0, 1090,13842,10205,13842, 1207,
-     1534,  664, 1203,  727,  677,  773,13842, 1275,10238,    0,
-     1158,13842,10183,10188,10193, 9562, 9555,13842, 1333,  258,
-
-      917,13842, 1336, 9602,    0, 1226,13842, 9568, 9570,13842,
-     1343, 1321,13842, 1402, 9599,    0, 1253,13842, 9564, 9564,
-     1265, 9566,  920,13842, 1411, 1389,13842, 1471, 9594,    0,
-     1362,13842, 9545,  583,13842, 1480, 1395, 1045,13842, 1537,
-     9591,    0, 1431,13842, 9539, 9549,13842, 1540, 1458,13842,
-     1600, 9580,    0, 1500,13842, 9522, 9525, 9531, 9509,13842,
-     1656, 9569, 1189,13842, 1662, 9556,    0, 1524,13842, 9511,
-     9515, 9503, 9507,13842, 1665,  449, 9502, 1195,13842, 1724,
-     9530,    0, 1558,13842, 9491, 9494, 9484, 1775, 9488,13842,
-     1730, 9512,    0, 1616,13842, 9469, 9471, 9460,13842, 1733,
-
-     1845,13842, 1798, 9506,    0, 1640,13842, 9467, 9455,13842,
-     1801, 4415, 9452, 2977, 1234,13842, 1806, 9496,    0, 1651,
-    13842, 9431, 9425,  776,13842, 1868, 1522, 1249, 1871, 1247,
-     9421,13842, 9481, 9469,13842,13842,13842, 1973,   90, 9401,
-     9400, 9397, 9442,13842,    0, 2555, 9391, 9437, 9414, 1276,
-      332,  320, 9387, 9384, 9378, 9371, 1651,  467, 9350, 9351,
-     9352, 1859, 9372,  712,  856, 9346, 9345, 9335, 1914,  797,
-     9319, 9320, 9312, 9336,  732, 1969,  992, 9309,  868, 1069,
-    13842,    0, 9303, 9316, 9312, 9300, 9332, 9295,13842,    0,
-     9288, 9282, 9287, 9285, 9283, 9267, 1330,13842,    0, 9255,
-
-     9263,13842,    0, 9248, 2897, 9237, 9254,13842,    0, 9234,
-     9242, 9238, 9237,13842,    0, 9217, 9233, 9219,13842,    0,
-     9199, 9218, 9213, 9212,13842,    0, 2900, 2958, 9193, 9206,
-     9187, 9185, 9176, 9170,13842,    0, 9171, 3028, 9152, 3031,
-     9137, 9143, 9139, 9148, 9143, 9124, 9140, 9130, 9123, 9112,
-     9123,13842,    0, 3036, 9112,13842,    0, 9113,  177, 3054,
-     9092, 9102, 9105, 9096, 9088,13842,    0, 9078, 3057, 3097,
-     9091,13842,    0, 9086, 9087, 9086, 9060,13842,    0, 9044,
-     3100, 9035, 9053, 9051, 9039,13842,    0, 9031, 3103, 9025,
-    13842,    0, 3107, 9024, 9017,13842,    0, 9012, 9009, 9009,
-
-    13842,    0, 9013, 9011, 8991, 3110, 8985, 8994, 8993, 8977,
-     8979,13842,    0, 8965, 8966, 1341, 1401, 1980, 1416, 1528,
-     1983,13842,    0, 8965, 8959, 8964, 8975, 8972, 8948,13842,
-        0, 3165, 8950, 8941,13842,    0, 8942, 3168, 8930, 8945,
-     8931, 8939, 8933, 8932, 8917,13842,    0, 8913, 8927, 8915,
-     8892,13842,    0, 8893, 3171, 8886,13842,    0, 8882, 8881,
-     3175, 8865, 8857,13842,    0, 8860, 3178, 8869, 8845, 8844,
-     8847,13842,    0, 8844, 3233, 8837,   13, 8833, 8867,13842,
-        0, 8832, 8813, 8825, 8804,13842,    0, 3236, 8795, 8789,
-    13842,    0, 8793, 8808, 8804, 8792, 8774, 8822, 8830, 1693,
-
-     8777,13842, 1918,    0, 8772, 8762, 8808, 8806, 8758,13842,
-     3239, 2109, 8750, 2964, 3301, 2052, 8749, 8760, 8751, 8730,
-     8742, 8712, 8718, 8709, 8718, 8706, 1406, 8697, 8700, 8684,
-     8684, 8675, 8675, 8687, 8669, 8667, 2175, 8677, 8656, 8669,
-     8645, 8646, 8650, 8630, 8638, 8620, 8625, 8622, 8608, 2233,
-     8599, 8601, 8593, 3243, 3312, 3246, 3316, 3304, 3307, 8598,
-     8608, 8585, 8591, 8596, 8579, 3369, 3379, 8589, 8569, 3372,
-     3382, 8581, 3431, 2301, 8579, 3436, 3440, 3443, 3497, 3485,
-     3489, 3494, 3503, 3554, 3557, 3560, 3568, 3572, 3624, 3627,
-     3633, 3691, 2372, 3694, 2436, 3697, 3718, 3762, 3772, 3776,
-
-     3642, 3780, 1866, 3766, 2505, 8568, 3825, 2574, 3830, 8562,
-     8547, 8556, 8551, 8535, 8536, 8547, 8535, 8523, 3833, 3836,
-     3839, 2640, 3843, 3890, 8524, 8514, 8521, 3896, 2711, 8520,
-     8515, 8497, 3899, 3902, 1687, 8502, 3905, 2782, 3909, 2988,
-     3958, 3967, 8509, 3961, 3970, 2584, 8499, 8507, 3980, 3063,
-     8501, 8487, 8479, 3973, 4032, 8493, 4037, 3128, 4040, 4043,
-     4047, 3196, 8475, 4094, 4100, 8480, 8465, 4103, 4106, 8473,
-      385, 8462, 4109, 3265, 4114, 8472, 8435, 4163, 4171, 8451,
-     8428, 4175, 4178, 8424, 8419, 8417, 8413, 8423, 8396, 8403,
-     8407, 8381, 4182, 4229, 4232, 3335, 8377, 4238, 4241, 8384,
-
-     4244, 3522, 4250, 8374, 4264, 8369, 8372, 8375, 4268, 4271,
-     4278, 4296, 4299, 4302, 4307, 8352, 4310, 3591, 4342, 4350,
-     8368, 8342, 4353, 3654, 8352, 4356, 4365, 8336, 4371, 3700,
-     8349, 8348, 4377, 4380, 1725, 8343, 4384, 3722, 8327, 8360,
-     4413, 4419,13842, 8311, 8318, 8315, 4422, 4426, 4389, 3928,
-     8286, 4441, 4448, 4451, 4455, 4460, 4485, 4493, 4496, 8332,
-    13842,13842,  721, 8286,13842, 8329, 8324, 8272,13842,13842,
-     8265, 4055,13842,13842, 8275, 4499, 4507,13842, 4518, 1876,
-     8267, 8256, 8249, 8252, 8260, 8249, 8238, 8227, 8212, 8218,
-     8214, 8219, 8208, 8199, 8195,  477, 8210, 8192, 8193, 8206,
-
-     8203, 1721, 2119, 8191, 8194, 8183, 8173, 8162, 8159, 8166,
-     8160, 8135, 8126, 8126, 8136, 8133, 8116, 8101, 8085, 4522,
-     4197, 8077, 8069, 4526, 4530, 8081, 4546, 4549,13842, 4552,
-     8070, 8054, 4540, 8072, 8057, 8036, 4559, 4571,13842, 4574,
-     8027, 8042, 4578, 4581,13842, 4584, 8022, 4593,13842,13842,
-     8030, 4603, 4606,13842, 4609, 4612, 4618, 8018, 8017, 4630,
-     4633, 4642, 4648,13842, 4651, 4654, 4661, 4672, 4675, 4683,
-     4686,13842, 4690, 4693, 4696, 8015, 8011, 4705, 4711, 4719,
-     4723,13842, 4726, 4729,13842,13842, 4738,13842,13842, 4746,
-     4750, 8019, 8018, 7980, 7973, 4758, 4764,13842, 4767, 7940,
-
-     7953, 7944, 4770,13842,13842, 4778, 4786,13842,13842, 4796,
-     4799, 7921, 7938, 7924, 7921, 7917, 7894, 7868, 7855, 1129,
-     4807, 4810,13842, 4817, 4820,13842,13842, 4829, 4832,13842,
-     4836, 7836, 7823, 4839, 4842,13842,13842, 7775, 7766, 7762,
-     4851, 4857,13842, 4860, 7683, 4863, 4866,13842,13842, 4882,
-    13842,13842, 4890, 4893,13842, 4898, 4901, 4904, 4912,13842,
-     4919, 7674, 7651, 4927,13842,13842, 7657, 7611, 7484, 4923,
-     4938,13842, 4942, 7485, 4945,13842,13842, 4953, 4957,13842,
-     4961, 4966,13842,13842, 7479, 4976, 4980,13842, 4983, 4987,
-     4990, 4995, 5008,13842, 5014, 7452, 7444, 7288, 7148, 5017,
-
-    13842,13842, 5027, 5035, 7076, 7012, 5045, 5048,13842, 5051,
-     6996,   13, 5054, 5057,13842, 5060,   25,  119, 1732,  197,
-      244, 5079,  267,  288,  307, 5083, 5086,13842, 5089, 5093,
-    13842,13842,  325, 5109, 5112,13842, 5115,  385, 5118,13842,
-    13842, 5135, 5138, 5146, 5153, 5157,  420, 5165,  421, 5171,
-     5174,13842, 5178, 5183, 5186, 5197, 5201,  480, 5209, 5215,
-    13842, 5218,  487, 5221,13842,13842, 5229, 5240,13842, 5243,
-      528,  531, 5248,13842,13842,  558, 5262, 5265,13842, 5269,
-      554, 5272,13842,13842,  549, 5288, 5291, 5294,13842, 5297,
-      557, 5300, 5306,13842,13842, 5318,  588, 5321, 5324,13842,
-
-     5327,  591, 5332,  597, 5336, 5346,13842, 5350, 5356,13842,
-    13842,  595, 5365, 5369,13842, 5372, 5376, 5384,  586,  612,
-     5394, 5399,  628, 5407, 5412,13842, 5416, 1309, 5419,13842,
-    13842,  667,  705,  681, 5422,13842,  713,  721,  782,  798,
-      784,  811,  842,  854, 2179,  845, 2237,  918,  911, 2122,
-      928,  931, 2515,  922,  934,  960,  993, 2650, 2858,  978,
-      999,  983,  990,  985, 2999, 1008, 3139, 3206, 1061, 1066,
-     1067, 3274, 1068, 3391, 1070, 5441,13842,13842, 1077, 1131,
-     5449,13842,13842, 1115, 5426, 3402, 1129, 5457, 5460, 1120,
-     1156, 1222, 5468, 1213, 5478, 5471, 1223, 1268, 5482, 5490,
-
-    13842,13842, 1253, 1273, 5501,13842,13842, 5509, 5512,13842,
-    13842, 5521,13842,13842, 5531, 5534,13842,13842, 1318, 1336,
-     5543,13842,13842, 5551, 5554,13842,13842, 1317, 1341, 5563,
-     1323, 5566, 5570, 5573, 5576, 5581, 5600, 5608,13842,13842,
-     5594, 5616, 5619, 5625, 5628, 5637, 5648, 5651, 5655, 5658,
-     5661, 5676, 1361, 1359, 5669, 5680, 1403, 5695, 1428, 5699,
-     1417, 5702, 5706, 5714, 5723, 5734, 5742, 3992, 1462, 1473,
-     1463, 1479, 5745, 1462, 5749, 5752, 5756, 5770, 5775, 1476,
-     5784, 1485, 5788, 1521, 1535, 5791,13842,13842, 5809, 1548,
-     5812, 1543, 1536, 5815, 1569, 1583, 1588, 1580, 1589, 5818,
-
-     5821, 1579, 1592, 1602, 5836, 5839, 5842, 1612, 5846,13842,
-    13842, 5857, 5861, 5869,13842,13842, 1621, 5878, 5883, 1635,
-     5891, 5896,13842,13842, 5906,13842,13842, 1635, 5914, 1651,
-     5917, 1653, 1652, 1663, 5920, 1656, 5923, 5926, 5929, 5944,
-     1663, 5947, 5950, 1677, 1717, 5958, 1709, 5965, 5968, 5977,
-     5986, 1714, 5989, 5995,13842,13842, 1712, 1731, 6010,13842,
-    13842, 1729, 6019, 1822, 1786, 6022,13842, 1807,13842,13842,
-     1787, 1778, 3516, 1794, 1787, 1785, 1800, 1802, 1809, 3586,
-     1807, 1823, 3664, 1845, 1863, 3732, 3759, 1854, 1853, 3786,
-     1861, 3799, 1868, 3999, 3923, 1888, 4002, 1898, 1908, 1905,
-
-     1922, 1924, 4065, 1918, 1929, 4068, 4127, 4503, 1933, 6025,
-     4132, 1926, 6028, 6031, 6042, 6045, 6048, 6051, 1955, 1958,
-     6054,13842,13842, 1969, 1967, 1962, 6066, 1979, 6075, 6078,
-     6086, 1990, 1971, 6098, 6101, 6105, 6108, 6123, 6127, 6132,
-     6135, 6138, 6150, 6156, 6159, 6168, 6175, 6178, 6190, 6181,
-     6186, 6204,13842,13842, 6212, 6215, 6218, 6221, 6224, 6242,
-     6245, 6248, 6256, 6266, 6274, 6284, 6287, 1997, 1988, 6293,
-    13842,13842, 6306, 6309, 6315, 1998, 6329, 4135, 6332,13842,
-    13842, 6340, 6348,13842,13842, 6344, 2004, 1984, 2019, 2035,
-     6359, 2033, 6363, 6366, 6369, 6378, 6384,13842,13842, 2041,
-
-     6393, 2045, 6397, 6400, 6415, 2035, 6418, 6421, 2044, 6429,
-     2037, 2039, 6438, 6441, 2048, 2037, 2047, 2050, 6444,13842,
-    13842, 2058, 2082, 2089, 6452, 6457, 6461, 6471, 2090, 6475,
-    13842,13842, 2102, 6483,13842,13842, 2093, 6492, 2099, 6495,
-     2104, 6498, 6501, 6505, 6519, 6523, 2100, 6526, 6530, 6538,
-    13842,13842, 6551, 2121, 6555,13842,13842, 2114, 2133, 6563,
-     2115, 6566, 3303, 3609, 6574, 6578, 6586, 2145, 6592, 6595,
-     6600, 6605, 6618, 2262, 2196, 2254,13842, 6623, 2163, 6626,
-     2158, 2159, 2308, 2155, 2158, 6629, 2169, 2176, 2162, 2210,
-     6632, 2212, 2212, 6641, 6644, 6647, 2229, 6650, 2233, 2218,
-
-     2235, 2239, 2379, 2237, 2244, 2255, 2291, 6655, 6658, 2296,
-     6661, 2299, 2283, 6664, 6667, 6675, 6678, 2298, 6686, 2288,
-     2296, 2298, 2300, 2313, 6689, 2310, 6693,13842,13842, 6708,
-     2308, 6701, 6711, 6714, 6720, 6732, 6735, 6743, 6746, 6750,
-     6755, 6768, 6774, 6782, 6786, 6789, 6797, 6804,13842,13842,
-     6815, 6818, 6826, 6829,13842,13842, 6837, 6845, 2321, 2333,
-     2324, 6840, 6858, 6866, 2358, 2372, 6869,13842,13842, 6879,
-     6884, 2355, 2350, 6892, 6897, 2369, 2378, 6900, 6904, 6912,
-    13842,13842, 2372, 6920,13842, 6923, 6927, 6930, 2362, 6933,
-     2392, 2385, 6939,13842, 2380, 6952, 6958,13842,13842, 6966,
-
-     2416, 6971, 2389, 6975,13842,13842, 6990, 6993, 2399, 7004,
-    13842,13842, 2392, 7014,13842, 2385, 7017, 7020, 7023, 7026,
-     2401, 7029, 2421, 2423, 2419, 2432, 7035, 7039,13842,13842,
-     7047,13842, 2428, 7050, 2435, 7054, 2437, 7057, 2446, 7060,
-     7068, 7079, 7087, 7090, 7093, 7108, 7111, 7115,13842,13842,
-     7129, 2445, 2460, 2493, 7132, 7135, 2515, 2517, 2545, 2524,
-     2540, 2528, 2598, 2528, 7138,13842,13842, 7153, 7156, 7159,
-    13842, 7163, 7168, 7184, 7187, 2523, 7195, 2605, 2669, 2565,
-     7202, 7205, 7214, 2515, 2551, 2582, 2562, 2565, 7220, 7223,
-     7226, 2571, 7229, 2572, 2578, 2586, 7232, 7235, 7238, 7241,
-
-     2591, 2587, 7244, 2619, 2654, 2630, 2632, 7247, 7250, 2634,
-     7253, 7258, 7261, 2635, 2631, 7264,13842,13842, 7272,13842,
-    13842, 2650, 7280, 2640, 7283, 7289, 7292, 7295, 7301,13842,
-     2647, 7313, 2661, 7316, 7320, 7328, 7335,13842,13842, 7343,
-    13842,13842, 7351, 7358, 7361,13842,13842, 7377,13842,13842,
-     7385, 7391,13842,13842, 7399, 7404, 7413,13842,13842, 7421,
-     7424,13842,13842, 2656, 2661, 2675, 7433,13842,13842, 7441,
-     7444, 2672, 2662, 7452,13842,13842, 2694, 7460, 7463, 7466,
-     2698, 2691, 7469,13842,13842, 2703, 7478, 7485, 2708, 7489,
-     7493, 2712, 2703, 2709, 2708, 7507, 7512, 2720, 7515,13842,
-
-     2713, 7519,13842,13842, 2718, 2728, 2728, 7538, 7541, 7549,
-     7552, 7556, 7559, 7562, 7568, 7571, 7580, 7576, 2725, 7589,
-     7598, 2743, 7607, 2743, 7610,13842, 2727, 7615, 7622,13842,
-    13842, 7630, 7637, 7648,13842,13842, 7656, 7659, 7662, 7670,
-     2731, 2757, 2783, 7677,13842, 7680, 7683, 2796, 2796, 2796,
-     2803, 2813, 2806, 2803, 2804, 2810, 2826, 7691, 7698, 7703,
-     7712,13842,13842, 7723,13842,13842, 2801, 7731, 7734, 2846,
-     2838, 7738, 5101, 7350, 7746, 7753, 7756, 2788, 2787, 2801,
-     7759, 7762, 2823, 7765, 7768, 2834, 7771, 7774, 7777, 2838,
-     2846, 2858, 7780, 7783, 2846, 2847, 2857, 7786, 7789, 2861,
-
-     7792, 7795, 2856, 2863, 2875, 2880, 7800, 7803, 7806, 7809,
-     7819, 7824, 7827, 7830, 7833, 7837, 7845,13842,13842, 7855,
-     7859, 7862, 7865, 7868,13842,13842, 7884, 2876, 2876, 2913,
-     7887,13842,13842, 7897, 2887, 2896, 7903, 7908, 7916, 7921,
-    13842, 2901, 2911, 2916, 7928, 7931, 7935, 7940,13842,13842,
-     7953, 7956, 7959, 7962, 7965, 7984, 7990, 2914, 2924, 2925,
-     7993, 7996,13842,13842, 8004, 8012, 8015, 8023, 8019, 8033,
-     8037, 8040, 8043, 8055,13842,13842, 8046, 8051,13842, 2935,
-     2933, 8065,13842, 8070,13842,13842, 8078, 8086,13842,13842,
-     8097, 2924, 2926,13842, 8100,13842,13842, 2971, 2958, 2974,
-
-     2972, 2979, 2997, 2989, 3010, 3005, 3015, 8108, 8116, 8089,
-     8102, 2993, 8130, 8136, 3055, 3103, 2984, 2991, 3001, 2987,
-     3005, 3007, 3012, 3057, 3010, 3035, 8139, 8145, 3051, 3048,
-     3066, 8149, 8155, 3056, 8158, 3054, 3073, 8161, 8164, 3074,
-     3071, 3122, 8167, 3109, 3122, 8171, 3125, 8174,13842, 8177,
-     8180,13842,13842, 8188, 8194, 8202, 8206, 8209, 8212, 8215,
-     8220, 8233, 8236, 8239, 8242, 8245,13842, 3140, 3128, 3123,
-     3146, 8248, 8266, 3143, 3152, 8274, 3232, 3363, 8282,13842,
-     3142, 3161, 8285, 8288, 8291,13842, 8294, 8312, 3189, 3190,
-     3192, 8320, 8323, 8326, 8297, 8334, 8341, 8347, 3185, 3188,
-
-     8355, 8359, 8362, 8366,13842,13842, 8374, 8377, 8385, 8388,
-     8392,13842, 8397, 8411, 3205, 3203, 3202, 8406,13842, 8419,
-     3208, 3201, 3236, 3231, 3262, 3264, 3292, 3279, 3274, 3290,
-     3281, 3308, 8426, 3282, 3287, 3330, 3283, 3290, 3316, 3321,
-     3362, 3323, 3340, 3369, 8429, 3433, 3437, 3417, 3366, 3382,
-     3384, 3391, 3395, 3390, 3393, 3405, 3438, 3442, 3445, 3439,
-     3441, 3467, 3489, 8432, 8438, 3464, 3476, 8441, 3462, 3479,
-     3528, 8448, 3502, 3515, 8451, 8454, 8457,13842,13842, 8465,
-     8468, 8476, 8488, 8483,13842, 8496,13842,13842, 8504,13842,
-     8507, 8510, 8513, 3513, 3519, 8516, 3514, 8519,13842,13842,
-
-     3527, 3527, 3560, 3619, 3563, 3563, 3637, 3566, 3545, 8534,
-     8537, 8540, 8548, 8555,13842,13842, 3575, 3585, 3591, 8570,
-     8574, 8582, 4251, 4291, 8590,13842, 8593, 8596,13842,13842,
-     3580, 8604, 8612, 8615, 8623,13842, 8626,13842,13842, 8634,
-     8638, 8646, 8653, 8664, 3692, 3829, 3600, 8672, 8675, 8678,
-     8681, 8684, 3639, 3665, 3681, 3686, 3705, 3682, 3692, 3691,
-     3710, 3729, 8693, 3685, 3708, 3707, 3711, 3714, 3721, 3723,
-     3737, 3734, 3738, 3785, 3779, 8697, 8702, 3835, 3916, 3960,
-     3789, 3800, 3787, 3804, 3814, 3841, 3827, 3836, 3840, 3857,
-     3866, 3871, 3864, 8705, 3871, 8708, 3913, 3916, 3919, 8715,
-
-     3925, 3937, 3945, 8721, 8724, 8732, 4102, 4138, 8740,13842,
-    13842, 8751, 8755, 8758, 3936, 8761, 8764, 8770, 8782, 3977,
-     3978, 4015, 3998, 4031, 4024, 4051, 4059, 4078, 4077, 4070,
-     8785, 8788, 8796,13842,13842, 8804,13842, 4063, 8808, 4073,
-     8811,13842,13842, 4121, 4132, 4132, 4135, 4136, 4150, 8826,
-     4141, 8829, 8832, 8841,13842,13842, 8849, 4167, 4212, 8857,
-    13842,13842, 4155, 4160, 4285, 4166, 4171, 4315, 4145, 8865,
-     8868, 8876, 8879, 8887, 8890, 8894, 8897, 4213, 4213, 4214,
-     4218,13842, 4239, 4237, 4239, 4245,13842, 8906, 4221, 4230,
-     4219, 4256, 4265, 4278, 4265, 4276, 4265, 4282, 4293, 4301,
-
-     8912, 8915, 8925,13842, 4369, 4343, 8930, 4295, 4309, 4325,
-     4392, 4398, 4346, 4341, 4350, 4378, 4423, 4426, 4379, 4387,
-     8933, 4377, 8936, 4379, 4402, 8939, 4390, 8944, 4400, 8952,
-     4436, 4440, 4448, 4465, 4462, 4468, 8960, 8963, 8966, 4453,
-     8969, 8972, 8987,13842,13842, 8995, 8998, 4441, 4450, 4490,
-     4482, 4495, 4496, 4512, 4497, 4517, 4517, 4509, 9006,13842,
-    13842, 4511, 9014, 9017, 4493, 4525, 4536, 4583, 4547, 4557,
-     4584, 9032,13842, 4545, 9035,13842,13842, 4573, 4591, 4588,
-     4599, 4606, 4595, 4603, 4613, 4625, 4613, 4624, 4632, 9043,
-     9047, 4637, 4666, 9055,13842,13842, 9063, 9066,13842,13842,
-
-     4626, 4647, 4674, 4661, 4664, 4696, 4710, 4712, 9074, 4667,
-     4669, 4692, 4745, 4751, 4697, 4694, 4696, 4722, 4768, 4774,
-     4724, 9078, 4751, 4759, 4773, 9086, 9089, 9093, 4752, 4738,
-     4810,13842,13842, 4764, 4771, 4778, 4841,13842,13842, 4804,
-     9108, 4804, 9112, 9116, 9119, 4805, 9125, 9128, 4840, 4852,
-     4843, 4855, 4857, 4850, 4864, 4859, 9131, 9134,13842, 9137,
-     4851, 9140,13842,13842, 9156,13842,13842, 9164, 4843, 4876,
-     4877, 4913, 4895, 4899, 4897, 4929, 4911, 4894, 9167, 9170,
-    13842,13842, 9178, 4918, 4941,13842, 4939, 4950,13842, 4930,
-     4969, 4962, 4976, 4965, 4972, 4982, 4988, 4975, 4987, 4999,
-
-     5002, 4993, 9185, 9189, 4997, 5009, 5006, 5017, 9197, 5016,
-     5036,13842, 5037, 5040, 5040,13842, 5042, 9206, 5019, 5006,
-     5070,13842,13842, 5025, 5025, 5025, 5091,13842,13842, 5048,
-     5068, 5081, 5072, 5097, 5132, 9209, 9212, 9221, 9275, 9323,
-     5063, 5064,13842, 5075, 5067, 5078,13842, 5088, 9231, 5097,
-     9234, 9240, 5104, 9243, 5156, 5125, 5161, 5132, 5177, 5153,
-     5188, 5166, 9246, 9249, 5156, 9252, 9255, 9270, 5174, 5176,
-    13842, 5209, 5191, 5190,13842, 5225, 5175, 9295, 9298, 9317,
-     9306, 5231, 5233, 5231, 5239, 5192, 5249, 5216, 5249, 5219,
-     5236, 5256, 5264, 5237, 5254, 5271, 5274, 5244, 9343,13842,
-
-    13842, 5280, 5248, 5296, 5267, 9335,13842, 5310, 5285, 5299,
-     5333, 5310, 5312, 9354, 5279, 5288,13842, 5299, 5296, 5297,
-    13842, 5323, 5377, 5345, 5382, 5355, 5387, 9357, 5411, 5428,
-     9377, 9425, 5609, 5349, 5398, 6367, 5356, 5403, 9365, 9388,
-    13842, 5427,13842, 5425,13842, 5416,13842, 5419, 9397,13842,
-     9400, 5375, 9403, 5429, 5438, 9419, 9446, 5430, 5441,13842,
-     5451, 5457,13842, 5433, 9454,13842,13842, 9462, 5462, 5481,
-    13842,13842,13842,13842, 5441,13842, 5476,13842, 5478, 5492,
-    13842,13842, 5471, 5503,13842,13842, 5481,13842, 5516,13842,
-     5517,13842, 5522, 5525,13842, 5530, 5535, 9472,13842, 6510,
-
-     5498, 5544, 6849, 5511, 5553,13842, 5558,13842, 5578, 5571,
-     5587, 5625, 5582, 5585, 5581, 9475,13842, 5532, 5558, 5552,
-     5619,13842,13842, 5570, 5618, 5605, 5667,13842, 9411, 9437,
-    13842,13842, 5647, 5649, 9478, 9481, 5672, 5704, 5689, 5738,
-     9484,13842,13842, 5657, 5667, 5674, 5697, 9499, 5739, 5769,
-     5741, 5797, 9502, 5690, 5694, 5720, 5713, 5735, 5731,13842,
-    13842,13842,13842,13842,13842,13842, 5697, 5716, 5706, 5827,
-    13842,13842, 5718, 5746, 5735, 5844,13842,13842,13842, 9505,
-     5795, 5781, 5799, 9508, 5779, 5762, 5769,13842, 5804, 5807,
-     5797, 5802,13842, 5824, 5837, 5843, 9511,13842, 9520, 9531,
-
-     5850, 5858, 5874, 5868, 5863, 5871, 5884, 5880, 5869, 5930,
-     5894, 5932, 9539, 9542, 5903, 5922, 5935, 5925, 5923, 5932,
-     5951, 5942, 9550, 9557, 5936, 5942, 5979, 5972, 5986, 5978,
-     5952, 5934, 5938,13842, 5957, 5958, 5946, 5950,13842, 5968,
-     9553, 6000, 5980, 5997, 5970, 5989, 6003, 6022, 5995, 6014,
-     6066, 6066, 9568, 6058, 6105, 6046, 6058, 6054, 6066, 6062,
-     6080, 6076, 6086, 6111,13842, 6110,13842, 9576,13842,13842,
-     6085, 6090, 6107, 6117, 6113, 6123, 6126, 6136, 9584,13842,
-    13842, 6161, 6164,13842, 6140,13842, 6152, 6142, 6161, 6132,
-     6152, 6153, 6172, 6159, 6178, 6221,13842, 6168, 6166, 6167,
-
-     6179, 6175, 6175, 6187, 6199,13842,13842, 6240, 6234, 6243,
-     6242, 6242, 6249, 6254, 6241, 6253, 6259, 6266, 6254,13842,
-    13842, 6270, 6276, 6277, 6265, 6276, 6289, 6289, 6280,13842,
-    13842, 6316, 6314, 6262, 6260, 6261, 6280, 6275, 6273, 6287,
-     6299, 6338, 6296, 6320, 6378, 6337, 6342, 6354, 6401, 6357,
-     6375, 6404, 6388, 6407, 6398, 6395, 6413, 6426, 6415, 6416,
-     6441, 6443, 6432, 6430, 6455, 6457, 6446, 6447, 6465, 6485,
-    13842,13842, 6448, 6459, 6508, 6463, 6456, 6477, 6537, 6494,
-     6565, 6496, 6506,13842, 6556, 6508, 6525,13842, 6577, 6554,
-     6554, 6563, 6572, 6585, 6576, 6609, 6575, 6592, 6586, 6628,
-
-     6598, 6615, 6618, 6668, 6634, 6659, 6649, 6689, 6659, 6646,
-     6653,13842, 6702, 6664, 6667,13842, 6716, 6747, 6666, 6724,
-    13842, 6671, 6731,13842, 6712, 6717, 6726, 6734, 6759, 6735,
-    13842, 6737, 6770, 6748,13842, 6745, 6788, 6763,13842, 6760,
-     6794, 6771,13842, 6772, 6751, 6809,13842, 6762, 6816,13842,
-     6832, 6752,13842, 6762,13842, 6800, 6820, 6816, 6830,13842,
-     6831, 6830,13842, 6839, 6844,13842, 6853, 6851,13842, 6865,
-     6859, 6823,13842, 6831,13842, 9592, 6903, 6902, 6894, 6922,
-     6912, 6930, 6900, 6919, 6904, 6923, 6907, 6931, 6914, 6937,
-     6959, 6957, 9595,13842,13842, 6965,13842, 6967,13842, 6974,
-
-     6941, 6978, 6945, 6984, 6954, 6991, 6957,13842,13842, 7048,
-     7066,13842,13842,13842, 6997,13842, 6996,13842, 7005,13842,
-     7003, 7053, 7056,13842,13842,13842,13842, 7081, 7084, 7055,
-     7078, 7160, 7293, 7088, 7172, 7200, 7257, 7058, 7126, 7087,
-     7161, 7148, 7307, 7251, 7269, 7128, 7331, 7292, 7308, 6994,
-     7026, 7024, 7158, 7286, 7316, 7379, 7394, 7320, 7348, 7362,
-     7384, 7401, 7418, 7336, 7480, 7268, 7400, 7509, 7528, 7238,
-     7389, 7439, 7457, 7548, 7565, 7163, 7481, 7465, 7483, 7574,
-     7600, 7569, 7578, 7260, 7420, 7529, 7585, 7617, 7650, 7464,
-     7484, 7647, 7657, 7678, 7733, 7794, 7797, 7568, 7595, 7500,
-
-     7583, 7636, 7671, 7822, 7825, 7668, 7830, 7804, 7920, 7883,
-     7907, 7895, 7925, 7699, 7875, 7711, 7959, 7927, 7957, 7131,
-     7627, 8010, 8055, 7888, 7864, 9603, 9606,13842,13842, 9626,
-     9635, 9644, 9653, 9662, 9671, 9680, 9689, 9698, 9707, 9716,
-     9725, 9734, 9743, 9752, 9761, 9770, 9779, 9788, 9797, 9806,
-     9815, 9824, 9833, 9842, 9851, 9860, 9869, 9878, 9887, 9896,
-     9905, 9914, 9923, 9932, 9941, 9950, 9959, 9968, 9977, 9986,
-     9995,10004,10013,10022,10031,10040,10049,10058,10067,10076,
-    10085,10094,10103,10112,10121,10130,10139,10148,10157,10166,
-    10175,10184,10193,10202,10211,10220,10229,10238,10245,10252,
-
-    10259,10266,10273,10280,10287,10294,10301,10308,10315,10322,
-    10329,10336,10343,10350,10357,10364,10371,10378,10385,10392,
-    10399,10406,10413,10420,10427,10434,10441,10448,10455,10464,
-    10471,10476,10483,10488,10495,10500,10507,10512,10519,10524,
-    10531,10536,10543,10548,10555,10560,10567,10572,10579,10584,
-    10591,10596,10603,10608,10615,10620,10627,10632,10639,10644,
-    10651,10656,10663,10668,10675,10680,10687,10692,10699,10704,
-    10711,10716,10723,10728,10735,10740,10747,10752,10759,10764,
-    10771,10776,10783,10788,10795,10800,10807,10812,10819,10824,
-    10831,10836,10845,10851,10858,10866,10874,10882,10889,10897,
-
-    10904,10912,10919,10927,10935,10943,10951,10959,10967,10975,
-    10983,10991,10998,11006,11014,11021,11029,11036,11044,11051,
-    11059,11066,11074,11081,11089,11096,11104,11111,11119,11126,
-    11134,11141,11149,11156,11164,11171,11179,11186,11194,11202,
-    11210,11217,11225,11232,11240,11247,11255,11262,11270,11277,
-    11285,11292,11300,11308,11316,11325,11331,11338,11346,11353,
-    11361,11368,11376,11383,11391,11398,11406,11413,11421,11429,
-    11436,11444,11451,11459,11466,11474,11482,11489,11497,11505,
-    11513,11521,11529,11536,11544,11551,11559,11566,11574,11582,
-    11590,11597,11605,11612,11620,11627,11635,11642,11650,11657,
-
-    11665,11672,11680,11687,11695,11702,11710,11717,11725,11733,
-    11741,11748,11756,11763,11771,11778,11786,11795,11804,11811,
-    11818,11826,11833,11841,11849,11857,11864,11872,11879,11887,
-    11895,11902,11910,11917,11925,11933,11941,11949,11956,11964,
-    11972,11980,11987,11995,12002,12010,12018,12026,12033,12041,
-    12048,12056,12063,12071,12078,12086,12094,12102,12109,12117,
-    12124,12132,12139,12147,12154,12162,12169,12177,12184,12192,
-    12199,12207,12214,12222,12229,12237,12246,12255,12262,12270,
-    12278,12285,12293,12301,12308,12316,12324,12332,12340,12348,
-    12356,12364,12372,12380,12388,12396,12403,12411,12419,12427,
-
-    12434,12442,12449,12457,12465,12472,12480,12487,12495,12502,
-    12510,12517,12525,12533,12540,12548,12555,12563,12570,12578,
-    12586,12594,12601,12609,12616,12624,12631,12639,12646,12654,
-    12662,12670,12679,12688,12696,12703,12711,12718,12726,12734,
-    12741,12749,12757,12765,12773,12781,12789,12796,12804,12812,
-    12819,12827,12835,12842,12849,12857,12865,12872,12880,12887,
-    12895,12903,12910,12918,12925,12933,12940,12948,12955,12963,
-    12971,12979,12987,12995,13002,13010,13018,13026,13034,13041,
-    13049,13058,13067,13074,13082,13090,13098,13105,13113,13121,
-    13129,13137,13145,13152,13160,13168,13175,13183,13191,13198,
-
-    13205,13213,13221,13228,13235,13243,13251,13259,13266,13274,
-    13281,13288,13296,13304,13312,13319,13327,13334,13342,13351,
-    13360,13367,13375,13383,13391,13399,13407,13415,13423,13431,
-    13439,13446,13454,13461,13469,13477,13485,13493,13501,13509,
-    13517,13524,13532,13540,13548,13556,13563,13570,13578,13586,
-    13593,13601,13608,13616,13625,13634,13641,13649,13657,13665,
-    13673,13681,13689,13696,13703,13711,13718,13726,13734,13741,
-    13749,13757,13764,13771,13778,13787,13796,13805,13814,13823,
-    13832
+     2705, 2708, 2748, 2751, 2754, 2759, 2776, 2779, 2819, 2822,
+     2825, 2830, 2847, 2887, 2890, 2893, 2898, 2915, 2955, 2958,
+     2961, 2966, 2983, 2986, 4141, 4209, 3026, 3029, 3032, 3037,
+
+     3054, 3057, 3097, 3100,    0,    0,10721,13930,13930,   96,
+      100,   29,   41,13930,  103,   51,13930,13930,10706,13930,
+    13930,10695,13930,10710,10708,  674,13930,13930,13930,13930,
+    10706,10706,10656,13930,  160,10683,    0,   87,13930,10649,
+    10635,13930,  166, 4273,10633, 4344, 3054, 1200,10685,   31,
+    13930,  169,10672,    0,  120,13930,10623,10618,   21,13930,
+      256,  154,   84,  153,13930,  261,10667,    0,  211,13930,
+    10616,10621,10622,10616,10609,13930,  264,   16,10625,  237,
+    13930,  326,10654,    0,  248,13930,10623,13930,  329,  305,
+    13930,  332,10648,    0,  282,13930,10617,10613,10613,13930,
+
+      394,  373,13930,  397,10642,    0,  350,13930,10593,10584,
+    10588,13930,  400,  453,  249,13930,  466,10634,    0,  418,
+    13930,10583,10583,13930,  534,  521,  381,13930,  597,10629,
+        0,  439,13930,10576,10571,10575,13930,  600,  595,  426,
+    13930,  668,10619,    0,  442,13930,10566,10584,10582,10564,
+    10580,   81,13930,  671,  716,13930,  674,10607,    0,  445,
+    13930,  141,10562,10572,   90,10553,   27,  450,10555,13930,
+      796,10606,  441,13930,  799,10595,    0,  507,13930,10561,
+    13930,  862,10601,  509,13930,  865,10588,    0,  554,13930,
+    10536,10542,10550,10534,  242,13930,  868,  313,10539,  594,
+
+    13930,  930,10576,    0,  584,13930,10531,10541,10526,13930,
+      933,  784,13930,  936,10570,    0,  625,13930,10531,13930,
+      995, 3115,10572,  713,13930,  998,10563,    0,  696,13930,
+    10532,10526,10528,  164,13930, 1001,10565,  726,13930, 1004,
+    10552,    0,  818,13930,10513,10517,13930, 1063,  841,13930,
+     1066,10547,    0,  886,13930,10513,10515,13930, 1069,  909,
+    13930, 1072,10540,    0,  954,13930,10501,10481,13930, 1134,
+     1113,13930, 1137,10529,    0, 1022,13930,10473,10471,10478,
+    10484,10486,  514,13930, 1140, 1181, 1187,13930, 1202,10515,
+        0, 1090,13930,10476,13930, 1207, 1534,  664, 1203,  727,
+
+      677,  773,13930, 1275,10509,    0, 1158,13930,10458,10459,
+    10464,10458,10447,13930, 1333,  258,  917,13930, 1336,10495,
+        0, 1226,13930,10461,10459,13930, 1343, 1321,13930, 1402,
+    10488,    0, 1253,13930,10453,10449, 1265,10451,  920,13930,
+     1411, 1389,13930, 1471,10480,    0, 1362,13930,10427,  583,
+    13930, 1480, 1395, 1045,13930, 1537,10474,    0, 1431,13930,
+    10429,10435,13930, 1540, 1458,13930, 1600,10467,    0, 1500,
+    13930,10417,10417,10427,10405,13930, 1656,10462, 1189,13930,
+     1662,10453,    0, 1524,13930,10408,10414,10402,10407,13930,
+     1665,  449,10398, 1195,13930, 1724,10439,    0, 1558,13930,
+
+    10400,10400,10398, 1775,10403,13930, 1730,10426,    0, 1616,
+    13930,10384,10386,10372,13930, 1733, 1845,13930, 1798,10418,
+        0, 1640,13930,10384,10368,13930, 1801, 4415,10366, 3110,
+     1474, 1901, 1260,10418,  676, 1776, 3183, 1638,10413, 1234,
+    13930, 1806,10404,    0, 1651,13930,10355,10346,  776,13930,
+     1868, 1522, 1249, 1871, 1318,10344,13930,10406,10391,13930,
+    13930,13930, 1973,   90,10341,10340,10334,10383,13930,    0,
+     2555,10332,10375,10357, 1330,  332,  320,10331,10327,10331,
+    10324, 1866,  467,10314,10315,10317, 1914,10337,  712,  856,
+    10311,10311,10311, 1969,  797,10299,10300,10298,10322,  732,
+
+     1980,  992,10296,  868, 1069,13930,    0,10286,10305,10301,
+    10286,10325,10288,13930,    0,10278,10272,10278, 9664, 9662,
+     9660, 1341,13930,    0, 9648, 9658,13930,    0, 9644, 3107,
+     9637, 9654,13930,    0, 9635, 9653, 9649, 9648,13930,    0,
+     9622, 9638, 9637,13930,    0, 9610, 9628, 9620, 9620,13930,
+        0, 3167, 3179, 9600, 9610, 9610, 9602, 9600, 9601,13930,
+        0, 9603, 3185, 9571, 3192, 9568, 9573, 9562, 9570, 9567,
+     9548, 9567, 9561, 9559, 9543, 9555,13930,    0, 3234, 9553,
+    13930,    0, 9554,  177, 3240, 9518, 9531, 9532, 9522, 9513,
+    13930,    0, 9486, 3243, 3252, 9500,13930,    0, 9494, 9492,
+
+     9510, 9483,13930,    0, 9478, 3261, 9470, 9485, 9474, 9462,
+    13930,    0, 9440, 3301, 9445,13930,    0, 3304, 9443, 9437,
+    13930,    0, 9436, 9432, 9419,13930,    0, 9426, 9426, 9400,
+     3307, 9394, 9407, 9410, 9388, 9391,13930,    0, 9383, 9377,
+     1344, 1401, 1983, 1207, 1416, 2037,13930,    0, 9378, 9371,
+     9377, 9387, 9372, 9356,13930,    0, 3311, 9344, 9339,13930,
+        0, 9338, 3314, 9326, 9344, 9330, 9338, 9325, 9325, 9309,
+    13930,    0, 9305, 9321, 9296, 9289,13930,    0, 9291, 3369,
+     9286,13930,    0, 9282, 9287, 3372, 9283, 9260,13930,    0,
+     9264, 3375, 9266, 9235, 9240, 9243,13930,    0, 9233, 3379,
+
+     9226,   13, 9222, 9270,13930,    0, 9230, 9219, 9228, 9203,
+    13930,    0, 3383, 9196, 9190,  936, 1004, 1072, 1140, 1528,
+     1597,13930,    0, 9194, 9203, 9199, 9187, 9169, 9223, 9231,
+     1693, 9178,13930, 2040,    0, 9173, 9172, 9218, 9216, 9149,
+    13930, 3427, 2109, 9143, 3110, 3485, 2175, 9126, 9136, 9139,
+     9124, 9137, 9116, 9111, 9105, 9115, 9099, 1406, 9107, 9109,
+     9087, 9085, 9073, 9078, 9086, 9068, 9066, 2233, 9076, 9055,
+     9068, 9046, 9047, 9061, 9049, 9056, 9031, 9035, 9044, 9030,
+     2237, 9021, 9020, 9012, 3430, 3438, 3433, 3441, 3490, 3494,
+     9017, 9023, 9004, 9011, 9015, 9000, 3498, 3505, 9009, 8977,
+
+     3556, 3559, 8992, 3564, 2304, 8987, 3567, 3637, 3570, 3640,
+     3626, 3629, 3632, 3644, 3692, 3695, 3700, 3759, 3773, 3762,
+     3710, 3765, 3769, 2372, 3780, 2436, 3825, 3830, 3834, 3844,
+     3899, 3891, 3910, 1921, 3902, 2505, 8985, 3905, 2574, 3959,
+     8974, 8953, 8958, 8953, 8941, 8941, 8946, 8944, 8929, 3962,
+     3968, 3965, 2640, 3971, 3977, 8934, 8923, 8921, 4028, 2711,
+     8924, 8910, 8894, 4031, 4036, 1687, 8898, 4040, 2782, 4094,
+     2993, 4046, 4099, 8899, 4103, 4106, 2584, 8889, 8897, 4112,
+     3065, 8891, 8877, 8873, 4162, 4173, 8883, 4168, 3266, 4176,
+     4181, 4188, 3333, 8860, 4230, 4233, 8874, 8860, 4238, 4241,
+
+     8867,  385, 8847, 4244, 3591, 4264, 8859, 8842, 4267, 4272,
+     8860, 8839, 4278, 4286, 8837, 8841, 8827, 8820, 8829, 8801,
+     8808, 8810, 8791, 4297, 4300, 4308, 3722, 8787, 4312, 4341,
+     8785, 4349, 3787, 4352, 8775, 4355, 8778, 8782, 8784, 4360,
+     4373, 4379, 4384, 4388, 4412, 4422, 8760, 4426, 3852, 4431,
+     4436, 8775, 8751, 4444, 3997, 8765, 4450, 4455, 8748, 4485,
+     4058, 8755, 8754, 4458, 4489, 1725, 8749, 4492, 4131, 8744,
+     8766, 4495, 4499,13930, 8719, 8727, 8726, 4503, 4510, 4514,
+     4196, 8708, 4518, 4523, 8695, 8694, 8692, 4532, 4537, 4542,
+     4545, 4550, 4565, 8732,13930,13930,  891, 8690,13930, 8732,
+
+     8731, 8674,13930,13930, 8671, 4569,13930,13930, 8681, 4577,
+     4580,13930, 4589, 1876, 8670, 8669, 8657, 8662, 8671, 8652,
+     8640, 8645, 8630, 8636, 8632, 8637, 8626, 8611, 8606,  477,
+     8617, 8600, 8596, 8606, 8603, 1721, 2119, 8590, 8591, 8600,
+     8590, 8575, 8573, 8575, 8575, 8566, 8550, 8525, 8518, 8510,
+     8494, 8499, 8483, 4592, 4610, 8482, 8468, 4599, 4618, 8472,
+     4628, 4631,13930, 4634, 8465, 8446, 4637, 8464, 8462, 8438,
+     4640, 4643,13930, 4655, 8429, 8440, 4662, 4665,13930, 4669,
+     8419, 4674,13930,13930, 8422, 4684, 4688,13930, 4691, 4694,
+     4703, 8404, 8373, 4712, 4717, 4725, 4730,13930, 4733, 4736,
+
+     4745, 4754, 4757, 4765, 4768,13930, 4772, 4775, 4778, 8361,
+     8355, 4787, 4793, 4801, 4805,13930, 4808, 4811,13930,13930,
+     4820,13930,13930, 4828, 4832, 8363, 8367, 8308, 8294, 4840,
+     4846,13930, 4849, 8277, 8298, 8288, 4852,13930,13930, 4860,
+     4868,13930,13930, 4878, 4881, 8273, 8231, 8184, 8169, 8163,
+     8129, 8044, 8037, 1471, 4889, 4892,13930, 4899, 4902,13930,
+    13930, 4911, 4914,13930, 4918, 7973, 7936, 4921, 4924,13930,
+    13930, 7869, 7865, 7859, 4933, 4939,13930, 4942, 7777, 4945,
+     4948,13930,13930, 4964,13930,13930, 4972, 4975,13930, 4980,
+     4983, 4986, 4994,13930, 5001, 7770, 7627, 5009,13930,13930,
+
+     7626, 7573, 7574, 5005, 5020,13930, 5024, 7573, 5027,13930,
+    13930, 5035, 5039,13930, 5043, 5048,13930,13930, 7564, 5058,
+     5062,13930, 5065, 5069, 5072, 5077, 5090,13930, 5096, 7507,
+     7442,    1,   36, 5099,13930,13930, 5109, 5117,  121,  196,
+     5127, 5130,13930, 5133,  244,  258, 5136, 5139,13930, 5142,
+      274,  321, 1732,  326,  383, 5161,  423,  424,  465, 5165,
+     5168,13930, 5171, 5175,13930,13930,  486, 5191, 5194,13930,
+     5197,  513, 5200,13930,13930, 5217, 5220, 5228, 5235, 5239,
+      533, 5247,  535, 5253, 5256,13930, 5260, 5265, 5268, 5279,
+     5283,  554, 5291, 5297,13930, 5300,  557, 5303,13930,13930,
+
+     5311, 5322,13930, 5325,  559,  559, 5330,13930,13930,  615,
+     5344, 5347,13930, 5351,  597, 5354,13930,13930,  592, 5370,
+     5373, 5376,13930, 5379,  600, 5382, 5388,13930,13930, 5400,
+      654, 5403, 5406,13930, 5409,  628, 5414,  630, 5418, 5428,
+    13930, 5432, 5438,13930,13930,  664, 5447, 5451,13930, 5454,
+      694,  733,  738, 5458, 5466,  776,  782, 5476, 5481,  798,
+     5489, 5494,13930, 5498, 1622, 5501,13930,13930,  857,  895,
+      916, 5504,13930,  910,  916,  923,  937,  979,  985,  981,
+      993, 2179,  983, 2515, 1054, 1047, 2122, 1066, 1070, 2650,
+     1114, 1129, 1134, 1133, 3104, 2858, 1119, 1224, 1213, 1257,
+
+     1253, 2926, 1279, 3275, 3174, 1333, 1338, 1336, 3342, 1337,
+     3401, 1363, 5523,13930,13930, 1388, 1474, 5531,13930,13930,
+     1459, 5508, 3526, 1473, 5539, 5542, 1521, 1535, 1548, 5550,
+     1536, 5560, 5553, 1542, 1584, 5564, 5572,13930,13930, 1572,
+     1592, 5583,13930,13930, 5591, 5594,13930,13930, 5603,13930,
+    13930, 5613, 5616,13930,13930, 1579, 1599, 5625,13930,13930,
+     5633, 5636,13930,13930, 1631, 1659, 5645, 1637, 5648, 5652,
+     5655, 5658, 5663, 5682, 5690,13930,13930, 5676, 5698, 5701,
+     5707, 5710, 5719, 5730, 5733, 5737, 5740, 5743, 5758, 1662,
+     1657, 5751, 5762, 1662, 5777, 1669, 5781, 1650, 5784, 5788,
+
+     5796, 5805, 5816, 5824, 3518, 1666, 1678, 1676, 1723, 5827,
+     1708, 5831, 5834, 5838, 5852, 5857, 1725, 5866, 1733, 5870,
+     1737, 1784, 5873,13930,13930, 5891, 1798, 5894, 1793, 1789,
+     5897, 1787, 1798, 1811, 1803, 1810, 5900, 5903, 1807, 1839,
+     1863, 5918, 5921, 5924, 1867, 5928,13930,13930, 5939, 5943,
+     5951,13930,13930, 1868, 5960, 5965, 1867, 5973, 5978,13930,
+    13930, 5988,13930,13930, 1855, 5996, 1868, 5999, 1874, 1869,
+     1881, 6002, 1872, 6005, 6008, 6011, 6026, 1906, 6029, 6032,
+     1920, 1956, 6040, 1916, 6047, 6050, 6059, 6068, 1927, 6071,
+     1939, 1954, 1959, 6077,13930,13930, 1959, 1979, 6092,13930,
+
+    13930, 1964, 6101, 2139, 2023, 6104,13930, 2025,13930,13930,
+     1992, 1982, 3206, 2002, 1994, 2007, 2036, 2041, 2040, 3459,
+     2038, 2048, 3664, 2050, 2056, 3732, 3798, 2045, 2046, 3862,
+     2054, 3923, 2063, 4068, 3929, 2079, 3932, 2089, 2099, 2096,
+     2112, 2113, 3991, 2108, 2117, 4125, 4305, 6107, 2116, 6110,
+     6113, 2109, 6124, 6127, 6130, 6133, 6137, 6140, 2149, 2152,
+     6144,13930,13930, 2159, 2160, 2153, 6159, 2170, 6162, 6167,
+     6180, 2172, 2153, 6183, 6186, 6193, 6204, 6211, 6214, 6217,
+     6225, 6235, 6244, 6247, 6253, 6265, 6271, 6278, 6283, 6292,
+     6296, 6300,13930,13930, 6310, 6314, 6317, 6320, 6323, 6328,
+
+     6341, 6346, 6354, 6366, 6372, 6376, 6384, 2179, 2168, 6391,
+    13930,13930, 6399, 6403, 6406, 2204, 6417, 6274, 6421,13930,
+    13930, 6429, 6432,13930,13930, 6444, 2221, 2201, 2223, 2225,
+     6448, 2224, 6451, 6454, 6457, 6472, 6477,13930,13930, 2229,
+     6485, 2234, 6491, 6495, 6504, 2223, 6509, 6513, 2233, 6522,
+     2225, 2236, 6527, 6532, 2246, 2235, 2243, 2247, 6535,13930,
+    13930, 2272, 2284, 2277, 6546, 6549, 6553, 6561, 2281, 6567,
+    13930,13930, 2290, 6581,13930,13930, 2282, 6575, 2287, 6589,
+     2293, 6594, 6599, 6602, 6608, 6613, 2288, 6621, 6626, 6643,
+    13930,13930, 6634, 2310, 6653,13930,13930, 2302, 2330, 6662,
+
+     2302, 6666, 3631, 4932, 6674, 6677, 6685, 2317, 6688, 2309,
+     2311, 2314, 6692, 6695, 6698, 6716, 2364, 2421, 2396,13930,
+     6719, 2363, 6722, 2358, 2359, 2406, 2355, 2358, 6725, 2369,
+     2376, 2362, 2378, 6728, 2379, 2379, 6731, 6738, 6741, 2395,
+     6744, 2417, 2415, 2435, 2427, 2515, 2423, 2426, 2437, 2442,
+     6747, 6753, 2456, 6756, 2460, 2445, 6759, 6764, 6772, 6777,
+     2504, 6785, 2496, 2504, 2513, 2511, 2526, 6790, 2522, 6793,
+    13930,13930, 6804, 2536, 6809, 6812, 6815, 6827, 6818, 6836,
+     6823, 6844, 6847, 6853, 6865, 6868, 6876, 6879, 6883, 6891,
+     6897,13930,13930, 6905, 6911, 6919, 6923,13930,13930, 6931,
+
+     6934, 2562, 2572, 2565, 6943, 6949, 6957, 2568, 2579, 6961,
+    13930,13930, 6975, 6978, 2562, 2557, 6986, 6989, 2574, 2584,
+     6993, 6996, 7011,13930,13930, 2577, 7019,13930, 7022, 7026,
+     7029, 2576, 7032, 2599, 2597, 7039,13930, 2592, 7050, 7054,
+    13930,13930, 7063, 2643, 7069, 2630, 7082,13930,13930, 7073,
+     7091, 2639, 7101,13930,13930, 2635, 7076,13930, 2627, 7111,
+     7114, 7117, 7120, 2628, 7123, 2634, 2637, 2630, 2644, 7129,
+     7133,13930,13930, 7141,13930, 2639, 7144, 2658, 7148, 2660,
+     7151, 2669, 7154, 7162, 7173, 7181, 7184, 7187, 7202, 7205,
+     7209,13930,13930, 7223, 2656, 2670, 2702, 7226, 7229, 2703,
+
+     2691, 2737, 2707, 2738, 2728, 2743, 2731, 7232,13930,13930,
+     7247, 7250, 7253,13930, 2749, 2752, 2793, 7257, 7262, 7278,
+     7281, 2712, 7289, 2810, 2846, 2832, 7296, 7299, 7308, 2720,
+     2738, 2754, 2732, 2771, 7314, 7317, 7320, 2775, 7323, 2778,
+     2775, 2782, 7326, 7329, 7332, 7335, 2781, 2784, 7338, 2801,
+     2818, 2794, 2800, 7341, 7344, 2820, 7347, 7352, 7355, 2839,
+     2835, 7358,13930,13930, 7366,13930,13930, 2854, 7374, 2844,
+     7377, 7383, 7386, 7389, 7395,13930, 2840, 7407, 2853, 7410,
+     7414, 7422, 7429,13930,13930, 7437,13930,13930, 7445, 7452,
+     7455,13930,13930, 7471,13930,13930, 7479, 7485,13930,13930,
+
+     7493, 7498, 7507,13930,13930, 7515, 7518,13930,13930, 2849,
+     2852, 2871, 7527,13930,13930, 7535, 7538, 2868, 2858, 7546,
+    13930,13930, 2875, 7554, 7557, 7560, 2865, 2863, 7563,13930,
+    13930, 2873, 7572, 7579, 2894, 7583, 7587, 2911, 2902, 2910,
+     2909, 7601, 7606, 2921, 7609,13930, 2916, 7613,13930,13930,
+     2909, 2919, 2919, 7632, 7635, 7643, 7646, 7650, 7653, 7656,
+     7662, 7665, 7674, 7670, 2924, 7683, 7692, 2942, 7701, 2942,
+     7704,13930, 2929, 7709, 7716,13930,13930, 7724, 7731, 7742,
+    13930,13930, 7750, 7753, 7756, 7764, 2933, 2945, 2958, 7771,
+    13930, 7774, 7777, 2987, 2998, 2998, 3007, 3017, 3010, 3007,
+
+     3008, 3014, 3025, 7785, 7792, 7797, 7806,13930,13930, 7817,
+    13930,13930, 3000, 7825, 7828, 3053, 3073, 7832, 4294, 4675,
+     7840, 7847, 7850, 2995, 2993, 3002, 7853, 7856, 3010, 7859,
+     7862, 3052, 7865, 7868, 7871, 3051, 3065, 3077, 7874, 7877,
+     3067, 3066, 3075, 7880, 7883, 3080, 7886, 7889, 3074, 3105,
+     3118, 3124, 7894, 7897, 7900, 7903, 7913, 7918, 7921, 7924,
+     7927, 7931, 7939,13930,13930, 7949, 7953, 7956, 7959, 7962,
+    13930,13930, 7978, 3135, 3139, 3178, 7981,13930,13930, 7991,
+     3135, 3138, 7997, 8002, 8010, 8015,13930, 3144, 3152, 3187,
+     8022, 8025, 8029, 8034,13930,13930, 8047, 8050, 8053, 8056,
+
+     8059, 8078, 8084, 3191, 3198, 3203, 8087, 8090,13930,13930,
+     8098, 8106, 8109, 8117, 8113, 8127, 8131, 8134, 8137, 8149,
+    13930,13930, 8140, 8145,13930, 3217, 3219, 8159,13930, 8164,
+    13930,13930, 8172, 8180,13930,13930, 8191, 3210, 3207,13930,
+     8194,13930,13930, 3272, 3272, 3293, 3289, 3296, 3300, 3287,
+     3305, 3300, 3312, 8202, 8210, 5183, 7444, 3290, 8221, 8224,
+     3370, 3380, 3280, 3285, 3323, 3283, 3290, 3304, 3331, 3386,
+     3328, 3337, 8227, 8230, 3335, 3337, 3394, 8233, 8243, 3385,
+     8246, 3377, 3390, 8249, 8252, 3394, 3395, 3427, 8255, 3416,
+     3432, 8258, 3438, 8261,13930, 8265, 8268,13930,13930, 8276,
+
+     8282, 8290, 8294, 8297, 8300, 8303, 8308, 8321, 8324, 8327,
+     8330, 8333,13930, 3455, 3448, 3444, 3469, 8336, 8354, 3465,
+     3473, 8362, 3682, 3962, 8370,13930, 3462, 3464, 8373, 8376,
+     8379,13930, 8382, 8400, 3495, 3503, 3504, 8408, 8411, 8414,
+     8385, 8422, 8429, 8435, 3508, 3510, 8443, 8447, 8450, 8454,
+    13930,13930, 8462, 8465, 8473, 8476, 8480,13930, 8485, 8499,
+     3522, 3524, 3520, 8494,13930, 8507, 3525, 3517, 3553, 3549,
+     3564, 3552, 3577, 3576, 3576, 3592, 3588, 3613, 8514, 3592,
+     3598, 3640, 3594, 3604, 3608, 3642, 3709, 3641, 3658, 3656,
+     8517, 3830, 3810, 3778, 3651, 3668, 3668, 3676, 3675, 3684,
+
+     3710, 3736, 3739, 3759, 3768, 3764, 3770, 3789, 3807, 8520,
+     8526, 3792, 3806, 8529, 3797, 3842, 3859, 8536, 3834, 3846,
+     8539, 8542, 8545,13930,13930, 8553, 8556, 8564, 8576, 8571,
+    13930, 8584,13930,13930, 8592,13930, 8595, 8598, 8601, 3845,
+     3855, 8604, 3850, 8607,13930,13930, 3862, 3853, 3890, 4024,
+     3901, 3938, 4030, 3941, 3909, 8622, 8625, 8628, 8636, 8643,
+    13930,13930, 3938, 3950, 3947, 8658, 8662, 8670, 4095, 4132,
+     8678,13930, 8681, 8684,13930,13930, 3949, 8692, 8700, 8703,
+     8711,13930, 8714,13930,13930, 8722, 8726, 8734, 8741, 8752,
+     4335, 4406, 3972, 8760, 8763, 8766, 8769, 8772, 4007, 4023,
+
+     4029, 4036, 4062, 4039, 4051, 4066, 4077, 4095, 8781, 4041,
+     4053, 4054, 4063, 4062, 4067, 4069, 4109, 4110, 4120, 4123,
+     4124, 8785, 8790, 4188, 4186, 4259, 4135, 4144, 4151, 4190,
+     4198, 4204, 4187, 4199, 4186, 4203, 4218, 4223, 4215, 8793,
+     4222, 8796, 4237, 4241, 4227, 8803, 4249, 4274, 4281, 8809,
+     8812, 8820, 4312, 4347, 8828,13930,13930, 8839, 8843, 8846,
+     4275, 8849, 8852, 8858, 8870, 4294, 4315, 4356, 4339, 4362,
+     4351, 4375, 4359, 4378, 4366, 4361, 8873, 8876, 8884,13930,
+    13930, 8892,13930, 4356, 8896, 4366, 8899,13930,13930, 4385,
+     4386, 4406, 4413, 4419, 4427, 8914, 4419, 8917, 8920, 8929,
+
+    13930,13930, 8937, 4504, 4512, 8945,13930,13930, 4431, 4435,
+     4541, 4436, 4443, 4564, 4418, 8953, 8956, 8964, 8967, 8975,
+     8978, 8982, 8985, 4460, 4466, 4465, 4486,13930, 4506, 4490,
+     4510, 4515,13930, 8994, 4491, 4500, 4488, 4504, 4520, 4538,
+     4521, 4538, 4530, 4545, 4554, 4560, 9000, 9003, 9013,13930,
+     4605, 4597, 9018, 4546, 4555, 4573, 4622, 4643, 4589, 4583,
+     4587, 4608, 4653, 4661, 4618, 4627, 9021, 4614, 9024, 4634,
+     4664, 9027, 4652, 9032, 4661, 9040, 5051, 5170, 4711, 4716,
+     4714, 4720, 9048, 9051, 9054, 4691, 9057, 9060, 9075,13930,
+    13930, 9083, 9086, 4688, 4697, 4737, 4734, 4746, 4752, 4772,
+
+     4752, 4776, 4777, 4764, 9094,13930,13930, 4773, 9102, 9105,
+     4759, 4796, 4805, 4839, 4803, 4822, 4850, 9120,13930, 4810,
+     9123,13930,13930, 4837, 4842, 4845, 4850, 4856, 4851, 4853,
+     4861, 4876, 4864, 4872, 4882, 9131, 9135, 5324, 5514, 9143,
+    13930,13930, 9151, 9154,13930,13930, 4889, 4910, 4933, 4934,
+     4918, 4938, 4954, 4950, 9162, 4911, 4923, 4940, 4988, 4993,
+     4940, 4947, 4949, 4966, 5011, 5023, 4973, 9166, 5804, 6190,
+     5015, 9174, 9177, 9181, 4995, 4987, 5052,13930,13930, 5024,
+     5029, 5015, 5080,13930,13930, 5037, 9196, 5026, 9200, 9204,
+     9207, 5035, 9213, 9216, 5071, 5083, 5051, 5063, 5088, 5101,
+
+     5084, 5095, 5125, 5113, 5128, 5116, 9219, 9222,13930, 9225,
+     5099, 9228,13930,13930, 9244,13930,13930, 9252, 5090, 5124,
+     5121, 5170, 5143, 5147, 5146, 5180, 5151, 5154, 9255, 9258,
+    13930,13930, 9266, 5178, 5190,13930, 5192, 5202,13930, 5176,
+     5214, 5207, 5226, 5214, 5230, 5249, 5253, 5240, 5253, 5264,
+     5266, 5257, 9273, 9277, 5261, 5282, 5246, 5262, 5282, 5293,
+     5257, 5268, 9285, 5301, 5305,13930, 5307, 5309, 5310,13930,
+     5311, 9294, 5289, 5275, 5346,13930,13930, 5308, 5308, 5296,
+     5357,13930,13930, 5315, 5352, 5374, 5350, 5370, 5389, 5401,
+     5364, 5383, 5425, 9297, 9300, 9309, 9363, 9411, 5372, 5379,
+
+    13930, 5405, 5398, 5399,13930, 5415, 9319, 5422, 9322, 9328,
+     5427, 9331, 5480, 5449, 5488, 5431, 5504, 5476, 5507, 5451,
+     5514, 5483, 5521, 5491, 9334, 9337, 5484, 9340, 9343, 9358,
+     5503, 5501,13930, 5541, 5515, 5522,13930, 5556, 5508, 9383,
+     9386, 9405, 9394, 5565, 5574, 5573, 5574, 5529, 5585, 5559,
+     5592, 5562, 5579, 5602, 5604, 5573, 5596, 5617, 5621, 5592,
+     9431,13930,13930, 5637, 5605, 5640, 5601, 5661, 5633, 5664,
+     5607, 9423,13930, 5670, 5648, 5654, 5680, 5657, 5664, 9442,
+     5631, 5640,13930, 5657, 5649, 5651,13930, 5661, 5719, 5688,
+     5722, 5663, 5741, 5712, 5749, 5699, 5756, 9445, 5769, 5801,
+
+     9465, 9513, 6386, 5719, 5766, 6518, 5723, 5784, 9453, 9476,
+    13930, 5789,13930, 5799,13930, 5803,13930, 5805,13930, 5793,
+    13930, 5795, 9485,13930, 9488, 5758, 9491, 5818, 5825, 9507,
+     9534, 5816, 5820,13930, 5821, 5836,13930, 5826, 9542,13930,
+    13930, 9550, 5909, 5912,13930,13930,13930,13930, 5827,13930,
+     5861,13930, 5862, 5874,13930,13930, 5852, 5894,13930,13930,
+     5873,13930, 5907,13930, 5909,13930, 5907,13930, 5909,13930,
+     5927, 5929,13930, 5941, 5947, 9560,13930, 6891, 5909, 5959,
+     6633, 5922, 5964,13930, 5972,13930, 5977,13930, 5976,13930,
+     5977, 5975, 6019, 6037, 5982, 6067, 5987, 9563,13930, 5951,
+
+     5971, 5959, 6058,13930,13930, 5973, 5995, 5983, 6075,13930,
+     9499, 9525,13930,13930,13930,13930, 6017, 6029, 9566, 9569,
+     6078, 6048, 6116, 6060, 9572,13930,13930, 6057, 6076, 6085,
+     6096, 9587, 6158, 6164, 6170, 6193, 9590, 6085, 6107, 6136,
+     6128, 6152, 6142,13930,13930,13930,13930,13930,13930,13930,
+    13930,13930, 6105, 6127, 6114, 6217,13930,13930, 6131, 6152,
+     6145, 6234,13930,13930,13930,13930,13930, 9593, 6226, 6219,
+     6235, 9596, 6202, 6191, 6194,13930, 6215, 6220, 6202, 6216,
+    13930, 6238, 6250, 6261, 9599,13930, 9608, 9619, 6267, 6275,
+     6288, 6295, 6295, 6304, 6316, 6307, 6296, 6340, 6306, 6344,
+
+     9627, 9630, 6314, 6326, 6339, 6329, 6324, 6332, 6345, 6338,
+     9638, 9645, 6342, 6343, 6383, 6368, 6389, 6377, 6364, 6348,
+     6362,13930, 6389, 6390, 6374, 6377,13930, 6412, 9641, 6445,
+     6411, 6429, 6400, 6420, 6421, 6442, 6414, 6433, 6484, 6482,
+     9656, 6482, 6493, 6459, 6469, 6465, 6488, 6503, 6513, 6522,
+     6531, 6561,13930, 6563,13930, 9664,13930,13930, 6537, 6542,
+     6542, 6556, 6551, 6556, 6556, 6569, 9672,13930,13930, 6601,
+     6599,13930, 6579,13930, 6585, 6564, 6582, 6556, 6579, 6578,
+     6601, 6574, 6598, 6665,13930, 6587, 6586, 6593, 6610, 6610,
+     6636, 6636, 6649,13930,13930, 6685, 6680, 6690, 6684, 6685,
+
+     6712, 6726, 6713, 6734, 6744, 6745, 6732,13930,13930, 6747,
+     6757, 6758, 6745, 6760, 6773, 6774, 6761,13930,13930, 6797,
+     6795, 6745, 6756, 6767, 6784, 6780, 6785, 6785, 6803, 6891,
+     6798, 6809, 6859, 6819, 6812, 6834, 6881, 6848, 6864, 6883,
+     6879, 6906, 6904, 6901, 6923, 6924, 6917, 6915, 6932, 6941,
+     6931, 6928, 6946, 6947, 6937, 6934, 6958, 6960,13930,13930,
+     6923, 6947, 6997, 6950, 6944, 6954, 7001, 6957, 6998, 6961,
+     6965,13930, 7021, 6982, 6990,13930, 7038, 7011, 7012, 7018,
+     7023, 7036, 7027, 7062, 7028, 7048, 7053, 7089, 7058, 7075,
+     7069, 7102, 7068, 7085, 7091, 7120, 7097, 7085, 7087,13930,
+
+     7153, 7105, 7108,13930, 7158, 7172, 7108, 7164,13930, 7111,
+     7164,13930, 7150, 7168, 7165, 7173, 7195, 7169,13930, 7177,
+     7207, 7184,13930, 7182, 7214, 7190,13930, 7200, 7230, 7207,
+    13930, 7205, 7183, 7239,13930, 7186, 7253,13930, 7243, 7196,
+    13930, 7198,13930, 7237, 7250, 7241, 7261,13930, 7262, 7256,
+    13930, 7268, 7262,13930, 7278, 7273,13930, 7281, 7280, 7240,
+    13930, 7278,13930, 9680, 7357, 7356, 7340, 7365, 7347, 7365,
+     7338, 7357, 7351, 7374, 7357, 7377, 7362, 7381, 7413, 7412,
+     9683,13930,13930, 7416,13930, 7421,13930, 7428, 7392, 7435,
+     7401, 7444, 7408, 7451, 7418,13930,13930, 7446, 7458,13930,
+
+    13930,13930, 7457,13930, 7467,13930, 7478,13930, 7483, 7525,
+     7526,13930,13930,13930,13930, 7531, 7551, 7478, 7488, 7512,
+     7581, 7494, 7514, 7558, 7586, 7559, 7594, 7603, 7622, 7620,
+     7668, 7587, 7659, 7672, 7680, 7703, 7711, 7689, 7697, 7787,
+     7802, 7729, 7777, 7762, 7770, 7568, 7677, 7772, 7827, 7888,
+     7890, 7916, 7934, 7966, 8053, 7744, 7891, 7751, 7958, 7977,
+     8057, 7989, 8026, 7473, 7796, 8054, 8056, 7919, 7947, 8105,
+     8151, 7671, 7995, 7971, 8002, 8048, 8144, 8021, 8107, 8187,
+     8219, 8171, 8295, 8157, 8263, 8051, 8137, 8168, 8296, 8299,
+     8326, 8349, 8350, 8158, 8256, 8339, 8378, 8423, 8439, 8415,
+
+     8435, 8408, 8516, 8188, 8190, 8561, 8564, 7694, 8331, 8569,
+     8600, 8267, 8334, 9691, 9694,13930,13930, 9714, 9723, 9732,
+     9741, 9750, 9759, 9768, 9777, 9786, 9795, 9804, 9813, 9822,
+     9831, 9840, 9849, 9858, 9867, 9876, 9885, 9894, 9903, 9912,
+     9921, 9930, 9939, 9948, 9957, 9966, 9975, 9984, 9993,10002,
+    10011,10020,10029,10038,10047,10056,10065,10074,10083,10092,
+    10101,10110,10119,10128,10137,10146,10155,10164,10173,10182,
+    10191,10200,10209,10218,10227,10236,10245,10254,10263,10272,
+    10281,10290,10299,10308,10317,10326,10333,10340,10347,10354,
+    10361,10368,10375,10382,10389,10396,10403,10410,10417,10424,
+
+    10431,10438,10445,10452,10459,10466,10473,10480,10487,10494,
+    10501,10508,10515,10522,10529,10536,10543,10552,10559,10564,
+    10571,10576,10583,10588,10595,10600,10607,10612,10619,10624,
+    10631,10636,10643,10648,10655,10660,10667,10672,10679,10684,
+    10691,10696,10703,10708,10715,10720,10727,10732,10739,10744,
+    10751,10756,10763,10768,10775,10780,10787,10792,10799,10804,
+    10811,10816,10823,10828,10835,10840,10847,10852,10859,10864,
+    10871,10876,10883,10888,10895,10900,10907,10912,10919,10924,
+    10933,10939,10946,10954,10962,10970,10977,10985,10992,11000,
+    11007,11015,11023,11031,11039,11047,11055,11063,11071,11079,
+
+    11086,11094,11102,11109,11117,11124,11132,11139,11147,11154,
+    11162,11169,11177,11184,11192,11199,11207,11214,11222,11229,
+    11237,11244,11252,11259,11267,11274,11282,11290,11298,11305,
+    11313,11320,11328,11335,11343,11350,11358,11365,11373,11380,
+    11388,11396,11404,11413,11419,11426,11434,11441,11449,11456,
+    11464,11471,11479,11486,11494,11501,11509,11517,11524,11532,
+    11539,11547,11554,11562,11570,11577,11585,11593,11601,11609,
+    11617,11624,11632,11639,11647,11654,11662,11670,11678,11685,
+    11693,11700,11708,11715,11723,11730,11738,11745,11753,11760,
+    11768,11775,11783,11790,11798,11805,11813,11821,11829,11836,
+
+    11844,11851,11859,11866,11874,11883,11892,11899,11906,11914,
+    11921,11929,11937,11945,11952,11960,11967,11975,11983,11990,
+    11998,12005,12013,12021,12029,12037,12044,12052,12060,12068,
+    12075,12083,12090,12098,12106,12114,12121,12129,12136,12144,
+    12151,12159,12166,12174,12182,12190,12197,12205,12212,12220,
+    12227,12235,12242,12250,12257,12265,12272,12280,12287,12295,
+    12302,12310,12317,12325,12334,12343,12350,12358,12366,12373,
+    12381,12389,12396,12404,12412,12420,12428,12436,12444,12452,
+    12460,12468,12476,12484,12491,12499,12507,12515,12522,12530,
+    12537,12545,12553,12560,12568,12575,12583,12590,12598,12605,
+
+    12613,12621,12628,12636,12643,12651,12658,12666,12674,12682,
+    12689,12697,12704,12712,12719,12727,12734,12742,12750,12758,
+    12767,12776,12784,12791,12799,12806,12814,12822,12829,12837,
+    12845,12853,12861,12869,12877,12884,12892,12900,12907,12915,
+    12923,12930,12937,12945,12953,12960,12968,12975,12983,12991,
+    12998,13006,13013,13021,13028,13036,13043,13051,13059,13067,
+    13075,13083,13090,13098,13106,13114,13122,13129,13137,13146,
+    13155,13162,13170,13178,13186,13193,13201,13209,13217,13225,
+    13233,13240,13248,13256,13263,13271,13279,13286,13293,13301,
+    13309,13316,13323,13331,13339,13347,13354,13362,13369,13376,
+
+    13384,13392,13400,13407,13415,13422,13430,13439,13448,13455,
+    13463,13471,13479,13487,13495,13503,13511,13519,13527,13534,
+    13542,13549,13557,13565,13573,13581,13589,13597,13605,13612,
+    13620,13628,13636,13644,13651,13658,13666,13674,13681,13689,
+    13696,13704,13713,13722,13729,13737,13745,13753,13761,13769,
+    13777,13784,13791,13799,13806,13814,13822,13829,13837,13845,
+    13852,13859,13866,13875,13884,13893,13902,13911,13920
     } ;
 
-static yyconst flex_int16_t yy_def[4482] =
+static const flex_int16_t yy_def[4570] =
     {   0,
-     3930, 3930, 3931, 3931, 3931, 3931, 3932, 3932, 3933, 3933,
-     3934, 3934, 3935, 3935, 3935, 3935, 3936, 3936, 3937, 3937,
-     3938, 3938, 3938, 3938, 3930, 3930, 3938, 3938, 3938, 3938,
-     3930, 3930, 3938, 3938, 3930, 3930, 3938, 3938, 3938, 3938,
-     3939, 3939, 3940, 3940, 3930, 3930, 3940, 3940, 3940, 3940,
-     3941, 3941, 3942, 3942, 3930, 3930, 3942, 3942, 3942, 3942,
-     3943, 3943, 3944, 3944, 3945, 3945, 3946, 3946, 3947, 3947,
-     3948, 3948, 3930, 3930, 3948, 3948, 3948, 3948, 3949, 3949,
-     3950, 3950, 3930, 3930, 3950, 3950, 3950, 3950, 3951, 3951,
-     3952, 3952, 3930, 3930, 3952, 3952, 3952, 3952, 3953, 3953,
-
-     3954, 3954, 3955, 3955, 3956, 3956, 3930, 3930, 3956, 3956,
-     3956, 3956, 3957, 3957, 3958, 3958, 3930, 3930, 3958, 3958,
-     3958, 3958, 3959, 3959, 3960, 3960, 3930, 3930, 3960, 3960,
-     3960, 3960, 3961, 3961, 3962, 3962, 3963, 3963, 3964, 3964,
-     3930, 3930, 3964, 3964, 3964, 3964, 3965, 3965, 3966, 3966,
-     3930, 3930, 3966, 3966, 3966, 3966, 3967, 3967, 3968, 3968,
-     3969, 3969, 3970, 3970, 3971, 3971, 3972, 3972, 3973, 3973,
-     3974, 3974, 3930, 3930, 3975, 3975, 3976, 3976, 3976, 3976,
-     3930, 3930, 3976, 3976, 3976, 3976, 3930, 3930, 3976, 3976,
-     3930, 3930, 3976, 3976, 3976, 3976, 3977, 3977, 3978, 3978,
-
-     3930, 3930, 3978, 3978, 3978, 3978, 3979, 3979, 3980, 3980,
-     3981, 3981, 3982, 3982, 3983, 3983, 3984, 3984, 3930, 3930,
-     3984, 3984, 3984, 3984, 3985, 3985, 3986, 3986, 3987, 3987,
-     3988, 3988, 3930, 3930, 3988, 3988, 3988, 3988, 3989, 3989,
-     3990, 3990, 3930, 3930, 3990, 3990, 3990, 3990, 3991, 3991,
-     3992, 3992, 3993, 3993, 3994, 3994, 3995, 3995, 3996, 3996,
-     3996, 3996, 3930, 3930, 3996, 3996, 3996, 3996, 3930, 3930,
-     3996, 3996, 3930, 3930, 3996, 3996, 3996, 3996, 3997, 3997,
-     3998, 3998, 3930, 3930, 3998, 3998, 3998, 3998, 3930, 3930,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3999, 3929, 3929, 3999, 3999, 3929, 3929, 3929,  328, 3929,
-      330,  328,  331,  330, 3929, 3929, 3929, 4000, 3929, 3929,
-     4000, 4000, 4000, 3929, 3929,  330,  330,  330, 3929, 3929,
-     3929, 4001, 3929, 3929, 4001, 4001, 4001, 4001, 4001, 3929,
-     3929,  330,  330,  330, 3929, 3929, 3929, 4002, 3929, 3929,
-     4002, 3929, 3929, 3929, 3929, 3929, 3929, 4003, 3929, 3929,
-     4003, 4003, 4003, 3929, 3929, 3929, 3929, 3929, 3929, 4004,
-     3929, 3929, 4004, 4004, 4004, 3929, 3929,  330,  330, 3929,
-
-     3929, 3929, 4005, 3929, 3929, 4005, 4005, 3929, 3929,  330,
-      330, 3929, 3929, 3929, 4006, 3929, 3929, 4006, 4006, 4006,
-     3929, 3929,  330,  330, 3929, 3929, 3929, 4007, 3929, 3929,
-     4007, 4007, 4007, 4007, 4007, 4007, 3929, 3929, 3929, 3929,
-     3929, 3929, 4008, 3929, 3929, 4008, 4008, 4008, 4008, 4008,
-     4008, 4008, 4008, 3929, 3929,  330,  330, 3929, 3929, 3929,
-     4009, 3929, 3929, 4009, 3929, 3929,  330,  330, 3929, 3929,
-     3929, 4010, 3929, 3929, 4010, 4010, 4010, 4010, 4010, 3929,
-     3929,  330,  330,  330, 3929, 3929, 3929, 4011, 3929, 3929,
-     4011, 4011, 4011, 3929, 3929, 3929, 3929, 3929, 3929, 4012,
-
-     3929, 3929, 4012, 3929, 3929,  330,  506,  330, 3929, 3929,
-     3929, 4013, 3929, 3929, 4013, 4013, 4013, 4013, 3929, 3929,
-      330,  330, 3929, 3929, 3929, 4014, 3929, 3929, 4014, 4014,
-     3929, 3929, 3929, 3929, 3929, 3929, 4015, 3929, 3929, 4015,
-     4015, 3929, 3929, 3929, 3929, 3929, 3929, 4016, 3929, 3929,
-     4016, 4016, 3929, 3929, 3929, 3929, 3929, 3929, 4017, 3929,
-     3929, 4017, 4017, 4017, 4017, 4017, 4017, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4018, 3929, 3929, 4018, 3929, 3929,
-      506,  581,  330,  330,  330,  330, 3929, 3929, 3929, 4019,
-     3929, 3929, 4019, 4019, 4019, 4019, 4019, 3929, 3929,  330,
-
-      330, 3929, 3929, 3929, 4020, 3929, 3929, 4020, 4020, 3929,
-     3929, 3929, 3929, 3929, 3929, 4021, 3929, 3929, 4021, 4021,
-     4021, 4021, 4021, 3929, 3929, 3929, 3929, 3929, 3929, 4022,
-     3929, 3929, 4022, 4022, 3929, 3929,  330,  330, 3929, 3929,
-     3929, 4023, 3929, 3929, 4023, 4023, 3929, 3929, 3929, 3929,
-     3929, 3929, 4024, 3929, 3929, 4024, 4024, 4024, 4024, 3929,
-     3929,  330,  330, 3929, 3929, 3929, 4025, 3929, 3929, 4025,
-     4025, 4025, 4025, 3929, 3929,  330,  330,  330, 3929, 3929,
-     3929, 4026, 3929, 3929, 4026, 4026, 4026, 3929, 3929, 3929,
-     3929, 3929, 4027, 3929, 3929, 4027, 4027, 4027, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 4028, 3929, 3929, 4028, 4028, 3929,
-     3929, 3929,  712,  330,  330, 3929, 3929, 3929, 4029, 3929,
-     3929, 4029, 4029, 4029, 3929, 3929,  330,  330, 3929, 4030,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4031, 4031, 4031, 4032, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4033, 4033, 4033, 4033, 4033, 4034, 3929, 3929, 4035,
-     4035, 4035, 4035, 4035, 4035, 4036, 3929, 3929, 4037, 4037,
-
-     4038, 3929, 4039, 4039, 4039, 4039, 4040, 3929, 4041, 4041,
-     4041, 4041, 4042, 3929, 4043, 4043, 4043, 4044, 3929, 4045,
-     4045, 4045, 4045, 4046, 3929, 4047, 4047, 4047, 4047, 4047,
-     4047, 4047, 4047, 4048, 3929, 4049, 4049, 4049, 4049, 4049,
-     4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049,
-     4050, 3929, 4051, 4051, 4052, 3929, 4053, 4053, 4053, 4053,
-     4053, 4053, 4053, 4054, 3929, 3929, 4055, 4055, 4055, 4055,
-     4056, 3929, 4057, 4057, 4058, 3929, 3929, 3929, 4059, 4059,
-     4059, 4059, 4059, 4059, 4060, 3929, 4061, 4061, 4061, 4062,
-     3929, 4063, 4063, 4063, 4064, 3929, 4065, 4065, 4065, 4066,
-
-     3929, 4067, 4067, 4067, 4067, 4067, 4067, 4067, 4067, 4068,
-     3929, 3929, 4069, 4069, 4070, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4071, 4071, 4071, 4071, 4071, 4071, 4072, 3929,
-     4073, 4073, 4073, 4074, 3929, 4075, 4075, 4075, 4075, 4075,
-     4075, 4075, 4075, 4075, 4076, 3929, 4077, 4077, 4077, 4077,
-     4078, 3929, 4079, 4079, 4079, 4080, 3929, 4081, 4081, 4081,
-     4081, 4081, 4082, 3929, 4083, 4083, 4083, 4083, 4083, 4084,
-     3929, 3929, 4085, 4085, 4085, 4085, 3929, 4086, 3929, 3929,
-     4087, 4087, 4087, 4087, 4088, 3929, 4089, 4089, 4089, 4090,
-     3929, 4091, 4091, 4091, 4091, 4091, 4092, 4093, 3929, 4093,
-
-     3929, 3929, 3929, 4094, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4095, 4096, 4096, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4097, 4097, 4097, 4097, 4098, 4098, 3929,
-     4099, 4099, 4099, 4099, 4099, 4100, 4100, 3929, 4101, 4102,
-     4102, 4103, 3929, 3929, 4103, 4104, 4104, 4105, 4105, 4105,
-     4106, 4106, 4107, 4107, 4108, 4108, 4109, 4109, 4109, 4110,
-     4110, 3929, 3929, 3929, 3929, 4111, 4111, 4111, 4111, 4111,
-
-     4112, 4112, 4113, 3929, 3929, 4113, 3929, 3929, 4113, 4113,
-     4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4114, 4114,
-     3929, 3929, 4115, 4115, 4116, 4116, 4116, 3929, 3929, 4116,
-     4116, 4116, 4117, 4117, 3929, 4118, 3929, 3929, 3929, 3929,
-     4119, 4119, 4120, 4121, 4121, 3929, 3929, 4122, 3929, 3929,
-     4122, 4122, 4122, 4123, 4123, 4124, 3929, 3929, 4125, 4125,
-     3929, 3929, 4126, 4127, 4127, 4128, 4128, 4129, 4129, 4130,
-     4130, 4130, 3929, 3929, 4130, 4130, 4130, 4131, 4131, 3929,
-     4132, 4133, 4133, 3929, 3929, 3929, 3929, 4134, 4134, 4134,
-     4134, 4134, 4135, 4135, 3929, 3929, 4136, 4137, 4137, 4138,
-
-     3929, 3929, 4138, 4138, 4138, 4138, 4138, 4138, 4139, 4139,
-     4140, 4140, 4140, 4141, 4141, 4142, 3929, 3929, 4143, 4143,
-     4144, 4144, 3929, 3929, 4144, 4145, 4145, 4146, 3929, 3929,
-     4146, 4146, 4147, 4147, 3929, 4148, 3929, 3929, 4148, 3929,
-     4149, 4149, 3929, 4150, 4150, 4150, 4151, 4151, 3929, 3929,
-     4152, 4153, 4153, 4154, 4154, 4154, 4154, 4155, 4155, 4156,
-     3929, 3929, 4156, 3929, 3929, 4157, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4158, 3929, 4159, 3929, 4159, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4160, 4160, 3929, 3929, 4160, 3929, 4161, 3929, 4161,
-     3929, 4162, 4162, 4162, 4162, 4162, 3929, 4163, 3929, 4163,
-     3929, 4164, 3929, 4165, 3929, 4165, 4166, 3929, 3929, 3929,
-     4166, 3929, 4167, 3929, 4167, 3929, 3929, 4168, 4168, 3929,
-     3929, 3929, 4169, 3929, 4169, 3929, 3929, 3929, 3929, 3929,
-     4170, 3929, 4170, 3929, 3929, 4171, 4171, 3929, 3929, 3929,
-     4172, 3929, 4172, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4173, 4173, 4173, 4173, 3929, 4174, 3929, 4174, 4175,
-
-     4175, 4175, 3929, 3929, 3929, 4175, 3929, 3929, 3929, 3929,
-     3929, 4175, 4175, 4175, 4175, 4175, 4175, 4175, 4175, 4175,
-     3929, 4176, 3929, 4176, 3929, 3929, 3929, 3929, 4177, 3929,
-     4177, 4178, 4178, 4178, 3929, 3929, 3929, 4178, 4178, 4178,
-     3929, 4179, 3929, 4179, 3929, 4180, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4181, 3929, 4181, 4182, 3929, 4183, 3929,
-     4183, 3929, 4184, 3929, 3929, 3929, 4184, 4184, 4184, 3929,
-     4185, 3929, 4185, 4186, 3929, 3929, 3929, 3929, 4187, 3929,
-     4187, 3929, 3929, 3929, 4188, 3929, 4189, 3929, 4189, 4190,
-     4190, 3929, 4191, 3929, 4191, 4192, 4192, 4192, 4192, 3929,
-
-     3929, 3929, 3929, 3929, 4192, 4192, 3929, 4193, 3929, 4193,
-     3929, 4194, 3929, 4195, 3929, 4195, 3929, 3929, 3929, 3929,
-     4196, 4196, 4196, 4196, 4196, 3929, 4197, 3929, 4197, 3929,
-     3929, 3929, 4198, 3929, 4199, 3929, 4199, 4200, 3929, 3929,
-     3929, 3929, 3929, 4200, 3929, 3929, 4200, 4200, 4200, 3929,
-     4201, 3929, 4201, 3929, 3929, 3929, 3929, 4202, 3929, 4203,
-     3929, 4203, 4204, 3929, 3929, 3929, 3929, 4205, 3929, 4205,
-     4206, 4206, 3929, 3929, 3929, 4206, 3929, 4207, 3929, 4207,
-     4208, 3929, 3929, 3929, 4208, 4208, 3929, 4209, 3929, 4209,
-     3929, 4210, 3929, 3929, 3929, 4210, 3929, 3929, 4211, 3929,
-
-     4211, 4212, 4212, 4212, 3929, 4213, 3929, 4213, 3929, 3929,
-     3929, 4214, 3929, 4215, 3929, 4215, 3929, 3929, 4216, 4216,
-     3929, 3929, 4216, 3929, 4217, 3929, 4217, 4218, 4219, 3929,
-     3929, 3929, 3929, 4220, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4221, 4221,
-     3929, 3929, 3929, 4221, 4222, 3929, 4223, 3929, 3929, 4223,
-     4223, 4223, 4224, 3929, 4225, 4226, 4227, 4227, 4228, 3929,
-
-     3929, 3929, 4229, 4229, 3929, 3929, 3929, 4230, 3929, 3929,
-     3929, 3929, 3929, 3929, 4231, 3929, 3929, 3929, 4232, 4232,
-     3929, 3929, 3929, 4233, 3929, 3929, 3929, 4234, 4234, 4234,
-     4234, 4235, 4236, 4236, 4236, 3929, 3929, 3929, 3929, 3929,
-     4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236,
-     4237, 4238, 4239, 4239, 3929, 3929, 4239, 4239, 4239, 4240,
-     3929, 3929, 3929, 4241, 3929, 3929, 4242, 3929, 4243, 4243,
-     4243, 4243, 4244, 4245, 4246, 4247, 4248, 3929, 3929, 4249,
-     4250, 4251, 4251, 4251, 4251, 3929, 3929, 3929, 4251, 4251,
-     4252, 3929, 4253, 4254, 3929, 3929, 3929, 3929, 4255, 3929,
-
-     3929, 4255, 4255, 4255, 4256, 4257, 4258, 4259, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4259, 3929, 3929, 4259,
-     4260, 3929, 3929, 3929, 3929, 3929, 3929, 4261, 4262, 4263,
-     4264, 4265, 4265, 4265, 4266, 4267, 4267, 3929, 3929, 4268,
-     3929, 3929, 3929, 4269, 3929, 4270, 4271, 3929, 3929, 4271,
-     4272, 4273, 4274, 3929, 3929, 3929, 4275, 4275, 3929, 3929,
-     3929, 4275, 4276, 4277, 4278, 4278, 3929, 4278, 3929, 3929,
-     4279, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4280, 4280, 4280, 4281, 3929, 4282,
-     3929, 3929, 3929, 4282, 4282, 4282, 4283, 3929, 3929, 3929,
-     4284, 4285, 4285, 4286, 4287, 4287, 4288, 4289, 4290, 4290,
-     4291, 4292, 4292, 3929, 3929, 4292, 4293, 3929, 3929, 4294,
-     4294, 3929, 3929, 3929, 4294, 4294, 4294, 4294, 4294, 4294,
-     3929, 3929, 4294, 4294, 4294, 4295, 4296, 4297, 4297, 3929,
-     3929, 3929, 4297, 3929, 3929, 4297, 4298, 3929, 3929, 3929,
-     3929, 4299, 3929, 3929, 3929, 4300, 4301, 4301, 4301, 4301,
-     4302, 4303, 4304, 3929, 3929, 4305, 3929, 3929, 3929, 4306,
-
-     4307, 4308, 3929, 3929, 4308, 4308, 3929, 3929, 4308, 4309,
-     3929, 4310, 4311, 3929, 3929, 3929, 3929, 4312, 3929, 3929,
-     3929, 4312, 4312, 4312, 4313, 3929, 3929, 4314, 4315, 3929,
-     3929, 3929, 4315, 3929, 3929, 3929, 4315, 4316, 4317, 4318,
-     4319, 4320, 4321, 4321, 4321, 4322, 4323, 3929, 3929, 3929,
-     3929, 3929, 4324, 3929, 3929, 3929, 3929, 4325, 3929, 4326,
-     4327, 3929, 3929, 3929, 3929, 3929, 4328, 4329, 4330, 4331,
-     4331, 4331, 4332, 4333, 4334, 4334, 3929, 4335, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4336, 4337, 3929,
-     4338, 4338, 4338, 4338, 4339, 3929, 3929, 3929, 3929, 4340,
-     4341, 4341, 4342, 3929, 3929, 3929, 3929, 4343, 4344, 3929,
-     3929, 3929, 3929, 4345, 3929, 3929, 4346, 3929, 3929, 3929,
-     3929, 3929, 4347, 3929, 3929, 3929, 3929, 3929, 4348, 4348,
-     4348, 3929, 3929, 4348, 4348, 4348, 3929, 3929, 3929, 3929,
-     3929, 4348, 4348, 4349, 4350, 4351, 4351, 3929, 3929, 3929,
-     3929, 3929, 4351, 3929, 3929, 3929, 4352, 4353, 4354, 4354,
-     4354, 4354, 3929, 3929, 4355, 4356, 3929, 3929, 3929, 4357,
-
-     4358, 4359, 4360, 3929, 3929, 3929, 3929, 3929, 4360, 3929,
-     3929, 3929, 4360, 3929, 3929, 3929, 4361, 4362, 3929, 3929,
-     3929, 3929, 4363, 4363, 4363, 4363, 4364, 3929, 3929, 3929,
-     3929, 3929, 4365, 4365, 4365, 4366, 4367, 4368, 4369, 4370,
-     3929, 3929, 4371, 3929, 3929, 4372, 4373, 3929, 3929, 3929,
-     4374, 3929, 4375, 3929, 4376, 4377, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4378, 4379, 3929,
-     3929, 3929, 3929, 3929, 3929, 4380, 4381, 4382, 4383, 4383,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4384, 4385, 3929, 4386, 4386, 4386, 4386, 3929, 3929,
-     3929, 4387, 4388, 3929, 3929, 4389, 3929, 3929, 3929, 3929,
-     3929, 3929, 4390, 4391, 3929, 3929, 3929, 3929, 3929, 3929,
-     4392, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4393,
-     3929, 3929, 3929, 4394, 4394, 4394, 3929, 3929, 3929, 3929,
-     3929, 4394, 4394, 3929, 3929, 3929, 4394, 4394, 4395, 4396,
-     4397, 4397, 3929, 3929, 3929, 4397, 4398, 4399, 4400, 3929,
-     3929, 4400, 4400, 4400, 4401, 4402, 4403, 4404, 3929, 3929,
-
-     4405, 3929, 3929, 3929, 4405, 4405, 3929, 3929, 3929, 4406,
-     3929, 3929, 3929, 4407, 4407, 4407, 4407, 4408, 4409, 3929,
-     3929, 4409, 4410, 4411, 3929, 3929, 4412, 4413, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4414, 3929, 3929, 4415,
-     3929, 4416, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4417, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4418, 4419, 4420, 4421,
-     4421, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 4422, 4423, 3929, 3929, 3929,
-     4424, 4424, 4424, 3929, 4425, 4426, 3929, 3929, 3929, 4427,
-     4428, 4429, 4430, 3929, 3929, 3929, 4431, 4432, 4432, 4432,
-     3929, 3929, 3929, 4432, 4432, 4432, 3929, 3929, 4433, 3929,
-     3929, 4434, 4434, 4434, 4435, 4436, 4437, 3929, 3929, 3929,
-     4437, 4437, 4437, 4438, 4439, 4440, 4441, 4442, 4442, 4442,
-     3929, 3929, 3929, 3929, 4443, 3929, 3929, 3929, 4444, 4444,
-     4444, 4445, 4446, 3929, 3929, 3929, 4446, 3929, 3929, 4447,
-     4448, 3929, 3929, 3929, 3929, 3929, 4449, 3929, 3929, 3929,
-     4450, 3929, 4451, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4452, 3929, 3929,
-     3929, 4453, 4454, 4455, 4456, 4456, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4457, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4458, 4458, 3929, 4459, 3929,
-     3929, 4460, 4461, 4462, 4463, 3929, 3929, 4464, 4464, 4464,
-     4464, 3929, 3929, 4464, 4464, 3929, 3929, 3929, 3929, 3929,
-     4465, 4465, 4465, 4466, 3929, 3929, 3929, 3929, 4467, 4467,
-     4467, 4467, 3929, 3929, 4468, 4469, 3929, 3929, 4470, 4470,
-
-     4470, 3929, 4471, 3929, 3929, 3929, 3929, 3929, 4472, 4472,
-     3929, 3929, 3929, 3929, 4473, 4474, 4475, 3929, 3929, 4450,
-     3929, 4451, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4452, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4453, 4454, 4455, 4456, 4456, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4457, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     4461, 4462, 4463, 4464, 4464, 4464, 4464, 3929, 3929, 3929,
-
-     4464, 4464, 3929, 3929, 3929, 3929, 3929, 3929, 4465, 4465,
-     3929, 3929, 4466, 3929, 3929, 3929, 4467, 4467, 4467, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4469, 3929, 3929, 3929,
-     4470, 4470, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4473, 4474, 4475, 4450,
-     3929, 4451, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4452, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4453, 4454, 4455, 4456, 4456,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4461, 4462, 4463, 4464, 4464, 3929, 3929, 4464, 4464,
-     4464, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4465,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4467, 4467, 4467,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4469,
-     4470, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4473, 3929,
-     3929, 3929, 3929, 4450, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4452, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 4455, 4456, 4456, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4461, 4462, 4463, 4464,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4464, 4464, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4465, 3929, 3929,
-     3929, 4467, 3929, 3929, 4467, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4470, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4473,
-     3929, 3929, 3929, 3929, 3929, 3929, 4450, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4452, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4455, 4456, 4456, 4456, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4461, 3929, 3929, 4463,
-     4464, 3929, 3929, 3929, 3929, 3929, 3929, 4464, 4464, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4465, 4467, 3929,
-     3929, 3929, 4467, 3929, 3929, 3929, 3929, 3929, 3929, 4470,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4450, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4452, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4455, 4456, 4456, 4456, 4476, 4477,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4461, 4463, 4464, 3929, 3929, 4464, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4465, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4470, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4452, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 4455, 4456, 4478, 4479,
-     4476, 4477, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     4463, 4464, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 4465, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4470, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4455,
-     4478, 4456, 4480, 4479, 4481, 4456, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 4463, 4464, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4465, 3929, 3929,
-     3929, 3929, 4470, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4455,
-     4480, 3929, 4481, 4456, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4455, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 4455, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 4455, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 4455,
-     4455, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 4455, 4455, 3929, 3929, 3929, 3929, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4455, 4455, 4455, 3929,    0, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929
+     4018, 4018, 4019, 4019, 4019, 4019, 4020, 4020, 4021, 4021,
+     4022, 4022, 4023, 4023, 4023, 4023, 4024, 4024, 4025, 4025,
+     4026, 4026, 4026, 4026, 4018, 4018, 4026, 4026, 4026, 4026,
+     4018, 4018, 4026, 4026, 4018, 4018, 4026, 4026, 4026, 4026,
+     4027, 4027, 4028, 4028, 4018, 4018, 4028, 4028, 4028, 4028,
+     4029, 4029, 4030, 4030, 4018, 4018, 4030, 4030, 4030, 4030,
+     4031, 4031, 4032, 4032, 4033, 4033, 4034, 4034, 4035, 4035,
+     4036, 4036, 4018, 4018, 4036, 4036, 4036, 4036, 4037, 4037,
+     4038, 4038, 4018, 4018, 4038, 4038, 4038, 4038, 4039, 4039,
+     4040, 4040, 4018, 4018, 4040, 4040, 4040, 4040, 4041, 4041,
+
+     4042, 4042, 4043, 4043, 4044, 4044, 4018, 4018, 4044, 4044,
+     4044, 4044, 4045, 4045, 4046, 4046, 4018, 4018, 4046, 4046,
+     4046, 4046, 4047, 4047, 4048, 4048, 4018, 4018, 4048, 4048,
+     4048, 4048, 4049, 4049, 4050, 4050, 4051, 4051, 4052, 4052,
+     4018, 4018, 4052, 4052, 4052, 4052, 4053, 4053, 4054, 4054,
+     4018, 4018, 4054, 4054, 4054, 4054, 4055, 4055, 4056, 4056,
+     4057, 4057, 4058, 4058, 4059, 4059, 4060, 4060, 4061, 4061,
+     4062, 4062, 4018, 4018, 4063, 4063, 4064, 4064, 4064, 4064,
+     4018, 4018, 4064, 4064, 4064, 4064, 4018, 4018, 4064, 4064,
+     4018, 4018, 4064, 4064, 4064, 4064, 4065, 4065, 4066, 4066,
+
+     4018, 4018, 4066, 4066, 4066, 4066, 4067, 4067, 4068, 4068,
+     4069, 4069, 4070, 4070, 4071, 4071, 4072, 4072, 4018, 4018,
+     4072, 4072, 4072, 4072, 4073, 4073, 4074, 4074, 4075, 4075,
+     4076, 4076, 4018, 4018, 4076, 4076, 4076, 4076, 4077, 4077,
+     4078, 4078, 4018, 4018, 4078, 4078, 4078, 4078, 4079, 4079,
+     4080, 4080, 4081, 4081, 4082, 4082, 4083, 4083, 4084, 4084,
+     4084, 4084, 4018, 4018, 4084, 4084, 4084, 4084, 4018, 4018,
+     4084, 4084, 4084, 4084, 4018, 4018, 4084, 4084, 4018, 4018,
+     4084, 4084, 4084, 4084, 4018, 4018, 4084, 4084, 4018, 4018,
+     4084, 4084, 4084, 4084, 4085, 4085, 4086, 4086, 4018, 4018,
+
+     4086, 4086, 4086, 4086, 4018, 4018, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4087, 4017, 4017, 4087,
+     4087, 4017, 4017, 4017,  344, 4017,  346,  344,  347,  346,
+     4017, 4017, 4017, 4088, 4017, 4017, 4088, 4088, 4088, 4017,
+     4017,  346,  346,  346, 4017, 4017, 4017, 4089, 4017, 4017,
+     4089, 4089, 4089, 4089, 4089, 4017, 4017,  346,  346,  346,
+     4017, 4017, 4017, 4090, 4017, 4017, 4090, 4017, 4017, 4017,
+     4017, 4017, 4017, 4091, 4017, 4017, 4091, 4091, 4091, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4092, 4017, 4017, 4092, 4092,
+     4092, 4017, 4017,  346,  346, 4017, 4017, 4017, 4093, 4017,
+     4017, 4093, 4093, 4017, 4017,  346,  346, 4017, 4017, 4017,
+     4094, 4017, 4017, 4094, 4094, 4094, 4017, 4017,  346,  346,
+     4017, 4017, 4017, 4095, 4017, 4017, 4095, 4095, 4095, 4095,
+     4095, 4095, 4017, 4017, 4017, 4017, 4017, 4017, 4096, 4017,
+     4017, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4017,
+     4017,  346,  346, 4017, 4017, 4017, 4097, 4017, 4017, 4097,
+     4017, 4017,  346,  346, 4017, 4017, 4017, 4098, 4017, 4017,
+     4098, 4098, 4098, 4098, 4098, 4017, 4017,  346,  346,  346,
+
+     4017, 4017, 4017, 4099, 4017, 4017, 4099, 4099, 4099, 4017,
+     4017, 4017, 4017, 4017, 4017, 4100, 4017, 4017, 4100, 4017,
+     4017,  346,  522,  346, 4017, 4017, 4017, 4101, 4017, 4017,
+     4101, 4101, 4101, 4101, 4017, 4017,  346,  346, 4017, 4017,
+     4017, 4102, 4017, 4017, 4102, 4102, 4017, 4017, 4017, 4017,
+     4017, 4017, 4103, 4017, 4017, 4103, 4103, 4017, 4017, 4017,
+     4017, 4017, 4017, 4104, 4017, 4017, 4104, 4104, 4017, 4017,
+     4017, 4017, 4017, 4017, 4105, 4017, 4017, 4105, 4105, 4105,
+     4105, 4105, 4105, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4106, 4017, 4017, 4106, 4017, 4017,  522,  597,  346,  346,
+
+      346,  346, 4017, 4017, 4017, 4107, 4017, 4017, 4107, 4107,
+     4107, 4107, 4107, 4017, 4017,  346,  346, 4017, 4017, 4017,
+     4108, 4017, 4017, 4108, 4108, 4017, 4017, 4017, 4017, 4017,
+     4017, 4109, 4017, 4017, 4109, 4109, 4109, 4109, 4109, 4017,
+     4017, 4017, 4017, 4017, 4017, 4110, 4017, 4017, 4110, 4110,
+     4017, 4017,  346,  346, 4017, 4017, 4017, 4111, 4017, 4017,
+     4111, 4111, 4017, 4017, 4017, 4017, 4017, 4017, 4112, 4017,
+     4017, 4112, 4112, 4112, 4112, 4017, 4017,  346,  346, 4017,
+     4017, 4017, 4113, 4017, 4017, 4113, 4113, 4113, 4113, 4017,
+     4017,  346,  346,  346, 4017, 4017, 4017, 4114, 4017, 4017,
+
+     4114, 4114, 4114, 4017, 4017, 4017, 4017, 4017, 4115, 4017,
+     4017, 4115, 4115, 4115, 4017, 4017, 4017, 4017, 4017, 4017,
+     4116, 4017, 4017, 4116, 4116, 4017, 4017, 4017,  728,  346,
+      522,  731,  346,  730,  346,  730,  731,  737,  736,  346,
+     4017, 4017, 4017, 4117, 4017, 4017, 4117, 4117, 4117, 4017,
+     4017,  346,  346, 4017, 4118, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4119,
+     4119, 4119, 4120, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4121, 4121, 4121, 4121,
+     4121, 4122, 4017, 4017, 4123, 4123, 4123, 4123, 4123, 4123,
+     4124, 4017, 4017, 4125, 4125, 4126, 4017, 4127, 4127, 4127,
+     4127, 4128, 4017, 4129, 4129, 4129, 4129, 4130, 4017, 4131,
+     4131, 4131, 4132, 4017, 4133, 4133, 4133, 4133, 4134, 4017,
+     4135, 4135, 4135, 4135, 4135, 4135, 4135, 4135, 4136, 4017,
+     4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137,
+     4137, 4137, 4137, 4137, 4137, 4138, 4017, 4139, 4139, 4140,
+     4017, 4141, 4141, 4141, 4141, 4141, 4141, 4141, 4142, 4017,
+     4017, 4143, 4143, 4143, 4143, 4144, 4017, 4145, 4145, 4146,
+
+     4017, 4017, 4017, 4147, 4147, 4147, 4147, 4147, 4147, 4148,
+     4017, 4149, 4149, 4149, 4150, 4017, 4151, 4151, 4151, 4152,
+     4017, 4153, 4153, 4153, 4154, 4017, 4155, 4155, 4155, 4155,
+     4155, 4155, 4155, 4155, 4156, 4017, 4017, 4157, 4157, 4158,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4159, 4159, 4159,
+     4159, 4159, 4159, 4160, 4017, 4161, 4161, 4161, 4162, 4017,
+     4163, 4163, 4163, 4163, 4163, 4163, 4163, 4163, 4163, 4164,
+     4017, 4165, 4165, 4165, 4165, 4166, 4017, 4167, 4167, 4167,
+     4168, 4017, 4169, 4169, 4169, 4169, 4169, 4170, 4017, 4171,
+     4171, 4171, 4171, 4171, 4172, 4017, 4017, 4173, 4173, 4173,
+
+     4173, 4017, 4174, 4017, 4017, 4175, 4175, 4175, 4175, 4176,
+     4017, 4177, 4177, 4177, 4178, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4179, 4179, 4179, 4179, 4179, 4180, 4181, 4017,
+     4181, 4017, 4017, 4017, 4182, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4183, 4184, 4184, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4185, 4185, 4185, 4185, 4186, 4186,
+     4017, 4187, 4187, 4187, 4187, 4187, 4188, 4188, 4017, 4189,
+
+     4190, 4190, 4191, 4017, 4017, 4191, 4192, 4192, 4193, 4193,
+     4193, 4194, 4194, 4195, 4195, 4196, 4196, 4197, 4197, 4197,
+     4198, 4198, 4017, 4017, 4017, 4017, 4199, 4199, 4199, 4199,
+     4199, 4200, 4200, 4201, 4017, 4017, 4201, 4017, 4017, 4201,
+     4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4202,
+     4202, 4017, 4017, 4203, 4203, 4204, 4204, 4204, 4017, 4017,
+     4204, 4204, 4204, 4205, 4205, 4017, 4206, 4017, 4017, 4017,
+     4017, 4207, 4207, 4208, 4209, 4209, 4017, 4017, 4210, 4017,
+     4017, 4210, 4210, 4210, 4211, 4211, 4212, 4017, 4017, 4213,
+     4213, 4017, 4017, 4214, 4215, 4215, 4216, 4216, 4217, 4217,
+
+     4218, 4218, 4218, 4017, 4017, 4218, 4218, 4218, 4219, 4219,
+     4017, 4220, 4221, 4221, 4017, 4017, 4017, 4017, 4222, 4222,
+     4222, 4222, 4222, 4223, 4223, 4017, 4017, 4224, 4225, 4225,
+     4226, 4017, 4017, 4226, 4226, 4226, 4226, 4226, 4226, 4227,
+     4227, 4228, 4228, 4228, 4229, 4229, 4230, 4017, 4017, 4231,
+     4231, 4232, 4232, 4017, 4017, 4232, 4233, 4233, 4234, 4017,
+     4017, 4234, 4234, 4235, 4235, 4017, 4236, 4017, 4017, 4236,
+     4017, 4237, 4237, 4017, 4238, 4238, 4238, 4239, 4239, 4017,
+     4017, 4240, 4241, 4241, 4017, 4017, 4017, 4242, 4242, 4242,
+     4242, 4243, 4243, 4244, 4017, 4017, 4244, 4017, 4017, 4245,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4246, 4017,
+     4247, 4017, 4247, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4248, 4248, 4017, 4017, 4248,
+     4017, 4249, 4017, 4249, 4017, 4250, 4250, 4250, 4250, 4250,
+     4017, 4251, 4017, 4251, 4017, 4252, 4017, 4253, 4017, 4253,
+     4254, 4017, 4017, 4017, 4254, 4017, 4255, 4017, 4255, 4017,
+     4017, 4256, 4256, 4017, 4017, 4017, 4257, 4017, 4257, 4017,
+
+     4017, 4017, 4017, 4017, 4258, 4017, 4258, 4017, 4017, 4259,
+     4259, 4017, 4017, 4017, 4260, 4017, 4260, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4261, 4261, 4261, 4261, 4017,
+     4262, 4017, 4262, 4263, 4263, 4263, 4017, 4017, 4017, 4263,
+     4017, 4017, 4017, 4017, 4017, 4263, 4263, 4263, 4263, 4263,
+     4263, 4263, 4263, 4263, 4017, 4264, 4017, 4264, 4017, 4017,
+     4017, 4017, 4265, 4017, 4265, 4266, 4266, 4266, 4017, 4017,
+     4017, 4266, 4266, 4266, 4017, 4267, 4017, 4267, 4017, 4268,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4269, 4017, 4269,
+     4270, 4017, 4271, 4017, 4271, 4017, 4272, 4017, 4017, 4017,
+
+     4272, 4272, 4272, 4017, 4273, 4017, 4273, 4274, 4017, 4017,
+     4017, 4017, 4275, 4017, 4275, 4017, 4017, 4017, 4276, 4017,
+     4277, 4017, 4277, 4278, 4278, 4017, 4279, 4017, 4279, 4280,
+     4280, 4280, 4280, 4017, 4017, 4017, 4017, 4017, 4280, 4280,
+     4017, 4281, 4017, 4281, 4017, 4282, 4017, 4283, 4017, 4283,
+     4017, 4017, 4017, 4017, 4284, 4284, 4284, 4284, 4284, 4017,
+     4285, 4017, 4285, 4017, 4017, 4017, 4286, 4017, 4287, 4017,
+     4287, 4288, 4017, 4017, 4017, 4017, 4017, 4288, 4017, 4017,
+     4288, 4288, 4288, 4017, 4289, 4017, 4289, 4017, 4017, 4017,
+     4017, 4290, 4017, 4291, 4017, 4291, 4292, 4017, 4017, 4017,
+
+     4017, 4293, 4017, 4293, 4294, 4294, 4017, 4017, 4017, 4294,
+     4017, 4295, 4017, 4295, 4296, 4017, 4017, 4017, 4296, 4296,
+     4017, 4297, 4017, 4297, 4017, 4298, 4017, 4017, 4017, 4298,
+     4017, 4017, 4299, 4017, 4299, 4300, 4300, 4300, 4017, 4301,
+     4017, 4301, 4017, 4017, 4017, 4302, 4017, 4303, 4017, 4303,
+     4017, 4017, 4017, 4017, 4017, 4304, 4304, 4017, 4017, 4304,
+     4017, 4305, 4017, 4305, 4306, 4307, 4017, 4017, 4017, 4017,
+     4308, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4309, 4309, 4017, 4017, 4017,
+     4309, 4310, 4017, 4311, 4017, 4017, 4311, 4311, 4311, 4312,
+     4017, 4313, 4314, 4315, 4315, 4316, 4017, 4017, 4017, 4317,
+     4317, 4017, 4017, 4017, 4318, 4017, 4017, 4017, 4017, 4017,
+     4017, 4319, 4017, 4017, 4017, 4320, 4320, 4017, 4017, 4017,
+     4321, 4017, 4017, 4017, 4322, 4322, 4322, 4322, 4323, 4324,
+     4324, 4324, 4017, 4017, 4017, 4017, 4017, 4324, 4324, 4324,
+     4324, 4324, 4324, 4324, 4324, 4324, 4324, 4325, 4326, 4327,
+     4327, 4017, 4017, 4327, 4327, 4327, 4328, 4017, 4017, 4017,
+
+     4329, 4017, 4017, 4330, 4017, 4331, 4331, 4331, 4331, 4332,
+     4333, 4334, 4335, 4336, 4017, 4017, 4337, 4338, 4339, 4339,
+     4339, 4339, 4017, 4017, 4017, 4339, 4339, 4340, 4017, 4341,
+     4342, 4017, 4017, 4017, 4017, 4343, 4017, 4017, 4343, 4343,
+     4343, 4344, 4345, 4346, 4347, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4347, 4017, 4017, 4347, 4348, 4017, 4017,
+     4017, 4017, 4017, 4017, 4349, 4350, 4351, 4352, 4353, 4353,
+     4353, 4354, 4355, 4355, 4017, 4017, 4356, 4017, 4017, 4017,
+     4357, 4017, 4358, 4359, 4017, 4017, 4359, 4360, 4361, 4362,
+     4017, 4017, 4017, 4017, 4017, 4017, 4363, 4363, 4017, 4017,
+
+     4017, 4363, 4364, 4365, 4366, 4366, 4017, 4366, 4017, 4017,
+     4367, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4368, 4368, 4368, 4369, 4017, 4370,
+     4017, 4017, 4017, 4370, 4370, 4370, 4371, 4017, 4017, 4017,
+     4372, 4373, 4373, 4374, 4375, 4375, 4376, 4377, 4378, 4378,
+     4379, 4380, 4380, 4017, 4017, 4380, 4381, 4017, 4017, 4382,
+     4382, 4017, 4017, 4017, 4382, 4382, 4382, 4382, 4382, 4382,
+
+     4017, 4017, 4382, 4382, 4382, 4383, 4384, 4385, 4385, 4017,
+     4017, 4017, 4385, 4017, 4017, 4385, 4386, 4017, 4017, 4017,
+     4017, 4387, 4017, 4017, 4017, 4388, 4389, 4389, 4389, 4389,
+     4390, 4391, 4392, 4017, 4017, 4393, 4017, 4017, 4017, 4394,
+     4395, 4396, 4017, 4017, 4396, 4396, 4017, 4017, 4396, 4397,
+     4017, 4398, 4399, 4017, 4017, 4017, 4017, 4400, 4017, 4017,
+     4017, 4400, 4400, 4400, 4401, 4017, 4017, 4402, 4403, 4017,
+     4017, 4017, 4403, 4017, 4017, 4017, 4403, 4404, 4405, 4406,
+     4407, 4408, 4409, 4409, 4409, 4410, 4411, 4017, 4017, 4017,
+     4017, 4017, 4412, 4017, 4017, 4017, 4017, 4413, 4017, 4414,
+
+     4415, 4017, 4017, 4017, 4017, 4017, 4416, 4417, 4418, 4017,
+     4017, 4017, 4419, 4419, 4419, 4420, 4421, 4422, 4422, 4017,
+     4423, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4424, 4425, 4017, 4426, 4426, 4426, 4426, 4427, 4017, 4017,
+     4017, 4017, 4428, 4429, 4429, 4430, 4017, 4017, 4017, 4017,
+     4431, 4432, 4017, 4017, 4017, 4017, 4433, 4017, 4017, 4434,
+     4017, 4017, 4017, 4017, 4017, 4435, 4017, 4017, 4017, 4017,
+
+     4017, 4436, 4436, 4436, 4017, 4017, 4436, 4436, 4436, 4017,
+     4017, 4017, 4017, 4017, 4436, 4436, 4437, 4438, 4439, 4439,
+     4017, 4017, 4017, 4017, 4017, 4439, 4017, 4017, 4017, 4440,
+     4441, 4442, 4442, 4442, 4442, 4017, 4017, 4443, 4444, 4017,
+     4017, 4017, 4445, 4446, 4447, 4448, 4017, 4017, 4017, 4017,
+     4017, 4448, 4017, 4017, 4017, 4448, 4017, 4017, 4017, 4449,
+     4450, 4017, 4017, 4017, 4017, 4451, 4451, 4451, 4451, 4452,
+     4017, 4017, 4017, 4017, 4017, 4453, 4453, 4453, 4454, 4455,
+     4456, 4457, 4458, 4017, 4017, 4459, 4017, 4017, 4460, 4461,
+     4017, 4017, 4017, 4462, 4017, 4463, 4017, 4464, 4465, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4466, 4467, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4468, 4469, 4470, 4471, 4471, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4472, 4473, 4017,
+     4474, 4474, 4474, 4474, 4017, 4017, 4017, 4475, 4476, 4017,
+     4017, 4477, 4017, 4017, 4017, 4017, 4017, 4017, 4478, 4479,
+     4017, 4017, 4017, 4017, 4017, 4017, 4480, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4481, 4017, 4017, 4017, 4482,
+     4482, 4482, 4017, 4017, 4017, 4017, 4017, 4482, 4482, 4017,
+     4017, 4017, 4482, 4482, 4483, 4484, 4485, 4485, 4017, 4017,
+     4017, 4485, 4486, 4487, 4488, 4017, 4017, 4488, 4488, 4488,
+     4489, 4490, 4491, 4492, 4017, 4017, 4493, 4017, 4017, 4017,
+     4493, 4493, 4017, 4017, 4017, 4494, 4017, 4017, 4017, 4495,
+     4495, 4495, 4495, 4496, 4497, 4017, 4017, 4497, 4498, 4499,
+     4017, 4017, 4500, 4501, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4502, 4017, 4017, 4503, 4017, 4504, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4505, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4506, 4507, 4508, 4509, 4509, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4510, 4511, 4017, 4017, 4017, 4512, 4512, 4512, 4017,
+     4513, 4514, 4017, 4017, 4017, 4515, 4516, 4517, 4518, 4017,
+     4017, 4017, 4519, 4520, 4520, 4520, 4017, 4017, 4017, 4520,
+     4520, 4520, 4017, 4017, 4521, 4017, 4017, 4522, 4522, 4522,
+     4523, 4524, 4525, 4017, 4017, 4017, 4525, 4525, 4525, 4526,
+
+     4527, 4528, 4529, 4530, 4530, 4530, 4017, 4017, 4017, 4017,
+     4531, 4017, 4017, 4017, 4532, 4532, 4532, 4533, 4534, 4017,
+     4017, 4017, 4534, 4017, 4017, 4535, 4536, 4017, 4017, 4017,
+     4017, 4017, 4537, 4017, 4017, 4017, 4538, 4017, 4539, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4540, 4017, 4017, 4017, 4541, 4542, 4543,
+     4544, 4544, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4545, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4546, 4546, 4017, 4547, 4017, 4017, 4548, 4549, 4550,
+     4551, 4017, 4017, 4552, 4552, 4552, 4552, 4017, 4017, 4552,
+     4552, 4017, 4017, 4017, 4017, 4017, 4553, 4553, 4553, 4554,
+     4017, 4017, 4017, 4017, 4555, 4555, 4555, 4555, 4017, 4017,
+     4556, 4557, 4017, 4017, 4558, 4558, 4558, 4017, 4559, 4017,
+     4017, 4017, 4017, 4017, 4560, 4560, 4017, 4017, 4017, 4017,
+     4561, 4562, 4563, 4017, 4017, 4538, 4017, 4539, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4540, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4541,
+     4542, 4543, 4544, 4544, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4545, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4549, 4550, 4551, 4552,
+     4552, 4552, 4552, 4017, 4017, 4017, 4552, 4552, 4017, 4017,
+     4017, 4017, 4017, 4017, 4553, 4553, 4017, 4017, 4554, 4017,
+     4017, 4017, 4555, 4555, 4555, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4557, 4017, 4017, 4017, 4558, 4558, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4561, 4562, 4563, 4538, 4017, 4539, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4540, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4541, 4542, 4543, 4544, 4544, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4549, 4550, 4551,
+     4552, 4552, 4017, 4017, 4552, 4552, 4552, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4553, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4555, 4555, 4555, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4557, 4558, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4561, 4017, 4017, 4017, 4017, 4538,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4540, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4543, 4544, 4544, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4549, 4550, 4551, 4552, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4552, 4552, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4553, 4017, 4017, 4017, 4555, 4017, 4017,
+     4555, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4558,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4561, 4017, 4017, 4017, 4017,
+     4017, 4017, 4538, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4540, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4543, 4544, 4544, 4544, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4549, 4017, 4017, 4551,
+     4552, 4017, 4017, 4017, 4017, 4017, 4017, 4552, 4552, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4553, 4555, 4017,
+     4017, 4017, 4555, 4017, 4017, 4017, 4017, 4017, 4017, 4558,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4538, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4540, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4543, 4544, 4544, 4544, 4564, 4565, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4549, 4551, 4552, 4017, 4017, 4552,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4553, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4558, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4540,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4543, 4544, 4566, 4567,
+
+     4564, 4565, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4551, 4552, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4553, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4558, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4543, 4566, 4544, 4568, 4567, 4569, 4544, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4551, 4552,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4553, 4017, 4017, 4017, 4017, 4558, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543, 4568, 4017,
+     4569, 4544, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4543, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4543, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4543, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4543, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543, 4543, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4543,
+     4543, 4017, 4017, 4017, 4017, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+
+     4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4543, 4543, 4543, 4017,    0, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017
     } ;
 
-static yyconst flex_uint16_t yy_nxt[13918] =
+static const flex_int16_t yy_nxt[14006] =
     {   0,
-     3929,  294,  295,  294,  294,  295,  294,  294,  295,  294,
-      294,  295,  294,  299,  295,  299,  305,  296,  302,  305,
-      296,  302,  999,  297, 3929,  303,  297,  796,  303,  300,
-      299,  295,  299,  730,  306,  308,  309,  306,  308,  309,
-      310,  311,  748,  310,  311,  730,  300,  315,  316,  731,
-      312,  308,  309,  312,  313,  733,  310,  308,  309, 1240,
-      313,  732,  310,  315,  316,  797,  312,  327,  295,  327,
-     1793,  732,  312,  327,  295,  327,  845,  327,  295,  327,
-      327,  295,  327,  328,  295,  295,  295,  785, 1795,  328,
-      846,  733,  317,  329,  786,  776,  329,  729,  729,  729,
-
-      330,  729,  729,  729,  729,  729,  729,  732,  317,  318,
-      319,  295,  319,  318,  318,  318,  318,  318,  318,  318,
-      320,  318,  318,  318,  733,  318,  322,  318,  323,  318,
-      295,  295,  295,  327,  295,  327,  327,  295,  327,  841,
-      732,  327,  295,  327,  788,  832,  330,  842,  776,  328,
-      833, 1005,  328,  843, 1006,  318,  318,  331,  327,  295,
-      327,  729,  729,  729,  787,  787,  324,  729,  729,  729,
-      729,  729,  729, 1796,  331,  325,  318,  319,  295,  319,
-      318,  318,  318,  318,  318,  318,  318,  320,  318,  318,
-      318,  837,  318,  322,  318,  323,  318,  295,  295,  295,
-
-      295,  295,  295,  327,  295,  327,  308,  309,  327,  295,
-      327,  310,  838,  332,  788,  733,  332,  776,  776,  329,
-      883,  688,  318,  318,  329,  295,  295,  295,  295,  295,
-      295,  732,  884,  324,  327,  295,  327,  327,  295,  327,
-     1126,  333,  325, 1127,  333,  327,  295,  327,  796, 1798,
-      331,  689,  733,  331,  327,  295,  327,  729,  729,  729,
-      813,  334,  729,  729,  729,  729,  729,  729,  732,  929,
-      334,  335,  336,  295,  336,  335,  335,  335,  335,  335,
-      335,  335,  337,  335,  335,  335,  733,  335,  339,  335,
-      340,  335,  345,  295,  345,  345,  295,  345,  295,  295,
-
-      295,  776,  732,  295,  295,  295,  862,  797,  346,  733,
-      863,  346, 1799,  776,  347, 1802,  801,  335,  335,  347,
-      345,  295,  345,  341,  864,  732,  342,  729,  729,  729,
-      729,  729,  729,  729,  729,  729,  346, 1803,  343,  335,
-      336,  295,  336,  335,  335,  335,  335,  335,  335,  335,
-      337,  335,  335,  335,  733,  335,  339,  335,  340,  335,
-      345,  295,  345,  345,  295,  345,  345,  295,  345, 1021,
-      732,  361,  295,  361,  865, 1804,  346,  733, 1806,  348,
-     1022, 1019,  348, 1023,  807,  335,  335,  362,  361,  295,
-      361,  341,  818,  732,  342,  729,  729,  729,  729,  729,
-
-      729,  729,  729,  729,  362, 1020,  343,  349,  350,  295,
-      350,  349,  349,  349,  349,  349,  349,  349,  351,  349,
-      349,  349,  733,  349,  353,  349,  354,  349,  295,  295,
-      295,  295,  295,  295,  361,  295,  361,  824,  732,  361,
-      295,  361, 1497,  733,  363,  776,  733,  363, 1498,  733,
-      362, 1808,  851,  349,  349,  362,  361,  295,  361,  732,
-      970,  355,  732,  356,  813,  732,  357,  729,  729,  729,
-      358, 1817,  364, 1820,  359,  349,  350,  295,  350,  349,
-      349,  349,  349,  349,  349,  349,  351,  349,  349,  349,
-      776,  349,  353,  349,  354,  349,  361,  295,  361,  373,
-
-      295,  373,  373,  295,  373,  776,  847,  385,  295,  385,
-      971,  733,  364,  788,  848,  374, 1031,  776,  374,  849,
-      855,  349,  349,  386,  385,  295,  385,  732, 1652,  355,
-     1032,  356,  818, 1828,  357,  729,  729,  729,  358, 1830,
-      386, 1653,  359,  365,  366,  295,  366,  365,  365,  365,
-      365,  365,  365,  365,  367,  365,  365,  365,  733,  365,
-      369,  365,  370,  365,  397,  295,  397,  397,  295,  397,
-      295,  295,  295,  776,  732,  295,  295,  295,  908, 1832,
-      398,  788,  909,  398, 1833,  776,  347, 1834,  733,  365,
-      365,  347,  397,  295,  397,  397,  295,  397,  729,  729,
-
-      729,  729,  729,  729,  732,  864,  824, 1836,  398, 1837,
-     1841,  398, 1845,  371,  365,  366,  295,  366,  365,  365,
-      365,  365,  365,  365,  365,  367,  365,  365,  365,  733,
-      365,  369,  365,  370,  365,  397,  295,  397,  397,  295,
-      397,  409,  295,  409, 1847,  732,  409,  295,  409,  949,
-     1850,  399, 1852, 1857,  399,  788,  950,  410,  776,  776,
-      365,  365,  410,  295,  295,  295,  295,  295,  295,  729,
-      729,  729,  729,  729,  729,  729,  729,  729, 1858,  347,
-      738, 1862,  347, 1869,  371,  375,  376,  295,  376,  375,
-      375,  375,  375,  375,  375,  375,  377,  375,  375,  375,
-
-      733,  375,  379,  375,  380,  375,  409,  295,  409,  409,
-      295,  409,  409,  295,  409,  752,  732,  409,  295,  409,
-      733, 1870,  410,  739,  875,  410,  916,  834,  411,  740,
-      770,  375,  375,  411,  741,  381,  732,  885,  915,  742,
-     1261,  921,  382, 1871, 1628,  383,  375,  376,  295,  376,
-      375,  375,  375,  375,  375,  375,  375,  377,  375,  375,
-      375, 1038,  375,  379,  375,  380,  375,  422,  295,  422,
-      422,  295,  422,  295,  295,  295,  916,  776,  295,  295,
-      295, 1038, 1872,  423,  915, 1039,  423, 1873,  733,  347,
-      776,  921,  375,  375,  347,  871,  381,  729,  729,  729,
-
-      729,  729,  729,  382,  732, 1020,  383,  387,  388,  295,
-      388,  387,  387,  387,  387,  387,  387,  387,  389,  387,
-      387,  387,  733,  387,  391,  387,  392,  387,  422,  295,
-      422,  422,  295,  422,  422,  295,  422,  776,  732,  422,
-      295,  422,  995, 1874,  423,  733, 1031,  423, 1875,  996,
-      424, 1876,  890,  387,  387,  424,  438,  295,  438,  393,
-     1046,  732,  394,  729,  729,  729,  729,  729,  729,  729,
-      729,  729,  439, 1877,  395,  387,  388,  295,  388,  387,
-      387,  387,  387,  387,  387,  387,  389,  387,  387,  387,
-      733,  387,  391,  387,  392,  387,  438,  295,  438,  455,
-
-      295,  455,  455,  295,  455, 1040,  732,  295,  295,  295,
-     1878, 1879,  439,  733, 1882,  456, 1041, 1019,  456, 1023,
-      895,  387,  387,  330,  295,  295,  295,  393,  929,  732,
-      394,  729,  729,  729,  729,  729,  729,  729,  729,  729,
-      330, 1039,  395,  400,  401,  295,  401,  400,  400,  400,
-      400,  400,  400,  400,  402,  400,  400,  400,  733,  400,
-      404,  400,  405,  400,  455,  295,  455,  455,  295,  455,
-      455,  295,  455,  943,  732,  455,  295,  455, 1885, 1886,
-      456,  776, 1888,  456, 1889, 1891,  457, 1892,  944,  400,
-      400,  457,  466,  295,  466,  406,  729,  729,  729,  729,
-
-      729,  729,  729,  729,  729,  729,  729,  729,  467, 1893,
-      407,  400,  401,  295,  401,  400,  400,  400,  400,  400,
-      400,  400,  402,  400,  400,  400,  733,  400,  404,  400,
-      405,  400,  466,  295,  466,  295,  295,  295,  295,  295,
-      295, 1031,  732,  466,  295,  466, 1894, 1898,  467, 1899,
-     1900,  330, 1901, 1902,  330, 1051,  951,  400,  400,  467,
-      466,  295,  466,  406,  729,  729,  729,  729,  729,  729,
-      729,  729,  729,  729,  729,  729,  467, 1905,  407,  412,
-      413,  295,  413,  412,  412,  412,  412,  412,  412,  412,
-      414,  412,  412,  412,  733,  412,  416,  412,  417,  412,
-
-      466,  295,  466,  466,  295,  466,  481,  295,  481,  776,
-      732,  481,  295,  481, 1908, 1909,  468,  733, 1031,  468,
-     1910, 1913,  482, 1914,  900,  412,  412,  482,  295,  295,
-      295,  418, 1053,  732,  419,  729,  729,  729,  729,  729,
-      729,  729,  729,  729,  483, 1915,  420,  412,  413,  295,
-      413,  412,  412,  412,  412,  412,  412,  412,  414,  412,
-      412,  412,  733,  412,  416,  412,  417,  412,  295,  295,
-      295,  481,  295,  481,  481,  295,  481, 1749,  732,  481,
-      295,  481, 1916, 1917,  483,  733, 1920,  482, 1924, 1750,
-      482,  733,  910,  412,  412,  484,  481,  295,  481,  418,
-
-      963,  732,  419,  729,  729,  729,  970,  732,  729,  729,
-      729, 3929,  484, 1925,  420,  425,  426,  295,  426,  425,
-      425,  425,  425,  425,  425,  425,  427,  425,  425,  425,
-      733,  425,  429,  425,  430,  425,  495,  295,  495,  495,
-      295,  495,  505,  295,  505,  990,  732,  505,  295,  505,
-      779,  911,  496,  776,  920,  496,  999,  733,  506,  776,
-      997,  425,  425,  506,  762,  431,  780,  776,  772,  919,
-     1926, 1000,  432,  732, 1928,  433,  729,  729,  729,  434,
-     1932,  435,  436,  425,  426,  295,  426,  425,  425,  425,
-      425,  425,  425,  425,  427,  425,  425,  425,  776,  425,
-
-      429,  425,  430,  425,  295,  295,  295,  295,  295,  295,
-      505,  295,  505,  776,  939,  505,  295,  505,  940, 1933,
-      507, 1935,  941,  507, 1936,  733,  506, 1017, 1261,  425,
-      425,  506,  934,  431,  729,  729,  729,  729,  729,  729,
-      432,  732, 1018,  433,  729,  729,  729,  434, 1864,  435,
-      436,  440,  441,  295,  441,  440,  440,  440,  440,  440,
-      440,  440,  442,  440,  440,  440,  733,  440,  444,  440,
-      445,  440,  505,  295,  505,  505,  295,  505,  520,  295,
-      520, 1017,  732,  520,  295,  520, 1939, 1940,  508, 1942,
-     1943,  508, 1184,  733,  521, 1946, 1068,  440,  440,  521,
-
-      945,  446,  447,  729,  729,  729,  951, 1018,  448,  732,
-     1968,  449,  729,  729,  729,  450, 1969,  451,  452,  453,
-      440,  441,  295,  441,  440,  440,  440,  440,  440,  440,
-      440,  442,  440,  440,  440,  733,  440,  444,  440,  445,
-      440,  295,  295,  295,  295,  295,  295,  520,  295,  520,
-     1021,  732,  520,  295,  520,  788, 1973,  330, 1292,  776,
-      330, 1022,  733,  521, 1185, 1187,  440,  440,  521,  956,
-      446,  447,  729,  729,  729, 1293, 1976,  448,  732, 1046,
-      449,  729,  729,  729,  450, 1978,  451,  452,  453,  458,
-      459,  295,  459,  458,  458,  458,  458,  458,  458,  458,
-
-      460,  458,  458,  458,  733,  458,  462,  458,  463,  458,
-      520,  295,  520,  520,  295,  520,  532,  295,  532, 1987,
-      732,  532,  295,  532, 1988, 1989,  522, 1990,  733,  522,
-     1992, 2000,  533,  997, 2002,  458,  458,  533,  729,  729,
-      729,  729,  729,  729,  732,  915,  464,  458,  459,  295,
-      459,  458,  458,  458,  458,  458,  458,  458,  460,  458,
-      458,  458,  733,  458,  462,  458,  463,  458,  543,  295,
-      543,  543,  295,  543,  554,  295,  554, 1040,  732,  554,
-      295,  554,  788,  916,  544,  917,  776,  544, 1041, 2005,
-      555, 1185, 2006,  458,  458,  555, 2009, 2011,  918, 2012,
-
-      919,  729,  729,  729,  464,  469,  470,  295,  470,  469,
-      469,  469,  469,  469,  469,  469,  471,  469,  469,  469,
-      733,  469,  473,  469,  474,  469,  569,  295,  569,  569,
-      295,  569,  295,  295,  295, 2014,  732,  295,  295,  295,
-     2015, 2016,  570, 2017,  733,  570, 2018, 2022,  571, 2023,
-     2024,  469,  469,  571,  475,  733,  476,  729,  729,  729,
-      732, 2029,  477,  729,  729,  729,  729,  729,  729,  478,
-     2033,  732,  479,  469,  470,  295,  470,  469,  469,  469,
-      469,  469,  469,  469,  471,  469,  469,  469, 2037,  469,
-      473,  469,  474,  469,  580,  295,  580,  580,  295,  580,
-
-      580,  295,  580, 2039, 1028,  580,  295,  580, 2041, 2043,
-      581, 1029, 1261,  581, 2044, 2045,  582, 1030, 2047,  469,
-      469,  582,  475, 2054,  476,  729,  729,  729, 1263, 2058,
-      477,  729,  729,  729,  729,  729,  729,  478, 2059, 1292,
-      479,  485,  486,  295,  486,  485,  485,  485,  485,  485,
-      485,  485,  487,  485,  485,  485, 1445,  485,  489,  485,
-      490,  485,  295,  295,  295,  295,  295,  295,  580,  295,
-      580, 2061, 1652,  580,  295,  580, 2068, 1591,  583,  977,
-     2070,  583, 2071, 1797,  581, 1659,  978,  485,  485,  581,
-      580,  295,  580,  491, 1293,  732, 1659, 2072,  492,  729,
-
-      729,  729,  729,  729,  729, 1867,  584,  729,  729,  729,
-      493,  485,  486,  295,  486,  485,  485,  485,  485,  485,
-      485,  485,  487,  485,  485,  485, 2077,  485,  489,  485,
-      490,  485,  580,  295,  580,  295,  295,  295,  295,  295,
-      295, 1261, 2078,  580,  295,  580, 2079, 2081,  584,  733,
-     2082,  507, 2083, 2084,  507, 2085,  985,  485,  485,  582,
-      580,  295,  580,  491, 2086,  732, 2074, 2087,  492,  729,
-      729,  729,  729,  729,  729, 2088,  582, 1280, 1280, 1280,
-      493,  497,  498,  295,  498,  497,  497,  497,  497,  497,
-      497,  497,  499,  497,  497,  497, 2089,  497,  501,  497,
-
-      502,  497,  295,  295,  295,  295,  295,  295,  580,  295,
-      580, 2090, 1028,  580,  295,  580, 1400, 2092,  585, 1029,
-     2093,  585, 2094, 2097,  584, 1036, 1401,  497,  497,  584,
-     1003, 1003, 1003, 1402, 1265,  503,  497,  498,  295,  498,
-      497,  497,  497,  497,  497,  497,  497,  499,  497,  497,
-      497, 2100,  497,  501,  497,  502,  497,  580,  295,  580,
-      580,  295,  580,  599,  295,  599, 2101, 1045,  599,  295,
-      599, 2102, 2103,  586, 1029, 2104,  586, 2105, 2106,  600,
-     1030, 2107,  497,  497,  600, 1003, 1003, 1003, 2110, 2113,
-      503,  509,  510,  295,  510,  509,  509,  509,  509,  509,
-
-      509,  509,  511,  509,  509,  509, 2120,  509,  513,  509,
-      514,  509,  295,  295,  295,  295,  295,  295,  599,  295,
-      599, 2121, 1045,  599,  295,  599, 2122, 2123,  363, 1029,
-     2124,  363, 2126, 1028,  600, 1036, 1045,  509,  509,  600,
-     1029,  515, 2131, 1029, 2132, 1004, 1186, 2176,  516, 1186,
-     2177,  517, 2183, 1280, 1280, 1280, 2189, 2190,  518,  509,
-      510,  295,  510,  509,  509,  509,  509,  509,  509,  509,
-      511,  509,  509,  509, 2191,  509,  513,  509,  514,  509,
-      599,  295,  599,  599,  295,  599,  611,  295,  611, 2192,
-     2195,  611,  295,  611, 2201, 2203,  601, 2209, 2213,  601,
-
-     2216, 2217,  612, 2220, 2221,  509,  509,  612, 2222,  515,
-     1272, 1272, 1272, 2223, 1273, 2224,  516, 1274, 1281,  517,
-     1303, 1303, 1303, 1887, 1887, 1887,  518,  523,  524,  295,
-      524,  523,  523,  523,  523,  523,  523,  523,  525,  523,
-      523,  523, 2225,  523,  527,  523,  528,  523,  625,  295,
-      625,  625,  295,  625,  636,  295,  636, 2226, 2233,  636,
-      295,  636, 2234, 2235,  626, 2237, 2239,  626, 2247, 2252,
-      637, 2253, 2254,  523,  523,  637, 1303, 1303, 1303,  529,
-     1880, 1880, 1880, 2256,  530,  523,  524,  295,  524,  523,
-      523,  523,  523,  523,  523,  523,  525,  523,  523,  523,
-
-     2269,  523,  527,  523,  528,  523,  295,  295,  295,  295,
-      295,  295,  636,  295,  636, 1867, 2283,  636,  295,  636,
-     2284, 2285,  347, 2289, 2290,  347, 2292, 1881,  637, 2293,
-     2294,  523,  523,  637, 1303, 1303, 1303,  529, 1883, 1883,
-     1883, 1304,  530,  534,  535,  295,  535,  534,  534,  534,
-      534,  534,  534,  534,  536,  534,  534,  534, 2279,  534,
-      538,  534,  539,  534,  636,  295,  636,  636,  295,  636,
-      648,  295,  648, 1867, 2295,  648,  295,  648, 2296, 2297,
-      638, 1261, 2300,  638, 2301, 1884,  649, 2302, 2303,  534,
-      534,  649,  661,  295,  661,  661,  295,  661, 2278, 1281,
-
-      540, 2304, 1348, 1348, 1348, 2308, 1349, 2280,  662, 1350,
-     2309,  662, 2310,  541,  534,  535,  295,  535,  534,  534,
-      534,  534,  534,  534,  534,  536,  534,  534,  534, 2286,
-      534,  538,  534,  539,  534,  295,  295,  295,  295,  295,
-      295,  661,  295,  661, 2311, 2287,  661,  295,  661, 2313,
-     2314,  330, 2315, 2288,  330, 2322, 2324,  662, 2325, 2326,
-      534,  534,  662,  661,  295,  661,  661,  295,  661, 2327,
-     2328,  540, 2331, 1384, 1384, 1384, 2333, 1385, 2364,  663,
-     1386, 2365,  663, 2366,  541,  545,  546,  295,  546,  545,
-      545,  545,  545,  545,  545,  545,  547,  545,  545,  545,
-
-     2305,  545,  549,  545,  550,  545,  675,  295,  675,  675,
-      295,  675,  295,  295,  295, 2372, 2306,  295,  295,  295,
-     2373, 2377,  676, 2378, 2307,  676, 2381, 2382,  677, 2386,
-     2389,  545,  545,  677,  675,  295,  675, 1387, 1387, 1387,
-     2393, 1388, 2394, 2395, 1389, 2398, 2401,  551, 2405, 2406,
-      676, 2407,  552,  545,  546,  295,  546,  545,  545,  545,
-      545,  545,  545,  545,  547,  545,  545,  545, 2412,  545,
-      549,  545,  550,  545,  675,  295,  675,  675,  295,  675,
-      675,  295,  675, 2414, 2415,  700,  295,  700, 2416, 2417,
-      676, 2419, 2422,  678, 2424, 2427,  678,  308,  309,  545,
-
-      545,  701,  310,  700,  295,  700, 1403, 1403, 1403, 2441,
-     1404, 2442,  688, 1405, 2443,  551, 1890, 1890, 1890,  701,
-      552,  556,  557,  295,  557,  556,  556,  556,  556,  556,
-      556,  556,  558,  556,  556,  556, 2448,  556,  560,  556,
-      561,  556,  689,  711,  295,  711,  711,  295,  711,  711,
-      295,  711, 2449,  711,  295,  711, 1011, 1011, 1011,  712,
-     2452, 2453,  712, 2454, 2457,  713, 2450,  556,  556,  713,
-      562,  563,  564, 1012, 2451, 1407, 1407, 1407,  565, 1408,
-     2467,  566, 1409, 2476, 1867, 1280, 1280, 1280,  567,  556,
-      557,  295,  557,  556,  556,  556,  556,  556,  556,  556,
-
-      558,  556,  556,  556, 2477,  556,  560,  556,  561,  556,
-      295,  295,  295,  295,  295,  295,  711,  295,  711, 2455,
-     2478,  711,  295,  711, 1261, 2479,  330, 2456, 2480,  330,
-     2469, 2471,  712, 2483, 2485,  556,  556,  712,  562,  563,
-      564, 1425, 1425, 1425, 2486, 1426,  565, 2487, 1427,  566,
-     1304, 1895, 1895, 1895, 2491, 2492,  567,  572,  573,  295,
-      573,  572,  572,  572,  572,  572,  572,  572,  574,  572,
-      572,  572, 2494,  572,  576,  572,  577,  572,  711,  295,
-      711,  711,  295,  711,  295,  295,  295, 1896, 1867,  295,
-      295,  295, 2495, 2496,  714, 2497, 2500,  714, 2504, 2505,
-
-      332, 2506, 2508,  572,  572,  332,  711,  295,  711,  711,
-      295,  711, 1435, 1435, 1435, 2514, 1436, 2516, 2528, 1437,
-     2470, 2529,  713, 2530, 2534,  713, 2535,  578,  572,  573,
-      295,  573,  572,  572,  572,  572,  572,  572,  572,  574,
-      572,  572,  572, 2536,  572,  576,  572,  577,  572,  295,
-      295,  295,  295,  295,  295,  711,  295,  711, 2542, 2543,
-      711,  295,  711, 2544, 2547,  333, 2551, 2552,  333, 2553,
-     2554,  714, 2557, 2558,  572,  572,  714,  711,  295,  711,
-      711,  295,  711, 1447, 1447, 1447, 2559, 1448, 2560, 2561,
-     1449, 2573, 2577,  715, 2580, 2581,  715, 2592,  578,  587,
-
-      588,  295,  588,  587,  587,  587,  587,  587,  587,  587,
-      589,  587,  587,  587, 2593,  587,  591,  587,  592,  587,
-      726,  295,  726,  726,  295,  726,  295,  295,  295, 2594,
-     2598,  295,  295,  295, 2599, 2600,  727, 2601, 2602,  727,
-     2603, 2604,  347, 2605, 2606,  587,  587,  347,  726,  295,
-      726, 2607, 2612,  593, 2629,  594, 2630, 1867,  595, 1897,
-     1897, 1897,  596, 2631,  727, 1867,  597,  587,  588,  295,
-      588,  587,  587,  587,  587,  587,  587,  587,  589,  587,
-      587,  587, 2632,  587,  591,  587,  592,  587,  726,  295,
-      726,  726,  295,  726,  726,  295,  726, 2634, 1073, 1073,
-
-     1073, 1092, 1092, 1092,  727, 2616, 2636,  728, 2637, 2615,
-      728, 2638, 2640,  587,  587, 1074, 2641,  748, 1093, 2642,
-     2643,  593,  875,  594, 2644, 2645,  595,  774, 2646, 2647,
-      596, 2668,  876, 2669,  597,  602,  603,  295,  603,  602,
-      602,  602,  602,  602,  602,  602,  604,  602,  602,  602,
-     2674,  602,  606,  602,  607,  602,  775, 2675, 2681, 1094,
-     1094, 1094,  752, 2670, 2682, 1276, 1276, 1276,  754, 2683,
-      776, 2699,  777, 2671,  760,  762, 1095, 2700, 2701,  760,
-      778,  602,  602, 1278, 2716,  877, 2717, 2721,  990, 1450,
-     1450, 1450,  608, 1451, 2722, 2723, 1452, 2724,  774, 2725,
-
-     1903, 1903, 1903, 2726, 2727,  609,  602,  603,  295,  603,
-      602,  602,  602,  602,  602,  602,  602,  604,  602,  602,
-      602, 2728,  602,  606,  602,  607,  602,  775, 2729, 1104,
-     1104, 1104, 1107, 1107, 1107, 2730, 2731, 1121, 1121, 1121,
-     2732,  776, 2744,  777, 2749,  760, 1105, 1904, 2750, 1108,
-     2753,  778,  602,  602, 1122, 1128, 1128, 1128, 1137, 1137,
-     1137, 2751, 2754,  608, 1464, 1464, 1464, 2755, 1465, 2756,
-     2752, 1466, 1129, 2759, 1867, 1138,  609,  613,  614,  295,
-      614,  613,  613,  613,  613,  613,  613,  613,  615,  613,
-      613,  613, 2760,  613,  617,  613,  618,  613, 1139, 1139,
-
-     1139, 1149, 1149, 1149, 1157, 1157, 1157, 2747, 1161, 1161,
-     1161, 1173, 1173, 1173, 2761, 1140, 2762, 2757, 1150, 2763,
-     2765, 1158, 1867,  613,  613, 1162, 2758, 2766, 1174, 1475,
-     1475, 1475,  619, 1476,  620, 2767, 1477, 2769,  621, 2770,
-     1906, 1906, 1906,  622,  623,  613,  614,  295,  614,  613,
-      613,  613,  613,  613,  613,  613,  615,  613,  613,  613,
-     2748,  613,  617,  613,  618,  613, 1195, 1195, 1195, 1201,
-     1201, 1201, 1217, 1217, 1217, 2771, 1223, 1223, 1223, 1229,
-     1229, 1229, 2773, 1196, 2774, 2776, 1202, 1884, 2794, 1218,
-     2795,  613,  613, 1224, 2796, 2797, 1230, 1482, 1482, 1482,
-
-      619, 1483,  620, 2801, 1484, 2802,  621, 1907, 1907, 1907,
-     2809,  622,  623,  627,  628,  295,  628,  627,  627,  627,
-      627,  627,  627,  627,  629,  627,  627,  627, 2810,  627,
-      631,  627,  632,  627, 1237, 1237, 1237, 1249, 1249, 1249,
-     1011, 1011, 1011, 2817, 1320, 1320, 1320, 1324, 1324, 1324,
-     2818, 1238, 2819, 2831, 1250, 2832, 2803, 1012, 2804,  627,
-      627, 1321, 2847, 2848, 1325,  633, 1500, 1500, 1500, 2849,
-     1501, 2805, 2851, 1502, 2852, 1911, 1911, 1911, 2853, 2854,
-      634,  627,  628,  295,  628,  627,  627,  627,  627,  627,
-      627,  627,  629,  627,  627,  627, 2855,  627,  631,  627,
-
-      632,  627, 1276, 1276, 1276, 1327, 1327, 1327, 1327, 1327,
-     1327, 1912, 2856, 3929, 3929, 3929, 2857, 3929, 3929, 3929,
-     1278, 2858, 2859, 1329, 2860, 2257, 1329,  627,  627, 2861,
-     3929, 2258, 2862,  633, 3929, 2259, 1530, 1530, 1530, 1279,
-     1531, 2260, 2864, 1532, 2865, 1330, 2868, 2869,  634,  639,
-      640,  295,  640,  639,  639,  639,  639,  639,  639,  639,
-      641,  639,  639,  639, 1322,  639,  643,  639,  644,  639,
-     1337, 1337, 1337, 1343, 1343, 1343, 2870, 1326, 2871, 1323,
-     1337, 1337, 1337, 1343, 1343, 1343, 2874, 2806, 1339, 2807,
-     2866, 1345, 1911, 1911, 1911,  639,  639, 2875, 1339, 2867,
-
-      645, 1345, 2808, 1906, 1906, 1906,  646,  639,  640,  295,
-      640,  639,  639,  639,  639,  639,  639,  639,  641,  639,
-      639,  639, 2872,  639,  643,  639,  644,  639, 1896, 2876,
-     1340, 2873, 1073, 1073, 1073, 2881, 1867, 1352, 1352, 1352,
-     2882, 1352, 1352, 1352, 1356, 1356, 1356, 2883, 1346, 1074,
-     1919, 2884, 1261,  639,  639, 1354, 1867, 2885,  645, 1354,
-     2886, 1357, 2887, 2888,  646,  650,  651,  295,  651,  650,
-      650,  650,  650,  650,  650,  650,  652,  650,  650,  650,
-     2880,  650,  654,  650,  655,  650, 1360, 1360, 1360, 1355,
-     1362, 1362, 1362, 2878, 2879, 1362, 1362, 1362, 3929, 3929,
-
-     3929, 2889, 2890, 1361, 1366, 1366, 1366, 2891, 1364, 2892,
-     2893,  650,  650, 1364,  656, 3929,  657, 2080, 2080, 2080,
-     2894, 1367,  658, 1539, 1539, 1539, 2895, 1540, 2897, 2898,
-     1541, 2899, 2900,  659,  650,  651,  295,  651,  650,  650,
-      650,  650,  650,  650,  650,  652,  650,  650,  650, 1358,
-      650,  654,  650,  655,  650, 1368, 1368, 1368, 1370, 1370,
-     1370, 1370, 1370, 1370, 1359, 2901, 2902, 1365, 2903, 1374,
-     1374, 1374, 1369, 3929, 3929, 3929, 1372, 2915, 2916, 1372,
-      650,  650, 2919,  656, 2920,  657, 1375, 1880, 1880, 1880,
-     3929,  658, 1564, 1564, 1564, 2921, 1565, 2922, 2925, 1566,
-
-     2926, 2929,  659,  664,  665,  295,  665,  664,  664,  664,
-      664,  664,  664,  664,  666,  664,  664,  664, 2930,  664,
-      668,  664,  669,  664, 1376, 1378, 1378, 1378, 1380, 1380,
-     1380, 2261, 2938, 1373, 1380, 1380, 1380, 2262, 2939, 1377,
-     2923, 2263, 1379, 1396, 1396, 1396, 1382, 2264, 2940,  664,
-      664, 2924, 1382, 2951,  670, 1573, 1573, 1573, 2927, 1574,
-      671, 1398, 1575, 2969,  672, 1883, 1883, 1883, 2978, 2928,
-      673,  664,  665,  295,  665,  664,  664,  664,  664,  664,
-      664,  664,  666,  664,  664,  664, 2979,  664,  668,  664,
-      669,  664, 1092, 1092, 1092, 1094, 1094, 1094, 1390, 1390,
-
-     1390, 1582, 1582, 1582, 2980, 1583, 1383, 2981, 1584, 1093,
-     2982, 2983, 1095, 2984, 2985, 1391, 2963,  664,  664, 3929,
-     3929, 3929,  670, 1593, 1593, 1593, 2964, 1594,  671, 2965,
-     1595, 2986,  672, 2091, 2091, 2091, 3929, 2987,  673,  679,
-      680,  295,  680,  679,  679,  679,  679,  679,  679,  679,
-      681,  679,  679,  679, 2989,  679,  683,  679,  684,  679,
-     1887, 1887, 1887, 3929, 3929, 3929, 2990, 1104, 1104, 1104,
-     2991, 2992, 1392, 3929, 3929, 3929, 2993, 3929, 3929, 3929,
-     3929, 1396, 1396, 1396, 1105,  679,  679, 1890, 1890, 1890,
-     3929, 2994, 2995,  685, 3929, 2996,  686, 2997, 2998, 1398,
-
-     2095, 2095, 2095,  687,  679,  680,  295,  680,  679,  679,
-      679,  679,  679,  679,  679,  681,  679,  679,  679, 1393,
-      679,  683,  679,  684,  679, 1394, 1107, 1107, 1107, 1399,
-     1395, 1410, 1410, 1410, 1421, 1421, 1421, 1421, 1421, 1421,
-     1121, 1121, 1121, 1108, 1428, 1428, 1428, 2999, 1411, 3000,
-      679,  679, 1423, 2966, 1261, 1423, 3008, 1122,  685, 3009,
-     3010,  686, 1430, 2967, 3011, 2096, 2968, 3012,  687,  690,
-      691,  295,  691,  690,  690,  690,  690,  690,  690,  690,
-      692,  690,  690,  690, 3005,  690,  694,  690,  695,  690,
-     3013, 1428, 1428, 1428, 3014, 3015, 1424, 1128, 1128, 1128,
-
-     1441, 1441, 1441, 1441, 1441, 1441, 1137, 1137, 1137, 1430,
-     1139, 1139, 1139, 3016, 1129,  690,  690, 3017, 1443, 3018,
-     3019, 1443,  696, 1138, 1895, 1895, 1895, 1140,  697, 1609,
-     1609, 1609, 3020, 1610, 3022, 1867, 1611,  698,  690,  691,
-      295,  691,  690,  690,  690,  690,  690,  690,  690,  692,
-      690,  690,  690, 1431,  690,  694,  690,  695,  690, 1453,
-     1453, 1453, 1458, 1458, 1458, 1444, 3023, 3024, 1453, 1453,
-     1453, 1458, 1458, 1458, 1470, 1470, 1470, 1455, 3006, 1867,
-     1460, 1149, 1149, 1149,  690,  690, 1455, 3025, 3027, 1460,
-     3028,  696, 1472, 1895, 1895, 1895, 3029,  697, 1150, 3040,
-
-     2098, 2098, 2098, 1897, 1897, 1897,  698,  702,  703,  295,
-      703,  702,  702,  702,  702,  702,  702,  702,  704,  702,
-      702,  702, 3007,  702,  706,  702,  707,  702, 3048, 1912,
-     1456, 3049, 1461, 1470, 1470, 1470, 3050, 3051, 1157, 1157,
-     1157, 1478, 1478, 1478, 1478, 1478, 1478, 2099, 1161, 1161,
-     1161, 1472, 3052,  702,  702, 1158, 1272, 1272, 1272, 1480,
-     1273, 3053, 1480, 1274,  708, 1162, 1903, 1903, 1903, 1906,
-     1906, 1906, 3054,  709,  702,  703,  295,  703,  702,  702,
-      702,  702,  702,  702,  702,  704,  702,  702,  702, 1473,
-      702,  706,  702,  707,  702, 1486, 1486, 1486, 3055, 3056,
-
-     1481, 1486, 1486, 1486, 1492, 1492, 1492, 1492, 1492, 1492,
-     1173, 1173, 1173, 1488, 3057, 1503, 1503, 1503, 3058, 1488,
-      702,  702, 1494, 3062, 3065, 1494, 3033, 1174, 1907, 1907,
-     1907,  708, 1504, 1911, 1911, 1911, 2186, 2186, 2186, 3034,
-      709,  716,  717,  295,  717,  716,  716,  716,  716,  716,
-      716,  716,  718,  716,  716,  716, 3066,  716,  720,  716,
-      721,  716, 3035, 1489, 1507, 1507, 1507, 3067, 3068, 1495,
-     3069, 3070, 1507, 1507, 1507, 3036, 1513, 1513, 1513, 1513,
-     1513, 1513, 1509, 1526, 1526, 1526, 3071,  716,  716, 3074,
-     1509, 3078, 3082,  722, 1515, 3083,  723, 1515, 1676, 1676,
-
-     1676, 1528, 1677, 3086, 3079, 1678, 3087, 3090,  724,  716,
-      717,  295,  717,  716,  716,  716,  716,  716,  716,  716,
-      718,  716,  716,  716, 1510,  716,  720,  716,  721,  716,
-     1526, 1526, 1526, 1195, 1195, 1195, 3080, 3101, 1516, 1534,
-     1534, 1534, 1534, 1534, 1534, 1201, 1201, 1201, 1528, 3081,
-     1196, 1542, 1542, 1542, 3102,  716,  716, 1536, 3103, 3104,
-     1536,  722, 1202, 3105,  723, 1545, 1545, 1545, 1543, 1550,
-     1550, 1550, 1550, 1550, 1550, 2944,  724,  733, 3106, 1554,
-     1554, 1554, 1546, 3107,  748, 2945, 3108, 1552, 3110, 3111,
-     1552, 2946, 3112,  732,  749, 1529, 1555, 1556, 1556, 1556,
-
-     3929, 3929, 3929, 1559, 1559, 1559, 3084, 1537, 1559, 1559,
-     1559, 1217, 1217, 1217, 1557, 2947, 3113, 3929, 3114, 3085,
-     1553, 1561,  750,  751,  752, 2948, 1561, 3115, 1218,  753,
-      754, 2949, 3116,  755,  756, 3117, 3088,  757, 3118,  758,
-      759,  760, 3119, 1567, 1567, 1567, 3120,  761,  733, 3089,
-     3121, 1567, 1567, 1567, 1223, 1223, 1223, 1577, 1577, 1577,
-     1558, 1569, 1867, 3129,  732,  763, 1577, 1577, 1577, 1569,
-     1562, 1224, 1229, 1229, 1229, 1579, 3130, 3131, 1587, 1587,
-     1587, 1587, 1587, 1587, 1579, 1237, 1237, 1237, 1261, 1230,
-     1249, 1249, 1249,  750,  764,  765, 1589, 3132, 3126, 1589,
-
-      766,  767, 1238, 3133,  768,  756, 3134, 1250,  769, 3135,
-      770,  771,  772, 1570, 1598, 1598, 1598, 3136,  773,  733,
-     1598, 1598, 1598, 1605, 1605, 1605,  990, 1605, 1605, 1605,
-     3137, 3138, 1600, 1580, 3139,  732,  749, 3125, 1600, 3140,
-     3141, 1607, 1613, 1613, 1613, 1607, 3142, 3144, 1590, 1613,
-     1613, 1613, 1617, 1617, 1617, 3145, 3929, 3929, 3929, 3146,
-     1615, 1621, 1621, 1621,  750,  751,  752, 1615, 3148, 1618,
-     3149,  753,  754, 3929, 3151,  755,  756, 3153, 1622,  757,
-     3150,  758,  759,  760, 3152, 1601, 3929, 3929, 3929,  761,
-     3154, 3155, 1608, 3156, 1624, 1624, 1624, 1624, 1624, 1624,
-
-     1276, 1276, 1276, 3929, 2108, 2108, 2108, 1619, 1276, 1276,
-     1276, 1616, 1626, 3161, 3168, 1626, 3169, 3170, 1278, 1635,
-     1635, 1635, 1620, 1320, 1320, 1320, 1278, 1324, 1324, 1324,
-     3171, 1681, 1681, 1681, 3172, 1682, 3173, 1636, 1683, 3174,
-     1321, 1688, 1688, 1688, 1325, 3175, 1623, 1327, 1327, 1327,
-     1327, 1327, 1327, 1327, 1327, 1327, 3176, 3177, 1689, 1627,
-     1337, 1337, 1337, 3178, 3179, 1329, 3183, 3184, 1329, 2109,
-     3185, 1329, 1337, 1337, 1337, 1337, 1337, 1337, 1339, 1343,
-     1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 3186, 3187,
-     1339, 3188, 3189, 1339, 1348, 1348, 1348, 1345, 1349, 3190,
-
-     1345, 1350, 3191, 1345, 1352, 1352, 1352, 1352, 1352, 1352,
-     1352, 1352, 1352, 1356, 1356, 1356, 3192, 3193, 1685, 1700,
-     1700, 1700, 1354, 1701, 3194, 1354, 1702, 3195, 1354, 3196,
-     1357, 1360, 1360, 1360, 1705, 1705, 1705, 3197, 1706, 1696,
-     3198, 1707, 1693, 1362, 1362, 1362, 3199, 3200, 1361, 1362,
-     1362, 1362, 1362, 1362, 1362, 1366, 1366, 1366, 3201, 3202,
-     1699, 1364, 1709, 1709, 1709, 3210, 1710, 1364, 3211, 1711,
-     1364, 3205, 1367, 1368, 1368, 1368, 1712, 1712, 1712, 3212,
-     1713, 3206, 3213, 1714, 1370, 1370, 1370, 1370, 1370, 1370,
-     1369, 1370, 1370, 1370, 1374, 1374, 1374, 1716, 1716, 1716,
-
-     3207, 1717, 1372, 3214, 1718, 1372, 1378, 1378, 1378, 1372,
-     3208, 1375, 1721, 1721, 1721, 1708, 1722, 3215, 3216, 1723,
-     1380, 1380, 1380, 1379, 1380, 1380, 1380, 1380, 1380, 1380,
-     1384, 1384, 1384, 3217, 1385, 3219, 3220, 1386, 1382, 1387,
-     1387, 1387, 1382, 1388, 3221, 1382, 1389, 1390, 1390, 1390,
-     3222, 1725, 1725, 1725, 1715, 1726, 3223, 3224, 1727, 1396,
-     1396, 1396, 3225, 3226, 1391, 1396, 1396, 1396, 1396, 1396,
-     1396, 1403, 1403, 1403, 3227, 1404, 3228, 1398, 1405, 1736,
-     1736, 1736, 3229, 1398, 3230, 3231, 1398, 1407, 1407, 1407,
-     1724, 1408, 1261, 3233, 1409, 3232, 1737, 1410, 1410, 1410,
-
-     1738, 1738, 1738, 3234, 1739, 3241, 3242, 1740, 1421, 1421,
-     1421, 1421, 1421, 1421, 1411, 3243, 3244, 1732, 1421, 1421,
-     1421, 1425, 1425, 1425, 3245, 1426, 1423, 3235, 1427, 1423,
-     1428, 1428, 1428, 1428, 1428, 1428, 1423, 1428, 1428, 1428,
-     1755, 1755, 1755, 1435, 1435, 1435, 3246, 1436, 1430, 3247,
-     1437, 1430, 1441, 1441, 1441, 1430, 3248, 1756, 1441, 1441,
-     1441, 1441, 1441, 1441, 1762, 1762, 1762, 1447, 1447, 1447,
-     1443, 1448, 3250, 3253, 1449, 3255, 1443, 3256, 3257, 1443,
-     3258, 1763, 3259, 1450, 1450, 1450, 1751, 1451, 3260, 3261,
-     1452, 1453, 1453, 1453, 1453, 1453, 1453, 3262, 1752, 1453,
-
-     1453, 1453, 1765, 1765, 1765, 1458, 1458, 1458, 3265, 1455,
-     3268, 3269, 1455, 1458, 1458, 1458, 3270, 1455, 3271, 1766,
-     1458, 1458, 1458, 1460, 1470, 1470, 1470, 1760, 1464, 1464,
-     1464, 1460, 1465, 3272, 3273, 1466, 3274, 3275, 1460, 1470,
-     1470, 1470, 1472, 1470, 1470, 1470, 1475, 1475, 1475, 3276,
-     1476, 3277, 3282, 1477, 1478, 1478, 1478, 1472, 1478, 1478,
-     1478, 1472, 1478, 1478, 1478, 1764, 3283, 1482, 1482, 1482,
-     1767, 1483, 1480, 3284, 1484, 3285, 1480, 1486, 1486, 1486,
-     1480, 1486, 1486, 1486, 1486, 1486, 1486, 3286, 1778, 1778,
-     1778, 3929, 3929, 3929, 3287, 1488, 1492, 1492, 1492, 1488,
-
-     3288, 3289, 1488, 3290, 1773, 1779, 3291, 3292, 3929, 1492,
-     1492, 1492, 3293, 3294, 1494, 1492, 1492, 1492, 1500, 1500,
-     1500, 3295, 1501, 1775, 3296, 1502, 3297, 1494, 1503, 1503,
-     1503, 3298, 3302, 1494, 3303, 1777, 1786, 1786, 1786, 1780,
-     1787, 3304, 3305, 1788, 3308, 1504, 1507, 1507, 1507, 1507,
-     1507, 1507, 1507, 1507, 1507, 1513, 1513, 1513, 1513, 1513,
-     1513, 1513, 1513, 1513, 1509, 3309, 3310, 1509, 3311, 3312,
-     1509, 3313, 3315, 1515, 3316, 3317, 1515, 3318, 3319, 1515,
-     1800, 1800, 1800, 1781, 1526, 1526, 1526, 1526, 1526, 1526,
-     1526, 1526, 1526, 3320, 1530, 1530, 1530, 1801, 1531, 3321,
-
-     3322, 1532, 1528, 3323, 1791, 1528, 3324, 3325, 1528, 1794,
-     1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1539,
-     1539, 1539, 3326, 1540, 2617, 2618, 1541, 2619, 1536, 3333,
-     3334, 1536, 3335, 3336, 1536, 2620, 1542, 1542, 1542, 1809,
-     1809, 1809, 2621, 1810, 3337, 3338, 1811, 1812, 1812, 1812,
-     3339, 1261, 1805, 1543, 1545, 1545, 1545, 3340, 1814, 1814,
-     1814, 3341, 1815, 3342, 1813, 1816, 1818, 1818, 1818, 3343,
-     3344, 1546, 1550, 1550, 1550, 1550, 1550, 1550, 1807, 1550,
-     1550, 1550, 3345, 1819, 1554, 1554, 1554, 1822, 1822, 1822,
-     1552, 1823, 3346, 1552, 1824, 3327, 3347, 1552, 1556, 1556,
-
-     1556, 1555, 1825, 1825, 1825, 3348, 1826, 3352, 3358, 1827,
-     1559, 1559, 1559, 3359, 3360, 1557, 1559, 1559, 1559, 1559,
-     1559, 1559, 1564, 1564, 1564, 3361, 1565, 3362, 1561, 1566,
-     1567, 1567, 1567, 3363, 1561, 3364, 3371, 1561, 3372, 3373,
-     1821, 1567, 1567, 1567, 1567, 1567, 1567, 3374, 1569, 1573,
-     1573, 1573, 3375, 1574, 3376, 3377, 1575, 3378, 3379, 1569,
-     3380, 3381, 1569, 1577, 1577, 1577, 1577, 1577, 1577, 3382,
-     1577, 1577, 1577, 1582, 1582, 1582, 3383, 1583, 3384, 3385,
-     1584, 1579, 3386, 3387, 1579, 3388, 3389, 1829, 1579, 1838,
-     1838, 1838, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587,
-
-     1587, 1842, 1842, 1842, 3390, 3391, 1839, 1593, 1593, 1593,
-     1589, 1594, 1831, 1589, 1595, 3392, 1589, 3393, 1843, 3929,
-     3929, 3929, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
-     1598, 3394, 1835, 1848, 1848, 1848, 3929, 1605, 1605, 1605,
-     1600, 3395, 3396, 1600, 3397, 3400, 1600, 1605, 1605, 1605,
-     1849, 1605, 1605, 1605, 3401, 1607, 3402, 1609, 1609, 1609,
-     1840, 1610, 3403, 3404, 1611, 1607, 1613, 1613, 1613, 1607,
-     1613, 1613, 1613, 1613, 1613, 1613, 1846, 1617, 1617, 1617,
-     3405, 1844, 3406, 3407, 1615, 1854, 1854, 1854, 1615, 1855,
-     3408, 1615, 1856, 3409, 1618, 1621, 1621, 1621, 3421, 1851,
-
-     1859, 1859, 1859, 3422, 1860, 3427, 1261, 1861, 1624, 1624,
-     1624, 3428, 1622, 1624, 1624, 1624, 3412, 1624, 1624, 1624,
-     1866, 1866, 1866, 1635, 1635, 1635, 1626, 1327, 1327, 1327,
-     3413, 1626, 3431, 3432, 1853, 1626, 3412, 3433, 1867, 1868,
-     3434, 1636, 1676, 1676, 1676, 1329, 1677, 3415, 3436, 1678,
-     1681, 1681, 1681, 3410, 1682, 3437, 3444, 1683, 1688, 1688,
-     1688, 1921, 1921, 1921, 3439, 1922, 3445, 3438, 1923, 1337,
-     1337, 1337, 1343, 1343, 1343, 1689, 3440, 3446, 1863, 1929,
-     1929, 1929, 3447, 1352, 1352, 1352, 3448, 1339, 3449, 1918,
-     1345, 1700, 1700, 1700, 3453, 1701, 1930, 3454, 1702, 3455,
-
-     3450, 1354, 1705, 1705, 1705, 3456, 1706, 3451, 3457, 1707,
-     1362, 1362, 1362, 1709, 1709, 1709, 3458, 1710, 3459, 3452,
-     1711, 3460, 1712, 1712, 1712, 3461, 1713, 3462, 1364, 1714,
-     3463, 1927, 1370, 1370, 1370, 1716, 1716, 1716, 3464, 1717,
-     1931, 1934, 1718, 3465, 1721, 1721, 1721, 3470, 1722, 3471,
-     1372, 1723, 1380, 1380, 1380, 1725, 1725, 1725, 1937, 1726,
-     3476, 3477, 1727, 3478, 1944, 1944, 1944, 1396, 1396, 1396,
-     1382, 1948, 1948, 1948, 3929, 3929, 3929, 3929, 3929, 3929,
-     1938, 1945, 1736, 1736, 1736, 1398, 3479, 3482, 1949, 3482,
-     1261, 3929, 3412, 3412, 3929, 3929, 3929, 3929, 3485, 1737,
-
-     1941, 1952, 1952, 1952, 3415, 1953, 3413, 3486, 1954, 1738,
-     1738, 1738, 3929, 1739, 3417, 3487, 1740, 3929, 3929, 3929,
-     3929, 3929, 3929, 1947, 3488, 1951, 3929, 3929, 3929, 3929,
-     3929, 3929, 3480, 3418, 3929, 3419, 3490, 3929, 3929, 3929,
-     3929, 1950, 3489, 3929, 1867, 1868, 3929, 1955, 3420, 1961,
-     1961, 1961, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 1421, 1421, 1421, 1956, 1962, 3491, 3492, 3929,
-     1755, 1755, 1755, 3929, 1958, 3493, 3929, 1428, 1428, 1428,
-     1423, 1970, 1970, 1970, 3495, 1971, 3496, 1756, 1972, 3509,
-     3494, 1957, 3510, 3501, 1959, 1430, 1974, 1974, 1974, 1960,
-
-     1441, 1441, 1441, 1762, 1762, 1762, 3511, 1979, 1979, 1979,
-     3505, 1980, 3502, 1975, 1981, 1453, 1453, 1453, 1443, 1964,
-     1763, 1965, 3512, 1963, 1765, 1765, 1765, 3525, 1966, 3506,
-     1967, 3526, 3503, 1455, 3527, 1983, 1983, 1983, 3528, 1984,
-     3504, 1766, 1985, 1458, 1458, 1458, 1470, 1470, 1470, 3529,
-     1478, 1478, 1478, 1994, 1994, 1994, 3530, 1486, 1486, 1486,
-     3515, 1460, 3519, 3531, 1472, 3532, 3507, 1977, 1480, 3533,
-     1995, 1778, 1778, 1778, 3508, 1488, 1997, 1997, 1997, 3516,
-     1998, 3520, 1982, 1999, 3536, 1492, 1492, 1492, 1779, 2003,
-     2003, 2003, 1786, 1786, 1786, 3537, 1787, 3517, 3538, 1788,
-
-     3482, 3542, 1986, 1494, 1991, 3518, 2004, 3482, 1993, 1996,
-     2007, 2007, 2007, 1507, 1507, 1507, 1513, 1513, 1513, 1800,
-     1800, 1800, 2019, 2019, 2019, 3521, 2020, 2008, 3543, 2021,
-     3544, 1509, 3534, 3522, 1515, 3545, 1801, 1526, 1526, 1526,
-     2026, 2026, 2026, 1534, 1534, 1534, 2001, 1809, 1809, 1809,
-     3535, 1810, 3539, 3546, 1811, 1528, 3547, 2027, 1812, 1812,
-     1812, 1536, 2030, 2030, 2030, 3548, 2031, 3540, 3549, 2032,
-     1814, 1814, 1814, 3550, 1815, 1813, 3551, 1816, 2010, 1818,
-     1818, 1818, 3552, 2013, 2034, 2034, 2034, 2025, 2035, 3556,
-     3557, 2036, 1550, 1550, 1550, 3558, 1819, 1822, 1822, 1822,
-
-     3559, 1823, 3560, 3561, 1824, 3562, 2028, 1825, 1825, 1825,
-     1552, 1826, 3563, 3564, 1827, 1559, 1559, 1559, 1567, 1567,
-     1567, 1577, 1577, 1577, 2048, 2048, 2048, 1838, 1838, 1838,
-     2050, 2050, 2050, 1561, 2051, 3565, 1569, 2052, 3566, 1579,
-     3567, 2049, 3571, 2038, 1839, 1587, 1587, 1587, 1842, 1842,
-     1842, 2055, 2055, 2055, 3572, 2056, 3573, 3574, 2057, 1598,
-     1598, 1598, 3575, 1589, 3576, 1843, 1848, 1848, 1848, 2062,
-     2062, 2062, 3577, 2063, 3578, 3582, 2064, 1600, 2065, 2065,
-     2065, 3583, 2040, 1849, 3584, 2042, 2046, 1605, 1605, 1605,
-     1613, 1613, 1613, 3585, 3586, 2066, 1854, 1854, 1854, 3587,
-
-     1855, 3588, 3589, 1856, 3590, 1607, 3591, 3592, 1615, 2060,
-     2053, 1859, 1859, 1859, 3593, 1860, 3594, 3595, 1861, 3597,
-     1624, 1624, 1624, 1866, 1866, 1866, 2111, 2111, 2111, 2095,
-     2095, 2095, 2108, 2108, 2108, 3598, 3599, 2067, 1626, 3600,
-     3601, 1867, 2069, 2114, 2114, 2114, 2116, 2116, 2116, 3929,
-     3929, 3929, 1327, 1327, 1327, 1921, 1921, 1921, 3602, 1922,
-     2115, 3603, 1923, 2117, 3604, 3605, 3929, 1337, 1337, 1337,
-     1329, 3606, 2073, 2112, 3607, 2075, 1929, 1929, 1929, 2127,
-     2127, 2127, 3612, 2128, 3608, 1339, 2129, 1343, 1343, 1343,
-     3613, 3614, 2076, 1930, 2109, 3615, 3609, 2096, 3616, 1352,
-
-     1352, 1352, 2134, 2134, 2134, 1345, 2136, 2136, 2136, 1362,
-     1362, 1362, 3617, 3618, 2118, 3619, 3620, 1354, 3621, 2135,
-     2119, 3622, 3623, 2137, 1370, 1370, 1370, 1364, 2140, 2140,
-     2140, 3610, 2125, 2142, 2142, 2142, 1380, 1380, 1380, 2145,
-     2145, 2145, 1372, 3611, 3624, 2141, 3625, 2130, 2133, 3626,
-     2143, 3929, 3929, 3929, 1382, 3627, 2146, 1944, 1944, 1944,
-     2148, 2148, 2148, 3628, 2149, 3629, 3630, 2150, 3929, 2151,
-     2151, 2151, 3631, 3632, 1945, 2138, 1396, 1396, 1396, 1948,
-     1948, 1948, 2157, 2157, 2157, 3633, 2152, 3929, 3929, 3929,
-     2139, 2154, 2154, 2154, 1398, 2155, 1949, 3634, 2156, 2158,
-
-     3635, 3636, 2144, 3637, 3929, 1952, 1952, 1952, 3638, 1953,
-     2147, 3639, 1954, 3929, 3929, 3929, 3929, 3929, 3929, 2162,
-     2162, 2162, 3929, 3929, 3929, 3929, 3929, 3929, 3640, 3641,
-     3929, 3643, 3644, 3929, 3645, 3646, 2163, 2153, 3647, 3929,
-     1261, 3648, 3929, 3929, 3929, 3929, 1961, 1961, 1961, 2167,
-     2167, 2167, 2159, 2168, 3649, 3650, 2169, 2170, 2170, 2170,
-     3929, 3651, 3652, 1962, 3653, 3642, 2161, 3929, 3929, 3929,
-     3654, 3655, 2165, 3656, 2171, 3929, 3929, 3929, 2160, 3657,
-     3658, 2164, 3659, 3660, 3929, 1421, 1421, 1421, 1428, 1428,
-     1428, 3661, 3929, 3662, 1970, 1970, 1970, 2166, 1971, 3663,
-
-     3664, 1972, 3665, 1423, 3666, 3667, 1430, 2178, 2178, 2178,
-     1974, 1974, 1974, 3668, 3669, 2172, 2180, 2180, 2180, 3670,
-     2181, 3671, 3672, 2182, 2179, 3673, 3674, 1975, 3675, 2173,
-     2184, 2184, 2184, 1979, 1979, 1979, 3676, 1980, 3677, 3678,
-     1981, 1453, 1453, 1453, 2175, 1458, 1458, 1458, 2185, 1983,
-     1983, 1983, 2174, 1984, 3679, 3680, 1985, 1261, 3682, 1455,
-     2193, 2193, 2193, 1460, 1478, 1478, 1478, 1994, 1994, 1994,
-     2197, 2197, 2197, 3683, 2198, 3423, 3681, 2199, 2194, 1486,
-     1486, 1486, 1480, 3684, 1995, 1997, 1997, 1997, 2187, 1998,
-     3685, 3424, 1999, 3425, 1492, 1492, 1492, 1488, 2003, 2003,
-
-     2003, 2204, 2204, 2204, 3686, 2205, 3426, 3687, 2206, 3688,
-     3689, 2196, 1494, 2188, 3690, 2004, 2207, 2207, 2207, 2007,
-     2007, 2007, 2210, 2210, 2210, 3691, 2211, 3692, 3693, 2212,
-     2214, 2214, 2214, 2208, 3694, 3695, 2008, 3696, 2200, 1513,
-     1513, 1513, 2219, 2219, 2219, 2019, 2019, 2019, 2215, 2020,
-     3697, 3698, 2021, 1526, 1526, 1526, 3699, 1515, 2026, 2026,
-     2026, 2202, 2228, 2228, 2228, 3700, 2229, 3701, 3702, 2230,
-     3703, 1528, 2231, 2231, 2231, 2027, 2030, 2030, 2030, 3704,
-     2031, 3705, 3706, 2032, 2034, 2034, 2034, 3707, 2035, 3708,
-     2232, 2036, 2218, 1550, 1550, 1550, 1559, 1559, 1559, 1567,
-
-     1567, 1567, 2241, 2241, 2241, 2227, 3929, 3929, 3929, 3709,
-     3710, 1552, 3711, 3712, 1561, 3466, 3713, 1569, 3714, 2242,
-     2244, 2244, 2244, 3929, 1577, 1577, 1577, 2048, 2048, 2048,
-     3715, 2248, 2248, 2248, 3467, 2249, 3468, 2245, 2250, 2050,
-     2050, 2050, 1579, 2051, 2049, 3716, 2052, 3717, 2238, 3469,
-     3719, 2240, 1587, 1587, 1587, 2236, 2055, 2055, 2055, 3720,
-     2056, 3721, 3722, 2057, 1598, 1598, 1598, 2062, 2062, 2062,
-     1589, 2063, 2246, 2243, 2064, 2065, 2065, 2065, 3723, 2265,
-     2265, 2265, 1600, 2266, 1261, 3724, 2267, 1605, 1605, 1605,
-     3725, 3726, 2066, 2270, 2270, 2270, 2272, 2272, 2272, 3727,
-
-     2251, 2274, 2274, 2274, 3718, 1607, 3929, 3929, 3929, 3728,
-     3729, 2271, 3730, 2273, 3731, 3732, 2255, 3733, 2275, 1624,
-     1624, 1624, 3734, 3929, 2281, 2281, 2281, 2080, 2080, 2080,
-     2291, 2291, 2291, 2091, 2091, 2091, 3735, 1626, 3736, 2268,
-     3737, 2282, 2298, 2298, 2298, 2095, 2095, 2095, 2299, 2299,
-     2299, 2098, 2098, 2098, 3738, 2277, 2108, 2108, 2108, 2312,
-     2312, 2312, 2111, 2111, 2111, 2114, 2114, 2114, 2316, 2316,
-     2316, 2276, 2317, 3739, 3740, 2318, 2116, 2116, 2116, 2319,
-     2319, 2319, 2115, 2320, 3741, 3742, 2321, 1327, 1327, 1327,
-     2329, 2329, 2329, 2117, 2127, 2127, 2127, 3743, 2128, 3744,
-
-     3745, 2129, 2334, 2334, 2334, 1329, 3746, 3747, 2330, 1343,
-     1343, 1343, 1352, 1352, 1352, 2134, 2134, 2134, 3748, 2335,
-     3749, 2337, 2337, 2337, 3750, 2338, 3752, 1345, 2339, 3753,
-     1354, 3754, 2135, 2136, 2136, 2136, 2340, 2340, 2340, 3755,
-     2341, 3756, 3757, 2342, 1362, 1362, 1362, 1370, 1370, 1370,
-     2137, 2140, 2140, 2140, 2323, 3758, 2345, 2345, 2345, 3759,
-     2346, 2332, 1364, 2347, 3760, 1372, 1261, 3761, 2141, 2142,
-     2142, 2142, 3751, 3762, 2336, 2348, 2348, 2348, 3763, 2349,
-     3764, 3765, 2350, 1380, 1380, 1380, 2143, 2145, 2145, 2145,
-     2352, 2352, 2352, 3766, 2353, 3767, 3768, 2354, 2355, 2355,
-
-     2355, 1382, 3769, 3770, 2146, 2148, 2148, 2148, 3771, 2149,
-     2343, 3772, 2150, 2344, 3773, 2356, 2151, 2151, 2151, 2357,
-     2357, 2357, 3774, 2358, 3775, 3777, 2359, 1396, 1396, 1396,
-     2154, 2154, 2154, 2152, 2155, 3778, 3779, 2156, 2157, 2157,
-     2157, 2162, 2162, 2162, 3780, 1398, 2361, 2361, 2361, 2351,
-     2362, 1261, 3781, 2363, 3782, 2158, 3783, 3472, 2163, 2367,
-     2367, 2367, 3784, 2368, 3785, 3776, 2369, 2370, 2370, 2370,
-     2167, 2167, 2167, 3473, 2168, 3474, 3786, 2169, 3787, 2360,
-     2170, 2170, 2170, 3788, 2371, 2374, 2374, 2374, 3475, 2375,
-     3789, 3790, 2376, 1421, 1421, 1421, 3791, 2171, 1428, 1428,
-
-     1428, 2178, 2178, 2178, 3792, 2383, 2383, 2383, 3794, 2384,
-     3795, 1423, 2385, 2180, 2180, 2180, 1430, 2181, 2179, 3796,
-     2182, 2184, 2184, 2184, 2186, 2186, 2186, 3797, 1453, 1453,
-     1453, 1458, 1458, 1458, 2390, 2390, 2390, 3798, 3799, 2185,
-     2193, 2193, 2193, 3800, 3801, 2379, 1455, 3802, 3803, 1460,
-     3804, 2391, 2380, 1478, 1478, 1478, 3805, 3806, 2194, 2197,
-     2197, 2197, 3807, 2198, 3808, 3809, 2199, 1486, 1486, 1486,
-     3812, 1480, 2399, 2399, 2399, 3813, 2204, 2204, 2204, 3814,
-     2205, 2392, 2388, 2206, 3815, 1488, 3816, 2387, 3817, 3818,
-     2400, 2207, 2207, 2207, 2402, 2402, 2402, 3819, 2403, 3820,
-
-     3821, 2404, 3824, 2396, 3825, 2210, 2210, 2210, 2208, 2211,
-     3826, 3827, 2212, 1261, 2397, 2214, 2214, 2214, 2408, 2408,
-     2408, 1513, 1513, 1513, 2219, 2219, 2219, 2411, 2411, 2411,
-     2413, 2413, 2413, 2215, 3854, 2409, 1526, 1526, 1526, 1515,
-     2228, 2228, 2228, 1261, 2229, 1261, 3852, 2230, 2231, 2231,
-     2231, 2420, 2420, 2420, 1528, 1550, 1550, 1550, 2425, 2425,
-     2425, 1567, 1567, 1567, 1792, 1790, 2232, 1261, 2421, 2241,
-     2241, 2241, 1261, 1552, 1261, 1261, 2426, 1261, 3853, 1569,
-     2429, 2429, 2429, 2410, 2430, 1261, 2242, 2431, 2432, 2432,
-     2432, 2244, 2244, 2244, 2434, 2434, 2434, 1261, 2435, 3836,
-
-     1261, 2436, 2418, 1261, 3822, 2433, 1261, 1261, 2245, 1577,
-     1577, 1577, 2438, 2438, 2438, 2423, 2248, 2248, 2248, 3832,
-     2249, 3828, 3823, 2250, 3829, 3840, 2428, 1579, 1789, 2439,
-     1587, 1587, 1587, 2444, 2444, 2444, 2446, 2446, 2446, 2265,
-     2265, 2265, 3833, 2266, 3842, 1261, 2267, 1261, 1589, 3830,
-     1261, 2445, 3831, 2447, 1605, 1605, 1605, 2459, 2459, 2459,
-     2270, 2270, 2270, 2437, 2272, 2272, 2272, 1261, 3855, 2461,
-     2461, 2461, 1607, 2462, 2460, 3834, 2463, 1261, 2271, 1261,
-     1261, 2273, 1261, 3837, 2440, 2274, 2274, 2274, 2464, 2464,
-     2464, 1261, 2465, 3841, 3848, 2466, 1624, 1624, 1624, 3922,
-
-     1785, 2458, 2275, 2281, 2281, 2281, 2472, 2472, 2472, 3844,
-     2473, 3838, 3878, 2474, 1626, 2475, 2475, 2475, 3843, 1261,
-     2282, 2481, 2481, 2481, 2482, 2482, 2482, 2291, 2291, 2291,
-     2484, 2484, 2484, 2488, 2488, 2488, 2298, 2298, 2298, 2299,
-     2299, 2299, 2489, 2489, 2489, 2493, 2493, 2493, 2498, 2498,
-     2498, 2499, 2499, 2499, 2501, 2501, 2501, 1261, 2468, 2312,
-     2312, 2312, 2502, 2502, 2502, 2316, 2316, 2316, 3839, 2317,
-     1261, 3886, 2318, 2319, 2319, 2319, 1261, 2320, 3868, 1261,
-     2321, 1327, 1327, 1327, 2509, 2509, 2509, 1261, 1261, 2490,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 1329,
-
-     3872, 2510, 2329, 2329, 2329, 1261, 3846, 3929, 3835, 2503,
-     3929, 1261, 1261, 3929, 1343, 1343, 1343, 2334, 2334, 2334,
-     2330, 2517, 2517, 2517, 3847, 2518, 1261, 1261, 2519, 1352,
-     1352, 1352, 1345, 2507, 2335, 1261, 2337, 2337, 2337, 1261,
-     2338, 3856, 2511, 2339, 2340, 2340, 2340, 1354, 2341, 3850,
-     1261, 2342, 1362, 1362, 1362, 1261, 2513, 1784, 2512, 1370,
-     1370, 1370, 2345, 2345, 2345, 3851, 2346, 1261, 3845, 2347,
-     1364, 3857, 2521, 2622, 2623, 2515, 2624, 1372, 2348, 2348,
-     2348, 1261, 2349, 3860, 2625, 2350, 1380, 1380, 1380, 3866,
-     2520, 2626, 2352, 2352, 2352, 2522, 2353, 3849, 1261, 2354,
-
-     2355, 2355, 2355, 1261, 1382, 2524, 2524, 2524, 1261, 2525,
-     3869, 3861, 2526, 1261, 2357, 2357, 2357, 2356, 2358, 1261,
-     1261, 2359, 1396, 1396, 1396, 2361, 2361, 2361, 3862, 2362,
-     2523, 3887, 2363, 3858, 2367, 2367, 2367, 1261, 2368, 1261,
-     1398, 2369, 2370, 2370, 2370, 2531, 2531, 2531, 3859, 2532,
-     3863, 3873, 2533, 2374, 2374, 2374, 3864, 2375, 1261, 2371,
-     2376, 2537, 2537, 2537, 1421, 1421, 1421, 2540, 2540, 2540,
-     2383, 2383, 2383, 3865, 2384, 3880, 1261, 2385, 2538, 1453,
-     1453, 1453, 1423, 1261, 1261, 2541, 1458, 1458, 1458, 2527,
-     2390, 2390, 2390, 3881, 2548, 2548, 2548, 1455, 2549, 1261,
-
-     1261, 2550, 1261, 1261, 1460, 3874, 1783, 2391, 1478, 1478,
-     1478, 3902, 1782, 1486, 1486, 1486, 2399, 2399, 2399, 1261,
-     2402, 2402, 2402, 3875, 2403, 3892, 1480, 2404, 1261, 2539,
-     3879, 1488, 1776, 3867, 2400, 2545, 1774, 1772, 2546, 2408,
-     2408, 2408, 2562, 2562, 2562, 3893, 2563, 1261, 1261, 2564,
-     1513, 1513, 1513, 2411, 2411, 2411, 2409, 2566, 2566, 2566,
-     2413, 2413, 2413, 2567, 2567, 2567, 3870, 1261, 1515, 3929,
-     3929, 3929, 3929, 3929, 3929, 2555, 2556, 1526, 1526, 1526,
-     2568, 3929, 3929, 3929, 1261, 3871, 3929, 1261, 1261, 3929,
-     2420, 2420, 2420, 1261, 3903, 1528, 3888, 1261, 3929, 2574,
-
-     2574, 2574, 1261, 2575, 1261, 3876, 2576, 2421, 2578, 2578,
-     2578, 2425, 2425, 2425, 1261, 2565, 2582, 2582, 2582, 1261,
-     3900, 2569, 3877, 2429, 2429, 2429, 2579, 2430, 3882, 2426,
-     2431, 2432, 2432, 2432, 2583, 3884, 1261, 2570, 2584, 2584,
-     2584, 2571, 2585, 2572, 3885, 2586, 1261, 3901, 2433, 2434,
-     2434, 2434, 3889, 2435, 3883, 1261, 2436, 1577, 1577, 1577,
-     2438, 2438, 2438, 2588, 2588, 2588, 1261, 2589, 1771, 1261,
-     2590, 1587, 1587, 1587, 3890, 1579, 1261, 2439, 2444, 2444,
-     2444, 2446, 2446, 2446, 2595, 2595, 2595, 1261, 2596, 1589,
-     1261, 2597, 1605, 1605, 1605, 3923, 2445, 1261, 2447, 2459,
-
-     2459, 2459, 3894, 3904, 2609, 2609, 2609, 3891, 2610, 2587,
-     1607, 2611, 3895, 2461, 2461, 2461, 2460, 2462, 1261, 1770,
-     2463, 3918, 1769, 2591, 2464, 2464, 2464, 1768, 2465, 3908,
-     1261, 2466, 1624, 1624, 1624, 2614, 2614, 2614, 3905, 2472,
-     2472, 2472, 2608, 2473, 3896, 1761, 2474, 2475, 2475, 2475,
-     1626, 3916, 1261, 1261, 2627, 2627, 2627, 2628, 2628, 2628,
-     2481, 2481, 2481, 2482, 2482, 2482, 2484, 2484, 2484, 2633,
-     2633, 2633, 2635, 2635, 2635, 2488, 2488, 2488, 2489, 2489,
-     2489, 2493, 2493, 2493, 2639, 2639, 2639, 2498, 2498, 2498,
-     2499, 2499, 2499, 2501, 2501, 2501, 2502, 2502, 2502, 3897,
-
-     2613, 2648, 2648, 2648, 2650, 2650, 2650, 2509, 2509, 2509,
-     2651, 2651, 2651, 1261, 2652, 1759, 1261, 2653, 1758, 2649,
-     2654, 2654, 2654, 1261, 2510, 3929, 3929, 3929, 3929, 3929,
-     3929, 2658, 2658, 2658, 1343, 1343, 1343, 2655, 2660, 2660,
-     2660, 1261, 3929, 1757, 1261, 3929, 2517, 2517, 2517, 1261,
-     2518, 3898, 1345, 2519, 3899, 2661, 1352, 1352, 1352, 3910,
-     1362, 1362, 1362, 1370, 1370, 1370, 1380, 1380, 1380, 2524,
-     2524, 2524, 3926, 2525, 1354, 1754, 2526, 2656, 1364, 3906,
-     2657, 1372, 3907, 1261, 1382, 2666, 2666, 2666, 2531, 2531,
-     2531, 3909, 2532, 3926, 1261, 2533, 1753, 2663, 2672, 2672,
-
-     2672, 2659, 1261, 2667, 2537, 2537, 2537, 1261, 2662, 2676,
-     2676, 2676, 1748, 2677, 1261, 2673, 2678, 2679, 2679, 2679,
-     1747, 2538, 2540, 2540, 2540, 2664, 1261, 3917, 2665, 1453,
-     1453, 1453, 2685, 2685, 2685, 2680, 2687, 2687, 2687, 1261,
-     2541, 2548, 2548, 2548, 1261, 2549, 1261, 1455, 2550, 3912,
-     2686, 1746, 3914, 2688, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 2693, 2693, 2693, 1478, 1478, 1478, 3919,
-     1745, 3929, 1744, 3913, 3929, 3911, 1261, 3929, 1261, 3920,
-     2694, 1743, 3915, 2689, 1480, 1486, 1486, 1486, 1742, 1741,
-     2684, 2697, 2697, 2697, 2702, 2702, 2702, 2562, 2562, 2562,
-
-     1735, 2563, 1734, 1488, 2564, 1513, 1513, 1513, 2698, 3921,
-     2690, 1733, 2692, 2566, 2566, 2566, 2567, 2567, 2567, 2691,
-     2707, 2707, 2707, 1515, 2704, 2704, 2704, 2695, 2705, 1261,
-     1731, 2706, 1730, 2568, 3929, 3929, 3929, 2708, 3929, 3929,
-     3929, 2711, 2711, 2711, 2713, 2713, 2713, 3929, 3929, 3929,
-     2696, 3929, 2578, 2578, 2578, 3929, 2574, 2574, 2574, 2712,
-     2575, 2714, 3924, 2576, 3929, 2703, 2582, 2582, 2582, 1729,
-     2579, 2584, 2584, 2584, 1261, 2585, 1728, 1720, 2586, 2718,
-     2718, 2718, 1719, 1704, 2583, 1703, 2709, 2588, 2588, 2588,
-     2710, 2589, 1698, 1697, 2590, 1695, 1694, 2719, 1587, 1587,
-
-     1587, 2595, 2595, 2595, 1692, 2596, 1691, 3925, 2597, 1605,
-     1605, 1605, 2734, 2735, 2715, 2736, 1589, 2609, 2609, 2609,
-     1690, 2610, 1687, 2737, 2611, 2739, 2740, 1607, 2741, 1686,
-     2738, 1624, 1624, 1624, 1684, 1680, 2742, 2614, 2614, 2614,
-     2627, 2627, 2627, 2743, 1679, 2720, 2628, 2628, 2628, 1626,
-     2764, 2764, 2764, 1675, 1674, 1261, 2633, 2633, 2633, 2635,
-     2635, 2635, 2768, 2768, 2768, 2639, 2639, 2639, 2772, 2772,
-     2772, 2733, 2775, 2775, 2775, 2648, 2648, 2648, 2650, 2650,
-     2650, 2651, 2651, 2651, 1673, 2652, 1672, 1671, 2653, 2654,
-     2654, 2654, 1670, 2649, 1669, 2777, 2777, 2777, 2745, 2778,
-
-     2746, 1668, 2779, 2780, 2780, 2780, 2655, 2782, 2782, 2782,
-     2658, 2658, 2658, 2784, 2784, 2784, 2660, 2660, 2660, 1667,
-     2781, 2786, 2786, 2786, 2783, 2787, 1666, 1665, 2788, 1664,
-     1663, 2785, 1662, 2661, 2789, 2789, 2789, 1362, 1362, 1362,
-     1370, 1370, 1370, 1380, 1380, 1380, 2666, 2666, 2666, 2672,
-     2672, 2672, 2790, 1661, 1660, 1364, 1658, 1657, 1372, 1656,
-     1655, 1382, 1654, 1651, 2667, 1650, 2673, 2798, 2798, 2798,
-     1649, 2799, 1648, 1647, 2800, 2676, 2676, 2676, 1646, 2677,
-     1645, 1644, 2678, 2679, 2679, 2679, 2811, 2811, 2811, 1453,
-     1453, 1453, 2685, 2685, 2685, 2687, 2687, 2687, 2825, 2825,
-
-     2825, 2680, 2791, 2812, 2793, 1643, 1642, 1455, 2792, 1641,
-     2686, 1640, 2688, 2814, 2814, 2814, 2826, 2815, 1639, 1638,
-     2816, 2820, 2820, 2820, 2693, 2693, 2693, 2822, 2822, 2822,
-     1637, 2823, 1634, 1633, 2824, 1486, 1486, 1486, 2821, 1632,
-     1631, 2694, 2697, 2697, 2697, 1630, 1629, 2813, 2828, 2828,
-     2828, 1261, 2829, 1488, 1612, 2830, 2833, 2833, 2833, 2698,
-     2702, 2702, 2702, 2835, 2835, 2835, 1604, 2704, 2704, 2704,
-     1603, 2705, 1602, 2834, 2706, 2707, 2707, 2707, 2837, 2837,
-     2837, 2836, 2838, 1597, 1596, 2839, 2840, 2840, 2840, 2842,
-     2842, 2842, 2708, 2711, 2711, 2711, 1592, 2827, 2713, 2713,
-
-     2713, 1586, 1585, 2841, 1581, 1576, 2843, 2718, 2718, 2718,
-     1572, 2712, 2844, 2844, 2844, 2714, 2845, 1571, 1563, 2846,
-     1587, 1587, 1587, 1549, 1548, 2719, 1547, 1605, 1605, 1605,
-     1624, 1624, 1624, 2764, 2764, 2764, 1544, 1538, 1589, 2896,
-     2896, 2896, 2768, 2768, 2768, 1607, 1533, 1525, 1626, 2772,
-     2772, 2772, 2775, 2775, 2775, 2904, 2904, 2904, 2777, 2777,
-     2777, 1524, 2778, 1523, 1522, 2779, 2780, 2780, 2780, 2906,
-     2906, 2906, 2905, 2907, 1521, 1520, 2908, 2782, 2782, 2782,
-     1519, 1518, 2877, 2781, 2784, 2784, 2784, 2850, 2863, 2909,
-     2909, 2909, 1517, 2910, 2783, 1512, 2911, 2786, 2786, 2786,
-
-     1511, 2787, 2785, 1506, 2788, 2789, 2789, 2789, 1362, 1362,
-     1362, 1370, 1370, 1370, 1380, 1380, 1380, 2917, 2917, 2917,
-     2798, 2798, 2798, 2790, 2799, 1505, 1364, 2800, 1499, 1372,
-     1496, 1491, 1382, 1490, 2918, 2931, 2931, 2931, 2811, 2811,
-     2811, 2933, 2933, 2933, 1485, 2934, 1474, 1469, 2935, 2936,
-     2936, 2936, 2932, 1468, 1467, 2812, 2814, 2814, 2814, 1463,
-     2815, 1462, 1457, 2816, 1446, 1440, 2914, 2937, 1439, 1438,
-     2912, 2820, 2820, 2820, 1434, 2941, 2941, 2941, 2913, 2942,
-     1433, 1432, 2943, 2822, 2822, 2822, 1420, 2823, 2821, 1419,
-     2824, 2825, 2825, 2825, 1486, 1486, 1486, 2828, 2828, 2828,
-
-     1418, 2829, 1417, 1416, 2830, 2952, 2952, 2952, 1415, 2826,
-     1414, 1413, 1488, 2833, 2833, 2833, 2954, 2954, 2954, 1412,
-     2955, 1406, 2953, 2956, 2835, 2835, 2835, 2837, 2837, 2837,
-     2834, 2838, 1351, 1347, 2839, 2840, 2840, 2840, 1342, 2957,
-     2957, 2957, 2836, 2958, 1341, 1336, 2959, 2842, 2842, 2842,
-     1335, 1334, 2841, 1333, 2960, 2960, 2960, 2950, 2961, 1332,
-     1331, 2962, 1319, 1318, 2843, 2844, 2844, 2844, 1317, 2845,
-     1316, 1315, 2846, 2970, 2970, 2970, 2972, 2972, 2972, 1587,
-     1587, 1587, 2975, 2975, 2975, 2976, 2976, 2976, 1314, 1313,
-     2971, 1312, 1311, 2973, 1605, 1605, 1605, 1589, 3001, 3001,
-
-     3001, 1310, 2977, 3003, 3003, 3003, 3021, 3021, 3021, 2896,
-     2896, 2896, 1607, 1309, 1308, 3002, 3026, 3026, 3026, 1307,
-     1306, 3004, 2904, 2904, 2904, 3030, 3030, 3030, 1305, 3031,
-     1302, 1301, 3032, 2906, 2906, 2906, 1300, 2907, 1299, 2905,
-     2908, 2909, 2909, 2909, 1298, 2910, 1297, 1296, 2911, 1295,
-     1294, 2974, 1362, 1362, 1362, 2988, 1370, 1370, 1370, 1380,
-     1380, 1380, 3041, 3041, 3041, 2917, 2917, 2917, 1291, 1290,
-     1364, 3043, 3043, 3043, 1372, 3044, 1289, 1382, 3045, 3042,
-     1288, 1287, 2918, 3046, 3046, 3046, 2931, 2931, 2931, 3059,
-     3059, 3059, 1286, 3060, 1285, 3039, 3061, 2933, 2933, 2933,
-
-     3047, 2934, 1284, 2932, 2935, 2936, 2936, 2936, 3038, 3063,
-     3063, 3063, 2941, 2941, 2941, 1283, 2942, 1282, 1275, 2943,
-     3037, 1271, 1270, 2937, 1269, 1268, 3064, 3072, 3072, 3072,
-     2952, 2952, 2952, 3075, 3075, 3075, 1267, 3076, 1264, 1262,
-     3077, 1261, 2954, 2954, 2954, 3073, 2955, 2953, 1259, 2956,
-     2957, 2957, 2957, 1257, 2958, 1256, 1255, 2959, 2960, 2960,
-     2960, 1254, 2961, 1253, 1251, 2962, 2970, 2970, 2970, 3091,
-     3091, 3091, 1248, 3092, 1246, 1245, 3093, 2972, 2972, 2972,
-     3094, 3094, 3094, 2971, 3095, 1244, 1243, 3096, 1587, 1587,
-     1587, 2975, 2975, 2975, 2973, 2976, 2976, 2976, 3098, 3098,
-
-     3098, 1242, 3099, 1239, 1236, 3100, 1589, 1605, 1605, 1605,
-     1235, 1234, 2977, 3001, 3001, 3001, 3122, 3122, 3122, 1232,
-     3123, 1231, 1228, 3124, 1227, 1607, 3003, 3003, 3003, 1225,
-     3002, 3127, 3127, 3127, 3021, 3021, 3021, 3143, 3143, 3143,
-     3026, 3026, 3026, 1222, 3004, 3147, 3147, 3147, 3128, 1867,
-     1221, 3097, 1220, 3030, 3030, 3030, 1216, 3031, 1215, 3109,
-     3032, 1362, 1362, 1362, 3158, 3158, 3158, 1380, 1380, 1380,
-     3041, 3041, 3041, 3162, 3162, 3162, 1213, 3163, 1212, 1364,
-     3164, 1211, 3159, 1210, 1208, 1382, 1207, 3042, 3043, 3043,
-     3043, 1206, 3044, 1205, 1204, 3045, 3046, 3046, 3046, 3165,
-
-     3165, 3165, 1203, 3166, 1200, 1199, 3167, 3059, 3059, 3059,
-     1197, 3060, 1194, 3047, 3061, 3063, 3063, 3063, 3180, 3180,
-     3180, 1192, 3181, 1191, 1190, 3182, 1189, 1188, 3157, 3160,
-     1183, 1181, 3064, 3072, 3072, 3072, 3075, 3075, 3075, 1180,
-     3076, 1179, 1177, 3077, 3203, 3203, 3203, 1176, 3091, 3091,
-     3091, 3073, 3092, 1175, 1172, 3093, 3094, 3094, 3094, 1171,
-     3095, 3204, 1170, 3096, 1587, 1587, 1587, 3098, 3098, 3098,
-     1169, 3099, 1167, 1166, 3100, 1605, 1605, 1605, 1165, 3122,
-     3122, 3122, 1589, 3123, 1163, 1160, 3124, 3236, 3236, 3236,
-     3127, 3127, 3127, 1607, 3238, 3238, 3238, 1156, 3239, 1155,
-
-     1153, 3240, 1152, 1151, 3237, 1867, 1148, 3128, 1867, 3249,
-     3249, 3249, 1867, 3143, 3143, 3143, 3209, 3251, 3251, 3251,
-     3252, 3252, 3252, 1147, 1146, 3218, 3147, 3147, 3147, 3254,
-     3254, 3254, 1362, 1362, 1362, 3158, 3158, 3158, 1380, 1380,
-     1380, 3162, 3162, 3162, 1145, 3163, 1143, 1142, 3164, 1136,
-     1364, 1135, 1134, 3159, 1132, 1131, 1382, 3165, 3165, 3165,
-     1130, 3166, 1125, 1124, 3167, 3266, 3266, 3266, 3278, 3278,
-     3278, 3180, 3180, 3180, 1120, 3181, 1118, 1117, 3182, 3280,
-     3280, 3280, 3267, 1116, 3263, 3279, 3203, 3203, 3203, 1115,
-     3299, 3299, 3299, 1114, 3300, 1113, 3281, 3301, 3306, 3306,
-
-     3306, 1112, 1111, 3204, 1110, 1109, 3264, 1605, 1605, 1605,
-     3236, 3236, 3236, 3328, 3328, 3328, 3307, 3329, 1106, 1103,
-     3330, 1102, 3238, 3238, 3238, 1607, 3239, 3237, 1867, 3240,
-     1100, 1867, 3249, 3249, 3249, 3251, 3251, 3251, 1099, 1098,
-     1867, 3252, 3252, 3252, 3254, 3254, 3254, 3349, 3349, 3349,
-     1380, 1380, 1380, 3266, 3266, 3266, 3353, 3353, 3353, 1097,
-     3354, 1096, 1091, 3355, 1089, 3350, 1088, 1087, 1382, 1086,
-     3267, 3356, 3356, 3356, 3314, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1865, 1865, 1084, 1083, 1865, 1082, 3357, 1080,
-     1079, 1865, 1865, 1865, 1867, 1865, 3278, 3278, 3278, 3365,
-
-     3365, 3365, 1078, 3366, 1077, 1075, 3367, 3368, 3368, 3368,
-     1072, 3369, 1071, 3279, 3370, 1069, 1067, 3351, 3280, 3280,
-     3280, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1065, 1064, 1865, 3281, 3306, 3306, 3306, 1865,
-     1865, 1865, 1867, 1865, 3299, 3299, 3299, 1063, 3300, 1062,
-     1061, 3301, 1060, 1059, 3307, 3398, 3398, 3398, 3328, 3328,
-     3328, 1057, 3329, 1056, 1055, 3330, 3429, 3429, 3429, 1865,
-     1865, 1054, 1052, 3399, 1050, 1049, 1867, 1865, 1865, 1865,
-     1865, 1865, 3416, 1865, 1865, 1865, 1048, 1047, 1865, 3430,
-     3430, 3430, 1044, 1865, 1865, 1865, 1867, 1865, 3349, 3349,
-
-     3349, 1380, 1380, 1380, 3353, 3353, 3353, 1043, 3354, 1042,
-     1037, 3355, 3429, 3429, 3429, 1035, 3350, 1034, 1033, 1382,
-     3356, 3356, 3356, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1865, 3416, 1027, 1026, 1865, 3357, 3430, 3430,
-     3430, 1865, 1865, 1865, 1867, 1865, 1025, 3441, 3441, 3441,
-     1024, 3442, 1016, 3435, 3443, 3365, 3365, 3365, 1015, 3366,
-     1013, 1010, 3367, 3368, 3368, 3368, 1009, 3369, 1008, 1007,
-     3370, 1865, 1865, 3398, 3398, 3398, 3484, 3484, 3484, 3497,
-     3497, 3497, 3499, 3499, 3499, 3441, 3441, 3441, 1002, 3442,
-      999, 3399, 3443, 1001, 1867, 1868,  994, 3498,  993, 3500,
-
-     3513, 3513, 3513, 3523, 3523, 3523, 3541, 3541, 3541, 3484,
-     3484, 3484, 3497, 3497, 3497,  991,  762, 3514,  989,  988,
-     3524, 3499, 3499, 3499, 1261,  986,  984, 1867,  983,  982,
-     3498,  980, 3553, 3553, 3553,  979, 3554,  976, 3500, 3555,
-     3513, 3513, 3513, 3568, 3568, 3568,  975, 3569,  974,  972,
-     3570, 3523, 3523, 3523, 3541, 3541, 3541, 3514, 3579, 3579,
-     3579, 2075, 3580,  971,  969, 3581,  968,  967, 3524, 3553,
-     3553, 3553, 1261, 3554,  966,  964, 3555, 3568, 3568, 3568,
-      963, 3569,  962,  961, 3570, 3579, 3579, 3579,  960, 3580,
-      959, 3596, 3581, 3793, 3793, 3793, 3793, 3793, 3793,  957,
-
-     3810,  955,  954, 3811, 3927, 3927, 3927, 3927, 3927, 3927,
-      952, 1261,  948,  946, 1261,  942,  938,  937,  935,  933,
-      932,  930, 3928,  928,  927, 3928,  292,  292,  292,  292,
-      292,  292,  292,  292,  292,  293,  293,  293,  293,  293,
-      293,  293,  293,  293,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  301,  301,  301,  301,  301,  301,  301,
-      301,  301,  304,  304,  304,  304,  304,  304,  304,  304,
-      304,  307,  307,  307,  307,  307,  307,  307,  307,  307,
-      314,  314,  314,  314,  314,  314,  314,  314,  314,  321,
-      321,  321,  321,  321,  321,  321,  321,  321,  326,  326,
-
-      326,  326,  326,  326,  326,  326,  326,  338,  338,  338,
-      338,  338,  338,  338,  338,  338,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  352,  352,  352,  352,  352,
-      352,  352,  352,  352,  360,  360,  360,  360,  360,  360,
+     4017,  310,  311,  310,  310,  311,  310,  310,  311,  310,
+      310,  311,  310,  315,  311,  315,  321,  312,  318,  321,
+      312,  318, 1030,  313, 4017,  319,  313,  821,  319,  316,
+      315,  311,  315,  755,  322,  324,  325,  322,  324,  325,
+      326,  327,  773,  326,  327,  755,  316,  331,  332,  756,
+      328,  324,  325,  328,  329,  758,  326,  324,  325, 1271,
+      329,  757,  326,  331,  332,  822,  328,  343,  311,  343,
+     1821,  757,  328,  343,  311,  343,  870,  343,  311,  343,
+      343,  311,  343,  344,  311,  311,  311,  810, 1822,  344,
+      871,  758,  333,  345,  811,  801,  345,  754,  754,  754,
+
+      346,  754,  754,  754,  754,  754,  754,  757,  333,  334,
+      335,  311,  335,  334,  334,  334,  334,  334,  334,  334,
+      336,  334,  334,  334,  758,  334,  338,  334,  339,  334,
+      311,  311,  311,  343,  311,  343,  343,  311,  343,  866,
+      757,  343,  311,  343,  813,  857,  346,  867,  801,  344,
+      858, 1036,  344,  868, 1037,  334,  334,  347,  343,  311,
+      343,  754,  754,  754,  812,  812,  340,  754,  754,  754,
+      754,  754,  754, 1826,  347,  341,  334,  335,  311,  335,
+      334,  334,  334,  334,  334,  334,  334,  336,  334,  334,
+      334,  862,  334,  338,  334,  339,  334,  311,  311,  311,
+
+      311,  311,  311,  343,  311,  343,  324,  325,  343,  311,
+      343,  326,  863,  348,  813,  758,  348,  801,  801,  345,
+      908,  704,  334,  334,  345,  311,  311,  311,  311,  311,
+      311,  757,  909,  340,  343,  311,  343,  343,  311,  343,
+     1157,  349,  341, 1158,  349,  343,  311,  343,  821, 1827,
+      347,  705,  758,  347,  343,  311,  343,  754,  754,  754,
+      838,  350,  754,  754,  754,  754,  754,  754,  757,  954,
+      350,  351,  352,  311,  352,  351,  351,  351,  351,  351,
+      351,  351,  353,  351,  351,  351,  758,  351,  355,  351,
+      356,  351,  361,  311,  361,  361,  311,  361,  311,  311,
+
+      311,  801,  757,  311,  311,  311,  887,  822,  362,  758,
+      888,  362, 1829,  801,  363, 1830,  826,  351,  351,  363,
+      361,  311,  361,  357,  889,  757,  358,  754,  754,  754,
+      754,  754,  754,  754,  754,  754,  362, 1832,  359,  351,
+      352,  311,  352,  351,  351,  351,  351,  351,  351,  351,
+      353,  351,  351,  351,  758,  351,  355,  351,  356,  351,
+      361,  311,  361,  361,  311,  361,  361,  311,  361, 1052,
+      757,  377,  311,  377,  890, 1833,  362,  758, 1835,  364,
+     1053, 1050,  364, 1054,  832,  351,  351,  378,  377,  311,
+      377,  357,  843,  757,  358,  754,  754,  754,  754,  754,
+
+      754,  754,  754,  754,  378, 1051,  359,  365,  366,  311,
+      366,  365,  365,  365,  365,  365,  365,  365,  367,  365,
+      365,  365,  758,  365,  369,  365,  370,  365,  311,  311,
+      311,  311,  311,  311,  377,  311,  377,  849,  757,  377,
+      311,  377, 1531,  758,  379,  801,  758,  379, 1532,  758,
+      378, 1836,  876,  365,  365,  378,  377,  311,  377,  757,
+      995,  371,  757,  372,  838,  757,  373,  754,  754,  754,
+      374, 1839,  380, 1840,  375,  365,  366,  311,  366,  365,
+      365,  365,  365,  365,  365,  365,  367,  365,  365,  365,
+      801,  365,  369,  365,  370,  365,  377,  311,  377,  389,
+
+      311,  389,  389,  311,  389,  801,  872,  401,  311,  401,
+      996,  758,  380,  813,  873,  390, 1062,  801,  390,  874,
+      880,  365,  365,  402,  401,  311,  401,  757, 1689,  371,
+     1063,  372,  843, 1841,  373,  754,  754,  754,  374, 1843,
+      402, 1690,  375,  381,  382,  311,  382,  381,  381,  381,
+      381,  381,  381,  381,  383,  381,  381,  381,  758,  381,
+      385,  381,  386,  381,  413,  311,  413,  413,  311,  413,
+      311,  311,  311,  801,  757,  311,  311,  311,  933, 1845,
+      414,  813,  934,  414, 1854,  801,  363, 1857,  758,  381,
+      381,  363,  413,  311,  413,  413,  311,  413,  754,  754,
+
+      754,  754,  754,  754,  757,  889,  849, 1865,  414, 1867,
+     1869,  414, 1870,  387,  381,  382,  311,  382,  381,  381,
+      381,  381,  381,  381,  381,  383,  381,  381,  381,  758,
+      381,  385,  381,  386,  381,  413,  311,  413,  413,  311,
+      413,  425,  311,  425, 1871,  757,  425,  311,  425,  974,
+     1873,  415, 1874, 1878,  415,  813,  975,  426,  801,  801,
+      381,  381,  426,  311,  311,  311,  311,  311,  311,  754,
+      754,  754,  754,  754,  754,  754,  754,  754, 1882,  363,
+      763, 1884,  363, 1887,  387,  391,  392,  311,  392,  391,
+      391,  391,  391,  391,  391,  391,  393,  391,  391,  391,
+
+      758,  391,  395,  391,  396,  391,  425,  311,  425,  425,
+      311,  425,  425,  311,  425,  777,  757,  425,  311,  425,
+      758, 1889,  426,  764,  900,  426,  941,  859,  427,  765,
+      795,  391,  391,  427,  766,  397,  757,  910,  940,  767,
+      801,  946,  398, 1891,  785,  399,  391,  392,  311,  392,
+      391,  391,  391,  391,  391,  391,  391,  393,  391,  391,
+      391, 1069,  391,  395,  391,  396,  391,  438,  311,  438,
+      438,  311,  438,  311,  311,  311,  941,  801,  311,  311,
+      311, 1069, 1892,  439,  940, 1070,  439, 1893,  758,  363,
+      801,  946,  391,  391,  363,  896,  397,  754,  754,  754,
+
+      754,  754,  754,  398,  757, 1051,  399,  403,  404,  311,
+      404,  403,  403,  403,  403,  403,  403,  403,  405,  403,
+      403,  403,  758,  403,  407,  403,  408,  403,  438,  311,
+      438,  438,  311,  438,  438,  311,  438,  801,  757,  438,
+      311,  438, 1026, 1897,  439,  758, 1062,  439, 1898, 1027,
+      440, 1902,  915,  403,  403,  440,  454,  311,  454,  409,
+     1077,  757,  410,  754,  754,  754,  754,  754,  754,  754,
+      754,  754,  455, 1909,  411,  403,  404,  311,  404,  403,
+      403,  403,  403,  403,  403,  403,  405,  403,  403,  403,
+      758,  403,  407,  403,  408,  403,  454,  311,  454,  471,
+
+      311,  471,  471,  311,  471, 1071,  757,  311,  311,  311,
+     1295, 1910,  455,  758, 1665,  472, 1072, 1050,  472, 1054,
+      920,  403,  403,  346,  311,  311,  311,  409,  954,  757,
+      410,  754,  754,  754,  754,  754,  754,  754,  754,  754,
+      346, 1070,  411,  416,  417,  311,  417,  416,  416,  416,
+      416,  416,  416,  416,  418,  416,  416,  416,  758,  416,
+      420,  416,  421,  416,  471,  311,  471,  471,  311,  471,
+      471,  311,  471,  968,  757,  471,  311,  471, 1911, 1912,
+      472,  801, 1913,  472, 1914, 1050,  473, 1915,  969,  416,
+      416,  473,  482,  311,  482,  422,  754,  754,  754,  754,
+
+      754,  754,  754,  754,  754,  754,  754,  754,  483, 1285,
+      423,  416,  417,  311,  417,  416,  416,  416,  416,  416,
+      416,  416,  418,  416,  416,  416,  758,  416,  420,  416,
+      421,  416,  482,  311,  482,  311,  311,  311,  311,  311,
+      311, 1062,  757,  482,  311,  482, 1916, 1917,  483, 1918,
+     1919,  346, 1922, 1069,  346, 1082,  976,  416,  416,  483,
+      482,  311,  482,  422,  754,  754,  754,  754,  754,  754,
+      754,  754,  754,  754,  754,  754,  483, 1286,  423,  428,
+      429,  311,  429,  428,  428,  428,  428,  428,  428,  428,
+      430,  428,  428,  428,  758,  428,  432,  428,  433,  428,
+
+      482,  311,  482,  482,  311,  482,  497,  311,  497,  801,
+      757,  497,  311,  497, 1925, 1926,  484,  758, 1062,  484,
+     1928, 1050,  498, 1929,  925,  428,  428,  498,  311,  311,
+      311,  434, 1084,  757,  435,  754,  754,  754,  754,  754,
+      754,  754,  754,  754,  499, 1286,  436,  428,  429,  311,
+      429,  428,  428,  428,  428,  428,  428,  428,  430,  428,
+      428,  428,  758,  428,  432,  428,  433,  428,  311,  311,
+      311,  497,  311,  497,  497,  311,  497, 1931,  757,  497,
+      311,  497, 1932, 1933,  499,  758, 1934,  498, 1938, 1069,
+      498,  758,  935,  428,  428,  500,  497,  311,  497,  434,
+
+      988,  757,  435,  754,  754,  754,  995,  757,  754,  754,
+      754, 4017,  500, 1287,  436,  441,  442,  311,  442,  441,
+      441,  441,  441,  441,  441,  441,  443,  441,  441,  441,
+      758,  441,  445,  441,  446,  441,  511,  311,  511,  511,
+      311,  511,  521,  311,  521, 1015,  757,  521,  311,  521,
+      804,  936,  512,  801,  945,  512, 1218,  758,  522,  801,
+     1028,  441,  441,  522,  787,  447,  805,  801,  797,  944,
+     1077, 1015,  448,  757, 1939,  449,  754,  754,  754,  450,
+     1940,  451,  452,  441,  442,  311,  442,  441,  441,  441,
+      441,  441,  441,  441,  443,  441,  441,  441,  801,  441,
+
+      445,  441,  446,  441,  311,  311,  311,  311,  311,  311,
+      521,  311,  521,  801,  964,  521,  311,  521,  965, 1941,
+      523, 1942,  966,  523,  801,  758,  522, 1030,  785,  441,
+      441,  522,  959,  447,  754,  754,  754,  754,  754,  754,
+      448,  757, 1031,  449,  754,  754,  754,  450, 1945,  451,
+      452,  456,  457,  311,  457,  456,  456,  456,  456,  456,
+      456,  456,  458,  456,  456,  456,  758,  456,  460,  456,
+      461,  456,  521,  311,  521,  521,  311,  521,  536,  311,
+      536, 1048,  757,  536,  311,  536, 1948, 1949,  524, 1950,
+     1953,  524, 1048,  758,  537, 1215, 1049,  456,  456,  537,
+
+      970,  462,  463,  754,  754,  754,  976, 1099,  464,  757,
+     1049,  465,  754,  754,  754,  466, 1954,  467,  468,  469,
+      456,  457,  311,  457,  456,  456,  456,  456,  456,  456,
+      456,  458,  456,  456,  456,  758,  456,  460,  456,  461,
+      456,  311,  311,  311,  311,  311,  311,  536,  311,  536,
+     1052,  757,  536,  311,  536,  813, 1955,  346, 1326,  801,
+      346, 1053,  758,  537, 1216, 1071,  456,  456,  537,  981,
+      462,  463,  754,  754,  754, 1327, 1072,  464,  757, 1216,
+      465,  754,  754,  754,  466, 4017,  467,  468,  469,  474,
+      475,  311,  475,  474,  474,  474,  474,  474,  474,  474,
+
+      476,  474,  474,  474,  758,  474,  478,  474,  479,  474,
+      536,  311,  536,  536,  311,  536,  548,  311,  548, 1786,
+      757,  548,  311,  548,  804, 1956,  538, 1957,  758,  538,
+     1960, 1787,  549, 1028,  780,  474,  474,  549,  754,  754,
+      754,  754,  754,  754,  757,  940,  480,  474,  475,  311,
+      475,  474,  474,  474,  474,  474,  474,  474,  476,  474,
+      474,  474,  758,  474,  478,  474,  479,  474,  559,  311,
+      559,  559,  311,  559,  570,  311,  570, 1052,  757,  570,
+      311,  570,  813,  941,  560,  942,  801,  560, 1072, 1964,
+      571, 1054, 1965,  474,  474,  571, 1966, 1968,  943, 1972,
+
+      944,  754,  754,  754,  480,  485,  486,  311,  486,  485,
+      485,  485,  485,  485,  485,  485,  487,  485,  485,  485,
+      758,  485,  489,  485,  490,  485,  585,  311,  585,  585,
+      311,  585,  311,  311,  311, 1973,  757,  311,  311,  311,
+     1975, 1295,  586, 1976,  758,  586, 1050, 1979,  587, 1015,
+     1980,  485,  485,  587,  491,  758,  492,  754,  754,  754,
+      757, 1904,  493,  754,  754,  754,  754,  754,  754,  494,
+     1287,  757,  495,  485,  486,  311,  486,  485,  485,  485,
+      485,  485,  485,  485,  487,  485,  485,  485, 1021,  485,
+      489,  485,  490,  485,  596,  311,  596,  596,  311,  596,
+
+      596,  311,  596, 1982,  783,  596,  311,  596, 1983, 1986,
+      597, 2008, 1295,  597, 2009, 2013,  598, 2016, 2018,  485,
+      485,  598,  491, 2027,  492,  754,  754,  754, 1297, 2028,
+      493,  754,  754,  754,  754,  754,  754,  494, 2029, 1326,
+      495,  501,  502,  311,  502,  501,  501,  501,  501,  501,
+      501,  501,  503,  501,  501,  501, 1479,  501,  505,  501,
+      506,  501,  311,  311,  311,  311,  311,  311,  596,  311,
+      596, 2030, 1689,  596,  311,  596, 2032, 1625,  599, 1002,
+     2040,  599, 2042, 1834,  597, 1696, 1003,  501,  501,  597,
+      596,  311,  596,  507, 1327,  757, 1696,  788,  508,  754,
+
+      754,  754,  754,  754,  754, 2045,  600,  754,  754,  754,
+      509,  501,  502,  311,  502,  501,  501,  501,  501,  501,
+      501,  501,  503,  501,  501,  501, 1019,  501,  505,  501,
+      506,  501,  596,  311,  596,  311,  311,  311,  311,  311,
+      311, 2046,  802,  596,  311,  596, 2049, 2051,  600,  758,
+      798,  523, 2052, 2054,  523, 2055, 1010,  501,  501,  598,
+      596,  311,  596,  507, 2056,  757, 2057, 2058,  508,  754,
+      754,  754,  754,  754,  754, 2062,  598, 1314, 1314, 1314,
+      509,  513,  514,  311,  514,  513,  513,  513,  513,  513,
+      513,  513,  515,  513,  513,  513, 2063,  513,  517,  513,
+
+      518,  513,  311,  311,  311,  311,  311,  311,  596,  311,
+      596, 2064, 1015,  596,  311,  596, 2069, 2073,  601, 1059,
+     2077,  601,  774, 2079,  600, 2081, 1060,  513,  513,  600,
+     2083, 2084, 1061, 2085, 2087,  519,  513,  514,  311,  514,
+      513,  513,  513,  513,  513,  513,  513,  515,  513,  513,
+      513, 1018,  513,  517,  513,  518,  513,  596,  311,  596,
+      596,  311,  596,  615,  311,  615, 2094, 1059,  615,  311,
+      615, 1434, 2098,  602, 1060,  786,  602, 2099, 2101,  616,
+     1067, 1435,  513,  513,  616, 1034, 1034, 1034, 1436, 2108,
+      519,  525,  526,  311,  526,  525,  525,  525,  525,  525,
+
+      525,  525,  527,  525,  525,  525, 2110,  525,  529,  525,
+      530,  525,  311,  311,  311,  311,  311,  311,  615,  311,
+      615, 2111, 1076,  615,  311,  615, 2112, 2113,  379, 1060,
+     2114,  379, 2115, 1076,  616, 1061, 1059,  525,  525,  616,
+     1060,  531, 1907, 1060, 2120, 1035, 1067, 2121,  532, 1217,
+     2122,  533, 1034, 1034, 1034, 2124, 1299, 2125,  534,  525,
+      526,  311,  526,  525,  525,  525,  525,  525,  525,  525,
+      527,  525,  525,  525, 2126,  525,  529,  525,  530,  525,
+      615,  311,  615,  615,  311,  615,  627,  311,  627, 2127,
+     1076,  627,  311,  627, 2128, 2129,  617, 1060, 2130,  617,
+
+     2131, 2132,  628, 1217, 2133,  525,  525,  628, 2135,  531,
+     1306, 1306, 1306, 2136, 1307, 2137,  532, 1308, 2140,  533,
+     1337, 1337, 1337, 1927, 1927, 1927,  534,  539,  540,  311,
+      540,  539,  539,  539,  539,  539,  539,  539,  541,  539,
+      539,  539, 2143,  539,  543,  539,  544,  539,  641,  311,
+      641,  641,  311,  641,  652,  311,  652, 2144, 1295,  652,
+      311,  652, 2145, 2146,  642, 2147, 2148,  642, 2149, 2150,
+      653, 2153, 2156,  539,  539,  653, 1314, 1314, 1314,  545,
+     1920, 1920, 1920, 2117,  546,  539,  540,  311,  540,  539,
+      539,  539,  539,  539,  539,  539,  541,  539,  539,  539,
+
+     2163,  539,  543,  539,  544,  539,  311,  311,  311,  311,
+      311,  311,  652,  311,  652, 2164, 2165,  652,  311,  652,
+     2166, 2167,  363, 2169, 2174,  363, 2175, 1921,  653, 2219,
+     2220,  539,  539,  653, 1337, 1337, 1337,  545, 1337, 1337,
+     1337, 1315,  546,  550,  551,  311,  551,  550,  550,  550,
+      550,  550,  550,  550,  552,  550,  550,  550, 2226,  550,
+      554,  550,  555,  550,  652,  311,  652,  652,  311,  652,
+      664,  311,  664, 2232, 2233,  664,  311,  664, 2234, 2235,
+      654, 2238, 2244,  654, 2246, 2252,  665, 2256, 2259,  550,
+      550,  665,  677,  311,  677,  677,  311,  677, 2260, 1338,
+
+      556, 2263, 2264, 1315, 2265, 1382, 1382, 1382,  678, 1383,
+     2266,  678, 1384,  557,  550,  551,  311,  551,  550,  550,
+      550,  550,  550,  550,  550,  552,  550,  550,  550, 2267,
+      550,  554,  550,  555,  550,  311,  311,  311,  311,  311,
+      311,  677,  311,  677, 2268, 2269,  677,  311,  677, 2276,
+     2277,  346, 2278, 2280,  346, 2282, 2290,  678, 2295, 2296,
+      550,  550,  678,  677,  311,  677,  677,  311,  677, 2297,
+     2299,  556, 2312, 1418, 1418, 1418, 2315, 1419, 2316,  679,
+     1420, 2317,  679, 1295,  557,  561,  562,  311,  562,  561,
+      561,  561,  561,  561,  561,  561,  563,  561,  561,  561,
+
+     2324,  561,  565,  561,  566,  561,  691,  311,  691,  691,
+      311,  691,  311,  311,  311, 1907, 2329,  311,  311,  311,
+     2330, 2331,  692, 2335, 2336,  692, 2338, 2332,  693, 2339,
+     2340,  561,  561,  693,  691,  311,  691, 1421, 1421, 1421,
+     1907, 1422, 2341, 2333, 1423, 2342, 2343,  567, 2346, 2326,
+      692, 2334,  568,  561,  562,  311,  562,  561,  561,  561,
+      561,  561,  561,  561,  563,  561,  561,  561, 2347,  561,
+      565,  561,  566,  561,  691,  311,  691,  691,  311,  691,
+      691,  311,  691, 2325, 2348,  716,  311,  716, 2349, 2350,
+      692, 2354, 2355,  694, 2356, 2357,  694,  324,  325,  561,
+
+      561,  717,  326,  716,  311,  716, 1437, 1437, 1437, 2359,
+     1438, 2360,  704, 1439, 2361,  567, 1923, 1923, 1923,  717,
+      568,  572,  573,  311,  573,  572,  572,  572,  572,  572,
+      572,  572,  574,  572,  572,  572, 2351,  572,  576,  572,
+      577,  572,  705,  727,  311,  727,  727,  311,  727,  727,
+      311,  727, 2352,  727,  311,  727, 1042, 1042, 1042,  728,
+     2353, 2368,  728, 1924, 2370,  729, 2371,  572,  572,  729,
+      578,  579,  580, 1043, 2372, 1441, 1441, 1441,  581, 1442,
+     2373,  582, 1443, 2374, 2377, 1314, 1314, 1314,  583,  572,
+      573,  311,  573,  572,  572,  572,  572,  572,  572,  572,
+
+      574,  572,  572,  572, 2379,  572,  576,  572,  577,  572,
+      311,  311,  311,  311,  311,  311,  727,  311,  727, 2410,
+     2411,  727,  311,  727, 2412, 2418,  346, 2419, 2423,  346,
+     2424, 2427,  728, 2428, 2432,  572,  572,  728,  578,  579,
+      580, 1459, 1459, 1459, 2435, 1460,  581, 2439, 1461,  582,
+     1338, 1930, 1930, 1930, 2440, 2441,  583,  588,  589,  311,
+      589,  588,  588,  588,  588,  588,  588,  588,  590,  588,
+      588,  588, 2444,  588,  592,  588,  593,  588,  727,  311,
+      727,  727,  311,  727,  311,  311,  311, 2447, 2451,  311,
+      311,  311, 2452, 2453,  730, 2458, 2460,  730, 2461, 2462,
+
+      731, 2463, 2465,  588,  588,  731,  727,  311,  727,  727,
+      311,  727, 1469, 1469, 1469, 2468, 1470, 2470, 2473, 1471,
+     2487, 2488,  732, 2489, 2494,  732, 2495,  594,  588,  589,
+      311,  589,  588,  588,  588,  588,  588,  588,  588,  590,
+      588,  588,  588, 2498,  588,  592,  588,  593,  588,  727,
+      311,  727,  727,  311,  727,  311,  311,  311, 2496, 2499,
+      311,  311,  311, 2500, 2501,  733, 2497, 2503,  733, 2513,
+     2332,  734, 2502, 2332,  588,  588,  734,  727,  311,  727,
+      727,  311,  727, 1481, 1481, 1481, 2333, 1482, 2522, 2352,
+     1483, 2523, 2524,  730, 2353, 2525,  730, 2353,  594,  603,
+
+      604,  311,  604,  603,  603,  603,  603,  603,  603,  603,
+      605,  603,  603,  603, 2351,  603,  607,  603,  608,  603,
+      311,  311,  311,  311,  311,  311,  727,  311,  727, 1295,
+     2333,  727,  311,  727, 2526, 2515,  735, 2529, 2353,  735,
+     2531, 2532,  733, 2533, 2537,  603,  603,  733,  727,  311,
+      727, 1907, 2538,  609, 2540,  610, 2541, 2542,  611, 1937,
+     1937, 1937,  612, 2543,  736, 1907,  613,  603,  604,  311,
+      604,  603,  603,  603,  603,  603,  603,  603,  605,  603,
+      603,  603, 2546,  603,  607,  603,  608,  603,  727,  311,
+      727,  311,  311,  311,  311,  311,  311, 2516, 2517,  727,
+
+      311,  727, 2550, 2551,  736, 2552, 2554,  737, 2560, 2562,
+      737, 2574, 2575,  603,  603,  738,  727,  311,  727, 2576,
+     2580,  609, 2581,  610, 2582, 2588,  611, 1943, 1943, 1943,
+      612, 2589,  738, 2590,  613,  618,  619,  311,  619,  618,
+      618,  618,  618,  618,  618,  618,  620,  618,  618,  618,
+     2593,  618,  622,  618,  623,  618,  311,  311,  311,  311,
+      311,  311,  727,  311,  727, 2597, 2598,  727,  311,  727,
+     2599, 2600,  739, 2603, 1944,  739, 2604, 2605,  736, 2606,
+     2607,  618,  618,  736,  727,  311,  727,  727,  311,  727,
+     2619, 2623,  624, 2626, 1484, 1484, 1484, 2627, 1485, 2638,
+
+      740, 1486, 2639,  740, 2640,  625,  618,  619,  311,  619,
+      618,  618,  618,  618,  618,  618,  618,  620,  618,  618,
+      618, 2644,  618,  622,  618,  623,  618,  751,  311,  751,
+      751,  311,  751,  311,  311,  311, 2645, 2646,  311,  311,
+      311, 2647, 2648,  752, 2649, 2650,  752, 2651, 2652,  363,
+     2653, 2658,  618,  618,  363,  751,  311,  751,  751,  311,
+      751, 2675, 2676,  624, 2677,  773, 1498, 1498, 1498, 2678,
+     1499,  752, 1907, 1500,  752,  799,  625,  629,  630,  311,
+      630,  629,  629,  629,  629,  629,  629,  629,  631,  629,
+      629,  629, 1907,  629,  633,  629,  634,  629,  751,  311,
+
+      751,  751,  311,  751,  800, 1935, 1935, 1935, 1104, 1104,
+     1104, 1310, 1310, 1310,  753, 2680, 2661,  753,  801, 2682,
+      802, 1015,  785,  629,  629, 1105,  900, 2683,  803, 1312,
+     2684,  799,  635, 2686,  636, 2687,  901, 2688,  637, 2689,
+     2662, 1936, 2690,  638,  639,  629,  630,  311,  630,  629,
+      629,  629,  629,  629,  629,  629,  631,  629,  629,  629,
+     1017,  629,  633,  629,  634,  629,  777, 2691, 1123, 1123,
+     1123, 2692,  779, 2693,  801, 1947, 1947, 1947,  785,  787,
+     1125, 1125, 1125,  785,  803, 1124, 1135, 1135, 1135,  902,
+     2714,  629,  629, 1138, 1138, 1138, 2715, 1126, 2720, 2721,
+
+      635, 2727,  636, 1136,  788, 2728,  637, 2123, 2123, 2123,
+     1139,  638,  639,  643,  644,  311,  644,  643,  643,  643,
+      643,  643,  643,  643,  645,  643,  643,  643, 2716,  643,
+      647,  643,  648,  643, 1020, 1152, 1152, 1152, 2717,  778,
+     2729, 1159, 1159, 1159, 1168, 1168, 1168,  801, 2745,  805,
+      784, 2746, 1153, 1170, 1170, 1170, 2747,  798, 1160,  643,
+      643, 1169, 1180, 1180, 1180,  649, 2762, 1509, 1509, 1509,
+     1171, 1510, 2763, 2767, 1511, 2768, 1946, 1946, 1946, 1181,
+      650,  643,  644,  311,  644,  643,  643,  643,  643,  643,
+      643,  643,  645,  643,  643,  643, 2769,  643,  647,  643,
+
+      648,  643, 1188, 1188, 1188, 1192, 1192, 1192, 1204, 1204,
+     1204, 2770, 1226, 1226, 1226, 1232, 1232, 1232, 2771, 1189,
+     2772, 2773, 1193, 1924, 2774, 1205, 2775,  643,  643, 1227,
+     2776, 2777, 1233,  649, 1516, 1516, 1516, 2778, 1517, 2790,
+     2795, 1518, 2796, 1951, 1951, 1951, 2799, 2800,  650,  655,
+      656,  311,  656,  655,  655,  655,  655,  655,  655,  655,
+      657,  655,  655,  655, 2801,  655,  659,  655,  660,  655,
+     1248, 1248, 1248, 1254, 1254, 1254, 1260, 1260, 1260, 1952,
+     1268, 1268, 1268, 2797, 1280, 1280, 1280, 1249, 2802, 1907,
+     1255, 2805, 2798, 1261, 2806,  655,  655, 1269, 2807, 1907,
+
+      661, 1281, 1951, 1951, 1951, 2808,  662,  655,  656,  311,
+      656,  655,  655,  655,  655,  655,  655,  655,  657,  655,
+      655,  655, 2793,  655,  659,  655,  660,  655, 1042, 1042,
+     1042, 1354, 1354, 1354, 1358, 1358, 1358, 2794, 1936, 4017,
+     4017, 4017, 4017, 4017, 4017, 1043, 2803, 2809, 1355, 2811,
+     2812, 1359, 2813,  655,  655, 2804, 4017, 2815,  661, 4017,
+     1920, 1920, 1920, 2816,  662,  666,  667,  311,  667,  666,
+      666,  666,  666,  666,  666,  666,  668,  666,  666,  666,
+     2817,  666,  670,  666,  671,  666, 1310, 1310, 1310, 2819,
+     1356, 1361, 1361, 1361, 2820, 1361, 1361, 1361, 2822, 1371,
+
+     1371, 1371, 1360, 2840, 1312, 1357, 1371, 1371, 1371, 1363,
+     2841,  666,  666, 1363,  672, 2842,  673, 1373, 2843, 1935,
+     1935, 1935,  674, 1313, 1373, 2847, 2848, 1946, 1946, 1946,
+     2855, 2856, 1364,  675,  666,  667,  311,  667,  666,  666,
+      666,  666,  666,  666,  666,  668,  666,  666,  666, 2863,
+      666,  670,  666,  671,  666, 1952, 1374, 1377, 1377, 1377,
+     1377, 1377, 1377, 2864, 2865, 1104, 1104, 1104, 1386, 1386,
+     1386, 1390, 1390, 1390, 1959, 1379, 2877, 2878, 1379, 2893,
+      666,  666, 1105,  672, 2894,  673, 1388, 2895, 1391, 2897,
+     2898,  674, 1534, 1534, 1534, 2899, 1535, 2900, 2901, 1536,
+
+     2902, 2903,  675,  680,  681,  311,  681,  680,  680,  680,
+      680,  680,  680,  680,  682,  680,  680,  680, 2904,  680,
+      684,  680,  685,  680, 2905, 1380, 2906, 1394, 1394, 1394,
+     1396, 1396, 1396, 1396, 1396, 1396, 2907, 2908, 1386, 1386,
+     1386, 4017, 4017, 4017, 1395, 1400, 1400, 1400, 1398,  680,
+      680, 1398, 2910, 2300,  686, 2911, 1388, 2914, 4017, 2301,
+      687, 2915, 1401, 2302,  688, 1923, 1923, 1923, 2916, 2303,
+      689,  680,  681,  311,  681,  680,  680,  680,  680,  680,
+      680,  680,  682,  680,  680,  680, 1389,  680,  684,  680,
+      685,  680, 1392, 1402, 1402, 1402, 1404, 1404, 1404, 2917,
+
+     2912, 1404, 1404, 1404, 2920, 1399, 2849, 1393, 2850, 2913,
+     1403, 1414, 1414, 1414, 1406, 2921, 2922,  680,  680, 1406,
+     2927, 2851,  686, 1564, 1564, 1564, 2928, 1565,  687, 1416,
+     1566, 2929,  688, 2134, 2134, 2134, 2930, 2931,  689,  695,
+      696,  311,  696,  695,  695,  695,  695,  695,  695,  695,
+      697,  695,  695,  695, 2932,  695,  699,  695,  700,  695,
+     1408, 1408, 1408, 1412, 1412, 1412, 1414, 1414, 1414, 2918,
+     1123, 1123, 1123, 1407, 4017, 4017, 4017, 1409, 2919, 2933,
+     1413, 1125, 1125, 1125, 1416,  695,  695, 1124, 1573, 1573,
+     1573, 4017, 1574,  701, 2934, 1575,  702, 1907, 1126, 1927,
+
+     1927, 1927, 2935,  703,  695,  696,  311,  696,  695,  695,
+      695,  695,  695,  695,  695,  697,  695,  695,  695, 2936,
+      695,  699,  695,  700,  695, 1410, 1424, 1424, 1424, 1907,
+     2937, 4017, 4017, 4017, 2938, 4017, 4017, 4017, 1417, 2939,
+     1411, 2926, 2940, 1425, 2941, 4017, 4017, 4017, 4017, 1295,
+      695,  695, 4017, 1598, 1598, 1598, 2943, 1599,  701, 2944,
+     1600,  702, 4017, 1930, 1930, 1930, 2945, 2925,  703,  706,
+      707,  311,  707,  706,  706,  706,  706,  706,  706,  706,
+      708,  706,  706,  706, 1426,  706,  710,  706,  711,  706,
+     2924, 1427, 1430, 1430, 1430, 2946, 2947, 1428, 2948, 2949,
+
+     4017, 4017, 4017, 1135, 1135, 1135, 1138, 1138, 1138, 2961,
+     1432, 1430, 1430, 1430, 2962,  706,  706, 4017, 2965, 2966,
+     1136, 2967,  712, 1139, 2138, 2138, 2138, 2968,  713, 1432,
+     1935, 1935, 1935, 1937, 1937, 1937, 2971,  714,  706,  707,
+      311,  707,  706,  706,  706,  706,  706,  706,  706,  708,
+      706,  706,  706, 1429,  706,  710,  706,  711,  706, 1433,
+     1444, 1444, 1444, 1455, 1455, 1455, 1152, 1152, 1152, 1455,
+     1455, 1455, 1462, 1462, 1462, 2972, 2975, 1445, 1462, 1462,
+     1462, 1457, 2976, 1153,  706,  706, 2852, 1457, 2853, 2139,
+     1464,  712, 1943, 1943, 1943, 2984, 1464,  713, 1607, 1607,
+
+     1607, 2854, 1608, 2985, 2986, 1609,  714,  718,  719,  311,
+      719,  718,  718,  718,  718,  718,  718,  718,  720,  718,
+      718,  718, 2997,  718,  722,  718,  723,  718, 1458, 1159,
+     1159, 1159, 1475, 1475, 1475, 3015, 3024, 1475, 1475, 1475,
+     1465, 1168, 1168, 1168, 3025, 2969, 1160, 1487, 1487, 1487,
+     1477, 2973, 3026,  718,  718, 1477, 2970, 3027, 1169, 1616,
+     1616, 1616, 2974, 1617,  724, 1489, 1618, 3028, 3029, 2141,
+     2141, 2141, 3030,  725,  718,  719,  311,  719,  718,  718,
+      718,  718,  718,  718,  718,  720,  718,  718,  718, 3031,
+      718,  722,  718,  723,  718, 1170, 1170, 1170, 3032, 1478,
+
+     1487, 1487, 1487, 3033, 1492, 1492, 1492, 1492, 1492, 1492,
+     3035, 3036, 1171, 1180, 1180, 1180, 2142, 3037, 1489, 2990,
+      718,  718, 1494, 3038, 3039, 1494, 1946, 1946, 1946, 2991,
+     1181,  724, 1627, 1627, 1627, 2992, 1628, 3040, 3041, 1629,
+      725,  741,  742,  311,  742,  741,  741,  741,  741,  741,
+      741,  741,  743,  741,  741,  741, 2993,  741,  745,  741,
+      746,  741, 1490, 1504, 1504, 1504, 2994, 3042, 1495, 1188,
+     1188, 1188, 2995, 3043, 1504, 1504, 1504, 1512, 1512, 1512,
+     3044, 1506, 1512, 1512, 1512, 3045, 1189,  741,  741, 1192,
+     1192, 1192, 1506,  747, 3046, 1514,  748, 1643, 1643, 1643,
+
+     1514, 1644, 3054, 3055, 1645, 1907, 1193, 1295,  749,  741,
+      742,  311,  742,  741,  741,  741,  741,  741,  741,  741,
+      743,  741,  741,  741, 3056,  741,  745,  741,  746,  741,
+     1507, 1520, 1520, 1520, 1520, 1520, 1520, 3051, 1515, 1526,
+     1526, 1526, 1526, 1526, 1526, 1204, 1204, 1204, 3052, 1522,
+     3057, 3058, 1522, 3059, 3060,  741,  741, 1528, 3061, 3062,
+     1528,  747, 1205, 3063,  748, 1537, 1537, 1537, 1541, 1541,
+     1541, 3064, 3065, 1541, 1541, 1541,  749,  758, 1907, 1547,
+     1547, 1547, 1538, 3066,  773, 3068, 1543, 1547, 1547, 1547,
+     3069, 1543, 3070,  757,  774, 3071, 1523, 1549, 1560, 1560,
+
+     1560, 1560, 1560, 1560, 1529, 1549, 1947, 1947, 1947, 1226,
+     1226, 1226, 3073, 1568, 1568, 1568, 1562, 2663, 2664, 1562,
+     2665, 3053,  775,  776,  777, 1544, 1227, 3074, 2666,  778,
+      779, 1570, 3075,  780,  781, 2667, 3079,  782, 3086,  783,
+      784,  785, 1568, 1568, 1568, 3094, 1550,  786,  758, 3080,
+     1232, 1232, 1232, 1576, 1576, 1576, 1579, 1579, 1579, 3009,
+     1570, 1584, 1584, 1584,  757,  788, 1563, 1233, 3095, 3010,
+     1577, 3081, 3011, 1580, 1584, 1584, 1584, 3096, 3097, 1586,
+     1588, 1588, 1588, 3098, 3082, 1590, 1590, 1590, 3099, 4017,
+     4017, 4017, 1586,  775,  789,  790, 3100, 1589, 3101, 3102,
+
+      791,  792, 1591, 3103,  793,  781, 4017, 1571,  794, 3104,
+      795,  796,  797, 1593, 1593, 1593, 3108, 3111,  798,  758,
+     3112, 3113, 1587, 1593, 1593, 1593, 1015, 1248, 1248, 1248,
+     3012, 1595, 1601, 1601, 1601,  757,  774, 1601, 1601, 1601,
+     3013, 1595, 3114, 3014, 1249, 1254, 1254, 1254, 3115, 1592,
+     1603, 1611, 1611, 1611, 3116, 1603, 1611, 1611, 1611, 1621,
+     1621, 1621, 1255, 3117,  775, 1016,  777, 3120, 3128, 1613,
+     3129,  778,  779, 3132, 1613,  780,  781, 1623, 3133,  782,
+     3136,  783,  784,  785, 3147, 1596, 1260, 1260, 1260,  786,
+     1621, 1621, 1621, 1268, 1268, 1268, 1632, 1632, 1632, 1604,
+
+     1632, 1632, 1632, 1261, 1639, 1639, 1639, 3148, 1623, 3149,
+     1269, 1639, 1639, 1639, 1634, 1280, 1280, 1280, 1634, 1647,
+     1647, 1647, 1641, 1614, 1647, 1647, 1647, 3150, 3124, 1641,
+     3151, 3152, 1281, 1654, 1654, 1654, 3126, 1649, 4017, 4017,
+     4017, 3125, 1649, 1658, 1658, 1658, 4017, 4017, 4017, 3127,
+     1655, 1661, 1661, 1661, 3153, 4017, 3154, 1624, 3156, 3157,
+     1659, 3158, 3130, 4017, 3159, 1635, 1661, 1661, 1661, 1663,
+     1306, 1306, 1306, 3160, 1307, 3131, 1642, 1308, 1310, 1310,
+     1310, 1310, 1310, 1310, 1663, 3134, 1650, 3161, 3162, 1656,
+     1672, 1672, 1672, 1354, 1354, 1354, 1312, 3163, 3135, 1312,
+
+     1358, 1358, 1358, 3164, 1657, 3165, 1660, 3166, 1673, 3167,
+     1355, 1713, 1713, 1713, 3175, 1714, 1907, 1359, 1715, 1718,
+     1718, 1718, 3176, 1719, 1295, 3177, 1720, 3178, 1664, 1361,
+     1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1725, 1725,
+     1725, 1371, 1371, 1371, 1371, 1371, 1371, 1363, 3179, 3180,
+     1363, 3181, 3172, 1363, 3182, 1726, 1371, 1371, 1371, 1373,
+     3183, 3184, 1373, 1377, 1377, 1377, 1377, 1377, 1377, 3185,
+     1377, 1377, 1377, 3171, 1373, 1382, 1382, 1382, 3186, 1383,
+     3187, 1379, 1384, 3188, 1379, 1386, 1386, 1386, 1379, 1386,
+     1386, 1386, 1386, 1386, 1386, 1390, 1390, 1390, 2668, 2669,
+
+     1722, 2670, 3190, 1388, 1737, 1737, 1737, 1388, 1738, 2671,
+     1388, 1739, 1391, 1394, 1394, 1394, 2672, 3191, 1742, 1742,
+     1742, 3192, 1743, 1730, 1733, 1744, 1396, 1396, 1396, 3194,
+     1395, 1396, 1396, 1396, 1396, 1396, 1396, 1400, 1400, 1400,
+     3203, 3204, 1736, 3205, 1398, 3206, 1746, 1746, 1746, 1398,
+     1747, 3211, 1398, 1748, 1401, 1402, 1402, 1402, 1749, 1749,
+     1749, 3218, 1750, 3219, 3220, 1751, 1404, 1404, 1404, 1404,
+     1404, 1404, 1403, 1404, 1404, 1404, 1408, 1408, 1408, 1753,
+     1753, 1753, 3221, 1754, 1406, 3222, 1755, 1406, 1412, 1412,
+     1412, 1406, 3223, 1409, 1758, 1758, 1758, 1745, 1759, 3224,
+
+     3225, 1760, 1414, 1414, 1414, 1413, 1414, 1414, 1414, 1414,
+     1414, 1414, 1418, 1418, 1418, 3226, 1419, 3227, 3228, 1420,
+     1416, 1421, 1421, 1421, 1416, 1422, 3229, 1416, 1423, 1424,
+     1424, 1424, 3233, 1762, 1762, 1762, 1752, 1763, 3234, 3235,
+     1764, 1430, 1430, 1430, 3236, 3237, 1425, 1430, 1430, 1430,
+     1430, 1430, 1430, 1437, 1437, 1437, 3238, 1438, 3239, 1432,
+     1439, 1773, 1773, 1773, 3240, 1432, 3241, 3242, 1432, 1441,
+     1441, 1441, 1761, 1442, 3243, 3244, 1443, 3245, 1774, 1444,
+     1444, 1444, 1775, 1775, 1775, 3246, 1776, 3247, 3248, 1777,
+     1455, 1455, 1455, 1455, 1455, 1455, 1445, 3249, 3250, 1769,
+
+     1455, 1455, 1455, 1459, 1459, 1459, 3251, 1460, 1457, 3252,
+     1461, 1457, 1462, 1462, 1462, 1462, 1462, 1462, 1457, 1462,
+     1462, 1462, 1792, 1792, 1792, 1469, 1469, 1469, 3264, 1470,
+     1464, 3265, 1471, 1464, 1475, 1475, 1475, 1464, 3266, 1793,
+     1475, 1475, 1475, 1475, 1475, 1475, 1799, 1799, 1799, 1481,
+     1481, 1481, 1477, 1482, 2304, 3267, 1483, 3268, 1477, 3269,
+     2305, 1477, 3270, 1800, 2306, 1484, 1484, 1484, 1788, 1485,
+     2307, 3271, 1486, 1487, 1487, 1487, 1487, 1487, 1487, 3273,
+     1789, 1487, 1487, 1487, 1802, 1802, 1802, 1492, 1492, 1492,
+     3274, 1489, 3275, 3276, 1489, 1492, 1492, 1492, 3277, 1489,
+
+     3278, 1803, 1492, 1492, 1492, 1494, 1504, 1504, 1504, 1797,
+     1498, 1498, 1498, 1494, 1499, 3279, 3280, 1500, 3281, 3282,
+     1494, 1504, 1504, 1504, 1506, 1504, 1504, 1504, 1509, 1509,
+     1509, 3283, 1510, 3284, 1295, 1511, 1512, 1512, 1512, 1506,
+     1512, 1512, 1512, 1506, 1512, 1512, 1512, 1801, 3299, 1516,
+     1516, 1516, 1804, 1517, 1514, 3300, 1518, 3301, 1514, 1520,
+     1520, 1520, 1514, 1520, 1520, 1520, 1520, 1520, 1520, 3293,
+     1815, 1815, 1815, 4017, 4017, 4017, 3302, 1522, 1526, 1526,
+     1526, 1522, 3303, 3304, 1522, 3195, 1810, 1816, 3305, 3306,
+     4017, 1526, 1526, 1526, 3308, 3196, 1528, 1526, 1526, 1526,
+
+     1534, 1534, 1534, 3311, 1535, 1812, 3313, 1536, 3314, 1528,
+     1537, 1537, 1537, 3197, 3315, 1528, 3316, 1814, 1823, 1823,
+     1823, 1817, 1824, 3317, 3198, 1825, 3318, 1538, 1541, 1541,
+     1541, 1541, 1541, 1541, 1541, 1541, 1541, 1547, 1547, 1547,
+     1547, 1547, 1547, 1547, 1547, 1547, 1543, 3319, 3320, 1543,
+     3321, 3322, 1543, 3323, 3324, 1549, 3327, 3330, 1549, 3331,
+     3332, 1549, 1837, 1837, 1837, 1818, 1560, 1560, 1560, 1560,
+     1560, 1560, 1560, 1560, 1560, 3333, 1564, 1564, 1564, 1838,
+     1565, 3334, 3335, 1566, 1562, 3336, 1828, 1562, 3337, 3338,
+     1562, 1831, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568,
+
+     1568, 1573, 1573, 1573, 3199, 1574, 2780, 2781, 1575, 2782,
+     1570, 3339, 3344, 1570, 3200, 3345, 1570, 2783, 1576, 1576,
+     1576, 1846, 1846, 1846, 2784, 1847, 3346, 3347, 1848, 1849,
+     1849, 1849, 3201, 3348, 1842, 1577, 1579, 1579, 1579, 3349,
+     1851, 1851, 1851, 3202, 1852, 3350, 1850, 1853, 1855, 1855,
+     1855, 3351, 3352, 1580, 1584, 1584, 1584, 1584, 1584, 1584,
+     1844, 1584, 1584, 1584, 3353, 1856, 1588, 1588, 1588, 1859,
+     1859, 1859, 1586, 1860, 3354, 1586, 1861, 3355, 3356, 1586,
+     1590, 1590, 1590, 1589, 1862, 1862, 1862, 3357, 1863, 3358,
+     3359, 1864, 1593, 1593, 1593, 3360, 3364, 1591, 1593, 1593,
+
+     1593, 1593, 1593, 1593, 1598, 1598, 1598, 3365, 1599, 3366,
+     1595, 1600, 1601, 1601, 1601, 3367, 1595, 3368, 3369, 1595,
+     3370, 3371, 1858, 1601, 1601, 1601, 1601, 1601, 1601, 3374,
+     1603, 1607, 1607, 1607, 3375, 1608, 3376, 3377, 1609, 3378,
+     3379, 1603, 3381, 3382, 1603, 1611, 1611, 1611, 1611, 1611,
+     1611, 3383, 1611, 1611, 1611, 1616, 1616, 1616, 3255, 1617,
+     3384, 3385, 1618, 1613, 3386, 3387, 1613, 3388, 3256, 1866,
+     1613, 1875, 1875, 1875, 1621, 1621, 1621, 1621, 1621, 1621,
+     1621, 1621, 1621, 1879, 1879, 1879, 3257, 3389, 1876, 1627,
+     1627, 1627, 1623, 1628, 1868, 1623, 1629, 3258, 1623, 3390,
+
+     1880, 4017, 4017, 4017, 1632, 1632, 1632, 1632, 1632, 1632,
+     1632, 1632, 1632, 3391, 1872, 1885, 1885, 1885, 4017, 1639,
+     1639, 1639, 1634, 3392, 3393, 1634, 3394, 3395, 1634, 1639,
+     1639, 1639, 1886, 1639, 1639, 1639, 3396, 1641, 3403, 1643,
+     1643, 1643, 1877, 1644, 1295, 3404, 1645, 1641, 1647, 1647,
+     1647, 1641, 1647, 1647, 1647, 1647, 1647, 1647, 1883, 1654,
+     1654, 1654, 3405, 1881, 3406, 3407, 1649, 1894, 1894, 1894,
+     1649, 1895, 3408, 1649, 1896, 3409, 1655, 1658, 1658, 1658,
+     3410, 1888, 1899, 1899, 1899, 3411, 1900, 3412, 3397, 1901,
+     1661, 1661, 1661, 3413, 1659, 1661, 1661, 1661, 3414, 1661,
+
+     1661, 1661, 1906, 1906, 1906, 1672, 1672, 1672, 1663, 1361,
+     1361, 1361, 3415, 1663, 3416, 3417, 1890, 1663, 3418, 3419,
+     1907, 1908, 3420, 1673, 1713, 1713, 1713, 1363, 1714, 3421,
+     3422, 1715, 1718, 1718, 1718, 3426, 1719, 3432, 3433, 1720,
+     1725, 1725, 1725, 1961, 1961, 1961, 3434, 1962, 3259, 3435,
+     1963, 1371, 1371, 1371, 1377, 1377, 1377, 1726, 3260, 3436,
+     1903, 1969, 1969, 1969, 3437, 1386, 1386, 1386, 3438, 1373,
+     3445, 1958, 1379, 1737, 1737, 1737, 3261, 1738, 1970, 3446,
+     1739, 3447, 3448, 1388, 1742, 1742, 1742, 3262, 1743, 3449,
+     3450, 1744, 1396, 1396, 1396, 1746, 1746, 1746, 3451, 1747,
+
+     3452, 3453, 1748, 3454, 1749, 1749, 1749, 3455, 1750, 3456,
+     1398, 1751, 3457, 1967, 1404, 1404, 1404, 1753, 1753, 1753,
+     3458, 1754, 1971, 1974, 1755, 3459, 1758, 1758, 1758, 3460,
+     1759, 3461, 1406, 1760, 1414, 1414, 1414, 1762, 1762, 1762,
+     1977, 1763, 3462, 3463, 1764, 3464, 1984, 1984, 1984, 1430,
+     1430, 1430, 1416, 1988, 1988, 1988, 4017, 4017, 4017, 4017,
+     4017, 4017, 1978, 1985, 1773, 1773, 1773, 1432, 3465, 3466,
+     1989, 3467, 3468, 4017, 3469, 3470, 4017, 4017, 4017, 4017,
+     3471, 1774, 1981, 1992, 1992, 1992, 3472, 1993, 3473, 3474,
+     1994, 1775, 1775, 1775, 4017, 1776, 3475, 3478, 1777, 4017,
+
+     4017, 4017, 4017, 4017, 4017, 1987, 3479, 1991, 4017, 4017,
+     4017, 4017, 4017, 4017, 3480, 3481, 4017, 3482, 3483, 4017,
+     4017, 4017, 4017, 1990, 3484, 4017, 3485, 3486, 4017, 1995,
+     3487, 2001, 2001, 2001, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 1455, 1455, 1455, 1996, 2002, 3488,
+     3489, 4017, 1792, 1792, 1792, 4017, 1998, 3490, 4017, 1462,
+     1462, 1462, 1457, 2010, 2010, 2010, 3491, 2011, 3503, 1793,
+     2012, 3504, 3509, 1997, 3494, 1295, 1999, 1464, 2014, 2014,
+     2014, 2000, 1475, 1475, 1475, 1799, 1799, 1799, 3495, 2019,
+     2019, 2019, 3510, 2020, 3513, 2015, 2021, 1487, 1487, 1487,
+
+     1477, 2004, 1800, 2005, 3514, 2003, 1802, 1802, 1802, 3494,
+     2006, 3515, 2007, 3516, 3517, 1489, 3518, 2023, 2023, 2023,
+     3497, 2024, 3492, 1803, 2025, 1492, 1492, 1492, 1504, 1504,
+     1504, 3520, 1512, 1512, 1512, 2034, 2034, 2034, 3285, 1520,
+     1520, 1520, 3528, 1494, 3521, 3529, 1506, 3530, 3286, 2017,
+     1514, 3523, 2035, 1815, 1815, 1815, 3522, 1522, 2037, 2037,
+     2037, 3531, 2038, 3524, 2022, 2039, 3287, 1526, 1526, 1526,
+     1816, 2043, 2043, 2043, 1823, 1823, 1823, 3288, 1824, 3532,
+     3537, 1825, 3538, 3539, 2026, 1528, 2031, 3540, 2044, 3541,
+     2033, 2036, 2047, 2047, 2047, 1541, 1541, 1541, 1547, 1547,
+
+     1547, 1837, 1837, 1837, 2059, 2059, 2059, 3542, 2060, 2048,
+     3543, 2061, 3544, 1543, 3545, 3546, 1549, 3547, 1838, 1560,
+     1560, 1560, 2066, 2066, 2066, 1568, 1568, 1568, 2041, 1846,
+     1846, 1846, 3548, 1847, 3549, 3533, 1848, 1562, 3535, 2067,
+     1849, 1849, 1849, 1570, 2070, 2070, 2070, 3534, 2071, 3550,
+     3536, 2072, 1851, 1851, 1851, 3551, 1852, 1850, 3556, 1853,
+     2050, 1855, 1855, 1855, 3557, 2053, 2074, 2074, 2074, 2065,
+     2075, 3562, 3563, 2076, 1584, 1584, 1584, 3564, 1856, 1859,
+     1859, 1859, 3565, 1860, 3566, 3567, 1861, 3570, 2068, 1862,
+     1862, 1862, 1586, 1863, 1295, 3570, 1864, 1593, 1593, 1593,
+
+     1601, 1601, 1601, 1611, 1611, 1611, 2088, 2088, 2088, 1875,
+     1875, 1875, 2090, 2090, 2090, 1595, 2091, 3573, 1603, 2092,
+     3574, 1613, 3575, 2089, 3494, 2078, 1876, 1621, 1621, 1621,
+     1879, 1879, 1879, 2095, 2095, 2095, 3568, 2096, 3495, 3578,
+     2097, 1632, 1632, 1632, 3579, 1623, 3580, 1880, 1885, 1885,
+     1885, 2102, 2102, 2102, 3583, 2103, 1907, 1908, 2104, 1634,
+     2105, 2105, 2105, 3576, 2080, 1886, 3584, 2082, 2086, 1639,
+     1639, 1639, 1647, 1647, 1647, 3494, 3591, 2106, 1894, 1894,
+     1894, 3577, 1895, 3581, 3592, 1896, 3497, 1641, 3595, 3597,
+     1649, 2100, 2093, 1899, 1899, 1899, 3596, 1900, 3582, 3589,
+
+     1901, 3598, 1661, 1661, 1661, 1906, 1906, 1906, 2151, 2151,
+     2151, 2154, 2154, 2154, 1951, 1951, 1951, 3599, 3590, 2107,
+     1663, 3600, 3613, 1907, 2109, 2138, 2138, 2138, 2151, 2151,
+     2151, 2157, 2157, 2157, 2159, 2159, 2159, 3593, 4017, 4017,
+     4017, 1361, 1361, 1361, 3614, 1961, 1961, 1961, 2158, 1962,
+     3615, 2160, 1963, 3616, 2116, 4017, 3594, 2118, 2155, 1363,
+     1371, 1371, 1371, 1969, 1969, 1969, 3617, 3618, 2170, 2170,
+     2170, 3619, 2171, 2152, 2119, 2172, 3620, 3621, 1373, 3603,
+     1970, 1377, 1377, 1377, 1386, 1386, 1386, 2177, 2177, 2177,
+     2152, 3607, 3605, 2139, 2179, 2179, 2179, 3624, 3604, 1379,
+
+     3606, 3625, 1388, 2161, 2178, 1396, 1396, 1396, 3626, 2162,
+     3608, 2180, 1404, 1404, 1404, 2183, 2183, 2183, 2185, 2185,
+     2185, 3609, 3622, 1398, 3289, 2168, 1414, 1414, 1414, 3610,
+     1406, 3570, 2184, 2176, 3290, 2186, 2188, 2188, 2188, 3630,
+     3623, 2173, 3627, 3570, 1416, 4017, 4017, 4017, 1984, 1984,
+     1984, 3631, 3291, 2189, 2191, 2191, 2191, 3628, 2192, 3632,
+     3633, 2193, 4017, 3292, 3634, 1985, 2194, 2194, 2194, 3635,
+     3636, 2181, 1430, 1430, 1430, 2229, 2229, 2229, 2182, 1988,
+     1988, 1988, 3637, 2195, 2197, 2197, 2197, 3638, 2198, 3639,
+     1432, 2199, 2187, 2200, 2200, 2200, 1989, 4017, 4017, 4017,
+
+     3640, 1992, 1992, 1992, 2190, 1993, 3644, 3645, 1994, 3646,
+     2201, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 2205, 2205,
+     2205, 4017, 4017, 4017, 4017, 4017, 4017, 3647, 4017, 4017,
+     4017, 4017, 4017, 2196, 3648, 2206, 3649, 3650, 4017, 3651,
+     3652, 4017, 2001, 2001, 2001, 3653, 4017, 2210, 2210, 2210,
+     3654, 2211, 3655, 3659, 2212, 2213, 2213, 2213, 3660, 2002,
+     3661, 3662, 2202, 3663, 3664, 2204, 3665, 4017, 4017, 4017,
+     3666, 2208, 2214, 4017, 4017, 4017, 2203, 1455, 1455, 1455,
+     2207, 3670, 3671, 2209, 4017, 1462, 1462, 1462, 3672, 3673,
+     4017, 3499, 2010, 2010, 2010, 1457, 2011, 3674, 3675, 2012,
+
+     2221, 2221, 2221, 1464, 2014, 2014, 2014, 2223, 2223, 2223,
+     3500, 2224, 3501, 3676, 2225, 2215, 3677, 2222, 2227, 2227,
+     2227, 2015, 2019, 2019, 2019, 3502, 2020, 2216, 3678, 2021,
+     1487, 1487, 1487, 2023, 2023, 2023, 2228, 2024, 3679, 3680,
+     2025, 2218, 3681, 3682, 2217, 1492, 1492, 1492, 1489, 2236,
+     2236, 2236, 1512, 1512, 1512, 2034, 2034, 2034, 2240, 2240,
+     2240, 3683, 2241, 1494, 3685, 2242, 3686, 2237, 3687, 3688,
+     1514, 3689, 2035, 1520, 1520, 1520, 3690, 2230, 2037, 2037,
+     2037, 3691, 2038, 3692, 3693, 2039, 1526, 1526, 1526, 3694,
+     3695, 1522, 2043, 2043, 2043, 3700, 2247, 2247, 2247, 2239,
+
+     2248, 3701, 3702, 2249, 1528, 2250, 2250, 2250, 3696, 2044,
+     2047, 2047, 2047, 2231, 2253, 2253, 2253, 3703, 2254, 3698,
+     3697, 2255, 2251, 2257, 2257, 2257, 3505, 2048, 1547, 1547,
+     1547, 3699, 2243, 2262, 2262, 2262, 2059, 2059, 2059, 3704,
+     2060, 2258, 3506, 2061, 3507, 3705, 1549, 1560, 1560, 1560,
+     2066, 2066, 2066, 2245, 2271, 2271, 2271, 3508, 2272, 3706,
+     3707, 2273, 2274, 2274, 2274, 1562, 3708, 2067, 2070, 2070,
+     2070, 3709, 2071, 3710, 3711, 2072, 1584, 1584, 1584, 3712,
+     2275, 2261, 2074, 2074, 2074, 3713, 2075, 3714, 3715, 2076,
+     1593, 1593, 1593, 3716, 1586, 1601, 1601, 1601, 3717, 2270,
+
+     2284, 2284, 2284, 4017, 4017, 4017, 3718, 3719, 1595, 2287,
+     2287, 2287, 3720, 1603, 1611, 1611, 1611, 2285, 3721, 3722,
+     4017, 3723, 2088, 2088, 2088, 3724, 2288, 2291, 2291, 2291,
+     3725, 2292, 1613, 3726, 2293, 1621, 1621, 1621, 2279, 2089,
+     3727, 3558, 2281, 3728, 2090, 2090, 2090, 2283, 2091, 3729,
+     3731, 2092, 3732, 1623, 2095, 2095, 2095, 3559, 2096, 3560,
+     3733, 2097, 2289, 1632, 1632, 1632, 3734, 2102, 2102, 2102,
+     2286, 2103, 3561, 3735, 2104, 2105, 2105, 2105, 2308, 2308,
+     2308, 1634, 2309, 2294, 1295, 2310, 1639, 1639, 1639, 2313,
+     2313, 2313, 2106, 2318, 2318, 2318, 2320, 2320, 2320, 4017,
+
+     4017, 4017, 3736, 3737, 1641, 3738, 3739, 2314, 3740, 3730,
+     2319, 3741, 3742, 2321, 3743, 2298, 4017, 1661, 1661, 1661,
+     2327, 2327, 2327, 2123, 2123, 2123, 2337, 2337, 2337, 2134,
+     2134, 2134, 2344, 2344, 2344, 1663, 3744, 2328, 2311, 2138,
+     2138, 2138, 2345, 2345, 2345, 2141, 2141, 2141, 2151, 2151,
+     2151, 3745, 3746, 2323, 2358, 2358, 2358, 2154, 2154, 2154,
+     2157, 2157, 2157, 3747, 2322, 2362, 2362, 2362, 3748, 2363,
+     3749, 3750, 2364, 2159, 2159, 2159, 3751, 2158, 2365, 2365,
+     2365, 3752, 2366, 3753, 3754, 2367, 1361, 1361, 1361, 3755,
+     2160, 2375, 2375, 2375, 2170, 2170, 2170, 3756, 2171, 3757,
+
+     3758, 2172, 3759, 3760, 1363, 1377, 1377, 1377, 3761, 2376,
+     2380, 2380, 2380, 1386, 1386, 1386, 2177, 2177, 2177, 2179,
+     2179, 2179, 3762, 1379, 1396, 1396, 1396, 2381, 2383, 2383,
+     2383, 1388, 2384, 2178, 3763, 2385, 2180, 2386, 2386, 2386,
+     3764, 2387, 1398, 3765, 2388, 1404, 1404, 1404, 2183, 2183,
+     2183, 3766, 3767, 2369, 2391, 2391, 2391, 2378, 2392, 3768,
+     3770, 2393, 3771, 1406, 3772, 2184, 2185, 2185, 2185, 2394,
+     2394, 2394, 3773, 2395, 3774, 2382, 2396, 1414, 1414, 1414,
+     2188, 2188, 2188, 2186, 2398, 2398, 2398, 3775, 2399, 3776,
+     2389, 2400, 2401, 2401, 2401, 1416, 3552, 2189, 2191, 2191,
+
+     2191, 3777, 2192, 3778, 3779, 2193, 2194, 2194, 2194, 2402,
+     1295, 2390, 2403, 2403, 2403, 3553, 2404, 3554, 3780, 2405,
+     1430, 1430, 1430, 2195, 2197, 2197, 2197, 3781, 2198, 3769,
+     3555, 2199, 2200, 2200, 2200, 2407, 2407, 2407, 1432, 2408,
+     3782, 3783, 2409, 2397, 2205, 2205, 2205, 3784, 3785, 2201,
+     2413, 2413, 2413, 3786, 2414, 3787, 3788, 2415, 2416, 2416,
+     2416, 2206, 2210, 2210, 2210, 3789, 2211, 3790, 3791, 2212,
+     3792, 3793, 2406, 3794, 3795, 2417, 2213, 2213, 2213, 2420,
+     2420, 2420, 3796, 2421, 3797, 3798, 2422, 1455, 1455, 1455,
+     1462, 1462, 1462, 2214, 2221, 2221, 2221, 2429, 2429, 2429,
+
+     3799, 2430, 3800, 3801, 2431, 1457, 3802, 3803, 1464, 3804,
+     3805, 2222, 2223, 2223, 2223, 3807, 2224, 1295, 3808, 2225,
+     2227, 2227, 2227, 2229, 2229, 2229, 3809, 1487, 1487, 1487,
+     1492, 1492, 1492, 2436, 2436, 2436, 3810, 3806, 2228, 2425,
+     2236, 2236, 2236, 3811, 2426, 1489, 3812, 3813, 1494, 3814,
+     2437, 1512, 1512, 1512, 3815, 2240, 2240, 2240, 2237, 2241,
+     3816, 3817, 2242, 3818, 1520, 1520, 1520, 3819, 3820, 1514,
+     2445, 2445, 2445, 3821, 2250, 2250, 2250, 2257, 2257, 2257,
+     2438, 2434, 1522, 2247, 2247, 2247, 2433, 2248, 2446, 3822,
+     2249, 2251, 2448, 2448, 2448, 2258, 2449, 3823, 3824, 2450,
+
+     3825, 2442, 2253, 2253, 2253, 3826, 2254, 3827, 3828, 2255,
+     3829, 2443, 2454, 2454, 2454, 1547, 1547, 1547, 2262, 2262,
+     2262, 2457, 2457, 2457, 2459, 2459, 2459, 3830, 3831, 2455,
+     1560, 1560, 1560, 1549, 2271, 2271, 2271, 3832, 2272, 3833,
+     3834, 2273, 2274, 2274, 2274, 2466, 2466, 2466, 1562, 1584,
+     1584, 1584, 2471, 2471, 2471, 1601, 1601, 1601, 3835, 3836,
+     2275, 3837, 2467, 2284, 2284, 2284, 3838, 1586, 3840, 3841,
+     2472, 3842, 3843, 1603, 2475, 2475, 2475, 2456, 2476, 3844,
+     2285, 2477, 2478, 2478, 2478, 2287, 2287, 2287, 2480, 2480,
+     2480, 1295, 2481, 3845, 3846, 2482, 2464, 3839, 3847, 2479,
+
+     3848, 3849, 2288, 1611, 1611, 1611, 2484, 2484, 2484, 2469,
+     2291, 2291, 2291, 3850, 2292, 3851, 3852, 2293, 3853, 3854,
+     2474, 1613, 3855, 2485, 1621, 1621, 1621, 2490, 2490, 2490,
+     2492, 2492, 2492, 2308, 2308, 2308, 3856, 2309, 3857, 3858,
+     2310, 3859, 1623, 3860, 3861, 2491, 3862, 2493, 1639, 1639,
+     1639, 2505, 2505, 2505, 2313, 2313, 2313, 2483, 2318, 2318,
+     2318, 3863, 1295, 2507, 2507, 2507, 1641, 2508, 2506, 3865,
+     2509, 3866, 2314, 3867, 3868, 2319, 3864, 3869, 2486, 2320,
+     2320, 2320, 2510, 2510, 2510, 3870, 2511, 3871, 3872, 2512,
+     1661, 1661, 1661, 3873, 3874, 2504, 2321, 2327, 2327, 2327,
+
+     2518, 2518, 2518, 3875, 2519, 3876, 3877, 2520, 1663, 2521,
+     2521, 2521, 3878, 3879, 2328, 2527, 2527, 2527, 2528, 2528,
+     2528, 2337, 2337, 2337, 2530, 2530, 2530, 2534, 2534, 2534,
+     2344, 2344, 2344, 2345, 2345, 2345, 2535, 2535, 2535, 2539,
+     2539, 2539, 2544, 2544, 2544, 2545, 2545, 2545, 2547, 2547,
+     2547, 3880, 2514, 2358, 2358, 2358, 2548, 2548, 2548, 2362,
+     2362, 2362, 3882, 2363, 3883, 3884, 2364, 2365, 2365, 2365,
+     3885, 2366, 3886, 3887, 2367, 1361, 1361, 1361, 2555, 2555,
+     2555, 3888, 3889, 2536, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 1363, 3890, 2556, 2375, 2375, 2375, 3891,
+
+     3892, 4017, 3893, 2549, 4017, 3894, 3895, 4017, 1377, 1377,
+     1377, 2380, 2380, 2380, 2376, 2563, 2563, 2563, 3896, 2564,
+     3897, 3900, 2565, 1386, 1386, 1386, 1379, 2553, 2381, 3901,
+     2383, 2383, 2383, 3902, 2384, 3903, 2557, 2385, 2386, 2386,
+     2386, 1388, 2387, 3904, 3905, 2388, 1396, 1396, 1396, 3906,
+     2559, 3907, 2558, 1404, 1404, 1404, 2391, 2391, 2391, 3908,
+     2392, 3909, 3912, 2393, 1398, 1295, 2567, 2785, 2786, 2561,
+     2787, 1406, 2394, 2394, 2394, 3913, 2395, 1295, 2788, 2396,
+     1414, 1414, 1414, 3914, 2566, 2789, 2398, 2398, 2398, 2568,
+     2399, 3915, 1295, 2400, 2401, 2401, 2401, 1295, 1416, 2570,
+
+     2570, 2570, 3910, 2571, 1820, 3924, 2572, 1295, 2403, 2403,
+     2403, 2402, 2404, 1295, 3911, 2405, 1430, 1430, 1430, 2407,
+     2407, 2407, 3966, 2408, 2569, 3925, 2409, 3922, 2413, 2413,
+     2413, 1295, 2414, 1295, 1432, 2415, 2416, 2416, 2416, 2577,
+     2577, 2577, 3920, 2578, 1295, 1295, 2579, 2420, 2420, 2420,
+     1295, 2421, 3921, 2417, 2422, 2583, 2583, 2583, 1455, 1455,
+     1455, 2586, 2586, 2586, 2429, 2429, 2429, 1819, 2430, 3926,
+     1295, 2431, 2584, 1487, 1487, 1487, 1457, 1295, 1295, 2587,
+     1492, 1492, 1492, 2573, 2436, 2436, 2436, 1295, 2594, 2594,
+     2594, 1489, 2595, 3916, 3917, 2596, 3923, 3927, 1494, 3918,
+
+     1295, 2437, 1512, 1512, 1512, 1295, 1295, 1520, 1520, 1520,
+     2445, 2445, 2445, 1295, 2448, 2448, 2448, 1813, 2449, 3919,
+     1514, 2450, 1295, 2585, 1811, 1522, 3928, 1809, 2446, 2591,
+     1808, 3948, 2592, 2454, 2454, 2454, 2608, 2608, 2608, 1295,
+     2609, 1295, 3934, 2610, 1547, 1547, 1547, 2457, 2457, 2457,
+     2455, 2612, 2612, 2612, 2459, 2459, 2459, 2613, 2613, 2613,
+     3930, 3929, 1549, 4017, 4017, 4017, 4017, 4017, 4017, 2601,
+     2602, 1560, 1560, 1560, 2614, 4017, 4017, 4017, 1295, 3931,
+     4017, 3932, 3974, 4017, 2466, 2466, 2466, 1295, 1807, 1562,
+     1295, 1295, 4017, 2620, 2620, 2620, 1295, 2621, 1806, 1295,
+
+     2622, 2467, 2624, 2624, 2624, 2471, 2471, 2471, 1295, 2611,
+     2628, 2628, 2628, 1295, 3935, 2615, 1295, 2475, 2475, 2475,
+     2625, 2476, 1295, 2472, 2477, 2478, 2478, 2478, 2629, 3933,
+     1295, 2616, 2630, 2630, 2630, 2617, 2631, 2618, 3936, 2632,
+     3949, 3940, 2479, 2480, 2480, 2480, 3937, 2481, 1295, 3941,
+     2482, 1611, 1611, 1611, 2484, 2484, 2484, 2634, 2634, 2634,
+     3938, 2635, 4010, 1295, 2636, 1621, 1621, 1621, 3939, 1613,
+     1295, 2485, 2490, 2490, 2490, 2492, 2492, 2492, 2641, 2641,
+     2641, 1295, 2642, 1623, 3944, 2643, 1639, 1639, 1639, 1295,
+     2491, 1295, 2493, 2505, 2505, 2505, 1295, 3942, 2655, 2655,
+
+     2655, 3958, 2656, 2633, 1641, 2657, 1295, 2507, 2507, 2507,
+     2506, 2508, 3943, 3960, 2509, 1295, 3946, 2637, 2510, 2510,
+     2510, 1295, 2511, 1805, 3947, 2512, 1661, 1661, 1661, 2660,
+     2660, 2660, 3945, 2518, 2518, 2518, 2654, 2519, 3950, 1798,
+     2520, 2521, 2521, 2521, 1663, 3967, 1295, 1295, 2673, 2673,
+     2673, 2674, 2674, 2674, 2527, 2527, 2527, 2528, 2528, 2528,
+     2530, 2530, 2530, 2679, 2679, 2679, 2681, 2681, 2681, 2534,
+     2534, 2534, 2535, 2535, 2535, 2539, 2539, 2539, 2685, 2685,
+     2685, 2544, 2544, 2544, 2545, 2545, 2545, 2547, 2547, 2547,
+     2548, 2548, 2548, 3951, 2659, 2694, 2694, 2694, 2696, 2696,
+
+     2696, 2555, 2555, 2555, 2697, 2697, 2697, 1295, 2698, 1295,
+     1295, 2699, 1796, 2695, 2700, 2700, 2700, 1795, 2556, 4017,
+     4017, 4017, 4017, 4017, 4017, 2704, 2704, 2704, 1377, 1377,
+     1377, 2701, 2706, 2706, 2706, 1295, 4017, 1794, 1295, 4017,
+     2563, 2563, 2563, 3952, 2564, 3953, 1379, 2565, 3959, 2707,
+     1386, 1386, 1386, 1295, 1396, 1396, 1396, 1404, 1404, 1404,
+     1414, 1414, 1414, 2570, 2570, 2570, 1295, 2571, 1388, 3954,
+     2572, 2702, 1398, 3970, 2703, 1406, 3956, 1295, 1416, 2712,
+     2712, 2712, 2577, 2577, 2577, 1295, 2578, 3955, 1791, 2579,
+     1295, 2709, 2718, 2718, 2718, 2705, 1295, 2713, 2583, 2583,
+
+     2583, 3971, 2708, 2722, 2722, 2722, 3975, 2723, 1295, 2719,
+     2724, 2725, 2725, 2725, 1295, 2584, 2586, 2586, 2586, 2710,
+     3961, 1295, 2711, 1487, 1487, 1487, 2731, 2731, 2731, 2726,
+     2733, 2733, 2733, 1790, 2587, 2594, 2594, 2594, 3976, 2595,
+     1295, 1489, 2596, 3962, 2732, 1295, 3964, 2734, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 2739, 2739, 2739,
+     1512, 1512, 1512, 3957, 3968, 4017, 3969, 1295, 4017, 3977,
+     1295, 4017, 1295, 1295, 2740, 1295, 1295, 2735, 1514, 1520,
+     1520, 1520, 3980, 3965, 2730, 2743, 2743, 2743, 2748, 2748,
+     2748, 2608, 2608, 2608, 1785, 2609, 1784, 1522, 2610, 1547,
+
+     1547, 1547, 2744, 3988, 2736, 3978, 2738, 2612, 2612, 2612,
+     2613, 2613, 2613, 2737, 2753, 2753, 2753, 1549, 2750, 2750,
+     2750, 2741, 2751, 3963, 1295, 2752, 1295, 2614, 4017, 4017,
+     4017, 2754, 4017, 4017, 4017, 2757, 2757, 2757, 2759, 2759,
+     2759, 4017, 4017, 4017, 2742, 4017, 2624, 2624, 2624, 4017,
+     2620, 2620, 2620, 2758, 2621, 2760, 1295, 2622, 4017, 2749,
+     2628, 2628, 2628, 1295, 2625, 2630, 2630, 2630, 3981, 2631,
+     1295, 3972, 2632, 2764, 2764, 2764, 1295, 1295, 2629, 3990,
+     2755, 2634, 2634, 2634, 2756, 2635, 1783, 1295, 2636, 3989,
+     1295, 2765, 1621, 1621, 1621, 2641, 2641, 2641, 4006, 2642,
+
+     4007, 3979, 2643, 1639, 1639, 1639, 1295, 1295, 2761, 1295,
+     1623, 2655, 2655, 2655, 3986, 2656, 1782, 3973, 2657, 3996,
+     1781, 1641, 1661, 1661, 1661, 2660, 2660, 2660, 2673, 2673,
+     2673, 2674, 2674, 2674, 2810, 2810, 2810, 3984, 1295, 2766,
+     1663, 1780, 3982, 1295, 2679, 2679, 2679, 2681, 2681, 2681,
+     2814, 2814, 2814, 2685, 2685, 2685, 2818, 2818, 2818, 2821,
+     2821, 2821, 2694, 2694, 2694, 2779, 2696, 2696, 2696, 2697,
+     2697, 2697, 4014, 2698, 3983, 1295, 2699, 2700, 2700, 2700,
+     2695, 1779, 1295, 2823, 2823, 2823, 1295, 2824, 2792, 2791,
+     2825, 2826, 2826, 2826, 2701, 2828, 2828, 2828, 2704, 2704,
+
+     2704, 2830, 2830, 2830, 2706, 2706, 2706, 3991, 2827, 2832,
+     2832, 2832, 2829, 2833, 1295, 1295, 2834, 3997, 1295, 2831,
+     3987, 2707, 2835, 2835, 2835, 1396, 1396, 1396, 1404, 1404,
+     1404, 1414, 1414, 1414, 2712, 2712, 2712, 2718, 2718, 2718,
+     2836, 1778, 4014, 1398, 1772, 1295, 1406, 1771, 1770, 1416,
+     1295, 1768, 2713, 1295, 2719, 2844, 2844, 2844, 1295, 2845,
+     1767, 3985, 2846, 2722, 2722, 2722, 3992, 2723, 1295, 1295,
+     2724, 2725, 2725, 2725, 2857, 2857, 2857, 1487, 1487, 1487,
+     2731, 2731, 2731, 2733, 2733, 2733, 2871, 2871, 2871, 2726,
+     2837, 2858, 2839, 3993, 3998, 1489, 2838, 1295, 2732, 4011,
+
+     2734, 2860, 2860, 2860, 2872, 2861, 3994, 3995, 2862, 2866,
+     2866, 2866, 2739, 2739, 2739, 2868, 2868, 2868, 1766, 2869,
+     1765, 1757, 2870, 1520, 1520, 1520, 2867, 1295, 1756, 2740,
+     2743, 2743, 2743, 3999, 1295, 2859, 2874, 2874, 2874, 1741,
+     2875, 1522, 1295, 2876, 2879, 2879, 2879, 2744, 2748, 2748,
+     2748, 2881, 2881, 2881, 1295, 2750, 2750, 2750, 1295, 2751,
+     4004, 2880, 2752, 2753, 2753, 2753, 2883, 2883, 2883, 2882,
+     2884, 1740, 4002, 2885, 2886, 2886, 2886, 2888, 2888, 2888,
+     2754, 2757, 2757, 2757, 1735, 2873, 2759, 2759, 2759, 4000,
+     1734, 2887, 4003, 1732, 2889, 2764, 2764, 2764, 1731, 2758,
+
+     2890, 2890, 2890, 2760, 2891, 4001, 1729, 2892, 1621, 1621,
+     1621, 1728, 1727, 2765, 1724, 1639, 1639, 1639, 1661, 1661,
+     1661, 2810, 2810, 2810, 1723, 1721, 1623, 2942, 2942, 2942,
+     2814, 2814, 2814, 1641, 1717, 1295, 1663, 2818, 2818, 2818,
+     2821, 2821, 2821, 2950, 2950, 2950, 2823, 2823, 2823, 1716,
+     2824, 1712, 1711, 2825, 2826, 2826, 2826, 2952, 2952, 2952,
+     2951, 2953, 1710, 1709, 2954, 2828, 2828, 2828, 4005, 1708,
+     2923, 2827, 2830, 2830, 2830, 2896, 2909, 2955, 2955, 2955,
+     1295, 2956, 2829, 1295, 2957, 2832, 2832, 2832, 1295, 2833,
+     2831, 1707, 2834, 2835, 2835, 2835, 1396, 1396, 1396, 1404,
+
+     1404, 1404, 1414, 1414, 1414, 2963, 2963, 2963, 2844, 2844,
+     2844, 2836, 2845, 4008, 1398, 2846, 4009, 1406, 1706, 1295,
+     1416, 4012, 2964, 2977, 2977, 2977, 2857, 2857, 2857, 2979,
+     2979, 2979, 1705, 2980, 1704, 1703, 2981, 2982, 2982, 2982,
+     2978, 1702, 1701, 2858, 2860, 2860, 2860, 1700, 2861, 1699,
+     1698, 2862, 4013, 1697, 2960, 2983, 1695, 1694, 2958, 2866,
+     2866, 2866, 1693, 2987, 2987, 2987, 2959, 2988, 1692, 1691,
+     2989, 2868, 2868, 2868, 1688, 2869, 2867, 1687, 2870, 2871,
+     2871, 2871, 1520, 1520, 1520, 2874, 2874, 2874, 1686, 2875,
+     1685, 1684, 2876, 2998, 2998, 2998, 1683, 2872, 1682, 1681,
+
+     1522, 2879, 2879, 2879, 3000, 3000, 3000, 1680, 3001, 1679,
+     2999, 3002, 2881, 2881, 2881, 2883, 2883, 2883, 2880, 2884,
+     1678, 1677, 2885, 2886, 2886, 2886, 1676, 3003, 3003, 3003,
+     2882, 3004, 1675, 1674, 3005, 2888, 2888, 2888, 1671, 1670,
+     2887, 1669, 3006, 3006, 3006, 2996, 3007, 1668, 1667, 3008,
+     1666, 1295, 2889, 2890, 2890, 2890, 1653, 2891, 1652, 1651,
+     2892, 3016, 3016, 3016, 3018, 3018, 3018, 1621, 1621, 1621,
+     3021, 3021, 3021, 3022, 3022, 3022, 1646, 1638, 3017, 1637,
+     1636, 3019, 1639, 1639, 1639, 1623, 3047, 3047, 3047, 1631,
+     3023, 3049, 3049, 3049, 3067, 3067, 3067, 2942, 2942, 2942,
+
+     1641, 1630, 1626, 3048, 3072, 3072, 3072, 1620, 1619, 3050,
+     2950, 2950, 2950, 3076, 3076, 3076, 1615, 3077, 1610, 1606,
+     3078, 2952, 2952, 2952, 1605, 2953, 1597, 2951, 2954, 2955,
+     2955, 2955, 1583, 2956, 1582, 1581, 2957, 1578, 1572, 3020,
+     1396, 1396, 1396, 3034, 1404, 1404, 1404, 1414, 1414, 1414,
+     3087, 3087, 3087, 2963, 2963, 2963, 1567, 1559, 1398, 3089,
+     3089, 3089, 1406, 3090, 1558, 1416, 3091, 3088, 1557, 1556,
+     2964, 3092, 3092, 3092, 2977, 2977, 2977, 3105, 3105, 3105,
+     1555, 3106, 1554, 3085, 3107, 2979, 2979, 2979, 3093, 2980,
+     1553, 2978, 2981, 2982, 2982, 2982, 3084, 3109, 3109, 3109,
+
+     2987, 2987, 2987, 1552, 2988, 1551, 1546, 2989, 3083, 1545,
+     1540, 2983, 1539, 1533, 3110, 3118, 3118, 3118, 2998, 2998,
+     2998, 3121, 3121, 3121, 1530, 3122, 1525, 1524, 3123, 1519,
+     3000, 3000, 3000, 3119, 3001, 2999, 1508, 3002, 3003, 3003,
+     3003, 1503, 3004, 1502, 1501, 3005, 3006, 3006, 3006, 1497,
+     3007, 1496, 1491, 3008, 3016, 3016, 3016, 3137, 3137, 3137,
+     1480, 3138, 1474, 1473, 3139, 3018, 3018, 3018, 3140, 3140,
+     3140, 3017, 3141, 1472, 1468, 3142, 1621, 1621, 1621, 3021,
+     3021, 3021, 3019, 3022, 3022, 3022, 3144, 3144, 3144, 1467,
+     3145, 1466, 1454, 3146, 1623, 1639, 1639, 1639, 1453, 1452,
+
+     3023, 3047, 3047, 3047, 3168, 3168, 3168, 1451, 3169, 1450,
+     1449, 3170, 1448, 1641, 3049, 3049, 3049, 1447, 3048, 3173,
+     3173, 3173, 3067, 3067, 3067, 3189, 3189, 3189, 3072, 3072,
+     3072, 1446, 3050, 3193, 3193, 3193, 3174, 1907, 1440, 3143,
+     1385, 3076, 3076, 3076, 1381, 3077, 1376, 3155, 3078, 1396,
+     1396, 1396, 3208, 3208, 3208, 1414, 1414, 1414, 3087, 3087,
+     3087, 3212, 3212, 3212, 1375, 3213, 1370, 1398, 3214, 1369,
+     3209, 1368, 1367, 1416, 1366, 3088, 3089, 3089, 3089, 1365,
+     3090, 1353, 1352, 3091, 3092, 3092, 3092, 3215, 3215, 3215,
+     1351, 3216, 1350, 1349, 3217, 3105, 3105, 3105, 1348, 3106,
+
+     1347, 3093, 3107, 3109, 3109, 3109, 3230, 3230, 3230, 1346,
+     3231, 1345, 1344, 3232, 1343, 1342, 3207, 3210, 1341, 1340,
+     3110, 3118, 3118, 3118, 3121, 3121, 3121, 1339, 3122, 1336,
+     1335, 3123, 3253, 3253, 3253, 1334, 3137, 3137, 3137, 3119,
+     3138, 1333, 1332, 3139, 3140, 3140, 3140, 1331, 3141, 3254,
+     1330, 3142, 1621, 1621, 1621, 3144, 3144, 3144, 1329, 3145,
+     1328, 1325, 3146, 1639, 1639, 1639, 1324, 3168, 3168, 3168,
+     1623, 3169, 1323, 1322, 3170, 3294, 3294, 3294, 3173, 3173,
+     3173, 1641, 3296, 3296, 3296, 1321, 3297, 1320, 1319, 3298,
+     1318, 1317, 3295, 1907, 1316, 3174, 1907, 3307, 3307, 3307,
+
+     1907, 3189, 3189, 3189, 3263, 3309, 3309, 3309, 3310, 3310,
+     3310, 1309, 1305, 3272, 3193, 3193, 3193, 3312, 3312, 3312,
+     1396, 1396, 1396, 3208, 3208, 3208, 1414, 1414, 1414, 3212,
+     3212, 3212, 1304, 3213, 1303, 1302, 3214, 1301, 1398, 1298,
+     1296, 3209, 1295, 1293, 1416, 3215, 3215, 3215, 1291, 3216,
+     1290, 1289, 3217, 3328, 3328, 3328, 3340, 3340, 3340, 3230,
+     3230, 3230, 1288, 3231, 1284, 1282, 3232, 3342, 3342, 3342,
+     3329, 1279, 3325, 3341, 3253, 3253, 3253, 1277, 3361, 3361,
+     3361, 1276, 3362, 1275, 3343, 3363, 3372, 3372, 3372, 1274,
+     1273, 3254, 1270, 1267, 3326, 1639, 1639, 1639, 3294, 3294,
+
+     3294, 3398, 3398, 3398, 3373, 3399, 1266, 1265, 3400, 1263,
+     3296, 3296, 3296, 1641, 3297, 3295, 1907, 3298, 1262, 1907,
+     3307, 3307, 3307, 3309, 3309, 3309, 1259, 1258, 1907, 3310,
+     3310, 3310, 3312, 3312, 3312, 3423, 3423, 3423, 1414, 1414,
+     1414, 3328, 3328, 3328, 3427, 3427, 3427, 1256, 3428, 1253,
+     1252, 3429, 1251, 3424, 1247, 1246, 1416, 1244, 3329, 3430,
+     3430, 3430, 3380, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+     1905, 1905, 1243, 1242, 1905, 1241, 3431, 1239, 1238, 1905,
+     1905, 1905, 1907, 1905, 3340, 3340, 3340, 3439, 3439, 3439,
+     1237, 3440, 1236, 1235, 3441, 3442, 3442, 3442, 1234, 3443,
+
+     1231, 3341, 3444, 1230, 1228, 3425, 3342, 3342, 3342, 1905,
+     1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+     1225, 1223, 1905, 3343, 3372, 3372, 3372, 1905, 1905, 1905,
+     1907, 1905, 3361, 3361, 3361, 1222, 3362, 1221, 1220, 3363,
+     1219, 1214, 3373, 3476, 3476, 3476, 3398, 3398, 3398, 1212,
+     3399, 1211, 1210, 3400, 3511, 3511, 3511, 1905, 1905, 1208,
+     1207, 3477, 1206, 1203, 1907, 1905, 1905, 1905, 1905, 1905,
+     3498, 1905, 1905, 1905, 1202, 1201, 1905, 3512, 3512, 3512,
+     1200, 1905, 1905, 1905, 1907, 1905, 3423, 3423, 3423, 1414,
+     1414, 1414, 3427, 3427, 3427, 1198, 3428, 1197, 1196, 3429,
+
+     3511, 3511, 3511, 1194, 3424, 1191, 1187, 1416, 3430, 3430,
+     3430, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+     1905, 3498, 1186, 1184, 1905, 3431, 3512, 3512, 3512, 1905,
+     1905, 1905, 1907, 1905, 1183, 3525, 3525, 3525, 1182, 3526,
+     1179, 3519, 3527, 3439, 3439, 3439, 1178, 3440, 1177, 1176,
+     3441, 3442, 3442, 3442, 1174, 3443, 1173, 1167, 3444, 1905,
+     1905, 3476, 3476, 3476, 3572, 3572, 3572, 3585, 3585, 3585,
+     3587, 3587, 3587, 3525, 3525, 3525, 1166, 3526, 1165, 3477,
+     3527, 1163, 1907, 1908, 1162, 3586, 1161, 3588, 3601, 3601,
+     3601, 3611, 3611, 3611, 3629, 3629, 3629, 3572, 3572, 3572,
+
+     3585, 3585, 3585, 1156, 1155, 3602, 1151, 1149, 3612, 3587,
+     3587, 3587, 1295, 1148, 1147, 1907, 1146, 1145, 3586, 1144,
+     3641, 3641, 3641, 1143, 3642, 1142, 3588, 3643, 3601, 3601,
+     3601, 3656, 3656, 3656, 1141, 3657, 1140, 1137, 3658, 3611,
+     3611, 3611, 3629, 3629, 3629, 3602, 3667, 3667, 3667, 2118,
+     3668, 1134, 1133, 3669, 1131, 1130, 3612, 3641, 3641, 3641,
+     1295, 3642, 1129, 1128, 3643, 3656, 3656, 3656, 1127, 3657,
+     1122, 1120, 3658, 3667, 3667, 3667, 1119, 3668, 1118, 3684,
+     3669, 3881, 3881, 3881, 3881, 3881, 3881, 1117, 3898, 1115,
+     1114, 3899, 4015, 4015, 4015, 4015, 4015, 4015, 1113, 1295,
+
+     1111, 1110, 1295, 1109, 1108, 1106, 1103, 1102, 1100, 1098,
+     4016, 1096, 1095, 4016,  308,  308,  308,  308,  308,  308,
+      308,  308,  308,  309,  309,  309,  309,  309,  309,  309,
+      309,  309,  314,  314,  314,  314,  314,  314,  314,  314,
+      314,  317,  317,  317,  317,  317,  317,  317,  317,  317,
+      320,  320,  320,  320,  320,  320,  320,  320,  320,  323,
+      323,  323,  323,  323,  323,  323,  323,  323,  330,  330,
+      330,  330,  330,  330,  330,  330,  330,  337,  337,  337,
+      337,  337,  337,  337,  337,  337,  342,  342,  342,  342,
+      342,  342,  342,  342,  342,  354,  354,  354,  354,  354,
+
+      354,  354,  354,  354,  360,  360,  360,  360,  360,  360,
       360,  360,  360,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  372,  372,  372,  372,  372,  372,  372,  372,
-      372,  378,  378,  378,  378,  378,  378,  378,  378,  378,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  396,  396,
-      396,  396,  396,  396,  396,  396,  396,  403,  403,  403,
-
-      403,  403,  403,  403,  403,  403,  408,  408,  408,  408,
-      408,  408,  408,  408,  408,  415,  415,  415,  415,  415,
-      415,  415,  415,  415,  421,  421,  421,  421,  421,  421,
-      421,  421,  421,  428,  428,  428,  428,  428,  428,  428,
-      428,  428,  437,  437,  437,  437,  437,  437,  437,  437,
-      437,  443,  443,  443,  443,  443,  443,  443,  443,  443,
-      454,  454,  454,  454,  454,  454,  454,  454,  454,  461,
-      461,  461,  461,  461,  461,  461,  461,  461,  465,  465,
-      465,  465,  465,  465,  465,  465,  465,  472,  472,  472,
-      472,  472,  472,  472,  472,  472,  480,  480,  480,  480,
-
-      480,  480,  480,  480,  480,  488,  488,  488,  488,  488,
-      488,  488,  488,  488,  494,  494,  494,  494,  494,  494,
-      494,  494,  494,  500,  500,  500,  500,  500,  500,  500,
-      500,  500,  504,  504,  504,  504,  504,  504,  504,  504,
-      504,  512,  512,  512,  512,  512,  512,  512,  512,  512,
-      519,  519,  519,  519,  519,  519,  519,  519,  519,  526,
-      526,  526,  526,  526,  526,  526,  526,  526,  531,  531,
-      531,  531,  531,  531,  531,  531,  531,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  542,  542,  542,  542,
-      542,  542,  542,  542,  542,  548,  548,  548,  548,  548,
-
-      548,  548,  548,  548,  553,  553,  553,  553,  553,  553,
-      553,  553,  553,  559,  559,  559,  559,  559,  559,  559,
-      559,  559,  568,  568,  568,  568,  568,  568,  568,  568,
-      568,  575,  575,  575,  575,  575,  575,  575,  575,  575,
-      579,  579,  579,  579,  579,  579,  579,  579,  579,  590,
-      590,  590,  590,  590,  590,  590,  590,  590,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  616,  616,  616,  616,  616,
-      616,  616,  616,  616,  624,  624,  624,  624,  624,  624,
-
-      624,  624,  624,  630,  630,  630,  630,  630,  630,  630,
-      630,  630,  635,  635,  635,  635,  635,  635,  635,  635,
-      635,  642,  642,  642,  642,  642,  642,  642,  642,  642,
-      647,  647,  647,  647,  647,  647,  647,  647,  647,  653,
-      653,  653,  653,  653,  653,  653,  653,  653,  660,  660,
-      660,  660,  660,  660,  660,  660,  660,  667,  667,  667,
-      667,  667,  667,  667,  667,  667,  674,  674,  674,  674,
-      674,  674,  674,  674,  674,  682,  682,  682,  682,  682,
-      682,  682,  682,  682,  307,  307,  307,  307,  307,  307,
-      307,  307,  307,  693,  693,  693,  693,  693,  693,  693,
-
-      693,  693,  699,  699,  699,  699,  699,  699,  699,  699,
-      699,  705,  705,  705,  705,  705,  705,  705,  705,  705,
-      710,  710,  710,  710,  710,  710,  710,  710,  710,  719,
-      719,  719,  719,  719,  719,  719,  719,  719,  725,  725,
-      725,  725,  725,  725,  725,  725,  725,  745,  745,  745,
-      926,  925,  924,  745,  782,  782,  782,  922,  914,  912,
-      782,  790,  790,  790,  907,  906,  905,  790,  799,  799,
-      799,  904,  903,  901,  799,  803,  803,  803,  899,  898,
-      896,  803,  809,  809,  809,  894,  893,  891,  809,  815,
-      815,  815,  889,  888,  886,  815,  820,  820,  820,  885,
-
-      882,  881,  820,  826,  826,  826,  880,  878, 3929,  826,
-      836,  836,  836,  874,  872,  870,  836,  853,  853,  853,
-      869,  868,  866,  853,  857,  857,  857,  865,  861,  860,
-      857,  867,  867,  867,  859,  858,  856,  867,  873,  873,
-      873,  855,  854,  852,  873,  879,  879,  879,  851,  850,
-      844,  879,  887,  887,  887,  840,  839,  835,  887,  892,
-      892,  892,  831,  830,  829,  892,  897,  897,  897,  828,
-      827,  825,  897,  902,  902,  902,  823,  822,  821,  902,
-      913,  913,  913,  819,  817,  816,  913,  923,  923,  923,
-      814,  812,  811,  923,  931,  931,  931,  810,  808,  806,
-
-      931,  936,  936,  936,  805,  804,  802,  936,  947,  947,
-      947,  800,  798,  797,  947,  953,  953,  953,  795,  794,
-      793,  953,  958,  958,  958,  792,  791,  789,  958,  965,
-      965,  965,  784,  783,  781,  965,  973,  973,  973, 3929,
-      762,  747,  973,  981,  981,  981,  746,  744,  743,  981,
-      987,  987,  987,  737,  736,  737,  987,  992,  992,  992,
-      736,  735,  734,  992,  998,  998,  998,  998,  998,  998,
-      998, 3929,  998,  745,  745,  745, 3929, 3929, 3929,  745,
-     1014, 3929, 3929, 3929, 1014,  782,  782,  782, 3929, 3929,
-     3929,  782, 1058, 3929, 3929, 3929, 1058,  790,  790,  790,
-
-     3929, 3929, 3929,  790, 1066, 3929, 3929, 3929, 1066,  799,
-      799,  799, 3929, 3929, 3929,  799, 1070, 3929, 3929, 3929,
-     1070,  803,  803,  803, 3929, 3929, 3929,  803, 1076, 3929,
-     3929, 3929, 1076,  809,  809,  809, 3929, 3929, 3929,  809,
-     1081, 3929, 3929, 3929, 1081,  815,  815,  815, 3929, 3929,
-     3929,  815, 1085, 3929, 3929, 3929, 1085,  820,  820,  820,
-     3929, 3929, 3929,  820, 1090, 3929, 3929, 3929, 1090,  826,
-      826,  826, 3929, 3929, 3929,  826, 1101, 3929, 3929, 3929,
-     1101,  836,  836,  836, 3929, 3929, 3929,  836, 1119, 3929,
-     3929, 3929, 1119,  853,  853,  853, 3929, 3929, 3929,  853,
-
-     1123, 3929, 3929, 3929, 1123,  857,  857,  857, 3929, 3929,
-     3929,  857, 1133, 3929, 3929, 3929, 1133,  867,  867,  867,
-     3929, 3929, 3929,  867, 1141, 3929, 3929, 3929, 1141,  873,
-      873,  873, 3929, 3929, 3929,  873, 1144, 3929, 3929, 3929,
-     1144,  879,  879,  879, 3929, 3929, 3929,  879, 1154, 3929,
-     3929, 3929, 1154,  887,  887,  887, 3929, 3929, 3929,  887,
-     1159, 3929, 3929, 3929, 1159,  892,  892,  892, 3929, 3929,
-     3929,  892, 1164, 3929, 3929, 3929, 1164,  897,  897,  897,
-     3929, 3929, 3929,  897, 1168, 3929, 3929, 3929, 1168,  902,
-      902,  902, 3929, 3929, 3929,  902, 1178, 3929, 3929, 3929,
-
-     1178,  913,  913,  913, 3929, 3929, 3929,  913, 1182, 3929,
-     3929, 3929, 1182,  923,  923,  923, 3929, 3929, 3929,  923,
-     1193, 3929, 3929, 3929, 1193,  931,  931,  931, 3929, 3929,
-     3929,  931, 1198, 3929, 3929, 3929, 1198,  936,  936,  936,
-     3929, 3929, 3929,  936, 1209, 3929, 3929, 3929, 1209,  947,
-      947,  947, 3929, 3929, 3929,  947, 1214, 3929, 3929, 3929,
-     1214,  953,  953,  953, 3929, 3929, 3929,  953, 1219, 3929,
-     3929, 3929, 1219,  958,  958,  958, 3929, 3929, 3929,  958,
-     1226, 3929, 3929, 3929, 1226,  965,  965,  965, 3929, 3929,
-     3929,  965, 1233, 3929, 3929, 3929, 1233,  973,  973,  973,
-
-     3929, 3929, 3929,  973, 1241, 3929, 3929, 3929, 1241,  981,
-      981,  981, 3929, 3929, 3929,  981, 1247, 3929, 3929, 3929,
-     1247,  987,  987,  987, 3929, 3929, 3929,  987, 1252, 3929,
-     3929, 3929, 1252,  992,  992,  992, 3929, 3929, 3929,  992,
-     1258, 3929, 3929, 3929, 1258, 1260, 1260, 1260, 1260, 1260,
-     1260, 1260, 1260, 1260, 1266, 3929, 3929, 3929, 3929, 1266,
-      745,  745,  745, 3929, 3929, 3929,  745, 1277, 1277, 1277,
-     1277, 3929, 3929, 1277, 1277,  782,  782,  782,  782, 3929,
-      782, 3929,  782, 1328, 1328, 1328, 1328, 3929, 3929, 1328,
-     1328,  790,  790,  790, 3929, 3929, 3929,  790, 1338, 1338,
-
-     1338, 1338, 3929, 3929, 1338, 1338,  799,  799,  799, 3929,
-     3929, 3929,  799, 1344, 1344, 1344, 1344, 3929, 3929, 1344,
-     1344,  803,  803,  803, 3929, 3929, 3929,  803, 1353, 1353,
-     1353, 1353, 3929, 3929, 1353, 1353,  809,  809,  809,  809,
-     3929,  809, 3929,  809, 1363, 1363, 1363, 1363, 3929, 3929,
-     1363, 1363,  815,  815,  815,  815, 3929,  815, 3929,  815,
-     1371, 1371, 1371, 1371, 3929, 3929, 1371, 1371,  820,  820,
-      820,  820, 3929,  820, 3929,  820, 1381, 1381, 1381, 1381,
-     3929, 3929, 1381, 1381,  826,  826,  826,  826, 3929,  826,
-     3929,  826, 1397, 1397, 1397, 1397, 3929, 3929, 1397, 1397,
-
-      836,  836,  836, 3929, 3929, 3929,  836, 1422, 1422, 1422,
-     1422, 3929, 3929, 1422, 1422, 1429, 1429, 1429, 1429, 3929,
-     3929, 1429, 1429,  857,  857,  857, 3929, 3929, 3929,  857,
-     1442, 1442, 1442, 1442, 3929, 3929, 1442, 1442,  867,  867,
-      867, 3929, 3929, 3929,  867, 1454, 1454, 1454, 1454, 3929,
-     3929, 1454, 1454,  873,  873,  873, 3929, 3929, 3929,  873,
-     1459, 1459, 1459, 1459, 3929, 3929, 1459, 1459,  879,  879,
-      879, 3929, 3929, 3929,  879, 1471, 1471, 1471, 1471, 3929,
-     3929, 1471, 1471,  887,  887,  887, 3929, 3929, 3929,  887,
-     1479, 1479, 1479, 1479, 3929, 3929, 1479, 1479,  892,  892,
-
-      892, 3929, 3929, 3929,  892, 1487, 1487, 1487, 1487, 3929,
-     3929, 1487, 1487,  897,  897,  897, 3929, 3929, 3929,  897,
-     1493, 1493, 1493, 1493, 3929, 3929, 1493, 1493,  902,  902,
-      902, 3929, 3929, 3929,  902, 1508, 1508, 1508, 1508, 3929,
-     3929, 1508, 1508,  913,  913,  913, 3929, 3929, 3929,  913,
-     1514, 1514, 1514, 1514, 3929, 3929, 1514, 1514,  923,  923,
-      923, 3929, 3929, 3929,  923, 1527, 1527, 1527, 1527, 3929,
-     3929, 1527, 1527,  931,  931,  931, 3929, 3929, 3929,  931,
-     1535, 1535, 1535, 1535, 3929, 3929, 1535, 1535,  936,  936,
-      936, 3929, 3929, 3929,  936, 1551, 1551, 1551, 1551, 3929,
-
-     3929, 1551, 1551,  947,  947,  947,  947, 3929,  947, 3929,
-      947, 1560, 1560, 1560, 1560, 3929, 3929, 1560, 1560,  953,
-      953,  953, 3929, 3929, 3929,  953, 1568, 1568, 1568, 1568,
-     3929, 3929, 1568, 1568,  958,  958,  958, 3929, 3929, 3929,
-      958, 1578, 1578, 1578, 1578, 3929, 3929, 1578, 1578,  965,
-      965,  965, 3929, 3929, 3929,  965, 1588, 1588, 1588, 1588,
-     3929, 3929, 1588, 1588,  973,  973,  973, 3929, 3929, 3929,
-      973, 1599, 1599, 1599, 1599, 3929, 3929, 1599, 1599,  981,
-      981,  981, 3929, 3929, 3929,  981, 1606, 1606, 1606, 1606,
-     3929, 3929, 1606, 1606,  987,  987,  987, 3929, 3929, 3929,
-
-      987, 1614, 1614, 1614, 1614, 3929, 3929, 1614, 1614,  992,
-      992,  992,  992, 3929,  992, 3929,  992, 1625, 1625, 1625,
-     1625, 3929, 3929, 1625, 1625, 1260, 1260, 1260, 1260, 1260,
-     1260, 1260, 1260, 1260, 1266, 3929, 1266, 3929, 3929, 1266,
-      745,  745,  745, 3929, 3929, 3929,  745, 1277, 1277, 1277,
-     1277, 3929, 3929, 1277, 1277,  782,  782,  782, 3929, 3929,
-     3929,  782, 1328, 1328, 1328, 1328, 3929, 3929, 1328, 1328,
-      790,  790,  790, 3929, 3929, 3929,  790, 1338, 1338, 1338,
-     1338, 3929, 3929, 1338, 1338,  799,  799,  799, 3929, 3929,
-     3929,  799, 1344, 1344, 1344, 1344, 3929, 3929, 1344, 1344,
-
-      803,  803,  803, 3929, 3929, 3929,  803, 1353, 1353, 1353,
-     1353, 3929, 3929, 1353, 1353,  809,  809,  809, 3929, 3929,
-     3929,  809, 1363, 1363, 1363, 1363, 3929, 3929, 1363, 1363,
-     1371, 1371, 1371, 1371, 3929, 3929, 1371, 1371,  820,  820,
-      820, 3929, 3929, 3929,  820, 1381, 1381, 1381, 1381, 3929,
-     3929, 1381, 1381,  826,  826,  826, 3929, 3929, 3929,  826,
-     1397, 1397, 1397, 1397, 3929, 3929, 1397, 1397,  836,  836,
-      836, 3929, 3929, 3929,  836, 1422, 1422, 1422, 1422, 3929,
-     3929, 1422, 1422, 1429, 1429, 1429, 1429, 3929, 3929, 1429,
-     1429,  857,  857,  857, 3929, 3929, 3929,  857, 1442, 1442,
-
-     1442, 1442, 3929, 3929, 1442, 1442,  867,  867,  867,  867,
-     3929,  867, 3929,  867, 1454, 1454, 1454, 1454, 3929, 3929,
-     1454, 1454,  873,  873,  873,  873, 3929,  873, 3929,  873,
-     1459, 1459, 1459, 1459, 3929, 3929, 1459, 1459,  879,  879,
-      879, 3929, 3929, 3929,  879, 1471, 1471, 1471, 1471, 3929,
-     3929, 1471, 1471,  887,  887,  887, 3929, 3929, 3929,  887,
-     1479, 1479, 1479, 1479, 3929, 3929, 1479, 1479,  892,  892,
-      892, 3929, 3929, 3929,  892, 1487, 1487, 1487, 1487, 3929,
-     3929, 1487, 1487,  897,  897,  897,  897, 3929,  897, 3929,
-      897, 1493, 1493, 1493, 1493, 3929, 3929, 1493, 1493,  902,
-
-      902,  902, 3929, 3929, 3929,  902, 1508, 1508, 1508, 1508,
-     3929, 3929, 1508, 1508,  913,  913,  913, 3929, 3929, 3929,
-      913, 1514, 1514, 1514, 1514, 3929, 3929, 1514, 1514,  923,
-      923,  923, 3929, 3929, 3929,  923, 1527, 1527, 1527, 1527,
-     3929, 3929, 1527, 1527,  931,  931,  931, 3929, 3929, 3929,
-      931, 1535, 1535, 1535, 1535, 3929, 3929, 1535, 1535,  936,
-      936,  936, 3929, 3929, 3929,  936, 1551, 1551, 1551, 1551,
-     3929, 3929, 1551, 1551,  947,  947,  947, 3929, 3929, 3929,
-      947, 1560, 1560, 1560, 1560, 3929, 3929, 1560, 1560,  953,
-      953,  953, 3929, 3929, 3929,  953, 1568, 1568, 1568, 1568,
-
-     3929, 3929, 1568, 1568,  958,  958,  958, 3929, 3929, 3929,
-      958, 1578, 1578, 1578, 1578, 3929, 3929, 1578, 1578,  965,
-      965,  965, 3929, 3929, 3929,  965, 1588, 1588, 1588, 1588,
-     3929, 3929, 1588, 1588,  973,  973,  973,  973, 3929,  973,
-     3929,  973, 1599, 1599, 1599, 1599, 3929, 3929, 1599, 1599,
-      981,  981,  981, 3929, 3929, 3929,  981, 1606, 1606, 1606,
-     1606, 3929, 3929, 1606, 1606,  987,  987,  987, 3929, 3929,
-     3929,  987, 1614, 1614, 1614, 1614, 3929, 3929, 1614, 1614,
-      992,  992,  992, 3929, 3929, 3929,  992, 1625, 1625, 1625,
-     1625, 3929, 3929, 1625, 1625, 1260, 1260, 1260, 1260, 1260,
-
-     1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1865,  745,  745,  745, 3929, 3929, 3929,  745,
-      782,  782,  782, 3929, 3929, 3929,  782, 1328, 1328, 1328,
-     1328, 3929, 3929, 1328, 1328,  790,  790,  790, 3929, 3929,
-     3929,  790, 1338, 1338, 1338, 1338, 3929, 3929, 1338, 1338,
-      799,  799,  799,  799, 3929,  799, 3929,  799, 1344, 1344,
-     1344, 1344, 3929, 3929, 1344, 1344,  803,  803,  803, 3929,
-     3929, 3929,  803, 1353, 1353, 1353, 1353, 3929, 3929, 1353,
-     1353,  809,  809,  809, 3929, 3929, 3929,  809, 1363, 1363,
-     1363, 1363, 3929, 3929, 1363, 1363, 1371, 1371, 1371, 1371,
-
-     3929, 3929, 1371, 1371,  820,  820,  820, 3929, 3929, 3929,
-      820, 1381, 1381, 1381, 1381, 3929, 3929, 1381, 1381,  826,
-      826,  826, 3929, 3929, 3929,  826, 1397, 1397, 1397, 1397,
-     3929, 3929, 1397, 1397,  836,  836,  836,  836, 3929,  836,
-     3929,  836, 1422, 1422, 1422, 1422, 3929, 3929, 1422, 1422,
-     1429, 1429, 1429, 1429, 3929, 3929, 1429, 1429,  857,  857,
-      857, 3929, 3929, 3929,  857, 1442, 1442, 1442, 1442, 3929,
-     3929, 1442, 1442, 1454, 1454, 1454, 1454, 3929, 3929, 1454,
-     1454, 1459, 1459, 1459, 1459, 3929, 3929, 1459, 1459,  879,
-      879,  879, 3929, 3929, 3929,  879, 1471, 1471, 1471, 1471,
-
-     3929, 3929, 1471, 1471,  887,  887,  887, 3929, 3929, 3929,
-      887, 1479, 1479, 1479, 1479, 3929, 3929, 1479, 1479,  892,
-      892,  892,  892, 3929,  892, 3929,  892, 1487, 1487, 1487,
-     1487, 3929, 3929, 1487, 1487,  897,  897,  897, 3929, 3929,
-     3929,  897, 1493, 1493, 1493, 1493, 3929, 3929, 1493, 1493,
-      902,  902,  902, 3929, 3929, 3929,  902, 1508, 1508, 1508,
-     1508, 3929, 3929, 1508, 1508,  913,  913,  913, 3929, 3929,
-     3929,  913, 1514, 1514, 1514, 1514, 3929, 3929, 1514, 1514,
-      923,  923,  923, 3929, 3929, 3929,  923, 1527, 1527, 1527,
-     1527, 3929, 3929, 1527, 1527,  931,  931,  931,  931, 3929,
-
-      931, 3929,  931, 1535, 1535, 1535, 1535, 3929, 3929, 1535,
-     1535,  936,  936,  936, 3929, 3929, 3929,  936, 1551, 1551,
-     1551, 1551, 3929, 3929, 1551, 1551,  947,  947,  947, 3929,
-     3929, 3929,  947, 1560, 1560, 1560, 1560, 3929, 3929, 1560,
-     1560,  953,  953,  953, 3929, 3929, 3929,  953, 1568, 1568,
-     1568, 1568, 3929, 3929, 1568, 1568,  958,  958,  958, 3929,
-     3929, 3929,  958, 1578, 1578, 1578, 1578, 3929, 3929, 1578,
-     1578,  965,  965,  965, 3929, 3929, 3929,  965, 1588, 1588,
-     1588, 1588, 3929, 3929, 1588, 1588,  973,  973,  973, 3929,
-     3929, 3929,  973, 1599, 1599, 1599, 1599, 3929, 3929, 1599,
-
-     1599,  981,  981,  981, 3929, 3929, 3929,  981, 1606, 1606,
-     1606, 1606, 3929, 3929, 1606, 1606,  987,  987,  987, 3929,
-     3929, 3929,  987, 1614, 1614, 1614, 1614, 3929, 3929, 1614,
-     1614,  992,  992,  992, 3929, 3929, 3929,  992, 1625, 1625,
-     1625, 1625, 3929, 3929, 1625, 1625, 1260, 1260, 1260, 1260,
-     1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1865, 1865,  745,  745,  745, 3929, 3929, 3929,
-      745,  782,  782,  782,  782, 3929,  782, 3929,  782, 1328,
-     1328, 1328, 1328, 3929, 3929, 1328, 1328,  790,  790,  790,
-     3929, 3929, 3929,  790, 1338, 1338, 1338, 1338, 3929, 3929,
-
-     1338, 1338, 1344, 1344, 1344, 1344, 3929, 3929, 1344, 1344,
-      803,  803,  803, 3929, 3929, 3929,  803, 1353, 1353, 1353,
-     1353, 3929, 3929, 1353, 1353,  809,  809,  809,  809, 3929,
-      809, 3929,  809, 1363, 1363, 1363, 1363, 3929, 3929, 1363,
-     1363, 1371, 1371, 1371, 1371, 3929, 3929, 1371, 1371,  820,
-      820,  820,  820, 3929,  820, 3929,  820, 1381, 1381, 1381,
-     1381, 3929, 3929, 1381, 1381,  826,  826,  826,  826, 3929,
-      826, 3929,  826, 1397, 1397, 1397, 1397, 3929, 3929, 1397,
-     1397,  836,  836,  836,  836, 3929,  836, 3929,  836, 1422,
-     1422, 1422, 1422, 3929, 3929, 1422, 1422, 1429, 1429, 1429,
-
-     1429, 3929, 3929, 1429, 1429,  857,  857,  857, 3929, 3929,
-     3929,  857, 1442, 1442, 1442, 1442, 3929, 3929, 1442, 1442,
-     1454, 1454, 1454, 1454, 3929, 3929, 1454, 1454, 1459, 1459,
-     1459, 1459, 3929, 3929, 1459, 1459,  879,  879,  879, 3929,
-     3929, 3929,  879, 1471, 1471, 1471, 1471, 3929, 3929, 1471,
-     1471,  887,  887,  887, 3929, 3929, 3929,  887, 1479, 1479,
-     1479, 1479, 3929, 3929, 1479, 1479, 1487, 1487, 1487, 1487,
-     3929, 3929, 1487, 1487,  897,  897,  897, 3929, 3929, 3929,
-      897, 1493, 1493, 1493, 1493, 3929, 3929, 1493, 1493,  902,
-      902,  902, 3929, 3929, 3929,  902, 1508, 1508, 1508, 1508,
-
-     3929, 3929, 1508, 1508,  913,  913,  913, 3929, 3929, 3929,
-      913, 1514, 1514, 1514, 1514, 3929, 3929, 1514, 1514,  923,
-      923,  923, 3929, 3929, 3929,  923, 1527, 1527, 1527, 1527,
-     3929, 3929, 1527, 1527, 1535, 1535, 1535, 1535, 3929, 3929,
-     1535, 1535,  936,  936,  936, 3929, 3929, 3929,  936, 1551,
-     1551, 1551, 1551, 3929, 3929, 1551, 1551,  947,  947,  947,
-     3929, 3929, 3929,  947, 1560, 1560, 1560, 1560, 3929, 3929,
-     1560, 1560,  953,  953,  953, 3929, 3929, 3929,  953, 1568,
-     1568, 1568, 1568, 3929, 3929, 1568, 1568,  958,  958,  958,
-      958, 3929,  958, 3929,  958, 1578, 1578, 1578, 1578, 3929,
-
-     3929, 1578, 1578,  965,  965,  965, 3929, 3929, 3929,  965,
-     1588, 1588, 1588, 1588, 3929, 3929, 1588, 1588,  973,  973,
-      973, 3929, 3929, 3929,  973, 1599, 1599, 1599, 1599, 3929,
-     3929, 1599, 1599,  981,  981,  981, 3929, 3929, 3929,  981,
-     1606, 1606, 1606, 1606, 3929, 3929, 1606, 1606,  987,  987,
-      987, 3929, 3929, 3929,  987, 1614, 1614, 1614, 1614, 3929,
-     3929, 1614, 1614,  992,  992,  992,  992, 3929,  992, 3929,
-      992, 1625, 1625, 1625, 1625, 3929, 3929, 1625, 1625, 1260,
-     1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865,
-     1865, 1865, 1865, 1865, 1865, 1865, 1865,  745,  745,  745,
-
-      745, 3929,  745, 3929,  745,  782,  782,  782, 3929, 3929,
-     3929,  782, 1328, 1328, 1328, 1328, 3929, 3929, 1328, 1328,
-      790,  790,  790, 3929, 3929, 3929,  790, 1338, 1338, 1338,
-     1338, 3929, 3929, 1338, 1338, 1344, 1344, 1344, 1344, 3929,
-     3929, 1344, 1344,  803,  803,  803, 3929, 3929, 3929,  803,
-     1353, 1353, 1353, 1353, 3929, 3929, 1353, 1353, 1363, 1363,
-     1363, 1363, 3929, 3929, 1363, 1363, 1371, 1371, 1371, 1371,
-     3929, 3929, 1371, 1371, 1381, 1381, 1381, 1381, 3929, 3929,
-     1381, 1381,  826,  826,  826,  826, 3929,  826, 3929,  826,
-     1397, 1397, 1397, 1397, 3929, 3929, 1397, 1397,  836,  836,
-
-      836, 3929, 3929, 3929,  836, 1422, 1422, 1422, 1422, 3929,
-     3929, 1422, 1422, 1429, 1429, 1429, 1429, 3929, 3929, 1429,
-     1429,  857,  857,  857, 3929, 3929, 3929,  857, 1454, 1454,
-     1454, 1454, 3929, 3929, 1454, 1454, 1459, 1459, 1459, 1459,
-     3929, 3929, 1459, 1459,  879,  879,  879, 3929, 3929, 3929,
-      879,  887,  887,  887, 3929, 3929, 3929,  887, 1479, 1479,
-     1479, 1479, 3929, 3929, 1479, 1479, 1487, 1487, 1487, 1487,
-     3929, 3929, 1487, 1487,  897,  897,  897, 3929, 3929, 3929,
-      897, 1493, 1493, 1493, 1493, 3929, 3929, 1493, 1493,  902,
-      902,  902, 3929, 3929, 3929,  902,  913,  913,  913,  913,
-
-     3929,  913, 3929,  913, 1514, 1514, 1514, 1514, 3929, 3929,
-     1514, 1514,  923,  923,  923, 3929, 3929, 3929,  923, 1527,
-     1527, 1527, 1527, 3929, 3929, 1527, 1527,  936,  936,  936,
-     3929, 3929, 3929,  936, 1551, 1551, 1551, 1551, 3929, 3929,
-     1551, 1551,  947,  947,  947, 3929, 3929, 3929,  947, 1560,
-     1560, 1560, 1560, 3929, 3929, 1560, 1560,  953,  953,  953,
-     3929, 3929, 3929,  953, 1568, 1568, 1568, 1568, 3929, 3929,
-     1568, 1568,  958,  958,  958,  958, 3929,  958, 3929,  958,
-     1578, 1578, 1578, 1578, 3929, 3929, 1578, 1578,  965,  965,
-      965,  965, 3929,  965, 3929,  965, 1588, 1588, 1588, 1588,
-
-     3929, 3929, 1588, 1588,  973,  973,  973, 3929, 3929, 3929,
-      973, 1599, 1599, 1599, 1599, 3929, 3929, 1599, 1599,  981,
-      981,  981,  981, 3929,  981, 3929,  981, 1606, 1606, 1606,
-     1606, 3929, 3929, 1606, 1606,  987,  987,  987,  987, 3929,
-      987, 3929,  987,  992,  992,  992, 3929, 3929, 3929,  992,
-     1625, 1625, 1625, 1625, 3929, 3929, 1625, 1625, 1260, 1260,
-     1260, 1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865,
-     1865, 1865, 1865, 1865, 1865, 1865,  782,  782,  782, 3929,
-     3929, 3929,  782, 1328, 1328, 1328, 1328, 3929, 3929, 1328,
-     1328,  790,  790,  790,  790, 3929,  790, 3929,  790, 1344,
-
-     1344, 1344, 1344, 3929, 3929, 1344, 1344,  803,  803,  803,
-     3929, 3929, 3929,  803, 1353, 1353, 1353, 1353, 3929, 3929,
-     1353, 1353, 1363, 1363, 1363, 1363, 3929, 3929, 1363, 1363,
-     1371, 1371, 1371, 1371, 3929, 3929, 1371, 1371, 1381, 1381,
-     1381, 1381, 3929, 3929, 1381, 1381, 1397, 1397, 1397, 1397,
-     3929, 3929, 1397, 1397,  836,  836,  836, 3929, 3929, 3929,
-      836, 1422, 1422, 1422, 1422, 3929, 3929, 1422, 1422, 1429,
-     1429, 1429, 1429, 3929, 3929, 1429, 1429,  857,  857,  857,
-     3929, 3929, 3929,  857, 1454, 1454, 1454, 1454, 3929, 3929,
-     1454, 1454, 1459, 1459, 1459, 1459, 3929, 3929, 1459, 1459,
-
-      879,  879,  879, 3929, 3929, 3929,  879,  887,  887,  887,
-     3929, 3929, 3929,  887, 1479, 1479, 1479, 1479, 3929, 3929,
-     1479, 1479, 1487, 1487, 1487, 1487, 3929, 3929, 1487, 1487,
-      897,  897,  897, 3929, 3929, 3929,  897,  902,  902,  902,
-     3929, 3929, 3929,  902, 1514, 1514, 1514, 1514, 3929, 3929,
-     1514, 1514,  923,  923,  923,  923, 3929,  923, 3929,  923,
-     1527, 1527, 1527, 1527, 3929, 3929, 1527, 1527,  936,  936,
-      936, 3929, 3929, 3929,  936, 1551, 1551, 1551, 1551, 3929,
-     3929, 1551, 1551,  947,  947,  947, 3929, 3929, 3929,  947,
-      953,  953,  953, 3929, 3929, 3929,  953, 1568, 1568, 1568,
-
-     1568, 3929, 3929, 1568, 1568, 1578, 1578, 1578, 1578, 3929,
-     3929, 1578, 1578, 1588, 1588, 1588, 1588, 3929, 3929, 1588,
-     1588,  973,  973,  973, 3929, 3929, 3929,  973, 1606, 1606,
-     1606, 1606, 3929, 3929, 1606, 1606,  992,  992,  992, 3929,
-     3929, 3929,  992, 1625, 1625, 1625, 1625, 3929, 3929, 1625,
-     1625, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
-     1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,  782,
-      782,  782, 3929, 3929, 3929,  782, 1328, 1328, 1328, 1328,
-     3929, 3929, 1328, 1328,  790,  790,  790,  790, 3929,  790,
-     3929,  790, 1344, 1344, 1344, 1344, 3929, 3929, 1344, 1344,
-
-      803,  803,  803,  803, 3929,  803, 3929,  803, 1353, 1353,
-     1353, 1353, 3929, 3929, 1353, 1353, 1363, 1363, 1363, 1363,
-     3929, 3929, 1363, 1363, 1371, 1371, 1371, 1371, 3929, 3929,
-     1371, 1371, 1381, 1381, 1381, 1381, 3929, 3929, 1381, 1381,
-     1397, 1397, 1397, 1397, 3929, 3929, 1397, 1397,  836,  836,
-      836, 3929, 3929, 3929,  836, 1422, 1422, 1422, 1422, 3929,
-     3929, 1422, 1422,  857,  857,  857, 3929, 3929, 3929,  857,
-     1454, 1454, 1454, 1454, 3929, 3929, 1454, 1454, 1459, 1459,
-     1459, 1459, 3929, 3929, 1459, 1459,  879,  879,  879,  879,
-     3929,  879, 3929,  879,  887,  887,  887,  887, 3929,  887,
-
-     3929,  887, 1479, 1479, 1479, 1479, 3929, 3929, 1479, 1479,
-     1487, 1487, 1487, 1487, 3929, 3929, 1487, 1487,  897,  897,
-      897,  897, 3929,  897, 3929,  897,  902,  902,  902, 3929,
-     3929, 3929,  902, 1514, 1514, 1514, 1514, 3929, 3929, 1514,
-     1514,  923,  923,  923,  923, 3929,  923, 3929,  923, 1527,
-     1527, 1527, 1527, 3929, 3929, 1527, 1527,  936,  936,  936,
-      936, 3929,  936, 3929,  936,  947,  947,  947, 3929, 3929,
-     3929,  947,  953,  953,  953, 3929, 3929, 3929,  953, 1578,
-     1578, 1578, 1578, 3929, 3929, 1578, 1578, 1588, 1588, 1588,
-     1588, 3929, 3929, 1588, 1588,  973,  973,  973, 3929, 3929,
-
-     3929,  973, 1606, 1606, 1606, 1606, 3929, 3929, 1606, 1606,
-      992,  992,  992, 3929, 3929, 3929,  992, 1625, 1625, 1625,
-     1625, 3929, 3929, 1625, 1625, 1260, 1260, 1260, 1260, 1260,
-     1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865,
-     1865, 1865, 1865,  782,  782,  782, 3929, 3929, 3929,  782,
-      790,  790,  790,  790, 3929,  790, 3929,  790, 1344, 1344,
-     1344, 1344, 3929, 3929, 1344, 1344, 1353, 1353, 1353, 1353,
-     3929, 3929, 1353, 1353, 1363, 1363, 1363, 1363, 3929, 3929,
-     1363, 1363, 1371, 1371, 1371, 1371, 3929, 3929, 1371, 1371,
-     1381, 1381, 1381, 1381, 3929, 3929, 1381, 1381,  836,  836,
-
-      836, 3929, 3929, 3929,  836,  857,  857,  857, 3929, 3929,
-     3929,  857, 1454, 1454, 1454, 1454, 3929, 3929, 1454, 1454,
-      879,  879,  879, 3929, 3929, 3929,  879, 1479, 1479, 1479,
-     1479, 3929, 3929, 1479, 1479, 1487, 1487, 1487, 1487, 3929,
-     3929, 1487, 1487,  902,  902,  902, 3929, 3929, 3929,  902,
-     1514, 1514, 1514, 1514, 3929, 3929, 1514, 1514,  923,  923,
-      923,  923, 3929,  923, 3929,  923,  936,  936,  936, 3929,
-     3929, 3929,  936,  947,  947,  947, 3929, 3929, 3929,  947,
-      953,  953,  953, 3929, 3929, 3929,  953, 3331, 3331, 3331,
-     3331, 3331, 3331, 3331, 3331, 3331, 3332, 3332, 3332, 3332,
-
-     3332, 3332, 3332, 3332, 3332, 3411, 3411, 3411, 3411, 3411,
-     3411, 3411, 3411, 3411, 3414, 3414, 3414, 3414, 3414, 3414,
-     3414, 3414, 3414, 3481, 3481, 3481, 3481, 3481, 3481, 3481,
-     3481, 3481, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
-     3483,  291, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929
+      368,  368,  376,  376,  376,  376,  376,  376,  376,  376,
+      376,  384,  384,  384,  384,  384,  384,  384,  384,  384,
+      388,  388,  388,  388,  388,  388,  388,  388,  388,  394,
+      394,  394,  394,  394,  394,  394,  394,  394,  400,  400,
+      400,  400,  400,  400,  400,  400,  400,  406,  406,  406,
+      406,  406,  406,  406,  406,  406,  412,  412,  412,  412,
+      412,  412,  412,  412,  412,  419,  419,  419,  419,  419,
+      419,  419,  419,  419,  424,  424,  424,  424,  424,  424,
+
+      424,  424,  424,  431,  431,  431,  431,  431,  431,  431,
+      431,  431,  437,  437,  437,  437,  437,  437,  437,  437,
+      437,  444,  444,  444,  444,  444,  444,  444,  444,  444,
+      453,  453,  453,  453,  453,  453,  453,  453,  453,  459,
+      459,  459,  459,  459,  459,  459,  459,  459,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  477,  477,  477,
+      477,  477,  477,  477,  477,  477,  481,  481,  481,  481,
+      481,  481,  481,  481,  481,  488,  488,  488,  488,  488,
+      488,  488,  488,  488,  496,  496,  496,  496,  496,  496,
+      496,  496,  496,  504,  504,  504,  504,  504,  504,  504,
+
+      504,  504,  510,  510,  510,  510,  510,  510,  510,  510,
+      510,  516,  516,  516,  516,  516,  516,  516,  516,  516,
+      520,  520,  520,  520,  520,  520,  520,  520,  520,  528,
+      528,  528,  528,  528,  528,  528,  528,  528,  535,  535,
+      535,  535,  535,  535,  535,  535,  535,  542,  542,  542,
+      542,  542,  542,  542,  542,  542,  547,  547,  547,  547,
+      547,  547,  547,  547,  547,  553,  553,  553,  553,  553,
+      553,  553,  553,  553,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  564,  564,  564,  564,  564,  564,  564,
+      564,  564,  569,  569,  569,  569,  569,  569,  569,  569,
+
+      569,  575,  575,  575,  575,  575,  575,  575,  575,  575,
+      584,  584,  584,  584,  584,  584,  584,  584,  584,  591,
+      591,  591,  591,  591,  591,  591,  591,  591,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  606,  606,  606,
+      606,  606,  606,  606,  606,  606,  614,  614,  614,  614,
+      614,  614,  614,  614,  614,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  626,  626,  626,  626,  626,  626,
+      626,  626,  626,  632,  632,  632,  632,  632,  632,  632,
+      632,  632,  640,  640,  640,  640,  640,  640,  640,  640,
+      640,  646,  646,  646,  646,  646,  646,  646,  646,  646,
+
+      651,  651,  651,  651,  651,  651,  651,  651,  651,  658,
+      658,  658,  658,  658,  658,  658,  658,  658,  663,  663,
+      663,  663,  663,  663,  663,  663,  663,  669,  669,  669,
+      669,  669,  669,  669,  669,  669,  676,  676,  676,  676,
+      676,  676,  676,  676,  676,  683,  683,  683,  683,  683,
+      683,  683,  683,  683,  690,  690,  690,  690,  690,  690,
+      690,  690,  690,  698,  698,  698,  698,  698,  698,  698,
+      698,  698,  323,  323,  323,  323,  323,  323,  323,  323,
+      323,  709,  709,  709,  709,  709,  709,  709,  709,  709,
+      715,  715,  715,  715,  715,  715,  715,  715,  715,  721,
+
+      721,  721,  721,  721,  721,  721,  721,  721,  726,  726,
+      726,  726,  726,  726,  726,  726,  726,  744,  744,  744,
+      744,  744,  744,  744,  744,  744,  750,  750,  750,  750,
+      750,  750,  750,  750,  750,  770,  770,  770, 1094, 1093,
+     1092,  770,  807,  807,  807, 1091, 1090, 1088,  807,  815,
+      815,  815, 1087, 1086, 1085,  815,  824,  824,  824, 1083,
+     1081, 1080,  824,  828,  828,  828, 1079, 1078, 1075,  828,
+      834,  834,  834, 1074, 1073, 1068,  834,  840,  840,  840,
+     1066, 1065, 1064,  840,  845,  845,  845, 1058, 1057, 1056,
+      845,  851,  851,  851, 1055, 1047, 1046,  851,  861,  861,
+
+      861, 1044, 1041, 1040,  861,  878,  878,  878, 1039, 1038,
+     1033,  878,  882,  882,  882, 1030, 1032, 1025,  882,  892,
+      892,  892, 1024, 1022, 4017,  892,  898,  898,  898, 4017,
+      787, 1014,  898,  904,  904,  904, 1013, 1011, 1009,  904,
+      912,  912,  912, 1008, 1007, 1005,  912,  917,  917,  917,
+     1004, 1001, 1000,  917,  922,  922,  922,  999,  997,  996,
+      922,  927,  927,  927,  994,  993,  992,  927,  938,  938,
+      938,  991,  989,  988,  938,  948,  948,  948,  987,  986,
+      985,  948,  956,  956,  956,  984,  982,  980,  956,  961,
+      961,  961,  979,  977,  973,  961,  972,  972,  972,  971,
+
+      967,  963,  972,  978,  978,  978,  962,  960,  958,  978,
+      983,  983,  983,  957,  955,  953,  983,  990,  990,  990,
+      952,  951,  950,  990,  998,  998,  998,  949,  947,  939,
+      998, 1006, 1006, 1006,  937,  932,  931, 1006, 1012, 1012,
+     1012,  930,  929,  928, 1012, 1023, 1023, 1023,  926,  924,
+      923, 1023, 1029, 1029, 1029, 1029, 1029, 1029, 1029,  921,
+     1029,  770,  770,  770,  919,  918,  916,  770, 1045,  914,
+      913,  911, 1045,  807,  807,  807,  910,  907,  906,  807,
+     1089,  905,  903, 4017, 1089,  815,  815,  815,  899,  897,
+      895,  815, 1097,  894,  893,  891, 1097,  824,  824,  824,
+
+      890,  886,  885,  824, 1101,  884,  883,  881, 1101,  828,
+      828,  828,  880,  879,  877,  828, 1107,  876,  875,  869,
+     1107,  834,  834,  834,  865,  864,  860,  834, 1112,  856,
+      855,  854, 1112,  840,  840,  840,  853,  852,  850,  840,
+     1116,  848,  847,  846, 1116,  845,  845,  845,  844,  842,
+      841,  845, 1121,  839,  837,  836, 1121,  851,  851,  851,
+      835,  833,  831,  851, 1132,  830,  829,  827, 1132,  861,
+      861,  861,  825,  823,  822,  861, 1150,  820,  819,  818,
+     1150,  878,  878,  878,  817,  816,  814,  878, 1154,  809,
+      808,  806, 1154,  882,  882,  882, 4017,  787,  772,  882,
+
+     1164,  771,  769,  768, 1164,  892,  892,  892,  762,  761,
+      762,  892, 1172,  761,  760,  759, 1172,  898,  898,  898,
+     4017, 4017, 4017,  898, 1175, 4017, 4017, 4017, 1175,  904,
+      904,  904, 4017, 4017, 4017,  904, 1185, 4017, 4017, 4017,
+     1185,  912,  912,  912, 4017, 4017, 4017,  912, 1190, 4017,
+     4017, 4017, 1190,  917,  917,  917, 4017, 4017, 4017,  917,
+     1195, 4017, 4017, 4017, 1195,  922,  922,  922, 4017, 4017,
+     4017,  922, 1199, 4017, 4017, 4017, 1199,  927,  927,  927,
+     4017, 4017, 4017,  927, 1209, 4017, 4017, 4017, 1209,  938,
+      938,  938, 4017, 4017, 4017,  938, 1213, 4017, 4017, 4017,
+
+     1213,  948,  948,  948, 4017, 4017, 4017,  948, 1224, 4017,
+     4017, 4017, 1224,  956,  956,  956, 4017, 4017, 4017,  956,
+     1229, 4017, 4017, 4017, 1229,  961,  961,  961, 4017, 4017,
+     4017,  961, 1240, 4017, 4017, 4017, 1240,  972,  972,  972,
+     4017, 4017, 4017,  972, 1245, 4017, 4017, 4017, 1245,  978,
+      978,  978, 4017, 4017, 4017,  978, 1250, 4017, 4017, 4017,
+     1250,  983,  983,  983, 4017, 4017, 4017,  983, 1257, 4017,
+     4017, 4017, 1257,  990,  990,  990, 4017, 4017, 4017,  990,
+     1264, 4017, 4017, 4017, 1264,  998,  998,  998, 4017, 4017,
+     4017,  998, 1272, 4017, 4017, 4017, 1272, 1006, 1006, 1006,
+
+     4017, 4017, 4017, 1006, 1278, 4017, 4017, 4017, 1278, 1012,
+     1012, 1012, 4017, 4017, 4017, 1012, 1283, 4017, 4017, 4017,
+     1283, 1023, 1023, 1023, 4017, 4017, 4017, 1023, 1292, 4017,
+     4017, 4017, 1292, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+     1294, 1294, 1300, 4017, 4017, 4017, 4017, 1300,  770,  770,
+      770, 4017, 4017, 4017,  770, 1311, 1311, 1311, 1311, 4017,
+     4017, 1311, 1311,  807,  807,  807,  807, 4017,  807, 4017,
+      807, 1362, 1362, 1362, 1362, 4017, 4017, 1362, 1362,  815,
+      815,  815, 4017, 4017, 4017,  815, 1372, 1372, 1372, 1372,
+     4017, 4017, 1372, 1372,  824,  824,  824, 4017, 4017, 4017,
+
+      824, 1378, 1378, 1378, 1378, 4017, 4017, 1378, 1378,  828,
+      828,  828, 4017, 4017, 4017,  828, 1387, 1387, 1387, 1387,
+     4017, 4017, 1387, 1387,  834,  834,  834,  834, 4017,  834,
+     4017,  834, 1397, 1397, 1397, 1397, 4017, 4017, 1397, 1397,
+      840,  840,  840,  840, 4017,  840, 4017,  840, 1405, 1405,
+     1405, 1405, 4017, 4017, 1405, 1405,  845,  845,  845,  845,
+     4017,  845, 4017,  845, 1415, 1415, 1415, 1415, 4017, 4017,
+     1415, 1415,  851,  851,  851,  851, 4017,  851, 4017,  851,
+     1431, 1431, 1431, 1431, 4017, 4017, 1431, 1431,  861,  861,
+      861, 4017, 4017, 4017,  861, 1456, 1456, 1456, 1456, 4017,
+
+     4017, 1456, 1456, 1463, 1463, 1463, 1463, 4017, 4017, 1463,
+     1463,  882,  882,  882, 4017, 4017, 4017,  882, 1476, 1476,
+     1476, 1476, 4017, 4017, 1476, 1476,  892,  892,  892, 4017,
+     4017, 4017,  892, 1488, 1488, 1488, 1488, 4017, 4017, 1488,
+     1488,  898,  898,  898, 4017, 4017, 4017,  898, 1493, 1493,
+     1493, 1493, 4017, 4017, 1493, 1493,  904,  904,  904, 4017,
+     4017, 4017,  904, 1505, 1505, 1505, 1505, 4017, 4017, 1505,
+     1505,  912,  912,  912, 4017, 4017, 4017,  912, 1513, 1513,
+     1513, 1513, 4017, 4017, 1513, 1513,  917,  917,  917, 4017,
+     4017, 4017,  917, 1521, 1521, 1521, 1521, 4017, 4017, 1521,
+
+     1521,  922,  922,  922, 4017, 4017, 4017,  922, 1527, 1527,
+     1527, 1527, 4017, 4017, 1527, 1527,  927,  927,  927, 4017,
+     4017, 4017,  927, 1542, 1542, 1542, 1542, 4017, 4017, 1542,
+     1542,  938,  938,  938, 4017, 4017, 4017,  938, 1548, 1548,
+     1548, 1548, 4017, 4017, 1548, 1548,  948,  948,  948, 4017,
+     4017, 4017,  948, 1561, 1561, 1561, 1561, 4017, 4017, 1561,
+     1561,  956,  956,  956, 4017, 4017, 4017,  956, 1569, 1569,
+     1569, 1569, 4017, 4017, 1569, 1569,  961,  961,  961, 4017,
+     4017, 4017,  961, 1585, 1585, 1585, 1585, 4017, 4017, 1585,
+     1585,  972,  972,  972,  972, 4017,  972, 4017,  972, 1594,
+
+     1594, 1594, 1594, 4017, 4017, 1594, 1594,  978,  978,  978,
+     4017, 4017, 4017,  978, 1602, 1602, 1602, 1602, 4017, 4017,
+     1602, 1602,  983,  983,  983, 4017, 4017, 4017,  983, 1612,
+     1612, 1612, 1612, 4017, 4017, 1612, 1612,  990,  990,  990,
+     4017, 4017, 4017,  990, 1622, 1622, 1622, 1622, 4017, 4017,
+     1622, 1622,  998,  998,  998, 4017, 4017, 4017,  998, 1633,
+     1633, 1633, 1633, 4017, 4017, 1633, 1633, 1006, 1006, 1006,
+     4017, 4017, 4017, 1006, 1640, 1640, 1640, 1640, 4017, 4017,
+     1640, 1640, 1012, 1012, 1012, 4017, 4017, 4017, 1012, 1648,
+     1648, 1648, 1648, 4017, 4017, 1648, 1648, 1023, 1023, 1023,
+
+     1023, 4017, 1023, 4017, 1023, 1662, 1662, 1662, 1662, 4017,
+     4017, 1662, 1662, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+     1294, 1294, 1300, 4017, 1300, 4017, 4017, 1300,  770,  770,
+      770, 4017, 4017, 4017,  770, 1311, 1311, 1311, 1311, 4017,
+     4017, 1311, 1311,  807,  807,  807, 4017, 4017, 4017,  807,
+     1362, 1362, 1362, 1362, 4017, 4017, 1362, 1362,  815,  815,
+      815, 4017, 4017, 4017,  815, 1372, 1372, 1372, 1372, 4017,
+     4017, 1372, 1372,  824,  824,  824, 4017, 4017, 4017,  824,
+     1378, 1378, 1378, 1378, 4017, 4017, 1378, 1378,  828,  828,
+      828, 4017, 4017, 4017,  828, 1387, 1387, 1387, 1387, 4017,
+
+     4017, 1387, 1387,  834,  834,  834, 4017, 4017, 4017,  834,
+     1397, 1397, 1397, 1397, 4017, 4017, 1397, 1397, 1405, 1405,
+     1405, 1405, 4017, 4017, 1405, 1405,  845,  845,  845, 4017,
+     4017, 4017,  845, 1415, 1415, 1415, 1415, 4017, 4017, 1415,
+     1415,  851,  851,  851, 4017, 4017, 4017,  851, 1431, 1431,
+     1431, 1431, 4017, 4017, 1431, 1431,  861,  861,  861, 4017,
+     4017, 4017,  861, 1456, 1456, 1456, 1456, 4017, 4017, 1456,
+     1456, 1463, 1463, 1463, 1463, 4017, 4017, 1463, 1463,  882,
+      882,  882, 4017, 4017, 4017,  882, 1476, 1476, 1476, 1476,
+     4017, 4017, 1476, 1476,  892,  892,  892,  892, 4017,  892,
+
+     4017,  892, 1488, 1488, 1488, 1488, 4017, 4017, 1488, 1488,
+      898,  898,  898,  898, 4017,  898, 4017,  898, 1493, 1493,
+     1493, 1493, 4017, 4017, 1493, 1493,  904,  904,  904, 4017,
+     4017, 4017,  904, 1505, 1505, 1505, 1505, 4017, 4017, 1505,
+     1505,  912,  912,  912, 4017, 4017, 4017,  912, 1513, 1513,
+     1513, 1513, 4017, 4017, 1513, 1513,  917,  917,  917, 4017,
+     4017, 4017,  917, 1521, 1521, 1521, 1521, 4017, 4017, 1521,
+     1521,  922,  922,  922,  922, 4017,  922, 4017,  922, 1527,
+     1527, 1527, 1527, 4017, 4017, 1527, 1527,  927,  927,  927,
+     4017, 4017, 4017,  927, 1542, 1542, 1542, 1542, 4017, 4017,
+
+     1542, 1542,  938,  938,  938, 4017, 4017, 4017,  938, 1548,
+     1548, 1548, 1548, 4017, 4017, 1548, 1548,  948,  948,  948,
+     4017, 4017, 4017,  948, 1561, 1561, 1561, 1561, 4017, 4017,
+     1561, 1561,  956,  956,  956, 4017, 4017, 4017,  956, 1569,
+     1569, 1569, 1569, 4017, 4017, 1569, 1569,  961,  961,  961,
+     4017, 4017, 4017,  961, 1585, 1585, 1585, 1585, 4017, 4017,
+     1585, 1585,  972,  972,  972, 4017, 4017, 4017,  972, 1594,
+     1594, 1594, 1594, 4017, 4017, 1594, 1594,  978,  978,  978,
+     4017, 4017, 4017,  978, 1602, 1602, 1602, 1602, 4017, 4017,
+     1602, 1602,  983,  983,  983, 4017, 4017, 4017,  983, 1612,
+
+     1612, 1612, 1612, 4017, 4017, 1612, 1612,  990,  990,  990,
+     4017, 4017, 4017,  990, 1622, 1622, 1622, 1622, 4017, 4017,
+     1622, 1622,  998,  998,  998,  998, 4017,  998, 4017,  998,
+     1633, 1633, 1633, 1633, 4017, 4017, 1633, 1633, 1006, 1006,
+     1006, 4017, 4017, 4017, 1006, 1640, 1640, 1640, 1640, 4017,
+     4017, 1640, 1640, 1012, 1012, 1012, 4017, 4017, 4017, 1012,
+     1648, 1648, 1648, 1648, 4017, 4017, 1648, 1648, 1023, 1023,
+     1023, 4017, 4017, 4017, 1023, 1662, 1662, 1662, 1662, 4017,
+     4017, 1662, 1662, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+     1294, 1294, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+
+     1905,  770,  770,  770, 4017, 4017, 4017,  770,  807,  807,
+      807, 4017, 4017, 4017,  807, 1362, 1362, 1362, 1362, 4017,
+     4017, 1362, 1362,  815,  815,  815, 4017, 4017, 4017,  815,
+     1372, 1372, 1372, 1372, 4017, 4017, 1372, 1372,  824,  824,
+      824,  824, 4017,  824, 4017,  824, 1378, 1378, 1378, 1378,
+     4017, 4017, 1378, 1378,  828,  828,  828, 4017, 4017, 4017,
+      828, 1387, 1387, 1387, 1387, 4017, 4017, 1387, 1387,  834,
+      834,  834, 4017, 4017, 4017,  834, 1397, 1397, 1397, 1397,
+     4017, 4017, 1397, 1397, 1405, 1405, 1405, 1405, 4017, 4017,
+     1405, 1405,  845,  845,  845, 4017, 4017, 4017,  845, 1415,
+
+     1415, 1415, 1415, 4017, 4017, 1415, 1415,  851,  851,  851,
+     4017, 4017, 4017,  851, 1431, 1431, 1431, 1431, 4017, 4017,
+     1431, 1431,  861,  861,  861,  861, 4017,  861, 4017,  861,
+     1456, 1456, 1456, 1456, 4017, 4017, 1456, 1456, 1463, 1463,
+     1463, 1463, 4017, 4017, 1463, 1463,  882,  882,  882, 4017,
+     4017, 4017,  882, 1476, 1476, 1476, 1476, 4017, 4017, 1476,
+     1476, 1488, 1488, 1488, 1488, 4017, 4017, 1488, 1488, 1493,
+     1493, 1493, 1493, 4017, 4017, 1493, 1493,  904,  904,  904,
+     4017, 4017, 4017,  904, 1505, 1505, 1505, 1505, 4017, 4017,
+     1505, 1505,  912,  912,  912, 4017, 4017, 4017,  912, 1513,
+
+     1513, 1513, 1513, 4017, 4017, 1513, 1513,  917,  917,  917,
+      917, 4017,  917, 4017,  917, 1521, 1521, 1521, 1521, 4017,
+     4017, 1521, 1521,  922,  922,  922, 4017, 4017, 4017,  922,
+     1527, 1527, 1527, 1527, 4017, 4017, 1527, 1527,  927,  927,
+      927, 4017, 4017, 4017,  927, 1542, 1542, 1542, 1542, 4017,
+     4017, 1542, 1542,  938,  938,  938, 4017, 4017, 4017,  938,
+     1548, 1548, 1548, 1548, 4017, 4017, 1548, 1548,  948,  948,
+      948, 4017, 4017, 4017,  948, 1561, 1561, 1561, 1561, 4017,
+     4017, 1561, 1561,  956,  956,  956,  956, 4017,  956, 4017,
+      956, 1569, 1569, 1569, 1569, 4017, 4017, 1569, 1569,  961,
+
+      961,  961, 4017, 4017, 4017,  961, 1585, 1585, 1585, 1585,
+     4017, 4017, 1585, 1585,  972,  972,  972, 4017, 4017, 4017,
+      972, 1594, 1594, 1594, 1594, 4017, 4017, 1594, 1594,  978,
+      978,  978, 4017, 4017, 4017,  978, 1602, 1602, 1602, 1602,
+     4017, 4017, 1602, 1602,  983,  983,  983, 4017, 4017, 4017,
+      983, 1612, 1612, 1612, 1612, 4017, 4017, 1612, 1612,  990,
+      990,  990, 4017, 4017, 4017,  990, 1622, 1622, 1622, 1622,
+     4017, 4017, 1622, 1622,  998,  998,  998, 4017, 4017, 4017,
+      998, 1633, 1633, 1633, 1633, 4017, 4017, 1633, 1633, 1006,
+     1006, 1006, 4017, 4017, 4017, 1006, 1640, 1640, 1640, 1640,
+
+     4017, 4017, 1640, 1640, 1012, 1012, 1012, 4017, 4017, 4017,
+     1012, 1648, 1648, 1648, 1648, 4017, 4017, 1648, 1648, 1023,
+     1023, 1023, 4017, 4017, 4017, 1023, 1662, 1662, 1662, 1662,
+     4017, 4017, 1662, 1662, 1294, 1294, 1294, 1294, 1294, 1294,
+     1294, 1294, 1294, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+     1905, 1905,  770,  770,  770, 4017, 4017, 4017,  770,  807,
+      807,  807,  807, 4017,  807, 4017,  807, 1362, 1362, 1362,
+     1362, 4017, 4017, 1362, 1362,  815,  815,  815, 4017, 4017,
+     4017,  815, 1372, 1372, 1372, 1372, 4017, 4017, 1372, 1372,
+     1378, 1378, 1378, 1378, 4017, 4017, 1378, 1378,  828,  828,
+
+      828, 4017, 4017, 4017,  828, 1387, 1387, 1387, 1387, 4017,
+     4017, 1387, 1387,  834,  834,  834,  834, 4017,  834, 4017,
+      834, 1397, 1397, 1397, 1397, 4017, 4017, 1397, 1397, 1405,
+     1405, 1405, 1405, 4017, 4017, 1405, 1405,  845,  845,  845,
+      845, 4017,  845, 4017,  845, 1415, 1415, 1415, 1415, 4017,
+     4017, 1415, 1415,  851,  851,  851,  851, 4017,  851, 4017,
+      851, 1431, 1431, 1431, 1431, 4017, 4017, 1431, 1431,  861,
+      861,  861,  861, 4017,  861, 4017,  861, 1456, 1456, 1456,
+     1456, 4017, 4017, 1456, 1456, 1463, 1463, 1463, 1463, 4017,
+     4017, 1463, 1463,  882,  882,  882, 4017, 4017, 4017,  882,
+
+     1476, 1476, 1476, 1476, 4017, 4017, 1476, 1476, 1488, 1488,
+     1488, 1488, 4017, 4017, 1488, 1488, 1493, 1493, 1493, 1493,
+     4017, 4017, 1493, 1493,  904,  904,  904, 4017, 4017, 4017,
+      904, 1505, 1505, 1505, 1505, 4017, 4017, 1505, 1505,  912,
+      912,  912, 4017, 4017, 4017,  912, 1513, 1513, 1513, 1513,
+     4017, 4017, 1513, 1513, 1521, 1521, 1521, 1521, 4017, 4017,
+     1521, 1521,  922,  922,  922, 4017, 4017, 4017,  922, 1527,
+     1527, 1527, 1527, 4017, 4017, 1527, 1527,  927,  927,  927,
+     4017, 4017, 4017,  927, 1542, 1542, 1542, 1542, 4017, 4017,
+     1542, 1542,  938,  938,  938, 4017, 4017, 4017,  938, 1548,
+
+     1548, 1548, 1548, 4017, 4017, 1548, 1548,  948,  948,  948,
+     4017, 4017, 4017,  948, 1561, 1561, 1561, 1561, 4017, 4017,
+     1561, 1561, 1569, 1569, 1569, 1569, 4017, 4017, 1569, 1569,
+      961,  961,  961, 4017, 4017, 4017,  961, 1585, 1585, 1585,
+     1585, 4017, 4017, 1585, 1585,  972,  972,  972, 4017, 4017,
+     4017,  972, 1594, 1594, 1594, 1594, 4017, 4017, 1594, 1594,
+      978,  978,  978, 4017, 4017, 4017,  978, 1602, 1602, 1602,
+     1602, 4017, 4017, 1602, 1602,  983,  983,  983,  983, 4017,
+      983, 4017,  983, 1612, 1612, 1612, 1612, 4017, 4017, 1612,
+     1612,  990,  990,  990, 4017, 4017, 4017,  990, 1622, 1622,
+
+     1622, 1622, 4017, 4017, 1622, 1622,  998,  998,  998, 4017,
+     4017, 4017,  998, 1633, 1633, 1633, 1633, 4017, 4017, 1633,
+     1633, 1006, 1006, 1006, 4017, 4017, 4017, 1006, 1640, 1640,
+     1640, 1640, 4017, 4017, 1640, 1640, 1012, 1012, 1012, 4017,
+     4017, 4017, 1012, 1648, 1648, 1648, 1648, 4017, 4017, 1648,
+     1648, 1023, 1023, 1023, 1023, 4017, 1023, 4017, 1023, 1662,
+     1662, 1662, 1662, 4017, 4017, 1662, 1662, 1294, 1294, 1294,
+     1294, 1294, 1294, 1294, 1294, 1294, 1905, 1905, 1905, 1905,
+     1905, 1905, 1905, 1905, 1905,  770,  770,  770,  770, 4017,
+      770, 4017,  770,  807,  807,  807, 4017, 4017, 4017,  807,
+
+     1362, 1362, 1362, 1362, 4017, 4017, 1362, 1362,  815,  815,
+      815, 4017, 4017, 4017,  815, 1372, 1372, 1372, 1372, 4017,
+     4017, 1372, 1372, 1378, 1378, 1378, 1378, 4017, 4017, 1378,
+     1378,  828,  828,  828, 4017, 4017, 4017,  828, 1387, 1387,
+     1387, 1387, 4017, 4017, 1387, 1387, 1397, 1397, 1397, 1397,
+     4017, 4017, 1397, 1397, 1405, 1405, 1405, 1405, 4017, 4017,
+     1405, 1405, 1415, 1415, 1415, 1415, 4017, 4017, 1415, 1415,
+      851,  851,  851,  851, 4017,  851, 4017,  851, 1431, 1431,
+     1431, 1431, 4017, 4017, 1431, 1431,  861,  861,  861, 4017,
+     4017, 4017,  861, 1456, 1456, 1456, 1456, 4017, 4017, 1456,
+
+     1456, 1463, 1463, 1463, 1463, 4017, 4017, 1463, 1463,  882,
+      882,  882, 4017, 4017, 4017,  882, 1488, 1488, 1488, 1488,
+     4017, 4017, 1488, 1488, 1493, 1493, 1493, 1493, 4017, 4017,
+     1493, 1493,  904,  904,  904, 4017, 4017, 4017,  904,  912,
+      912,  912, 4017, 4017, 4017,  912, 1513, 1513, 1513, 1513,
+     4017, 4017, 1513, 1513, 1521, 1521, 1521, 1521, 4017, 4017,
+     1521, 1521,  922,  922,  922, 4017, 4017, 4017,  922, 1527,
+     1527, 1527, 1527, 4017, 4017, 1527, 1527,  927,  927,  927,
+     4017, 4017, 4017,  927,  938,  938,  938,  938, 4017,  938,
+     4017,  938, 1548, 1548, 1548, 1548, 4017, 4017, 1548, 1548,
+
+      948,  948,  948, 4017, 4017, 4017,  948, 1561, 1561, 1561,
+     1561, 4017, 4017, 1561, 1561,  961,  961,  961, 4017, 4017,
+     4017,  961, 1585, 1585, 1585, 1585, 4017, 4017, 1585, 1585,
+      972,  972,  972, 4017, 4017, 4017,  972, 1594, 1594, 1594,
+     1594, 4017, 4017, 1594, 1594,  978,  978,  978, 4017, 4017,
+     4017,  978, 1602, 1602, 1602, 1602, 4017, 4017, 1602, 1602,
+      983,  983,  983,  983, 4017,  983, 4017,  983, 1612, 1612,
+     1612, 1612, 4017, 4017, 1612, 1612,  990,  990,  990,  990,
+     4017,  990, 4017,  990, 1622, 1622, 1622, 1622, 4017, 4017,
+     1622, 1622,  998,  998,  998, 4017, 4017, 4017,  998, 1633,
+
+     1633, 1633, 1633, 4017, 4017, 1633, 1633, 1006, 1006, 1006,
+     1006, 4017, 1006, 4017, 1006, 1640, 1640, 1640, 1640, 4017,
+     4017, 1640, 1640, 1012, 1012, 1012, 1012, 4017, 1012, 4017,
+     1012, 1023, 1023, 1023, 4017, 4017, 4017, 1023, 1662, 1662,
+     1662, 1662, 4017, 4017, 1662, 1662, 1294, 1294, 1294, 1294,
+     1294, 1294, 1294, 1294, 1294, 1905, 1905, 1905, 1905, 1905,
+     1905, 1905, 1905, 1905,  807,  807,  807, 4017, 4017, 4017,
+      807, 1362, 1362, 1362, 1362, 4017, 4017, 1362, 1362,  815,
+      815,  815,  815, 4017,  815, 4017,  815, 1378, 1378, 1378,
+     1378, 4017, 4017, 1378, 1378,  828,  828,  828, 4017, 4017,
+
+     4017,  828, 1387, 1387, 1387, 1387, 4017, 4017, 1387, 1387,
+     1397, 1397, 1397, 1397, 4017, 4017, 1397, 1397, 1405, 1405,
+     1405, 1405, 4017, 4017, 1405, 1405, 1415, 1415, 1415, 1415,
+     4017, 4017, 1415, 1415, 1431, 1431, 1431, 1431, 4017, 4017,
+     1431, 1431,  861,  861,  861, 4017, 4017, 4017,  861, 1456,
+     1456, 1456, 1456, 4017, 4017, 1456, 1456, 1463, 1463, 1463,
+     1463, 4017, 4017, 1463, 1463,  882,  882,  882, 4017, 4017,
+     4017,  882, 1488, 1488, 1488, 1488, 4017, 4017, 1488, 1488,
+     1493, 1493, 1493, 1493, 4017, 4017, 1493, 1493,  904,  904,
+      904, 4017, 4017, 4017,  904,  912,  912,  912, 4017, 4017,
+
+     4017,  912, 1513, 1513, 1513, 1513, 4017, 4017, 1513, 1513,
+     1521, 1521, 1521, 1521, 4017, 4017, 1521, 1521,  922,  922,
+      922, 4017, 4017, 4017,  922,  927,  927,  927, 4017, 4017,
+     4017,  927, 1548, 1548, 1548, 1548, 4017, 4017, 1548, 1548,
+      948,  948,  948,  948, 4017,  948, 4017,  948, 1561, 1561,
+     1561, 1561, 4017, 4017, 1561, 1561,  961,  961,  961, 4017,
+     4017, 4017,  961, 1585, 1585, 1585, 1585, 4017, 4017, 1585,
+     1585,  972,  972,  972, 4017, 4017, 4017,  972,  978,  978,
+      978, 4017, 4017, 4017,  978, 1602, 1602, 1602, 1602, 4017,
+     4017, 1602, 1602, 1612, 1612, 1612, 1612, 4017, 4017, 1612,
+
+     1612, 1622, 1622, 1622, 1622, 4017, 4017, 1622, 1622,  998,
+      998,  998, 4017, 4017, 4017,  998, 1640, 1640, 1640, 1640,
+     4017, 4017, 1640, 1640, 1023, 1023, 1023, 4017, 4017, 4017,
+     1023, 1662, 1662, 1662, 1662, 4017, 4017, 1662, 1662, 1294,
+     1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1905, 1905,
+     1905, 1905, 1905, 1905, 1905, 1905, 1905,  807,  807,  807,
+     4017, 4017, 4017,  807, 1362, 1362, 1362, 1362, 4017, 4017,
+     1362, 1362,  815,  815,  815,  815, 4017,  815, 4017,  815,
+     1378, 1378, 1378, 1378, 4017, 4017, 1378, 1378,  828,  828,
+      828,  828, 4017,  828, 4017,  828, 1387, 1387, 1387, 1387,
+
+     4017, 4017, 1387, 1387, 1397, 1397, 1397, 1397, 4017, 4017,
+     1397, 1397, 1405, 1405, 1405, 1405, 4017, 4017, 1405, 1405,
+     1415, 1415, 1415, 1415, 4017, 4017, 1415, 1415, 1431, 1431,
+     1431, 1431, 4017, 4017, 1431, 1431,  861,  861,  861, 4017,
+     4017, 4017,  861, 1456, 1456, 1456, 1456, 4017, 4017, 1456,
+     1456,  882,  882,  882, 4017, 4017, 4017,  882, 1488, 1488,
+     1488, 1488, 4017, 4017, 1488, 1488, 1493, 1493, 1493, 1493,
+     4017, 4017, 1493, 1493,  904,  904,  904,  904, 4017,  904,
+     4017,  904,  912,  912,  912,  912, 4017,  912, 4017,  912,
+     1513, 1513, 1513, 1513, 4017, 4017, 1513, 1513, 1521, 1521,
+
+     1521, 1521, 4017, 4017, 1521, 1521,  922,  922,  922,  922,
+     4017,  922, 4017,  922,  927,  927,  927, 4017, 4017, 4017,
+      927, 1548, 1548, 1548, 1548, 4017, 4017, 1548, 1548,  948,
+      948,  948,  948, 4017,  948, 4017,  948, 1561, 1561, 1561,
+     1561, 4017, 4017, 1561, 1561,  961,  961,  961,  961, 4017,
+      961, 4017,  961,  972,  972,  972, 4017, 4017, 4017,  972,
+      978,  978,  978, 4017, 4017, 4017,  978, 1612, 1612, 1612,
+     1612, 4017, 4017, 1612, 1612, 1622, 1622, 1622, 1622, 4017,
+     4017, 1622, 1622,  998,  998,  998, 4017, 4017, 4017,  998,
+     1640, 1640, 1640, 1640, 4017, 4017, 1640, 1640, 1023, 1023,
+
+     1023, 4017, 4017, 4017, 1023, 1662, 1662, 1662, 1662, 4017,
+     4017, 1662, 1662, 1294, 1294, 1294, 1294, 1294, 1294, 1294,
+     1294, 1294, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+     1905,  807,  807,  807, 4017, 4017, 4017,  807,  815,  815,
+      815,  815, 4017,  815, 4017,  815, 1378, 1378, 1378, 1378,
+     4017, 4017, 1378, 1378, 1387, 1387, 1387, 1387, 4017, 4017,
+     1387, 1387, 1397, 1397, 1397, 1397, 4017, 4017, 1397, 1397,
+     1405, 1405, 1405, 1405, 4017, 4017, 1405, 1405, 1415, 1415,
+     1415, 1415, 4017, 4017, 1415, 1415,  861,  861,  861, 4017,
+     4017, 4017,  861,  882,  882,  882, 4017, 4017, 4017,  882,
+
+     1488, 1488, 1488, 1488, 4017, 4017, 1488, 1488,  904,  904,
+      904, 4017, 4017, 4017,  904, 1513, 1513, 1513, 1513, 4017,
+     4017, 1513, 1513, 1521, 1521, 1521, 1521, 4017, 4017, 1521,
+     1521,  927,  927,  927, 4017, 4017, 4017,  927, 1548, 1548,
+     1548, 1548, 4017, 4017, 1548, 1548,  948,  948,  948,  948,
+     4017,  948, 4017,  948,  961,  961,  961, 4017, 4017, 4017,
+      961,  972,  972,  972, 4017, 4017, 4017,  972,  978,  978,
+      978, 4017, 4017, 4017,  978, 3401, 3401, 3401, 3401, 3401,
+     3401, 3401, 3401, 3401, 3402, 3402, 3402, 3402, 3402, 3402,
+     3402, 3402, 3402, 3493, 3493, 3493, 3493, 3493, 3493, 3493,
+
+     3493, 3493, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
+     3496, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569,
+     3571, 3571, 3571, 3571, 3571, 3571, 3571, 3571, 3571,  307,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017
     } ;
 
-static yyconst flex_int16_t yy_chk[13918] =
+static const flex_int16_t yy_chk[14006] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
         6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
-        4,   10,  977,    5,    0,    9,    6,  362,   10,    7,
-        8,    8,    8,  296,   11,   13,   13,   12,   14,   14,
-       13,   13,  334,   14,   14,  297,    8,   17,   17,  296,
-       13,   15,   15,   14,   15,  300,   15,   16,   16,  977,
-       16,  297,   16,   18,   18,  362,   15,   21,   21,   21,
-     1512,  300,   16,   22,   22,   22,  451,   23,   23,   23,
-       24,   24,   24,   21,   25,   25,   25,  343, 1517,   22,
-      451,  322,   17,   23,  343,  334,   24,  294,  294,  294,
-
-       25,  295,  295,  295,  299,  299,  299,  322,   18,   19,
+        4,   10, 1002,    5,    0,    9,    6,  378,   10,    7,
+        8,    8,    8,  312,   11,   13,   13,   12,   14,   14,
+       13,   13,  350,   14,   14,  313,    8,   17,   17,  312,
+       13,   15,   15,   14,   15,  316,   15,   16,   16, 1002,
+       16,  313,   16,   18,   18,  378,   15,   21,   21,   21,
+     1532,  316,   16,   22,   22,   22,  467,   23,   23,   23,
+       24,   24,   24,   21,   25,   25,   25,  359, 1533,   22,
+      467,  338,   17,   23,  359,  350,   24,  310,  310,  310,
+
+       25,  311,  311,  311,  315,  315,  315,  338,   18,   19,
        19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,  339,   19,   19,   19,   19,   19,
-       26,   26,   26,   27,   27,   27,   28,   28,   28,  449,
-      339,   29,   29,   29,  347,  436,   26,  449,  347,   27,
-      436,  739,   28,  449,  739,   19,   19,   29,   30,   30,
-       30,  319,  319,  319,  348,  346,   19,  327,  327,  327,
-      336,  336,  336, 1518,   30,   19,   20,   20,   20,   20,
+       19,   19,   19,   19,  355,   19,   19,   19,   19,   19,
+       26,   26,   26,   27,   27,   27,   28,   28,   28,  465,
+      355,   29,   29,   29,  363,  452,   26,  465,  363,   27,
+      452,  764,   28,  465,  764,   19,   19,   29,   30,   30,
+       30,  335,  335,  335,  364,  362,   19,  343,  343,  343,
+      352,  352,  352, 1539,   30,   19,   20,   20,   20,   20,
        20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
-       20,  446,   20,   20,   20,   20,   20,   31,   31,   31,
+       20,  462,   20,   20,   20,   20,   20,   31,   31,   31,
 
        32,   32,   32,   33,   33,   33,  251,  251,   34,   34,
-       34,  251,  446,   31,  346,  353,   32,  348,  346,   33,
-      518,  251,   20,   20,   34,   35,   35,   35,   36,   36,
-       36,  353,  518,   20,   37,   37,   37,   38,   38,   38,
-      859,   35,   20,  859,   36,   39,   39,   39,  364, 1520,
-       37,  251,  369,   38,   40,   40,   40,  345,  345,  345,
-      399,   39,  350,  350,  350,  361,  361,  361,  369,  600,
+       34,  251,  462,   31,  362,  369,   32,  364,  362,   33,
+      534,  251,   20,   20,   34,   35,   35,   35,   36,   36,
+       36,  369,  534,   20,   37,   37,   37,   38,   38,   38,
+      884,   35,   20,  884,   36,   39,   39,   39,  380, 1540,
+       37,  251,  385,   38,   40,   40,   40,  361,  361,  361,
+      415,   39,  366,  366,  366,  377,  377,  377,  385,  616,
        40,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,  379,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,  395,   41,   41,   41,
        41,   41,   43,   43,   43,   44,   44,   44,   45,   45,
 
-       45,  364,  379,   46,   46,   46,  479,  600,   43,  374,
-      479,   44, 1521,  399,   45, 1523,  374,   41,   41,   46,
-       47,   47,   47,   41,  482,  374,   41,  366,  366,  366,
-      373,  373,  373,  376,  376,  376,   47, 1524,   41,   42,
+       45,  380,  395,   46,   46,   46,  495,  616,   43,  390,
+      495,   44, 1545,  415,   45, 1546,  390,   41,   41,   46,
+       47,   47,   47,   41,  498,  390,   41,  382,  382,  382,
+      389,  389,  389,  392,  392,  392,   47, 1551,   41,   42,
        42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,  391,   42,   42,   42,   42,   42,
-       48,   48,   48,   49,   49,   49,   50,   50,   50,  752,
-      391,   53,   53,   53,  482, 1525,   48,  386, 1533,   49,
-      752,  751,   50,  752,  386,   42,   42,   53,   54,   54,
-       54,   42,  411,  386,   42,  385,  385,  385,  388,  388,
+       42,   42,   42,   42,  407,   42,   42,   42,   42,   42,
+       48,   48,   48,   49,   49,   49,   50,   50,   50,  777,
+      407,   53,   53,   53,  498, 1552,   48,  402, 1554,   49,
+      777,  776,   50,  777,  402,   42,   42,   53,   54,   54,
+       54,   42,  427,  402,   42,  401,  401,  401,  404,  404,
 
-      388,  397,  397,  397,   54,  751,   42,   51,   51,   51,
+      404,  413,  413,  413,   54,  776,   42,   51,   51,   51,
        51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,  404,   51,   51,   51,   51,   51,   55,   55,
-       55,   56,   56,   56,   57,   57,   57,  424,  404,   58,
-       58,   58, 1171,  416,   55,  411,  429,   56, 1171,  444,
-       57, 1538,  457,   51,   51,   58,   59,   59,   59,  416,
-      676,   51,  429,   51,  398,  444,   51,  401,  401,  401,
-       51, 1547,   59, 1549,   51,   52,   52,   52,   52,   52,
+       51,   51,  420,   51,   51,   51,   51,   51,   55,   55,
+       55,   56,   56,   56,   57,   57,   57,  440,  420,   58,
+       58,   58, 1202,  432,   55,  427,  445,   56, 1202,  460,
+       57, 1555,  473,   51,   51,   58,   59,   59,   59,  432,
+      692,   51,  445,   51,  414,  460,   51,  417,  417,  417,
+       51, 1557,   59, 1558,   51,   52,   52,   52,   52,   52,
        52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
-      424,   52,   52,   52,   52,   52,   60,   60,   60,   63,
-
-       63,   63,   64,   64,   64,  457,  452,   67,   67,   67,
-      676,  462,   60,  398,  452,   63,  758,  398,   64,  452,
-      468,   52,   52,   67,   68,   68,   68,  462, 1296,   52,
-      758,   52,  410, 1558,   52,  409,  409,  409,   52, 1563,
-       68, 1296,   52,   61,   61,   61,   61,   61,   61,   61,
-       61,   61,   61,   61,   61,   61,   61,   61,  473,   61,
+      440,   52,   52,   52,   52,   52,   60,   60,   60,   63,
+
+       63,   63,   64,   64,   64,  473,  468,   67,   67,   67,
+      692,  478,   60,  414,  468,   63,  783,  414,   64,  468,
+      484,   52,   52,   67,   68,   68,   68,  478, 1330,   52,
+      783,   52,  426, 1559,   52,  425,  425,  425,   52, 1567,
+       68, 1330,   52,   61,   61,   61,   61,   61,   61,   61,
+       61,   61,   61,   61,   61,   61,   61,   61,  489,   61,
        61,   61,   61,   61,   71,   71,   71,   72,   72,   72,
-       73,   73,   73,  468,  473,   74,   74,   74,  567, 1571,
-       71,  410,  567,   72, 1572,  410,   73, 1576,  489,   61,
-       61,   74,   75,   75,   75,   76,   76,   76,  413,  413,
+       73,   73,   73,  484,  489,   74,   74,   74,  583, 1572,
+       71,  426,  583,   72, 1581,  426,   73, 1583,  505,   61,
+       61,   74,   75,   75,   75,   76,   76,   76,  429,  429,
 
-      413,  422,  422,  422,  489,  484,  423, 1581,   75, 1585,
-     1591,   76, 1597,   61,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,   62,  501,
+      429,  438,  438,  438,  505,  500,  439, 1592,   75, 1597,
+     1605,   76, 1606,   61,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,   62,  517,
        62,   62,   62,   62,   62,   77,   77,   77,   78,   78,
-       78,   81,   81,   81, 1602,  501,   82,   82,   82,  634,
-     1604,   77, 1612, 1619,   78,  423,  634,   81,  484,  423,
-       62,   62,   82,   83,   83,   83,   84,   84,   84,  426,
-      426,  426,  438,  438,  438,  441,  441,  441, 1620,   83,
-      310, 1623,   84, 1632,   62,   65,   65,   65,   65,   65,
+       78,   81,   81,   81, 1610,  517,   82,   82,   82,  650,
+     1615,   77, 1619, 1625,   78,  439,  650,   81,  500,  439,
+       62,   62,   82,   83,   83,   83,   84,   84,   84,  442,
+      442,  442,  454,  454,  454,  457,  457,  457, 1631,   83,
+      326, 1636,   84, 1638,   62,   65,   65,   65,   65,   65,
        65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
 
-      513,   65,   65,   65,   65,   65,   85,   85,   85,   86,
-       86,   86,   87,   87,   87,  582,  513,   88,   88,   88,
-      439, 1633,   85,  310,  508,   86,  585,  439,   87,  310,
-      582,   65,   65,   88,  310,   65,  439,  522,  584,  310,
-     1263,  585,   65, 1634, 1263,   65,   66,   66,   66,   66,
+      529,   65,   65,   65,   65,   65,   85,   85,   85,   86,
+       86,   86,   87,   87,   87,  598,  529,   88,   88,   88,
+      455, 1646,   85,  326,  524,   86,  601,  455,   87,  326,
+      598,   65,   65,   88,  326,   65,  455,  538,  600,  326,
+      735,  601,   65, 1651,  735,   65,   66,   66,   66,   66,
        66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,  764,   66,   66,   66,   66,   66,   91,   91,   91,
-       92,   92,   92,   93,   93,   93,  584,  508,   94,   94,
-       94,  775, 1637,   91,  586,  764,   92, 1638,  496,   93,
-      522,  584,   66,   66,   94,  496,   66,  455,  455,  455,
+       66,  789,   66,   66,   66,   66,   66,   91,   91,   91,
+       92,   92,   92,   93,   93,   93,  600,  524,   94,   94,
+       94,  800, 1652,   91,  602,  789,   92, 1653,  512,   93,
+      538,  600,   66,   66,   94,  512,   66,  471,  471,  471,
 
-      459,  459,  459,   66,  496,  775,   66,   69,   69,   69,
+      475,  475,  475,   66,  512,  800,   66,   69,   69,   69,
        69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
-       69,   69,  527,   69,   69,   69,   69,   69,   95,   95,
-       95,   96,   96,   96,   97,   97,   97,  586,  527,   98,
-       98,   98,  724, 1639,   95,  533,  770,   96, 1640,  724,
-       97, 1641,  533,   69,   69,   98,  101,  101,  101,   69,
-      770,  533,   69,  466,  466,  466,  470,  470,  470,  481,
-      481,  481,  101, 1642,   69,   70,   70,   70,   70,   70,
+       69,   69,  543,   69,   69,   69,   69,   69,   95,   95,
+       95,   96,   96,   96,   97,   97,   97,  602,  543,   98,
+       98,   98,  749, 1656,   95,  549,  795,   96, 1657,  749,
+       97, 1660,  549,   69,   69,   98,  101,  101,  101,   69,
+      795,  549,   69,  482,  482,  482,  486,  486,  486,  497,
+      497,  497,  101, 1669,   69,   70,   70,   70,   70,   70,
        70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
-      538,   70,   70,   70,   70,   70,  102,  102,  102,  105,
-
-      105,  105,  106,  106,  106,  765,  538,  107,  107,  107,
-     1643, 1644,  102,  544, 1646,  105,  765,  779,  106,  765,
-      544,   70,   70,  107,  108,  108,  108,   70,  601,  544,
-       70,  486,  486,  486,  495,  495,  495,  498,  498,  498,
-      108,  779,   70,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,  549,   79,
+      554,   70,   70,   70,   70,   70,  102,  102,  102,  105,
+
+      105,  105,  106,  106,  106,  790,  554,  107,  107,  107,
+     1297, 1670,  102,  560, 1297,  105,  790,  804,  106,  790,
+      560,   70,   70,  107,  108,  108,  108,   70,  617,  560,
+       70,  502,  502,  502,  511,  511,  511,  514,  514,  514,
+      108,  804,   70,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,  565,   79,
        79,   79,   79,   79,  109,  109,  109,  110,  110,  110,
-      111,  111,  111,  623,  549,  112,  112,  112, 1648, 1649,
-      109,  601, 1651,  110, 1652, 1654,  111, 1655,  623,   79,
-       79,  112,  115,  115,  115,   79,  505,  505,  505,  510,
+      111,  111,  111,  639,  565,  112,  112,  112, 1671, 1674,
+      109,  617, 1675,  110, 1676, 1016,  111, 1677,  639,   79,
+       79,  112,  115,  115,  115,   79,  521,  521,  521,  526,
 
-      510,  510,  520,  520,  520,  524,  524,  524,  115, 1656,
+      526,  526,  536,  536,  536,  540,  540,  540,  115, 1016,
        79,   80,   80,   80,   80,   80,   80,   80,   80,   80,
-       80,   80,   80,   80,   80,   80,  560,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,  576,   80,   80,   80,
        80,   80,  116,  116,  116,  117,  117,  117,  118,  118,
-      118,  777,  560,  119,  119,  119, 1657, 1660,  116, 1661,
-     1662,  117, 1663, 1664,  118,  777,  638,   80,   80,  119,
-      120,  120,  120,   80,  532,  532,  532,  535,  535,  535,
-      543,  543,  543,  546,  546,  546,  120, 1666,   80,   89,
+      118,  802,  576,  119,  119,  119, 1678, 1679,  116, 1680,
+     1681,  117, 1683, 1017,  118,  802,  654,   80,   80,  119,
+      120,  120,  120,   80,  548,  548,  548,  551,  551,  551,
+      559,  559,  559,  562,  562,  562,  120, 1017,   80,   89,
        89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
-       89,   89,   89,   89,  576,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,  592,   89,   89,   89,   89,   89,
 
-      121,  121,  121,  122,  122,  122,  125,  125,  125,  638,
-      576,  126,  126,  126, 1669, 1670,  121,  555,  780,  122,
-     1671, 1673,  125, 1675,  555,   89,   89,  126,  127,  127,
-      127,   89,  780,  555,   89,  554,  554,  554,  557,  557,
-      557,  569,  569,  569,  127, 1679,   89,   90,   90,   90,
+      121,  121,  121,  122,  122,  122,  125,  125,  125,  654,
+      592,  126,  126,  126, 1685, 1686,  121,  571,  805,  122,
+     1688, 1018,  125, 1689,  571,   89,   89,  126,  127,  127,
+      127,   89,  805,  571,   89,  570,  570,  570,  573,  573,
+      573,  585,  585,  585,  127, 1018,   89,   90,   90,   90,
        90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,  591,   90,   90,   90,   90,   90,  128,  128,
-      128,  129,  129,  129,  130,  130,  130, 1420,  591,  131,
-      131,  131, 1680, 1684,  128,  570, 1687,  129, 1690, 1420,
-      130,  571,  570,   90,   90,  131,  132,  132,  132,   90,
+       90,   90,  607,   90,   90,   90,   90,   90,  128,  128,
+      128,  129,  129,  129,  130,  130,  130, 1691,  607,  131,
+      131,  131, 1692, 1693,  128,  586, 1694,  129, 1697, 1019,
+      130,  587,  586,   90,   90,  131,  132,  132,  132,   90,
 
-      663,  570,   90,  573,  573,  573,  678,  571,  580,  580,
-      580,  332,  132, 1691,   90,   99,   99,   99,   99,   99,
+      679,  586,   90,  589,  589,  589,  694,  587,  596,  596,
+      596,  348,  132, 1019,   90,   99,   99,   99,   99,   99,
        99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
-      606,   99,   99,   99,   99,   99,  135,  135,  135,  136,
-      136,  136,  139,  139,  139,  715,  606,  140,  140,  140,
-      332,  571,  135,  663,  583,  136,  730,  617,  139,  678,
-      728,   99,   99,  140,  332,   99,  332,  583,  332,  583,
-     1692,  730,   99,  617, 1694,   99,  588,  588,  588,   99,
-     1697,   99,   99,  100,  100,  100,  100,  100,  100,  100,
-      100,  100,  100,  100,  100,  100,  100,  100,  715,  100,
+      622,   99,   99,   99,   99,   99,  135,  135,  135,  136,
+      136,  136,  139,  139,  139,  740,  622,  140,  140,  140,
+      348,  587,  135,  679,  599,  136,  944,  633,  139,  694,
+      753,   99,   99,  140,  348,   99,  348,  599,  348,  599,
+      944,  733,   99,  633, 1698,   99,  604,  604,  604,   99,
+     1699,   99,   99,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  740,  100,
 
       100,  100,  100,  100,  141,  141,  141,  142,  142,  142,
-      143,  143,  143,  728,  621,  144,  144,  144,  621, 1698,
-      141, 1703,  621,  142, 1704,  612,  143,  750, 1628,  100,
-      100,  144,  612,  100,  599,  599,  599,  603,  603,  603,
-      100,  612,  750,  100,  611,  611,  611,  100, 1628,  100,
+      143,  143,  143,  753,  637,  144,  144,  144,  637, 1700,
+      141, 1701,  637,  142,  733,  628,  143,  755,  733,  100,
+      100,  144,  628,  100,  615,  615,  615,  619,  619,  619,
+      100,  628,  755,  100,  627,  627,  627,  100, 1703,  100,
       100,  103,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  631,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  647,  103,  103,  103,
       103,  103,  145,  145,  145,  146,  146,  146,  149,  149,
-      149,  797,  631,  150,  150,  150, 1719, 1720,  145, 1728,
-     1729,  146,  916,  626,  149, 1731,  797,  103,  103,  150,
+      149,  775,  647,  150,  150,  150, 1706, 1707,  145, 1708,
+     1710,  146,  822,  642,  149,  941,  775,  103,  103,  150,
 
-      626,  103,  103,  614,  614,  614,  637,  916,  103,  626,
-     1753,  103,  625,  625,  625,  103, 1754,  103,  103,  103,
+      642,  103,  103,  630,  630,  630,  653,  822,  103,  642,
+      941,  103,  641,  641,  641,  103, 1712,  103,  103,  103,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  104,  104,  643,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  659,  104,  104,  104,  104,
       104,  151,  151,  151,  152,  152,  152,  153,  153,  153,
-      917,  643,  154,  154,  154,  637, 1757,  151, 1027,  637,
-      152,  917,  649,  153,  917,  919,  104,  104,  154,  649,
-      104,  104,  628,  628,  628, 1027, 1759,  104,  649,  919,
-      104,  636,  636,  636,  104, 1761,  104,  104,  104,  113,
+      942,  659,  154,  154,  154,  653, 1716,  151, 1058,  653,
+      152,  942,  665,  153,  942,  945,  104,  104,  154,  665,
+      104,  104,  644,  644,  644, 1058,  945,  104,  665,  945,
+      104,  652,  652,  652,  104,  731,  104,  104,  104,  113,
       113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
 
-      113,  113,  113,  113,  654,  113,  113,  113,  113,  113,
-      155,  155,  155,  156,  156,  156,  159,  159,  159, 1769,
-      654,  160,  160,  160, 1770, 1771,  155, 1772,  668,  156,
-     1774, 1780,  159,  727, 1782,  113,  113,  160,  640,  640,
-      640,  648,  648,  648,  668,  581,  113,  114,  114,  114,
+      113,  113,  113,  113,  670,  113,  113,  113,  113,  113,
+      155,  155,  155,  156,  156,  156,  159,  159,  159, 1454,
+      670,  160,  160,  160,  731, 1717,  155, 1721,  684,  156,
+     1724, 1454,  159,  752,  731,  113,  113,  160,  656,  656,
+      656,  664,  664,  664,  684,  597,  113,  114,  114,  114,
       114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
-      114,  114,  683,  114,  114,  114,  114,  114,  163,  163,
-      163,  164,  164,  164,  167,  167,  167,  920,  683,  168,
-      168,  168,  727,  581,  163,  581,  727,  164,  920, 1784,
-      167,  920, 1785,  114,  114,  168, 1790, 1792,  581, 1793,
+      114,  114,  699,  114,  114,  114,  114,  114,  163,  163,
+      163,  164,  164,  164,  167,  167,  167, 1020,  699,  168,
+      168,  168,  752,  597,  163,  597,  752,  164, 1020, 1727,
+      167, 1020, 1728,  114,  114,  168, 1729, 1731,  597, 1734,
 
-      581,  651,  651,  651,  114,  123,  123,  123,  123,  123,
+      597,  667,  667,  667,  114,  123,  123,  123,  123,  123,
       123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
-      694,  123,  123,  123,  123,  123,  171,  171,  171,  172,
-      172,  172,  173,  173,  173, 1795,  694,  174,  174,  174,
-     1796, 1797,  171, 1798,  706,  172, 1799, 1802,  173, 1803,
-     1804,  123,  123,  174,  123,  720,  123,  661,  661,  661,
-      706, 1808,  123,  665,  665,  665,  675,  675,  675,  123,
-     1817,  720,  123,  124,  124,  124,  124,  124,  124,  124,
-      124,  124,  124,  124,  124,  124,  124,  124, 1820,  124,
+      710,  123,  123,  123,  123,  123,  171,  171,  171,  172,
+      172,  172,  173,  173,  173, 1735,  710,  174,  174,  174,
+     1740, 1665,  171, 1741,  722,  172, 1021, 1756,  173,  738,
+     1757,  123,  123,  174,  123,  745,  123,  677,  677,  677,
+      722, 1665,  123,  681,  681,  681,  691,  691,  691,  123,
+     1021,  745,  123,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124,  738,  124,
       124,  124,  124,  124,  177,  177,  177,  178,  178,  178,
 
-      179,  179,  179, 1828,  757,  180,  180,  180, 1830, 1832,
-      177,  757, 1000,  178, 1833, 1834,  179,  757, 1836,  124,
-      124,  180,  124, 1841,  124,  680,  680,  680, 1000, 1844,
-      124,  691,  691,  691,  700,  700,  700,  124, 1845, 1135,
+      179,  179,  179, 1765,  738,  180,  180,  180, 1766, 1768,
+      177, 1790, 1031,  178, 1791, 1794,  179, 1796, 1798,  124,
+      124,  180,  124, 1806,  124,  696,  696,  696, 1031, 1807,
+      124,  707,  707,  707,  716,  716,  716,  124, 1808, 1166,
       124,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133, 1135,  133,  133,  133,
+      133,  133,  133,  133,  133,  133, 1166,  133,  133,  133,
       133,  133,  181,  181,  181,  182,  182,  182,  183,  183,
-      183, 1847, 1302,  184,  184,  184, 1852, 1235,  181,  688,
-     1857,  182, 1858, 1519,  183, 1302,  688,  133,  133,  184,
-      185,  185,  185,  133, 1235,  688, 1519, 1862,  133,  703,
+      183, 1809, 1336,  184,  184,  184, 1811, 1266,  181,  704,
+     1817,  182, 1819, 1553,  183, 1336,  704,  133,  133,  184,
+      185,  185,  185,  133, 1266,  704, 1553,  736,  133,  719,
 
-      703,  703,  711,  711,  711, 1865,  185,  717,  717,  717,
+      719,  719,  727,  727,  727, 1821,  185,  742,  742,  742,
       133,  134,  134,  134,  134,  134,  134,  134,  134,  134,
-      134,  134,  134,  134,  134,  134, 1868,  134,  134,  134,
+      134,  134,  134,  134,  134,  134,  736,  134,  134,  134,
       134,  134,  186,  186,  186,  187,  187,  187,  188,  188,
-      188, 1864, 1871,  189,  189,  189, 1872, 1874,  186,  701,
-     1875,  187, 1876, 1877,  188, 1878,  701,  134,  134,  189,
-      190,  190,  190,  134, 1879,  701, 1864, 1881,  134,  726,
-      726,  726,  729,  729,  729, 1882,  190, 1280, 1280, 1280,
+      188, 1822,  736,  189,  189,  189, 1827, 1829,  186,  717,
+      736,  187, 1830, 1832,  188, 1833,  717,  134,  134,  189,
+      190,  190,  190,  134, 1834,  717, 1835, 1836,  134,  751,
+      751,  751,  754,  754,  754, 1839,  190, 1314, 1314, 1314,
       134,  137,  137,  137,  137,  137,  137,  137,  137,  137,
-      137,  137,  137,  137,  137,  137, 1884,  137,  137,  137,
+      137,  137,  137,  137,  137,  137, 1840,  137,  137,  137,
 
       137,  137,  191,  191,  191,  192,  192,  192,  193,  193,
-      193, 1885,  762,  194,  194,  194, 1103, 1888,  191,  762,
-     1889,  192, 1891, 1893,  193,  762, 1103,  137,  137,  194,
-     1003, 1003, 1003, 1103, 1003,  137,  138,  138,  138,  138,
+      193, 1841,  732,  194,  194,  194, 1845, 1854,  191,  782,
+     1857,  192,  732, 1865,  193, 1867,  782,  137,  137,  194,
+     1869, 1870,  782, 1871, 1873,  137,  138,  138,  138,  138,
       138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
-      138, 1896,  138,  138,  138,  138,  138,  195,  195,  195,
-      196,  196,  196,  199,  199,  199, 1898,  769,  200,  200,
-      200, 1899, 1900,  195,  769, 1901,  196, 1902, 1904,  199,
-      769, 1905,  138,  138,  200,  738,  738,  738, 1909, 1912,
+      138,  732,  138,  138,  138,  138,  138,  195,  195,  195,
+      196,  196,  196,  199,  199,  199, 1878,  787,  200,  200,
+      200, 1134, 1881,  195,  787,  732,  196, 1882, 1884,  199,
+      787, 1134,  138,  138,  200,  763,  763,  763, 1134, 1889,
       138,  147,  147,  147,  147,  147,  147,  147,  147,  147,
 
-      147,  147,  147,  147,  147,  147, 1919,  147,  147,  147,
+      147,  147,  147,  147,  147,  147, 1891,  147,  147,  147,
       147,  147,  201,  201,  201,  202,  202,  202,  203,  203,
-      203, 1920,  776,  204,  204,  204, 1924, 1925,  201,  776,
-     1926,  202, 1928,  918,  203,  776,  921,  147,  147,  204,
-      918,  147, 1932,  921, 1933,  738,  918, 1968,  147,  921,
-     1969,  147, 1976, 1016, 1016, 1016, 1987, 1988,  147,  148,
+      203, 1892,  794,  204,  204,  204, 1893, 1897,  201,  794,
+     1898,  202, 1902,  801,  203,  794,  943,  147,  147,  204,
+      801,  147, 1905,  943, 1908,  763,  801, 1911,  147,  943,
+     1912,  147, 1034, 1034, 1034, 1914, 1034, 1915,  147,  148,
       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148, 1989,  148,  148,  148,  148,  148,
-      205,  205,  205,  206,  206,  206,  209,  209,  209, 1990,
-     1992,  210,  210,  210, 2000, 2002,  205, 2006, 2009,  206,
+      148,  148,  148,  148, 1916,  148,  148,  148,  148,  148,
+      205,  205,  205,  206,  206,  206,  209,  209,  209, 1917,
+      946,  210,  210,  210, 1918, 1919,  205,  946, 1921,  206,
 
-     2011, 2012,  209, 2015, 2016,  148,  148,  210, 2017,  148,
-     1012, 1012, 1012, 2018, 1012, 2022,  148, 1012, 1016,  148,
-     1303, 1303, 1303, 1650, 1650, 1650,  148,  157,  157,  157,
+     1922, 1924,  209,  946, 1925,  148,  148,  210, 1928,  148,
+     1043, 1043, 1043, 1929, 1043, 1931,  148, 1043, 1933,  148,
+     1337, 1337, 1337, 1687, 1687, 1687,  148,  157,  157,  157,
       157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157, 2023,  157,  157,  157,  157,  157,  213,  213,
-      213,  214,  214,  214,  217,  217,  217, 2024, 2029,  218,
-      218,  218, 2033, 2037,  213, 2039, 2041,  214, 2047, 2054,
-      217, 2058, 2059,  157,  157,  218, 1037, 1037, 1037,  157,
-     1645, 1645, 1645, 2061,  157,  158,  158,  158,  158,  158,
+      157,  157, 1936,  157,  157,  157,  157,  157,  213,  213,
+      213,  214,  214,  214,  217,  217,  217, 1938, 1904,  218,
+      218,  218, 1939, 1940,  213, 1941, 1942,  214, 1944, 1945,
+      217, 1949, 1952,  157,  157,  218, 1047, 1047, 1047,  157,
+     1682, 1682, 1682, 1904,  157,  158,  158,  158,  158,  158,
       158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
 
-     2068,  158,  158,  158,  158,  158,  219,  219,  219,  220,
-      220,  220,  221,  221,  221, 2075, 2079,  222,  222,  222,
-     2081, 2082,  219, 2084, 2085,  220, 2087, 1645,  221, 2088,
-     2089,  158,  158,  222, 1050, 1050, 1050,  158, 1647, 1647,
-     1647, 1037,  158,  161,  161,  161,  161,  161,  161,  161,
-      161,  161,  161,  161,  161,  161,  161,  161, 2075,  161,
+     1959,  158,  158,  158,  158,  158,  219,  219,  219,  220,
+      220,  220,  221,  221,  221, 1960, 1964,  222,  222,  222,
+     1965, 1966,  219, 1968, 1972,  220, 1973, 1682,  221, 2008,
+     2009,  158,  158,  222, 1068, 1068, 1068,  158, 1081, 1081,
+     1081, 1047,  158,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161, 2016,  161,
       161,  161,  161,  161,  223,  223,  223,  224,  224,  224,
-      227,  227,  227, 2076, 2090,  228,  228,  228, 2092, 2093,
-      223, 2074, 2097,  224, 2099, 1647,  227, 2100, 2101,  161,
-      161,  228,  231,  231,  231,  232,  232,  232, 2074, 1050,
+      227,  227,  227, 2027, 2028,  228,  228,  228, 2029, 2030,
+      223, 2032, 2040,  224, 2042, 2046,  227, 2049, 2051,  161,
+      161,  228,  231,  231,  231,  232,  232,  232, 2052, 1068,
 
-      161, 2102, 1074, 1074, 1074, 2104, 1074, 2076,  231, 1074,
-     2105,  232, 2106,  161,  162,  162,  162,  162,  162,  162,
-      162,  162,  162,  162,  162,  162,  162,  162,  162, 2083,
+      161, 2055, 2056, 1081, 2057, 1105, 1105, 1105,  231, 1105,
+     2058,  232, 1105,  161,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162, 2062,
       162,  162,  162,  162,  162,  233,  233,  233,  234,  234,
-      234,  235,  235,  235, 2107, 2083,  236,  236,  236, 2110,
-     2112,  233, 2113, 2083,  234, 2118, 2120,  235, 2121, 2122,
-      162,  162,  236,  237,  237,  237,  238,  238,  238, 2123,
-     2124,  162, 2126, 1093, 1093, 1093, 2131, 1093, 2159,  237,
-     1093, 2160,  238, 2161,  162,  165,  165,  165,  165,  165,
+      234,  235,  235,  235, 2063, 2064,  236,  236,  236, 2069,
+     2073,  233, 2077, 2079,  234, 2081, 2087,  235, 2094, 2098,
+      162,  162,  236,  237,  237,  237,  238,  238,  238, 2099,
+     2101,  162, 2108, 1124, 1124, 1124, 2110, 1124, 2111,  237,
+     1124, 2112,  238, 2117,  162,  165,  165,  165,  165,  165,
       165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
 
-     2103,  165,  165,  165,  165,  165,  241,  241,  241,  242,
-      242,  242,  243,  243,  243, 2165, 2103,  244,  244,  244,
-     2166, 2172,  241, 2173, 2103,  242, 2176, 2177,  243, 2183,
-     2189,  165,  165,  244,  245,  245,  245, 1095, 1095, 1095,
-     2191, 1095, 2192, 2195, 1095, 2201, 2203,  165, 2209, 2213,
-      245, 2216,  165,  166,  166,  166,  166,  166,  166,  166,
-      166,  166,  166,  166,  166,  166,  166,  166, 2221,  166,
+     2117,  165,  165,  165,  165,  165,  241,  241,  241,  242,
+      242,  242,  243,  243,  243, 2119, 2122,  244,  244,  244,
+     2124, 2125,  241, 2127, 2128,  242, 2130, 2126,  243, 2131,
+     2132,  165,  165,  244,  245,  245,  245, 1126, 1126, 1126,
+     2118, 1126, 2133, 2126, 1126, 2135, 2136,  165, 2140, 2119,
+      245, 2126,  165,  166,  166,  166,  166,  166,  166,  166,
+      166,  166,  166,  166,  166,  166,  166,  166, 2142,  166,
       166,  166,  166,  166,  246,  246,  246,  247,  247,  247,
-      248,  248,  248, 2223, 2224,  255,  255,  255, 2225, 2226,
-      246, 2233, 2235,  247, 2237, 2239,  248,  252,  252,  166,
+      248,  248,  248, 2118, 2143,  255,  255,  255, 2144, 2145,
+      246, 2147, 2148,  247, 2149, 2150,  248,  252,  252,  166,
 
-      166,  255,  252,  256,  256,  256, 1105, 1105, 1105, 2252,
-     1105, 2253,  252, 1105, 2254,  166, 1653, 1653, 1653,  256,
+      166,  255,  252,  256,  256,  256, 1136, 1136, 1136, 2153,
+     1136, 2155,  252, 1136, 2156,  166, 1684, 1684, 1684,  256,
       166,  169,  169,  169,  169,  169,  169,  169,  169,  169,
-      169,  169,  169,  169,  169,  169, 2257,  169,  169,  169,
+      169,  169,  169,  169,  169,  169, 2146,  169,  169,  169,
       169,  169,  252,  259,  259,  259,  260,  260,  260,  261,
-      261,  261, 2258,  262,  262,  262,  746,  746,  746,  259,
-     2260, 2261,  260, 2262, 2264,  261, 2259,  169,  169,  262,
-      169,  169,  169,  746, 2259, 1108, 1108, 1108,  169, 1108,
-     2276,  169, 1108, 2284, 2280, 1146, 1146, 1146,  169,  170,
+      261,  261, 2146,  262,  262,  262,  771,  771,  771,  259,
+     2146, 2161,  260, 1684, 2163,  261, 2164,  169,  169,  262,
+      169,  169,  169,  771, 2165, 1139, 1139, 1139,  169, 1139,
+     2166,  169, 1139, 2167, 2169, 1177, 1177, 1177,  169,  170,
       170,  170,  170,  170,  170,  170,  170,  170,  170,  170,
 
-      170,  170,  170,  170, 2285,  170,  170,  170,  170,  170,
-      263,  263,  263,  264,  264,  264,  265,  265,  265, 2263,
-     2286,  266,  266,  266, 2278, 2287,  263, 2263, 2288,  264,
-     2278, 2280,  265, 2292, 2294,  170,  170,  266,  170,  170,
-      170, 1122, 1122, 1122, 2295, 1122,  170, 2296, 1122,  170,
-     1146, 1658, 1658, 1658, 2301, 2302,  170,  175,  175,  175,
+      170,  170,  170,  170, 2174,  170,  170,  170,  170,  170,
+      263,  263,  263,  264,  264,  264,  265,  265,  265, 2202,
+     2203,  266,  266,  266, 2204, 2208,  263, 2209, 2215,  264,
+     2216, 2219,  265, 2220, 2226,  170,  170,  266,  170,  170,
+      170, 1153, 1153, 1153, 2232, 1153,  170, 2234, 1153,  170,
+     1177, 1690, 1690, 1690, 2235, 2238,  170,  175,  175,  175,
       175,  175,  175,  175,  175,  175,  175,  175,  175,  175,
-      175,  175, 2304,  175,  175,  175,  175,  175,  267,  267,
-      267,  268,  268,  268,  269,  269,  269, 1658, 2279,  270,
-      270,  270, 2305, 2306,  267, 2307, 2310,  268, 2314, 2315,
+      175,  175, 2244,  175,  175,  175,  175,  175,  267,  267,
+      267,  268,  268,  268,  269,  269,  269, 2246, 2252,  270,
+      270,  270, 2256, 2259,  267, 2264, 2266,  268, 2267, 2268,
 
-      269, 2322, 2324,  175,  175,  270,  271,  271,  271,  272,
-      272,  272, 1129, 1129, 1129, 2331, 1129, 2333, 2364, 1129,
-     2279, 2365,  271, 2366, 2372,  272, 2373,  175,  176,  176,
+      269, 2269, 2276,  175,  175,  270,  271,  271,  271,  272,
+      272,  272, 1160, 1160, 1160, 2278, 1160, 2280, 2282, 1160,
+     2295, 2296,  271, 2297, 2300,  272, 2301,  175,  176,  176,
       176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
-      176,  176,  176, 2377,  176,  176,  176,  176,  176,  273,
-      273,  273,  274,  274,  274,  275,  275,  275, 2381, 2382,
-      276,  276,  276, 2386, 2389,  273, 2392, 2393,  274, 2394,
-     2395,  275, 2398, 2401,  176,  176,  276,  277,  277,  277,
-      278,  278,  278, 1138, 1138, 1138, 2405, 1138, 2406, 2407,
-     1138, 2419, 2422,  277, 2424, 2427,  278, 2441,  176,  197,
+      176,  176,  176, 2303,  176,  176,  176,  176,  176,  273,
+      273,  273,  274,  274,  274,  275,  275,  275, 2302, 2304,
+      276,  276,  276, 2305, 2306,  273, 2302, 2307,  274, 2322,
+     2315,  275, 2306, 2316,  176,  176,  276,  277,  277,  277,
+      278,  278,  278, 1169, 1169, 1169, 2315, 1169, 2330, 2316,
+     1169, 2331, 2332,  277, 2315, 2333,  278, 2316,  176,  197,
 
       197,  197,  197,  197,  197,  197,  197,  197,  197,  197,
-      197,  197,  197,  197, 2442,  197,  197,  197,  197,  197,
-      281,  281,  281,  282,  282,  282,  283,  283,  283, 2443,
-     2448,  284,  284,  284, 2449, 2450,  281, 2451, 2452,  282,
-     2453, 2454,  283, 2455, 2456,  197,  197,  284,  285,  285,
-      285, 2457, 2467,  197, 2478,  197, 2479, 2471,  197, 1659,
-     1659, 1659,  197, 2480,  285, 2470,  197,  198,  198,  198,
+      197,  197,  197,  197, 2317,  197,  197,  197,  197,  197,
+      279,  279,  279,  280,  280,  280,  281,  281,  281, 2324,
+     2317,  282,  282,  282, 2334, 2324,  279, 2338, 2317,  280,
+     2340, 2341,  281, 2342, 2347,  197,  197,  282,  283,  283,
+      283, 2326, 2348,  197, 2350,  197, 2351, 2352,  197, 1696,
+     1696, 1696,  197, 2353,  283, 2325,  197,  198,  198,  198,
       198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
-      198,  198, 2483,  198,  198,  198,  198,  198,  286,  286,
-      286,  287,  287,  287,  288,  288,  288, 2486,  805,  805,
+      198,  198, 2356,  198,  198,  198,  198,  198,  284,  284,
+      284,  285,  285,  285,  286,  286,  286, 2325, 2326,  287,
 
-      805,  827,  827,  827,  286, 2471, 2490,  287, 2491, 2470,
-      288, 2492, 2495,  198,  198,  805, 2496,  331,  827, 2497,
-     2500,  198,  506,  198, 2503, 2504,  198,  331, 2505, 2506,
-      198, 2528,  506, 2529,  198,  207,  207,  207,  207,  207,
+      287,  287, 2360, 2361,  284, 2368, 2370,  285, 2377, 2379,
+      286, 2410, 2411,  198,  198,  287,  288,  288,  288, 2412,
+     2418,  198, 2419,  198, 2423, 2427,  198, 1702, 1702, 1702,
+      198, 2428,  288, 2432,  198,  207,  207,  207,  207,  207,
       207,  207,  207,  207,  207,  207,  207,  207,  207,  207,
-     2535,  207,  207,  207,  207,  207,  331, 2536, 2542,  828,
-      828,  828,  506, 2530, 2543, 1014, 1014, 1014,  506, 2544,
-      331, 2558,  331, 2530,  331,  506,  828, 2559, 2560,  506,
-      331,  207,  207, 1014, 2580,  506, 2581, 2592,  714, 1140,
-     1140, 1140,  207, 1140, 2593, 2598, 1140, 2599,  714, 2600,
+     2435,  207,  207,  207,  207,  207,  289,  289,  289,  290,
+      290,  290,  291,  291,  291, 2438, 2439,  292,  292,  292,
+     2440, 2441,  289, 2444, 1702,  290, 2447, 2451,  291, 2452,
+     2453,  207,  207,  292,  293,  293,  293,  294,  294,  294,
+     2465, 2468,  207, 2470, 1171, 1171, 1171, 2473, 1171, 2487,
 
-     1665, 1665, 1665, 2601, 2602,  207,  208,  208,  208,  208,
+      293, 1171, 2488,  294, 2489,  207,  208,  208,  208,  208,
       208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
-      208, 2603,  208,  208,  208,  208,  208,  714, 2604,  838,
-      838,  838,  840,  840,  840, 2605, 2606,  854,  854,  854,
-     2607,  714, 2612,  714, 2617,  714,  838, 1665, 2618,  840,
-     2620,  714,  208,  208,  854,  860,  860,  860,  869,  869,
-      869, 2619, 2621,  208, 1150, 1150, 1150, 2622, 1150, 2623,
-     2619, 1150,  860, 2625, 2615,  869,  208,  211,  211,  211,
+      208, 2494,  208,  208,  208,  208,  208,  297,  297,  297,
+      298,  298,  298,  299,  299,  299, 2495, 2496,  300,  300,
+      300, 2497, 2498,  297, 2499, 2500,  298, 2501, 2502,  299,
+     2503, 2513,  208,  208,  300,  301,  301,  301,  302,  302,
+      302, 2524, 2525,  208, 2526,  347, 1181, 1181, 1181, 2529,
+     1181,  301, 2516, 1181,  302,  347,  208,  211,  211,  211,
       211,  211,  211,  211,  211,  211,  211,  211,  211,  211,
-      211,  211, 2626,  211,  211,  211,  211,  211,  870,  870,
+      211,  211, 2517,  211,  211,  211,  211,  211,  303,  303,
 
-      870,  881,  881,  881,  889,  889,  889, 2615,  893,  893,
-      893,  906,  906,  906, 2629,  870, 2630, 2624,  881, 2631,
-     2634,  889, 2616,  211,  211,  893, 2624, 2636,  906, 1158,
-     1158, 1158,  211, 1158,  211, 2637, 1158, 2640,  211, 2641,
-     1667, 1667, 1667,  211,  211,  212,  212,  212,  212,  212,
+      303,  304,  304,  304,  347, 1695, 1695, 1695,  830,  830,
+      830, 1045, 1045, 1045,  303, 2532, 2516,  304,  347, 2536,
+      347,  730,  347,  211,  211,  830,  522, 2537,  347, 1045,
+     2538,  730,  211, 2541,  211, 2542,  522, 2543,  211, 2546,
+     2517, 1695, 2549,  211,  211,  212,  212,  212,  212,  212,
       212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-     2616,  212,  212,  212,  212,  212,  932,  932,  932,  938,
-      938,  938,  955,  955,  955, 2642,  961,  961,  961,  967,
-      967,  967, 2644,  932, 2645, 2647,  938, 1667, 2668,  955,
-     2669,  212,  212,  961, 2670, 2671,  967, 1162, 1162, 1162,
-
-      212, 1162,  212, 2674, 1162, 2675,  212, 1668, 1668, 1668,
-     2681,  212,  212,  215,  215,  215,  215,  215,  215,  215,
-      215,  215,  215,  215,  215,  215,  215,  215, 2682,  215,
-      215,  215,  215,  215,  975,  975,  975,  988,  988,  988,
-     1011, 1011, 1011, 2689, 1054, 1054, 1054, 1056, 1056, 1056,
-     2690,  975, 2691, 2699,  988, 2700, 2677, 1011, 2677,  215,
-      215, 1054, 2715, 2716, 1056,  215, 1174, 1174, 1174, 2717,
-     1174, 2677, 2721, 1174, 2722, 1672, 1672, 1672, 2723, 2724,
+      730,  212,  212,  212,  212,  212,  522, 2550,  852,  852,
+      852, 2551,  522, 2552,  730, 1705, 1705, 1705,  730,  522,
+      853,  853,  853,  522,  730,  852,  863,  863,  863,  522,
+     2574,  212,  212,  865,  865,  865, 2575,  853, 2581, 2582,
+
+      212, 2588,  212,  863,  737, 2589,  212, 1913, 1913, 1913,
+      865,  212,  212,  215,  215,  215,  215,  215,  215,  215,
+      215,  215,  215,  215,  215,  215,  215,  215, 2576,  215,
+      215,  215,  215,  215,  737,  879,  879,  879, 2576,  737,
+     2590,  885,  885,  885,  894,  894,  894,  737, 2604,  737,
+      737, 2605,  879,  895,  895,  895, 2606,  737,  885,  215,
+      215,  894,  906,  906,  906,  215, 2626, 1189, 1189, 1189,
+      895, 1189, 2627, 2638, 1189, 2639, 1704, 1704, 1704,  906,
       215,  216,  216,  216,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  216,  216, 2725,  216,  216,  216,
+      216,  216,  216,  216,  216,  216, 2644,  216,  216,  216,
 
-      216,  216, 1015, 1015, 1015, 1058, 1058, 1058, 1059, 1059,
-     1059, 1672, 2726, 1055, 1055, 1055, 2727, 1057, 1057, 1057,
-     1015, 2728, 2729, 1058, 2730, 2063, 1059,  216,  216, 2731,
-     1055, 2063, 2732,  216, 1057, 2063, 1196, 1196, 1196, 1015,
-     1196, 2063, 2734, 1196, 2735, 1059, 2737, 2738,  216,  225,
+      216,  216,  914,  914,  914,  918,  918,  918,  931,  931,
+      931, 2645,  957,  957,  957,  963,  963,  963, 2646,  914,
+     2647, 2648,  918, 1704, 2649,  931, 2650,  216,  216,  957,
+     2651, 2652,  963,  216, 1193, 1193, 1193, 2653, 1193, 2658,
+     2663, 1193, 2664, 1709, 1709, 1709, 2666, 2667,  216,  225,
       225,  225,  225,  225,  225,  225,  225,  225,  225,  225,
-      225,  225,  225,  225, 1055,  225,  225,  225,  225,  225,
-     1066, 1066, 1066, 1070, 1070, 1070, 2739, 1057, 2740, 1055,
-     1067, 1067, 1067, 1071, 1071, 1071, 2742, 2678, 1066, 2678,
-     2736, 1070, 1674, 1674, 1674,  225,  225, 2743, 1067, 2736,
+      225,  225,  225,  225, 2668,  225,  225,  225,  225,  225,
+      980,  980,  980,  986,  986,  986,  992,  992,  992, 1709,
+     1000, 1000, 1000, 2665, 1013, 1013, 1013,  980, 2669, 2661,
+      986, 2671, 2665,  992, 2672,  225,  225, 1000, 2675, 2662,
 
-      225, 1071, 2678, 1686, 1686, 1686,  225,  226,  226,  226,
+      225, 1013, 1711, 1711, 1711, 2676,  225,  226,  226,  226,
       226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
-      226,  226, 2741,  226,  226,  226,  226,  226, 1674, 2744,
-     1067, 2741, 1073, 1073, 1073, 2749, 2748, 1076, 1076, 1076,
-     2750, 1077, 1077, 1077, 1078, 1078, 1078, 2751, 1071, 1073,
-     1686, 2752, 2746,  226,  226, 1076, 2747, 2753,  226, 1077,
-     2754, 1078, 2755, 2756,  226,  229,  229,  229,  229,  229,
+      226,  226, 2661,  226,  226,  226,  226,  226, 1042, 1042,
+     1042, 1085, 1085, 1085, 1087, 1087, 1087, 2662, 1711, 1086,
+     1086, 1086, 1088, 1088, 1088, 1042, 2670, 2677, 1085, 2680,
+     2682, 1087, 2683,  226,  226, 2670, 1086, 2686,  226, 1088,
+     1920, 1920, 1920, 2687,  226,  229,  229,  229,  229,  229,
       229,  229,  229,  229,  229,  229,  229,  229,  229,  229,
-     2748,  229,  229,  229,  229,  229, 1080, 1080, 1080, 1077,
-     1081, 1081, 1081, 2746, 2747, 1082, 1082, 1082, 1079, 1079,
-
-     1079, 2757, 2758, 1080, 1083, 1083, 1083, 2759, 1081, 2760,
-     2761,  229,  229, 1082,  229, 1079,  229, 1873, 1873, 1873,
-     2762, 1083,  229, 1202, 1202, 1202, 2763, 1202, 2766, 2767,
-     1202, 2769, 2770,  229,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  230,  230, 1079,
-      230,  230,  230,  230,  230, 1084, 1084, 1084, 1085, 1085,
-     1085, 1086, 1086, 1086, 1079, 2771, 2773, 1082, 2774, 1087,
-     1087, 1087, 1084, 1088, 1088, 1088, 1085, 2794, 2795, 1086,
-      230,  230, 2797,  230, 2801,  230, 1087, 1880, 1880, 1880,
-     1088,  230, 1218, 1218, 1218, 2802, 1218, 2803, 2805, 1218,
-
-     2806, 2808,  230,  239,  239,  239,  239,  239,  239,  239,
-      239,  239,  239,  239,  239,  239,  239,  239, 2809,  239,
-      239,  239,  239,  239, 1088, 1089, 1089, 1089, 1090, 1090,
-     1090, 2064, 2817, 1086, 1091, 1091, 1091, 2064, 2818, 1088,
-     2804, 2064, 1089, 1101, 1101, 1101, 1090, 2064, 2819,  239,
-      239, 2804, 1091, 2831,  239, 1224, 1224, 1224, 2807, 1224,
-      239, 1101, 1224, 2847,  239, 1883, 1883, 1883, 2853, 2807,
+     2688,  229,  229,  229,  229,  229, 1046, 1046, 1046, 2690,
+     1086, 1089, 1089, 1089, 2691, 1090, 1090, 1090, 2693, 1097,
+
+     1097, 1097, 1088, 2714, 1046, 1086, 1098, 1098, 1098, 1089,
+     2715,  229,  229, 1090,  229, 2716,  229, 1097, 2717, 1805,
+     1805, 1805,  229, 1046, 1098, 2720, 2721, 1723, 1723, 1723,
+     2727, 2728, 1090,  229,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  230,  230, 2735,
+      230,  230,  230,  230,  230, 1805, 1098, 1101, 1101, 1101,
+     1102, 1102, 1102, 2736, 2737, 1104, 1104, 1104, 1107, 1107,
+     1107, 1109, 1109, 1109, 1723, 1101, 2745, 2746, 1102, 2761,
+      230,  230, 1104,  230, 2762,  230, 1107, 2763, 1109, 2767,
+     2768,  230, 1205, 1205, 1205, 2769, 1205, 2770, 2771, 1205,
+
+     2772, 2773,  230,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  239,  239,  239, 2774,  239,
+      239,  239,  239,  239, 2775, 1102, 2776, 1111, 1111, 1111,
+     1112, 1112, 1112, 1113, 1113, 1113, 2777, 2778, 1108, 1108,
+     1108, 1110, 1110, 1110, 1111, 1114, 1114, 1114, 1112,  239,
+      239, 1113, 2780, 2103,  239, 2781, 1108, 2783, 1110, 2103,
+      239, 2784, 1114, 2103,  239, 1923, 1923, 1923, 2785, 2103,
       239,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-      240,  240,  240,  240,  240,  240, 2854,  240,  240,  240,
-      240,  240, 1092, 1092, 1092, 1094, 1094, 1094, 1096, 1096,
+      240,  240,  240,  240,  240,  240, 1108,  240,  240,  240,
+      240,  240, 1110, 1115, 1115, 1115, 1116, 1116, 1116, 2786,
 
-     1096, 1230, 1230, 1230, 2855, 1230, 1091, 2856, 1230, 1092,
-     2857, 2858, 1094, 2859, 2860, 1096, 2845,  240,  240, 1097,
-     1097, 1097,  240, 1238, 1238, 1238, 2845, 1238,  240, 2845,
-     1238, 2861,  240, 1886, 1886, 1886, 1097, 2862,  240,  249,
+     2782, 1117, 1117, 1117, 2788, 1113, 2723, 1110, 2723, 2782,
+     1115, 1121, 1121, 1121, 1116, 2789, 2790,  240,  240, 1117,
+     2795, 2723,  240, 1227, 1227, 1227, 2796, 1227,  240, 1121,
+     1227, 2797,  240, 1926, 1926, 1926, 2798, 2799,  240,  249,
       249,  249,  249,  249,  249,  249,  249,  249,  249,  249,
-      249,  249,  249,  249, 2864,  249,  249,  249,  249,  249,
-     1887, 1887, 1887, 1098, 1098, 1098, 2865, 1104, 1104, 1104,
-     2866, 2867, 1097, 1099, 1099, 1099, 2868, 1100, 1100, 1100,
-     1098, 1102, 1102, 1102, 1104,  249,  249, 1890, 1890, 1890,
-     1099, 2869, 2870,  249, 1100, 2871,  249, 2872, 2873, 1102,
-
-     1892, 1892, 1892,  249,  250,  250,  250,  250,  250,  250,
-      250,  250,  250,  250,  250,  250,  250,  250,  250, 1098,
-      250,  250,  250,  250,  250, 1099, 1107, 1107, 1107, 1102,
-     1100, 1109, 1109, 1109, 1119, 1119, 1119, 1120, 1120, 1120,
-     1121, 1121, 1121, 1107, 1123, 1123, 1123, 2874, 1109, 2875,
-      250,  250, 1119, 2846, 2878, 1120, 2881, 1121,  250, 2882,
-     2883,  250, 1123, 2846, 2884, 1892, 2846, 2885,  250,  253,
+      249,  249,  249,  249, 2800,  249,  249,  249,  249,  249,
+     1118, 1118, 1118, 1120, 1120, 1120, 1122, 1122, 1122, 2787,
+     1123, 1123, 1123, 1117, 1119, 1119, 1119, 1118, 2787, 2801,
+     1120, 1125, 1125, 1125, 1122,  249,  249, 1123, 1233, 1233,
+     1233, 1119, 1233,  249, 2802, 1233,  249, 2794, 1125, 1927,
+
+     1927, 1927, 2803,  249,  250,  250,  250,  250,  250,  250,
+      250,  250,  250,  250,  250,  250,  250,  250,  250, 2804,
+      250,  250,  250,  250,  250, 1119, 1127, 1127, 1127, 2793,
+     2805, 1128, 1128, 1128, 2806, 1129, 1129, 1129, 1122, 2807,
+     1119, 2794, 2808, 1127, 2809, 1130, 1130, 1130, 1128, 2792,
+      250,  250, 1129, 1249, 1249, 1249, 2812, 1249,  250, 2813,
+     1249,  250, 1130, 1930, 1930, 1930, 2815, 2793,  250,  253,
       253,  253,  253,  253,  253,  253,  253,  253,  253,  253,
-      253,  253,  253,  253, 2878,  253,  253,  253,  253,  253,
-     2886, 1124, 1124, 1124, 2887, 2888, 1120, 1128, 1128, 1128,
+      253,  253,  253,  253, 1128,  253,  253,  253,  253,  253,
+     2792, 1129, 1132, 1132, 1132, 2816, 2817, 1130, 2819, 2820,
 
-     1133, 1133, 1133, 1134, 1134, 1134, 1137, 1137, 1137, 1124,
-     1139, 1139, 1139, 2889, 1128,  253,  253, 2890, 1133, 2891,
-     2892, 1134,  253, 1137, 1895, 1895, 1895, 1139,  253, 1250,
-     1250, 1250, 2893, 1250, 2895, 2879, 1250,  253,  254,  254,
+     1131, 1131, 1131, 1135, 1135, 1135, 1138, 1138, 1138, 2840,
+     1132, 1133, 1133, 1133, 2841,  253,  253, 1131, 2843, 2847,
+     1135, 2848,  253, 1138, 1932, 1932, 1932, 2849,  253, 1133,
+     1935, 1935, 1935, 1937, 1937, 1937, 2851,  253,  254,  254,
       254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
-      254,  254,  254, 1124,  254,  254,  254,  254,  254, 1141,
-     1141, 1141, 1144, 1144, 1144, 1134, 2897, 2898, 1142, 1142,
-     1142, 1145, 1145, 1145, 1154, 1154, 1154, 1141, 2879, 2880,
-     1144, 1149, 1149, 1149,  254,  254, 1142, 2899, 2901, 1145,
-     2902,  254, 1154, 1768, 1768, 1768, 2903,  254, 1149, 2915,
+      254,  254,  254, 1131,  254,  254,  254,  254,  254, 1133,
+     1140, 1140, 1140, 1150, 1150, 1150, 1152, 1152, 1152, 1151,
+     1151, 1151, 1154, 1154, 1154, 2852, 2854, 1140, 1155, 1155,
+     1155, 1150, 2855, 1152,  254,  254, 2724, 1151, 2724, 1932,
+     1154,  254, 1943, 1943, 1943, 2863, 1155,  254, 1255, 1255,
 
-     1894, 1894, 1894, 1897, 1897, 1897,  254,  257,  257,  257,
+     1255, 2724, 1255, 2864, 2865, 1255,  254,  257,  257,  257,
       257,  257,  257,  257,  257,  257,  257,  257,  257,  257,
-      257,  257, 2880,  257,  257,  257,  257,  257, 2920, 1768,
-     1142, 2921, 1145, 1155, 1155, 1155, 2922, 2923, 1157, 1157,
-     1157, 1159, 1159, 1159, 1160, 1160, 1160, 1894, 1161, 1161,
-     1161, 1155, 2924,  257,  257, 1157, 1272, 1272, 1272, 1159,
-     1272, 2925, 1160, 1272,  257, 1161, 1903, 1903, 1903, 1906,
-     1906, 1906, 2926,  257,  258,  258,  258,  258,  258,  258,
-      258,  258,  258,  258,  258,  258,  258,  258,  258, 1155,
-      258,  258,  258,  258,  258, 1164, 1164, 1164, 2927, 2928,
-
-     1160, 1165, 1165, 1165, 1168, 1168, 1168, 1169, 1169, 1169,
-     1173, 1173, 1173, 1164, 2929, 1175, 1175, 1175, 2930, 1165,
-      258,  258, 1168, 2938, 2940, 1169, 2907, 1173, 1907, 1907,
-     1907,  258, 1175, 1911, 1911, 1911, 1978, 1978, 1978, 2907,
-      258,  279,  279,  279,  279,  279,  279,  279,  279,  279,
-      279,  279,  279,  279,  279,  279, 2944,  279,  279,  279,
-      279,  279, 2908, 1165, 1178, 1178, 1178, 2945, 2946, 1169,
-     2947, 2948, 1179, 1179, 1179, 2908, 1182, 1182, 1182, 1183,
-     1183, 1183, 1178, 1193, 1193, 1193, 2949,  279,  279, 2951,
-     1179, 2958, 2963,  279, 1182, 2964,  279, 1183, 1321, 1321,
-
-     1321, 1193, 1321, 2966, 2958, 1321, 2967, 2969,  279,  280,
-      280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
-      280,  280,  280,  280, 1179,  280,  280,  280,  280,  280,
-     1194, 1194, 1194, 1195, 1195, 1195, 2959, 2978, 1183, 1198,
-     1198, 1198, 1199, 1199, 1199, 1201, 1201, 1201, 1194, 2959,
-     1195, 1203, 1203, 1203, 2979,  280,  280, 1198, 2980, 2981,
-     1199,  280, 1201, 2983,  280, 1205, 1205, 1205, 1203, 1209,
-     1209, 1209, 1210, 1210, 1210, 2823,  280,  328, 2984, 1211,
-     1211, 1211, 1205, 2985,  328, 2823, 2986, 1209, 2989, 2990,
-     1210, 2823, 2991,  328,  328, 1194, 1211, 1212, 1212, 1212,
-
-     1213, 1213, 1213, 1214, 1214, 1214, 2965, 1199, 1215, 1215,
-     1215, 1217, 1217, 1217, 1212, 2824, 2992, 1213, 2993, 2965,
-     1210, 1214,  328,  328,  328, 2824, 1215, 2994, 1217,  328,
-      328, 2824, 2995,  328,  328, 2996, 2968,  328, 2997,  328,
-      328,  328, 2998, 1219, 1219, 1219, 2999,  328,  330, 2968,
-     3000, 1220, 1220, 1220, 1223, 1223, 1223, 1226, 1226, 1226,
-     1213, 1219, 3006, 3008,  330,  330, 1227, 1227, 1227, 1220,
-     1215, 1223, 1229, 1229, 1229, 1226, 3009, 3010, 1233, 1233,
-     1233, 1234, 1234, 1234, 1227, 1237, 1237, 1237, 3005, 1229,
-     1249, 1249, 1249,  330,  330,  330, 1233, 3011, 3006, 1234,
-
-      330,  330, 1237, 3012,  330,  330, 3013, 1249,  330, 3014,
-      330,  330,  330, 1220, 1241, 1241, 1241, 3015,  330,  712,
-     1242, 1242, 1242, 1247, 1247, 1247,  712, 1248, 1248, 1248,
-     3016, 3017, 1241, 1227, 3018,  712,  712, 3005, 1242, 3019,
-     3020, 1247, 1252, 1252, 1252, 1248, 3022, 3024, 1234, 1253,
-     1253, 1253, 1254, 1254, 1254, 3025, 1255, 1255, 1255, 3027,
-     1252, 1256, 1256, 1256,  712,  712,  712, 1253, 3029, 1254,
-     3031,  712,  712, 1255, 3032,  712,  712, 3033, 1256,  712,
-     3031,  712,  712,  712, 3032, 1242, 1257, 1257, 1257,  712,
-     3034, 3035, 1248, 3036, 1258, 1258, 1258, 1259, 1259, 1259,
-
-     1276, 1276, 1276, 1257, 1908, 1908, 1908, 1255, 1277, 1277,
-     1277, 1253, 1258, 3040, 3048, 1259, 3049, 3050, 1276, 1279,
-     1279, 1279, 1255, 1320, 1320, 1320, 1277, 1324, 1324, 1324,
-     3051, 1325, 1325, 1325, 3052, 1325, 3053, 1279, 1325, 3054,
-     1320, 1333, 1333, 1333, 1324, 3055, 1257, 1327, 1327, 1327,
-     1328, 1328, 1328, 1330, 1330, 1330, 3056, 3057, 1333, 1259,
-     1337, 1337, 1337, 3058, 3062, 1327, 3065, 3066, 1328, 1908,
-     3067, 1330, 1338, 1338, 1338, 1340, 1340, 1340, 1337, 1343,
-     1343, 1343, 1344, 1344, 1344, 1346, 1346, 1346, 3068, 3069,
-     1338, 3070, 3071, 1340, 1348, 1348, 1348, 1343, 1348, 3074,
-
-     1344, 1348, 3078, 1346, 1352, 1352, 1352, 1353, 1353, 1353,
-     1355, 1355, 1355, 1356, 1356, 1356, 3079, 3080, 1330, 1357,
-     1357, 1357, 1352, 1357, 3081, 1353, 1357, 3082, 1355, 3083,
-     1356, 1360, 1360, 1360, 1361, 1361, 1361, 3084, 1361, 1346,
-     3085, 1361, 1340, 1362, 1362, 1362, 3086, 3087, 1360, 1363,
-     1363, 1363, 1365, 1365, 1365, 1366, 1366, 1366, 3088, 3089,
-     1355, 1362, 1367, 1367, 1367, 3101, 1367, 1363, 3102, 1367,
-     1365, 3092, 1366, 1368, 1368, 1368, 1369, 1369, 1369, 3103,
-     1369, 3092, 3104, 1369, 1370, 1370, 1370, 1371, 1371, 1371,
-     1368, 1373, 1373, 1373, 1374, 1374, 1374, 1375, 1375, 1375,
-
-     3093, 1375, 1370, 3105, 1375, 1371, 1378, 1378, 1378, 1373,
-     3093, 1374, 1379, 1379, 1379, 1365, 1379, 3106, 3107, 1379,
-     1380, 1380, 1380, 1378, 1381, 1381, 1381, 1383, 1383, 1383,
-     1384, 1384, 1384, 3108, 1384, 3110, 3111, 1384, 1380, 1387,
-     1387, 1387, 1381, 1387, 3112, 1383, 1387, 1390, 1390, 1390,
-     3113, 1391, 1391, 1391, 1373, 1391, 3114, 3115, 1391, 1396,
-     1396, 1396, 3116, 3117, 1390, 1397, 1397, 1397, 1399, 1399,
-     1399, 1403, 1403, 1403, 3118, 1403, 3119, 1396, 1403, 1406,
-     1406, 1406, 3120, 1397, 3121, 3123, 1399, 1407, 1407, 1407,
-     1383, 1407, 3125, 3124, 1407, 3123, 1406, 1410, 1410, 1410,
-
-     1411, 1411, 1411, 3124, 1411, 3129, 3130, 1411, 1421, 1421,
-     1421, 1422, 1422, 1422, 1410, 3131, 3134, 1399, 1424, 1424,
-     1424, 1425, 1425, 1425, 3135, 1425, 1421, 3125, 1425, 1422,
-     1428, 1428, 1428, 1429, 1429, 1429, 1424, 1431, 1431, 1431,
-     1434, 1434, 1434, 1435, 1435, 1435, 3136, 1435, 1428, 3137,
-     1435, 1429, 1441, 1441, 1441, 1431, 3140, 1434, 1442, 1442,
-     1442, 1444, 1444, 1444, 1446, 1446, 1446, 1447, 1447, 1447,
-     1441, 1447, 3142, 3146, 1447, 3149, 1442, 3150, 3151, 1444,
-     3152, 1446, 3153, 1450, 1450, 1450, 1424, 1450, 3154, 3155,
-     1450, 1453, 1453, 1453, 1454, 1454, 1454, 3156, 1431, 1456,
-
-     1456, 1456, 1457, 1457, 1457, 1458, 1458, 1458, 3161, 1453,
-     3169, 3170, 1454, 1459, 1459, 1459, 3171, 1456, 3172, 1457,
-     1461, 1461, 1461, 1458, 1470, 1470, 1470, 1444, 1464, 1464,
-     1464, 1459, 1464, 3173, 3174, 1464, 3175, 3176, 1461, 1471,
-     1471, 1471, 1470, 1473, 1473, 1473, 1475, 1475, 1475, 3177,
-     1475, 3178, 3184, 1475, 1478, 1478, 1478, 1471, 1479, 1479,
-     1479, 1473, 1481, 1481, 1481, 1456, 3185, 1482, 1482, 1482,
-     1461, 1482, 1478, 3187, 1482, 3188, 1479, 1486, 1486, 1486,
-     1481, 1487, 1487, 1487, 1489, 1489, 1489, 3190, 1490, 1490,
-     1490, 1491, 1491, 1491, 3191, 1486, 1492, 1492, 1492, 1487,
-
-     3192, 3193, 1489, 3194, 1473, 1490, 3195, 3196, 1491, 1493,
-     1493, 1493, 3197, 3198, 1492, 1495, 1495, 1495, 1500, 1500,
-     1500, 3199, 1500, 1481, 3200, 1500, 3201, 1493, 1503, 1503,
-     1503, 3202, 3205, 1495, 3206, 1489, 1504, 1504, 1504, 1491,
-     1504, 3207, 3208, 1504, 3210, 1503, 1507, 1507, 1507, 1508,
-     1508, 1508, 1510, 1510, 1510, 1513, 1513, 1513, 1514, 1514,
-     1514, 1516, 1516, 1516, 1507, 3211, 3213, 1508, 3214, 3215,
-     1510, 3217, 3219, 1513, 3220, 3221, 1514, 3224, 3225, 1516,
-     1522, 1522, 1522, 1495, 1526, 1526, 1526, 1527, 1527, 1527,
-     1529, 1529, 1529, 3226, 1530, 1530, 1530, 1522, 1530, 3227,
-
-     3230, 1530, 1526, 3231, 1510, 1527, 3232, 3233, 1529, 1516,
-     1534, 1534, 1534, 1535, 1535, 1535, 1537, 1537, 1537, 1539,
-     1539, 1539, 3234, 1539, 2473, 2473, 1539, 2473, 1534, 3241,
-     3242, 1535, 3244, 3245, 1537, 2473, 1542, 1542, 1542, 1543,
-     1543, 1543, 2473, 1543, 3246, 3248, 1543, 1544, 1544, 1544,
-     3250, 3235, 1529, 1542, 1545, 1545, 1545, 3253, 1546, 1546,
-     1546, 3255, 1546, 3256, 1544, 1546, 1548, 1548, 1548, 3257,
-     3258, 1545, 1550, 1550, 1550, 1551, 1551, 1551, 1537, 1553,
-     1553, 1553, 3259, 1548, 1554, 1554, 1554, 1555, 1555, 1555,
-     1550, 1555, 3260, 1551, 1555, 3235, 3261, 1553, 1556, 1556,
-
-     1556, 1554, 1557, 1557, 1557, 3262, 1557, 3265, 3269, 1557,
-     1559, 1559, 1559, 3270, 3272, 1556, 1560, 1560, 1560, 1562,
-     1562, 1562, 1564, 1564, 1564, 3273, 1564, 3274, 1559, 1564,
-     1567, 1567, 1567, 3276, 1560, 3277, 3282, 1562, 3283, 3284,
-     1553, 1568, 1568, 1568, 1570, 1570, 1570, 3285, 1567, 1573,
-     1573, 1573, 3286, 1573, 3287, 3288, 1573, 3289, 3290, 1568,
-     3291, 3292, 1570, 1577, 1577, 1577, 1578, 1578, 1578, 3293,
-     1580, 1580, 1580, 1582, 1582, 1582, 3294, 1582, 3295, 3296,
-     1582, 1577, 3297, 3298, 1578, 3302, 3303, 1562, 1580, 1586,
-     1586, 1586, 1587, 1587, 1587, 1588, 1588, 1588, 1590, 1590,
-
-     1590, 1592, 1592, 1592, 3304, 3305, 1586, 1593, 1593, 1593,
-     1587, 1593, 1570, 1588, 1593, 3308, 1590, 3309, 1592, 1596,
-     1596, 1596, 1598, 1598, 1598, 1599, 1599, 1599, 1601, 1601,
-     1601, 3310, 1580, 1603, 1603, 1603, 1596, 1605, 1605, 1605,
-     1598, 3311, 3312, 1599, 3313, 3315, 1601, 1606, 1606, 1606,
-     1603, 1608, 1608, 1608, 3316, 1605, 3318, 1609, 1609, 1609,
-     1590, 1609, 3319, 3320, 1609, 1606, 1613, 1613, 1613, 1608,
-     1614, 1614, 1614, 1616, 1616, 1616, 1601, 1617, 1617, 1617,
-     3322, 1596, 3323, 3324, 1613, 1618, 1618, 1618, 1614, 1618,
-     3325, 1616, 1618, 3326, 1617, 1621, 1621, 1621, 3334, 1608,
-
-     1622, 1622, 1622, 3335, 1622, 3337, 3327, 1622, 1624, 1624,
-     1624, 3338, 1621, 1625, 1625, 1625, 3329, 1627, 1627, 1627,
-     1629, 1629, 1629, 1635, 1635, 1635, 1624, 1685, 1685, 1685,
-     3329, 1625, 3342, 3344, 1616, 1627, 3330, 3346, 1629, 1629,
-     3348, 1635, 1676, 1676, 1676, 1685, 1676, 3330, 3352, 1676,
-     1681, 1681, 1681, 3327, 1681, 3354, 3358, 1681, 1688, 1688,
-     1688, 1689, 1689, 1689, 3355, 1689, 3359, 3354, 1689, 1693,
-     1693, 1693, 1696, 1696, 1696, 1688, 3355, 3361, 1627, 1695,
-     1695, 1695, 3362, 1699, 1699, 1699, 3364, 1693, 3369, 1685,
-     1696, 1700, 1700, 1700, 3375, 1700, 1695, 3377, 1700, 3379,
-
-     3369, 1699, 1705, 1705, 1705, 3380, 1705, 3370, 3383, 1705,
-     1708, 1708, 1708, 1709, 1709, 1709, 3384, 1709, 3387, 3370,
-     1709, 3389, 1712, 1712, 1712, 3391, 1712, 3393, 1708, 1712,
-     3394, 1693, 1715, 1715, 1715, 1716, 1716, 1716, 3396, 1716,
-     1696, 1699, 1716, 3397, 1721, 1721, 1721, 3401, 1721, 3402,
-     1715, 1721, 1724, 1724, 1724, 1725, 1725, 1725, 1708, 1725,
-     3404, 3405, 1725, 3407, 1730, 1730, 1730, 1732, 1732, 1732,
-     1724, 1733, 1733, 1733, 1734, 1734, 1734, 1735, 1735, 1735,
-     1715, 1730, 1736, 1736, 1736, 1732, 3409, 3413, 1733, 3415,
-     3410, 1734, 3411, 3414, 1735, 1741, 1741, 1741, 3418, 1736,
-
-     1724, 1737, 1737, 1737, 3414, 1737, 3411, 3419, 1737, 1738,
-     1738, 1738, 1741, 1738, 3333, 3420, 1738, 1742, 1742, 1742,
-     1743, 1743, 1743, 1732, 3421, 1735, 1744, 1744, 1744, 1745,
-     1745, 1745, 3410, 3333, 1742, 3333, 3424, 1743, 1746, 1746,
-     1746, 1734, 3421, 1744, 3412, 3412, 1745, 1741, 3333, 1747,
-     1747, 1747, 1748, 1748, 1748, 1746, 1749, 1749, 1749, 1750,
-     1750, 1750, 1751, 1751, 1751, 1742, 1747, 3425, 3426, 1748,
-     1755, 1755, 1755, 1749, 1744, 3427, 1750, 1752, 1752, 1752,
-     1751, 1756, 1756, 1756, 3433, 1756, 3434, 1755, 1756, 3444,
-     3427, 1743, 3445, 3437, 1745, 1752, 1758, 1758, 1758, 1746,
-
-     1760, 1760, 1760, 1762, 1762, 1762, 3446, 1763, 1763, 1763,
-     3439, 1763, 3437, 1758, 1763, 1764, 1764, 1764, 1760, 1749,
-     1762, 1750, 3447, 1748, 1765, 1765, 1765, 3454, 1751, 3439,
-     1752, 3455, 3438, 1764, 3456, 1766, 1766, 1766, 3457, 1766,
-     3438, 1765, 1766, 1767, 1767, 1767, 1773, 1773, 1773, 3458,
-     1775, 1775, 1775, 1776, 1776, 1776, 3459, 1777, 1777, 1777,
-     3449, 1767, 3451, 3467, 1773, 3468, 3440, 1760, 1775, 3469,
-     1776, 1778, 1778, 1778, 3440, 1777, 1779, 1779, 1779, 3449,
-     1779, 3451, 1764, 1779, 3473, 1781, 1781, 1781, 1778, 1783,
-     1783, 1783, 1786, 1786, 1786, 3474, 1786, 3450, 3475, 1786,
-
-     3481, 3482, 1767, 1781, 1773, 3450, 1783, 3483, 1775, 1777,
-     1789, 1789, 1789, 1791, 1791, 1791, 1794, 1794, 1794, 1800,
-     1800, 1800, 1801, 1801, 1801, 3452, 1801, 1789, 3485, 1801,
-     3486, 1791, 3470, 3452, 1794, 3487, 1800, 1805, 1805, 1805,
-     1806, 1806, 1806, 1807, 1807, 1807, 1781, 1809, 1809, 1809,
-     3470, 1809, 3476, 3489, 1809, 1805, 3490, 1806, 1812, 1812,
-     1812, 1807, 1813, 1813, 1813, 3491, 1813, 3476, 3492, 1813,
-     1814, 1814, 1814, 3494, 1814, 1812, 3495, 1814, 1791, 1818,
-     1818, 1818, 3496, 1794, 1819, 1819, 1819, 1805, 1819, 3501,
-     3502, 1819, 1821, 1821, 1821, 3503, 1818, 1822, 1822, 1822,
-
-     3504, 1822, 3505, 3506, 1822, 3507, 1807, 1825, 1825, 1825,
-     1821, 1825, 3508, 3509, 1825, 1829, 1829, 1829, 1831, 1831,
-     1831, 1835, 1835, 1835, 1837, 1837, 1837, 1838, 1838, 1838,
-     1839, 1839, 1839, 1829, 1839, 3510, 1831, 1839, 3511, 1835,
-     3512, 1837, 3515, 1821, 1838, 1840, 1840, 1840, 1842, 1842,
-     1842, 1843, 1843, 1843, 3516, 1843, 3517, 3518, 1843, 1846,
-     1846, 1846, 3519, 1840, 3520, 1842, 1848, 1848, 1848, 1849,
-     1849, 1849, 3521, 1849, 3522, 3525, 1849, 1846, 1850, 1850,
-     1850, 3526, 1829, 1848, 3527, 1831, 1835, 1851, 1851, 1851,
-     1853, 1853, 1853, 3528, 3529, 1850, 1854, 1854, 1854, 3530,
-
-     1854, 3531, 3532, 1854, 3533, 1851, 3535, 3536, 1853, 1846,
-     1840, 1859, 1859, 1859, 3537, 1859, 3538, 3540, 1859, 3542,
-     1863, 1863, 1863, 1866, 1866, 1866, 1910, 1910, 1910, 1913,
-     1913, 1913, 1914, 1914, 1914, 3543, 3544, 1851, 1863, 3545,
-     3546, 1866, 1853, 1915, 1915, 1915, 1916, 1916, 1916, 1917,
-     1917, 1917, 1918, 1918, 1918, 1921, 1921, 1921, 3547, 1921,
-     1915, 3548, 1921, 1916, 3549, 3550, 1917, 1927, 1927, 1927,
-     1918, 3551, 1863, 1910, 3552, 1866, 1929, 1929, 1929, 1930,
-     1930, 1930, 3556, 1930, 3554, 1927, 1930, 1931, 1931, 1931,
-     3557, 3558, 1866, 1929, 1913, 3559, 3554, 1914, 3560, 1934,
-
-     1934, 1934, 1935, 1935, 1935, 1931, 1936, 1936, 1936, 1937,
-     1937, 1937, 3561, 3562, 1917, 3563, 3564, 1934, 3566, 1935,
-     1918, 3571, 3572, 1936, 1938, 1938, 1938, 1937, 1939, 1939,
-     1939, 3555, 1927, 1940, 1940, 1940, 1941, 1941, 1941, 1942,
-     1942, 1942, 1938, 3555, 3573, 1939, 3574, 1931, 1934, 3575,
-     1940, 1943, 1943, 1943, 1941, 3576, 1942, 1944, 1944, 1944,
-     1945, 1945, 1945, 3577, 1945, 3578, 3582, 1945, 1943, 1946,
-     1946, 1946, 3583, 3585, 1944, 1937, 1947, 1947, 1947, 1948,
-     1948, 1948, 1950, 1950, 1950, 3587, 1946, 1951, 1951, 1951,
-     1938, 1949, 1949, 1949, 1947, 1949, 1948, 3588, 1949, 1950,
-
-     3589, 3590, 1941, 3591, 1951, 1952, 1952, 1952, 3592, 1952,
-     1943, 3593, 1952, 1955, 1955, 1955, 1956, 1956, 1956, 1957,
-     1957, 1957, 1958, 1958, 1958, 1959, 1959, 1959, 3594, 3595,
-     1955, 3598, 3599, 1956, 3600, 3601, 1957, 1947, 3602, 1958,
-     3596, 3603, 1959, 1960, 1960, 1960, 1961, 1961, 1961, 1962,
-     1962, 1962, 1951, 1962, 3604, 3605, 1962, 1963, 1963, 1963,
-     1960, 3608, 3609, 1961, 3610, 3596, 1956, 1964, 1964, 1964,
-     3611, 3612, 1959, 3613, 1963, 1965, 1965, 1965, 1955, 3614,
-     3615, 1958, 3616, 3617, 1964, 1966, 1966, 1966, 1967, 1967,
-     1967, 3618, 1965, 3619, 1970, 1970, 1970, 1960, 1970, 3622,
-
-     3623, 1970, 3624, 1966, 3625, 3626, 1967, 1973, 1973, 1973,
-     1974, 1974, 1974, 3627, 3628, 1964, 1975, 1975, 1975, 3629,
-     1975, 3632, 3633, 1975, 1973, 3634, 3635, 1974, 3636, 1965,
-     1977, 1977, 1977, 1979, 1979, 1979, 3637, 1979, 3638, 3639,
-     1979, 1982, 1982, 1982, 1967, 1986, 1986, 1986, 1977, 1983,
-     1983, 1983, 1966, 1983, 3640, 3641, 1983, 3642, 3643, 1982,
-     1991, 1991, 1991, 1986, 1993, 1993, 1993, 1994, 1994, 1994,
-     1995, 1995, 1995, 3644, 1995, 3336, 3642, 1995, 1991, 1996,
-     1996, 1996, 1993, 3645, 1994, 1997, 1997, 1997, 1982, 1997,
-     3646, 3336, 1997, 3336, 2001, 2001, 2001, 1996, 2003, 2003,
-
-     2003, 2004, 2004, 2004, 3647, 2004, 3336, 3648, 2004, 3649,
-     3650, 1993, 2001, 1986, 3651, 2003, 2005, 2005, 2005, 2007,
-     2007, 2007, 2008, 2008, 2008, 3652, 2008, 3653, 3654, 2008,
-     2010, 2010, 2010, 2005, 3655, 3656, 2007, 3657, 1996, 2013,
-     2013, 2013, 2014, 2014, 2014, 2019, 2019, 2019, 2010, 2019,
-     3658, 3659, 2019, 2025, 2025, 2025, 3660, 2013, 2026, 2026,
-     2026, 2001, 2027, 2027, 2027, 3661, 2027, 3662, 3663, 2027,
-     3664, 2025, 2028, 2028, 2028, 2026, 2030, 2030, 2030, 3665,
-     2030, 3666, 3667, 2030, 2034, 2034, 2034, 3668, 2034, 3669,
-     2028, 2034, 2013, 2038, 2038, 2038, 2040, 2040, 2040, 2042,
-
-     2042, 2042, 2043, 2043, 2043, 2025, 2044, 2044, 2044, 3670,
-     3673, 2038, 3674, 3675, 2040, 3400, 3676, 2042, 3677, 2043,
-     2045, 2045, 2045, 2044, 2046, 2046, 2046, 2048, 2048, 2048,
-     3678, 2049, 2049, 2049, 3400, 2049, 3400, 2045, 2049, 2050,
-     2050, 2050, 2046, 2050, 2048, 3679, 2050, 3680, 2040, 3400,
-     3682, 2042, 2053, 2053, 2053, 2038, 2055, 2055, 2055, 3683,
-     2055, 3685, 3686, 2055, 2060, 2060, 2060, 2062, 2062, 2062,
-     2053, 2062, 2046, 2044, 2062, 2065, 2065, 2065, 3687, 2066,
-     2066, 2066, 2060, 2066, 3681, 3689, 2066, 2067, 2067, 2067,
-     3690, 3691, 2065, 2069, 2069, 2069, 2070, 2070, 2070, 3692,
-
-     2053, 2071, 2071, 2071, 3681, 2067, 2072, 2072, 2072, 3693,
-     3694, 2069, 3695, 2070, 3696, 3697, 2060, 3698, 2071, 2073,
-     2073, 2073, 3699, 2072, 2078, 2078, 2078, 2080, 2080, 2080,
-     2086, 2086, 2086, 2091, 2091, 2091, 3700, 2073, 3701, 2067,
-     3702, 2078, 2094, 2094, 2094, 2095, 2095, 2095, 2096, 2096,
-     2096, 2098, 2098, 2098, 3703, 2073, 2108, 2108, 2108, 2109,
-     2109, 2109, 2111, 2111, 2111, 2114, 2114, 2114, 2115, 2115,
-     2115, 2072, 2115, 3704, 3705, 2115, 2116, 2116, 2116, 2117,
-     2117, 2117, 2114, 2117, 3706, 3707, 2117, 2119, 2119, 2119,
-     2125, 2125, 2125, 2116, 2127, 2127, 2127, 3708, 2127, 3709,
-
-     3710, 2127, 2132, 2132, 2132, 2119, 3711, 3713, 2125, 2130,
-     2130, 2130, 2133, 2133, 2133, 2134, 2134, 2134, 3714, 2132,
-     3715, 2135, 2135, 2135, 3717, 2135, 3719, 2130, 2135, 3720,
-     2133, 3722, 2134, 2136, 2136, 2136, 2137, 2137, 2137, 3723,
-     2137, 3725, 3726, 2137, 2138, 2138, 2138, 2139, 2139, 2139,
-     2136, 2140, 2140, 2140, 2119, 3727, 2141, 2141, 2141, 3728,
-     2141, 2130, 2138, 2141, 3729, 2139, 3718, 3730, 2140, 2142,
-     2142, 2142, 3718, 3732, 2133, 2143, 2143, 2143, 3733, 2143,
-     3734, 3736, 2143, 2144, 2144, 2144, 2142, 2145, 2145, 2145,
-     2146, 2146, 2146, 3737, 2146, 3738, 3740, 2146, 2147, 2147,
-
-     2147, 2144, 3741, 3742, 2145, 2148, 2148, 2148, 3744, 2148,
-     2138, 3745, 2148, 2139, 3746, 2147, 2151, 2151, 2151, 2152,
-     2152, 2152, 3748, 2152, 3749, 3752, 2152, 2153, 2153, 2153,
-     2154, 2154, 2154, 2151, 2154, 3754, 3756, 2154, 2157, 2157,
-     2157, 2162, 2162, 2162, 3757, 2153, 2158, 2158, 2158, 2144,
-     2158, 3751, 3758, 2158, 3759, 2157, 3761, 3403, 2162, 2163,
-     2163, 2163, 3762, 2163, 3764, 3751, 2163, 2164, 2164, 2164,
-     2167, 2167, 2167, 3403, 2167, 3403, 3765, 2167, 3767, 2153,
-     2170, 2170, 2170, 3768, 2164, 2171, 2171, 2171, 3403, 2171,
-     3770, 3771, 2171, 2174, 2174, 2174, 3772, 2170, 2175, 2175,
-
-     2175, 2178, 2178, 2178, 3774, 2179, 2179, 2179, 3777, 2179,
-     3778, 2174, 2179, 2180, 2180, 2180, 2175, 2180, 2178, 3779,
-     2180, 2184, 2184, 2184, 2186, 2186, 2186, 3780, 2187, 2187,
-     2187, 2188, 2188, 2188, 2190, 2190, 2190, 3781, 3782, 2184,
-     2193, 2193, 2193, 3783, 3784, 2174, 2187, 3785, 3786, 2188,
-     3787, 2190, 2175, 2196, 2196, 2196, 3788, 3789, 2193, 2197,
-     2197, 2197, 3790, 2197, 3791, 3792, 2197, 2200, 2200, 2200,
-     3796, 2196, 2202, 2202, 2202, 3798, 2204, 2204, 2204, 3800,
-     2204, 2190, 2188, 2204, 3801, 2200, 3802, 2187, 3803, 3804,
-     2202, 2207, 2207, 2207, 2208, 2208, 2208, 3805, 2208, 3806,
-
-     3807, 2208, 3815, 2196, 3817, 2210, 2210, 2210, 2207, 2210,
-     3819, 3821, 2210, 3850, 2200, 2214, 2214, 2214, 2217, 2217,
-     2217, 2218, 2218, 2218, 2219, 2219, 2219, 2220, 2220, 2220,
-     2222, 2222, 2222, 2214, 3852, 2217, 2227, 2227, 2227, 2218,
-     2228, 2228, 2228, 3852, 2228, 3851, 3850, 2228, 2231, 2231,
-     2231, 2234, 2234, 2234, 2227, 2236, 2236, 2236, 2238, 2238,
-     2238, 2240, 2240, 2240, 1511, 1506, 2231, 3810, 2234, 2241,
-     2241, 2241, 3822, 2236, 3830, 3823, 2238, 3838, 3851, 2240,
-     2242, 2242, 2242, 2218, 2242, 3811, 2241, 2242, 2243, 2243,
-     2243, 2244, 2244, 2244, 2245, 2245, 2245, 3831, 2245, 3834,
-
-     3828, 2245, 2227, 3829, 3810, 2243, 3840, 3834, 2244, 2246,
-     2246, 2246, 2247, 2247, 2247, 2236, 2248, 2248, 2248, 3830,
-     2248, 3822, 3811, 2248, 3823, 3838, 2240, 2246, 1505, 2247,
-     2251, 2251, 2251, 2255, 2255, 2255, 2256, 2256, 2256, 2265,
-     2265, 2265, 3831, 2265, 3840, 3839, 2265, 3846, 2251, 3828,
-     3920, 2255, 3829, 2256, 2268, 2268, 2268, 2269, 2269, 2269,
-     2270, 2270, 2270, 2246, 2272, 2272, 2272, 3842, 3853, 2273,
-     2273, 2273, 2268, 2273, 2269, 3832, 2273, 3853, 2270, 3832,
-     3841, 2272, 3876, 3835, 2251, 2274, 2274, 2274, 2275, 2275,
-     2275, 3835, 2275, 3839, 3846, 2275, 2277, 2277, 2277, 3920,
-
-     1499, 2268, 2274, 2281, 2281, 2281, 2282, 2282, 2282, 3842,
-     2282, 3836, 3876, 2282, 2277, 2283, 2283, 2283, 3841, 3836,
-     2281, 2289, 2289, 2289, 2290, 2290, 2290, 2291, 2291, 2291,
-     2293, 2293, 2293, 2297, 2297, 2297, 2298, 2298, 2298, 2299,
-     2299, 2299, 2300, 2300, 2300, 2303, 2303, 2303, 2308, 2308,
-     2308, 2309, 2309, 2309, 2311, 2311, 2311, 3870, 2277, 2312,
-     2312, 2312, 2313, 2313, 2313, 2316, 2316, 2316, 3837, 2316,
-     3844, 3884, 2316, 2319, 2319, 2319, 3837, 2319, 3866, 3884,
-     2319, 2323, 2323, 2323, 2325, 2325, 2325, 3866, 3845, 2300,
-     2326, 2326, 2326, 2327, 2327, 2327, 2328, 2328, 2328, 2323,
-
-     3870, 2325, 2329, 2329, 2329, 3854, 3844, 2326, 3833, 2313,
-     2327, 3848, 3833, 2328, 2332, 2332, 2332, 2334, 2334, 2334,
-     2329, 2335, 2335, 2335, 3845, 2335, 3843, 3849, 2335, 2336,
-     2336, 2336, 2332, 2323, 2334, 3855, 2337, 2337, 2337, 3858,
-     2337, 3854, 2326, 2337, 2340, 2340, 2340, 2336, 2340, 3848,
-     3847, 2340, 2343, 2343, 2343, 3864, 2328, 1498, 2327, 2344,
-     2344, 2344, 2345, 2345, 2345, 3849, 2345, 3859, 3843, 2345,
-     2343, 3855, 2343, 2474, 2474, 2332, 2474, 2344, 2348, 2348,
-     2348, 3860, 2348, 3858, 2474, 2348, 2351, 2351, 2351, 3864,
-     2336, 2474, 2352, 2352, 2352, 2344, 2352, 3847, 3856, 2352,
-
-     2355, 2355, 2355, 3861, 2351, 2356, 2356, 2356, 3871, 2356,
-     3867, 3859, 2356, 3857, 2357, 2357, 2357, 2355, 2357, 3867,
-     3862, 2357, 2360, 2360, 2360, 2361, 2361, 2361, 3860, 2361,
-     2351, 3885, 2361, 3856, 2367, 2367, 2367, 3863, 2367, 3885,
-     2360, 2367, 2370, 2370, 2370, 2371, 2371, 2371, 3857, 2371,
-     3861, 3871, 2371, 2374, 2374, 2374, 3862, 2374, 3872, 2370,
-     2374, 2378, 2378, 2378, 2379, 2379, 2379, 2380, 2380, 2380,
-     2383, 2383, 2383, 3863, 2383, 3878, 3873, 2383, 2378, 2387,
-     2387, 2387, 2379, 3890, 3878, 2380, 2388, 2388, 2388, 2360,
-     2390, 2390, 2390, 3879, 2391, 2391, 2391, 2387, 2391, 3865,
-
-     3877, 2391, 3879, 3891, 2388, 3872, 1497, 2390, 2396, 2396,
-     2396, 3900, 1496, 2397, 2397, 2397, 2399, 2399, 2399, 3900,
-     2402, 2402, 2402, 3873, 2402, 3890, 2396, 2402, 3868, 2379,
-     3877, 2397, 1485, 3865, 2399, 2387, 1474, 1469, 2388, 2408,
-     2408, 2408, 2409, 2409, 2409, 3891, 2409, 3869, 3886, 2409,
-     2410, 2410, 2410, 2411, 2411, 2411, 2408, 2412, 2412, 2412,
-     2413, 2413, 2413, 2414, 2414, 2414, 3868, 3874, 2410, 2415,
-     2415, 2415, 2416, 2416, 2416, 2396, 2397, 2418, 2418, 2418,
-     2414, 2417, 2417, 2417, 3875, 3869, 2415, 3898, 3882, 2416,
-     2420, 2420, 2420, 3880, 3901, 2418, 3886, 3883, 2417, 2421,
-
-     2421, 2421, 3901, 2421, 3887, 3874, 2421, 2420, 2423, 2423,
-     2423, 2425, 2425, 2425, 3899, 2410, 2428, 2428, 2428, 3881,
-     3898, 2415, 3875, 2429, 2429, 2429, 2423, 2429, 3880, 2425,
-     2429, 2432, 2432, 2432, 2428, 3882, 3888, 2416, 2433, 2433,
-     2433, 2417, 2433, 2418, 3883, 2433, 3921, 3899, 2432, 2434,
-     2434, 2434, 3887, 2434, 3881, 3902, 2434, 2437, 2437, 2437,
-     2438, 2438, 2438, 2439, 2439, 2439, 3892, 2439, 1468, 3889,
-     2439, 2440, 2440, 2440, 3888, 2437, 3893, 2438, 2444, 2444,
-     2444, 2446, 2446, 2446, 2447, 2447, 2447, 3906, 2447, 2440,
-     3903, 2447, 2458, 2458, 2458, 3921, 2444, 3894, 2446, 2459,
-
-     2459, 2459, 3892, 3902, 2460, 2460, 2460, 3889, 2460, 2437,
-     2458, 2460, 3893, 2461, 2461, 2461, 2459, 2461, 3914, 1467,
-     2461, 3916, 1463, 2440, 2464, 2464, 2464, 1462, 2464, 3906,
-     3916, 2464, 2468, 2468, 2468, 2469, 2469, 2469, 3903, 2472,
-     2472, 2472, 2458, 2472, 3894, 1445, 2472, 2475, 2475, 2475,
-     2468, 3914, 3895, 2469, 2476, 2476, 2476, 2477, 2477, 2477,
-     2481, 2481, 2481, 2482, 2482, 2482, 2484, 2484, 2484, 2485,
-     2485, 2485, 2487, 2487, 2487, 2488, 2488, 2488, 2489, 2489,
-     2489, 2493, 2493, 2493, 2494, 2494, 2494, 2498, 2498, 2498,
-     2499, 2499, 2499, 2501, 2501, 2501, 2502, 2502, 2502, 3895,
-
-     2468, 2507, 2507, 2507, 2508, 2508, 2508, 2509, 2509, 2509,
-     2510, 2510, 2510, 3896, 2510, 1440, 3897, 2510, 1439, 2507,
-     2511, 2511, 2511, 3908, 2509, 2512, 2512, 2512, 2513, 2513,
-     2513, 2514, 2514, 2514, 2515, 2515, 2515, 2511, 2516, 2516,
-     2516, 3904, 2512, 1438, 3905, 2513, 2517, 2517, 2517, 3907,
-     2517, 3896, 2515, 2517, 3897, 2516, 2520, 2520, 2520, 3908,
-     2521, 2521, 2521, 2522, 2522, 2522, 2523, 2523, 2523, 2524,
-     2524, 2524, 3925, 2524, 2520, 1433, 2524, 2512, 2521, 3904,
-     2513, 2522, 3905, 3925, 2523, 2527, 2527, 2527, 2531, 2531,
-     2531, 3907, 2531, 3924, 3915, 2531, 1432, 2521, 2534, 2534,
-
-     2534, 2515, 3910, 2527, 2537, 2537, 2537, 3924, 2520, 2538,
-     2538, 2538, 1419, 2538, 3912, 2534, 2538, 2539, 2539, 2539,
-     1418, 2537, 2540, 2540, 2540, 2522, 3911, 3915, 2523, 2545,
-     2545, 2545, 2546, 2546, 2546, 2539, 2547, 2547, 2547, 3909,
-     2540, 2548, 2548, 2548, 3913, 2548, 3918, 2545, 2548, 3910,
-     2546, 1417, 3912, 2547, 2551, 2551, 2551, 2552, 2552, 2552,
-     2553, 2553, 2553, 2554, 2554, 2554, 2555, 2555, 2555, 3917,
-     1416, 2551, 1415, 3911, 2552, 3909, 3919, 2553, 3917, 3918,
-     2554, 1414, 3913, 2547, 2555, 2556, 2556, 2556, 1413, 1412,
-     2545, 2557, 2557, 2557, 2561, 2561, 2561, 2562, 2562, 2562,
-
-     1402, 2562, 1401, 2556, 2562, 2565, 2565, 2565, 2557, 3919,
-     2551, 1400, 2553, 2566, 2566, 2566, 2567, 2567, 2567, 2552,
-     2569, 2569, 2569, 2565, 2568, 2568, 2568, 2555, 2568, 3922,
-     1395, 2568, 1394, 2567, 2570, 2570, 2570, 2569, 2571, 2571,
-     2571, 2572, 2572, 2572, 2573, 2573, 2573, 2577, 2577, 2577,
-     2556, 2570, 2578, 2578, 2578, 2571, 2574, 2574, 2574, 2572,
-     2574, 2573, 3922, 2574, 2577, 2565, 2582, 2582, 2582, 1393,
-     2578, 2584, 2584, 2584, 3923, 2584, 1392, 1377, 2584, 2587,
-     2587, 2587, 1376, 1359, 2582, 1358, 2570, 2588, 2588, 2588,
-     2571, 2588, 1351, 1347, 2588, 1342, 1341, 2587, 2591, 2591,
-
-     2591, 2595, 2595, 2595, 1336, 2595, 1335, 3923, 2595, 2608,
-     2608, 2608, 2610, 2610, 2577, 2610, 2591, 2609, 2609, 2609,
-     1334, 2609, 1332, 2610, 2609, 2611, 2611, 2608, 2611, 1331,
-     2610, 2613, 2613, 2613, 1326, 1323, 2611, 2614, 2614, 2614,
-     2627, 2627, 2627, 2611, 1322, 2591, 2628, 2628, 2628, 2613,
-     2632, 2632, 2632, 1319, 1318, 2614, 2633, 2633, 2633, 2635,
-     2635, 2635, 2638, 2638, 2638, 2639, 2639, 2639, 2643, 2643,
-     2643, 2608, 2646, 2646, 2646, 2648, 2648, 2648, 2650, 2650,
-     2650, 2651, 2651, 2651, 1317, 2651, 1316, 1315, 2651, 2654,
-     2654, 2654, 1314, 2648, 1313, 2655, 2655, 2655, 2613, 2655,
-
-     2614, 1312, 2655, 2656, 2656, 2656, 2654, 2657, 2657, 2657,
-     2658, 2658, 2658, 2659, 2659, 2659, 2660, 2660, 2660, 1311,
-     2656, 2661, 2661, 2661, 2657, 2661, 1310, 1309, 2661, 1308,
-     1307, 2659, 1306, 2660, 2662, 2662, 2662, 2663, 2663, 2663,
-     2664, 2664, 2664, 2665, 2665, 2665, 2666, 2666, 2666, 2672,
-     2672, 2672, 2662, 1305, 1304, 2663, 1301, 1300, 2664, 1299,
-     1298, 2665, 1297, 1295, 2666, 1294, 2672, 2673, 2673, 2673,
-     1293, 2673, 1292, 1291, 2673, 2676, 2676, 2676, 1290, 2676,
-     1289, 1288, 2676, 2679, 2679, 2679, 2683, 2683, 2683, 2684,
-     2684, 2684, 2685, 2685, 2685, 2687, 2687, 2687, 2695, 2695,
-
-     2695, 2679, 2663, 2683, 2665, 1287, 1286, 2684, 2664, 1285,
-     2685, 1284, 2687, 2688, 2688, 2688, 2695, 2688, 1283, 1282,
-     2688, 2692, 2692, 2692, 2693, 2693, 2693, 2694, 2694, 2694,
-     1281, 2694, 1275, 1271, 2694, 2696, 2696, 2696, 2692, 1268,
-     1267, 2693, 2697, 2697, 2697, 1266, 1264, 2684, 2698, 2698,
-     2698, 1260, 2698, 2696, 1251, 2698, 2701, 2701, 2701, 2697,
-     2702, 2702, 2702, 2703, 2703, 2703, 1246, 2704, 2704, 2704,
-     1245, 2704, 1244, 2701, 2704, 2707, 2707, 2707, 2708, 2708,
-     2708, 2703, 2708, 1240, 1239, 2708, 2709, 2709, 2709, 2710,
-     2710, 2710, 2707, 2711, 2711, 2711, 1236, 2696, 2713, 2713,
-
-     2713, 1232, 1231, 2709, 1228, 1225, 2710, 2718, 2718, 2718,
-     1222, 2711, 2714, 2714, 2714, 2713, 2714, 1221, 1216, 2714,
-     2720, 2720, 2720, 1208, 1207, 2718, 1206, 2733, 2733, 2733,
-     2745, 2745, 2745, 2764, 2764, 2764, 1204, 1200, 2720, 2765,
-     2765, 2765, 2768, 2768, 2768, 2733, 1197, 1192, 2745, 2772,
-     2772, 2772, 2775, 2775, 2775, 2776, 2776, 2776, 2777, 2777,
-     2777, 1191, 2777, 1190, 1189, 2777, 2780, 2780, 2780, 2781,
-     2781, 2781, 2776, 2781, 1188, 1187, 2781, 2782, 2782, 2782,
-     1186, 1185, 2745, 2780, 2784, 2784, 2784, 2720, 2733, 2783,
-     2783, 2783, 1184, 2783, 2782, 1181, 2783, 2786, 2786, 2786,
-
-     1180, 2786, 2784, 1177, 2786, 2789, 2789, 2789, 2791, 2791,
-     2791, 2792, 2792, 2792, 2793, 2793, 2793, 2796, 2796, 2796,
-     2798, 2798, 2798, 2789, 2798, 1176, 2791, 2798, 1172, 2792,
-     1170, 1167, 2793, 1166, 2796, 2810, 2810, 2810, 2811, 2811,
-     2811, 2812, 2812, 2812, 1163, 2812, 1156, 1153, 2812, 2813,
-     2813, 2813, 2810, 1152, 1151, 2811, 2814, 2814, 2814, 1148,
-     2814, 1147, 1143, 2814, 1136, 1132, 2793, 2813, 1131, 1130,
-     2791, 2820, 2820, 2820, 1127, 2821, 2821, 2821, 2792, 2821,
-     1126, 1125, 2821, 2822, 2822, 2822, 1118, 2822, 2820, 1117,
-     2822, 2825, 2825, 2825, 2827, 2827, 2827, 2828, 2828, 2828,
-
-     1116, 2828, 1115, 1114, 2828, 2832, 2832, 2832, 1113, 2825,
-     1112, 1111, 2827, 2833, 2833, 2833, 2834, 2834, 2834, 1110,
-     2834, 1106, 2832, 2834, 2835, 2835, 2835, 2837, 2837, 2837,
-     2833, 2837, 1075, 1072, 2837, 2840, 2840, 2840, 1069, 2841,
-     2841, 2841, 2835, 2841, 1068, 1065, 2841, 2842, 2842, 2842,
-     1064, 1063, 2840, 1062, 2843, 2843, 2843, 2827, 2843, 1061,
-     1060, 2843, 1053, 1052, 2842, 2844, 2844, 2844, 1051, 2844,
-     1049, 1048, 2844, 2848, 2848, 2848, 2849, 2849, 2849, 2850,
-     2850, 2850, 2851, 2851, 2851, 2852, 2852, 2852, 1047, 1046,
-     2848, 1045, 1044, 2849, 2863, 2863, 2863, 2850, 2876, 2876,
-
-     2876, 1043, 2852, 2877, 2877, 2877, 2894, 2894, 2894, 2896,
-     2896, 2896, 2863, 1042, 1041, 2876, 2900, 2900, 2900, 1040,
-     1039, 2877, 2904, 2904, 2904, 2905, 2905, 2905, 1038, 2905,
-     1036, 1035, 2905, 2906, 2906, 2906, 1034, 2906, 1033, 2904,
-     2906, 2909, 2909, 2909, 1032, 2909, 1031, 1030, 2909, 1029,
-     1028, 2850, 2912, 2912, 2912, 2863, 2913, 2913, 2913, 2914,
-     2914, 2914, 2916, 2916, 2916, 2917, 2917, 2917, 1026, 1025,
-     2912, 2918, 2918, 2918, 2913, 2918, 1024, 2914, 2918, 2916,
-     1023, 1022, 2917, 2919, 2919, 2919, 2931, 2931, 2931, 2932,
-     2932, 2932, 1021, 2932, 1020, 2914, 2932, 2933, 2933, 2933,
-
-     2919, 2933, 1019, 2931, 2933, 2936, 2936, 2936, 2913, 2939,
-     2939, 2939, 2941, 2941, 2941, 1018, 2941, 1017, 1013, 2941,
-     2912, 1009, 1008, 2936, 1007, 1006, 2939, 2950, 2950, 2950,
-     2952, 2952, 2952, 2953, 2953, 2953, 1005, 2953, 1001,  999,
-     2953,  998, 2954, 2954, 2954, 2950, 2954, 2952,  997, 2954,
-     2957, 2957, 2957,  996, 2957,  995,  994, 2957, 2960, 2960,
-     2960,  993, 2960,  990,  989, 2960, 2970, 2970, 2970, 2971,
-     2971, 2971,  985, 2971,  984,  983, 2971, 2972, 2972, 2972,
-     2973, 2973, 2973, 2970, 2973,  982,  979, 2973, 2974, 2974,
-     2974, 2975, 2975, 2975, 2972, 2976, 2976, 2976, 2977, 2977,
-
-     2977,  978, 2977,  976,  974, 2977, 2974, 2988, 2988, 2988,
-      971,  970, 2976, 3001, 3001, 3001, 3002, 3002, 3002,  969,
-     3002,  968,  966, 3002,  963, 2988, 3003, 3003, 3003,  962,
-     3001, 3007, 3007, 3007, 3021, 3021, 3021, 3023, 3023, 3023,
-     3026, 3026, 3026,  960, 3003, 3028, 3028, 3028, 3007, 3007,
-      959, 2974,  956, 3030, 3030, 3030,  954, 3030,  951, 2988,
-     3030, 3037, 3037, 3037, 3038, 3038, 3038, 3039, 3039, 3039,
-     3041, 3041, 3041, 3042, 3042, 3042,  950, 3042,  949, 3037,
-     3042,  948, 3038,  945,  944, 3039,  943, 3041, 3043, 3043,
-     3043,  942, 3043,  941,  940, 3043, 3046, 3046, 3046, 3047,
-
-     3047, 3047,  939, 3047,  937,  934, 3047, 3059, 3059, 3059,
-      933, 3059,  929, 3046, 3059, 3063, 3063, 3063, 3064, 3064,
-     3064,  928, 3064,  927,  926, 3064,  925,  924, 3037, 3039,
-      915,  914, 3063, 3072, 3072, 3072, 3075, 3075, 3075,  911,
-     3075,  910,  909, 3075, 3090, 3090, 3090,  908, 3091, 3091,
-     3091, 3072, 3091,  907,  905, 3091, 3094, 3094, 3094,  904,
-     3094, 3090,  903, 3094, 3097, 3097, 3097, 3098, 3098, 3098,
-      900, 3098,  899,  898, 3098, 3109, 3109, 3109,  895, 3122,
-     3122, 3122, 3097, 3122,  894,  890, 3122, 3126, 3126, 3126,
-     3127, 3127, 3127, 3109, 3128, 3128, 3128,  888, 3128,  885,
-
-      884, 3128,  883,  882, 3126, 3126,  880, 3127, 3127, 3141,
-     3141, 3141, 3128, 3143, 3143, 3143, 3097, 3144, 3144, 3144,
-     3145, 3145, 3145,  877,  876, 3109, 3147, 3147, 3147, 3148,
-     3148, 3148, 3157, 3157, 3157, 3158, 3158, 3158, 3160, 3160,
-     3160, 3162, 3162, 3162,  875, 3162,  874,  871, 3162,  868,
-     3157,  865,  864, 3158,  863,  862, 3160, 3165, 3165, 3165,
-      861, 3165,  858,  855, 3165, 3168, 3168, 3168, 3179, 3179,
-     3179, 3180, 3180, 3180,  851, 3180,  850,  849, 3180, 3183,
-     3183, 3183, 3168,  848, 3157, 3179, 3203, 3203, 3203,  847,
-     3204, 3204, 3204,  846, 3204,  845, 3183, 3204, 3209, 3209,
-
-     3209,  844,  843, 3203,  842,  841, 3160, 3218, 3218, 3218,
-     3236, 3236, 3236, 3237, 3237, 3237, 3209, 3237,  839,  837,
-     3237,  834, 3238, 3238, 3238, 3218, 3238, 3236, 3236, 3238,
-      833, 3237, 3249, 3249, 3249, 3251, 3251, 3251,  832,  831,
-     3238, 3252, 3252, 3252, 3254, 3254, 3254, 3263, 3263, 3263,
-     3264, 3264, 3264, 3266, 3266, 3266, 3267, 3267, 3267,  830,
-     3267,  829,  824, 3267,  823, 3263,  822,  821, 3264,  818,
-     3266, 3268, 3268, 3268, 3218, 3239, 3239, 3239, 3239, 3239,
-     3239, 3239, 3239, 3239,  817,  816, 3239,  813, 3268,  812,
-      811, 3239, 3239, 3239, 3239, 3239, 3278, 3278, 3278, 3279,
-
-     3279, 3279,  810, 3279,  807,  806, 3279, 3281, 3281, 3281,
-      804, 3281,  801, 3278, 3281,  800,  796, 3264, 3280, 3280,
-     3280, 3239, 3239, 3240, 3240, 3240, 3240, 3240, 3240, 3240,
-     3240, 3240,  795,  794, 3240, 3280, 3306, 3306, 3306, 3240,
-     3240, 3240, 3240, 3240, 3299, 3299, 3299,  793, 3299,  792,
-      791, 3299,  788,  787, 3306, 3314, 3314, 3314, 3328, 3328,
-     3328,  786, 3328,  785,  784, 3328, 3339, 3339, 3339, 3240,
-     3240,  783,  778, 3314,  774,  773, 3328, 3331, 3331, 3331,
-     3331, 3331, 3331, 3331, 3331, 3331,  772,  771, 3331, 3340,
-     3340, 3340,  768, 3331, 3331, 3331, 3331, 3331, 3349, 3349,
-
-     3349, 3351, 3351, 3351, 3353, 3353, 3353,  767, 3353,  766,
-      763, 3353, 3429, 3429, 3429,  761, 3349,  760,  759, 3351,
-     3356, 3356, 3356, 3331, 3331, 3332, 3332, 3332, 3332, 3332,
-     3332, 3332, 3332, 3332,  756,  755, 3332, 3356, 3430, 3430,
-     3430, 3332, 3332, 3332, 3332, 3332,  754, 3357, 3357, 3357,
-      753, 3357,  749, 3351, 3357, 3365, 3365, 3365,  748, 3365,
-      747,  743, 3365, 3368, 3368, 3368,  742, 3368,  741,  740,
-     3368, 3332, 3332, 3398, 3398, 3398, 3416, 3416, 3416, 3435,
-     3435, 3435, 3436, 3436, 3436, 3441, 3441, 3441,  734, 3441,
-      733, 3398, 3441,  731, 3416, 3416,  723, 3435,  722, 3436,
-
-     3448, 3448, 3448, 3453, 3453, 3453, 3480, 3480, 3480, 3484,
-     3484, 3484, 3497, 3497, 3497,  718,  713, 3448,  709,  708,
-     3453, 3499, 3499, 3499, 3480,  704,  698, 3484,  697,  696,
-     3497,  692, 3500, 3500, 3500,  689, 3500,  687, 3499, 3500,
-     3513, 3513, 3513, 3514, 3514, 3514,  686, 3514,  685,  681,
-     3514, 3523, 3523, 3523, 3541, 3541, 3541, 3513, 3524, 3524,
-     3524, 3484, 3524,  677,  673, 3524,  672,  671, 3523, 3553,
-     3553, 3553, 3541, 3553,  670,  666, 3553, 3568, 3568, 3568,
-      662, 3568,  659,  658, 3568, 3579, 3579, 3579,  657, 3579,
-      656, 3541, 3579, 3776, 3776, 3776, 3793, 3793, 3793,  652,
-
-     3793,  646,  645, 3793, 3926, 3926, 3926, 3927, 3927, 3927,
-      641, 3776,  633,  629, 3793,  622,  620,  619,  615,  609,
-      608,  604, 3926,  597,  596, 3927, 3930, 3930, 3930, 3930,
-     3930, 3930, 3930, 3930, 3930, 3931, 3931, 3931, 3931, 3931,
-     3931, 3931, 3931, 3931, 3932, 3932, 3932, 3932, 3932, 3932,
-     3932, 3932, 3932, 3933, 3933, 3933, 3933, 3933, 3933, 3933,
-     3933, 3933, 3934, 3934, 3934, 3934, 3934, 3934, 3934, 3934,
-     3934, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935,
-     3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3937,
-     3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3938, 3938,
-
-     3938, 3938, 3938, 3938, 3938, 3938, 3938, 3939, 3939, 3939,
-     3939, 3939, 3939, 3939, 3939, 3939, 3940, 3940, 3940, 3940,
-     3940, 3940, 3940, 3940, 3940, 3941, 3941, 3941, 3941, 3941,
-     3941, 3941, 3941, 3941, 3942, 3942, 3942, 3942, 3942, 3942,
-     3942, 3942, 3942, 3943, 3943, 3943, 3943, 3943, 3943, 3943,
-     3943, 3943, 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944,
-     3944, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3947,
-     3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3948, 3948,
-     3948, 3948, 3948, 3948, 3948, 3948, 3948, 3949, 3949, 3949,
-
-     3949, 3949, 3949, 3949, 3949, 3949, 3950, 3950, 3950, 3950,
-     3950, 3950, 3950, 3950, 3950, 3951, 3951, 3951, 3951, 3951,
-     3951, 3951, 3951, 3951, 3952, 3952, 3952, 3952, 3952, 3952,
-     3952, 3952, 3952, 3953, 3953, 3953, 3953, 3953, 3953, 3953,
-     3953, 3953, 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954,
-     3954, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955,
-     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3957,
-     3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3958, 3958,
-     3958, 3958, 3958, 3958, 3958, 3958, 3958, 3959, 3959, 3959,
-     3959, 3959, 3959, 3959, 3959, 3959, 3960, 3960, 3960, 3960,
-
-     3960, 3960, 3960, 3960, 3960, 3961, 3961, 3961, 3961, 3961,
-     3961, 3961, 3961, 3961, 3962, 3962, 3962, 3962, 3962, 3962,
-     3962, 3962, 3962, 3963, 3963, 3963, 3963, 3963, 3963, 3963,
-     3963, 3963, 3964, 3964, 3964, 3964, 3964, 3964, 3964, 3964,
-     3964, 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965,
-     3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3967,
-     3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3968, 3968,
-     3968, 3968, 3968, 3968, 3968, 3968, 3968, 3969, 3969, 3969,
-     3969, 3969, 3969, 3969, 3969, 3969, 3970, 3970, 3970, 3970,
-     3970, 3970, 3970, 3970, 3970, 3971, 3971, 3971, 3971, 3971,
-
-     3971, 3971, 3971, 3971, 3972, 3972, 3972, 3972, 3972, 3972,
-     3972, 3972, 3972, 3973, 3973, 3973, 3973, 3973, 3973, 3973,
-     3973, 3973, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974,
-     3974, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975,
-     3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3977,
-     3977, 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3978, 3978,
-     3978, 3978, 3978, 3978, 3978, 3978, 3978, 3979, 3979, 3979,
-     3979, 3979, 3979, 3979, 3979, 3979, 3980, 3980, 3980, 3980,
-     3980, 3980, 3980, 3980, 3980, 3981, 3981, 3981, 3981, 3981,
-     3981, 3981, 3981, 3981, 3982, 3982, 3982, 3982, 3982, 3982,
-
-     3982, 3982, 3982, 3983, 3983, 3983, 3983, 3983, 3983, 3983,
-     3983, 3983, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984,
-     3984, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985,
-     3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3987,
-     3987, 3987, 3987, 3987, 3987, 3987, 3987, 3987, 3988, 3988,
-     3988, 3988, 3988, 3988, 3988, 3988, 3988, 3989, 3989, 3989,
-     3989, 3989, 3989, 3989, 3989, 3989, 3990, 3990, 3990, 3990,
-     3990, 3990, 3990, 3990, 3990, 3991, 3991, 3991, 3991, 3991,
-     3991, 3991, 3991, 3991, 3992, 3992, 3992, 3992, 3992, 3992,
-     3992, 3992, 3992, 3993, 3993, 3993, 3993, 3993, 3993, 3993,
-
-     3993, 3993, 3994, 3994, 3994, 3994, 3994, 3994, 3994, 3994,
-     3994, 3995, 3995, 3995, 3995, 3995, 3995, 3995, 3995, 3995,
-     3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3997,
-     3997, 3997, 3997, 3997, 3997, 3997, 3997, 3997, 3998, 3998,
-     3998, 3998, 3998, 3998, 3998, 3998, 3998, 3999, 3999, 3999,
-      595,  594,  593, 3999, 4000, 4000, 4000,  589,  578,  574,
-     4000, 4001, 4001, 4001,  566,  565,  564, 4001, 4002, 4002,
-     4002,  563,  562,  558, 4002, 4003, 4003, 4003,  552,  551,
-      547, 4003, 4004, 4004, 4004,  541,  540,  536, 4004, 4005,
-     4005, 4005,  530,  529,  525, 4005, 4006, 4006, 4006,  521,
-
-      517,  516, 4006, 4007, 4007, 4007,  515,  511,  507, 4007,
-     4008, 4008, 4008,  503,  499,  493, 4008, 4009, 4009, 4009,
-      492,  491,  487, 4009, 4010, 4010, 4010,  483,  478,  477,
-     4010, 4011, 4011, 4011,  476,  475,  471, 4011, 4012, 4012,
-     4012,  467,  464,  460, 4012, 4013, 4013, 4013,  456,  453,
-      450, 4013, 4014, 4014, 4014,  448,  447,  442, 4014, 4015,
-     4015, 4015,  435,  434,  433, 4015, 4016, 4016, 4016,  432,
-      431,  427, 4016, 4017, 4017, 4017,  420,  419,  418, 4017,
-     4018, 4018, 4018,  414,  407,  406, 4018, 4019, 4019, 4019,
-      402,  395,  394, 4019, 4020, 4020, 4020,  393,  389,  383,
-
-     4020, 4021, 4021, 4021,  382,  381,  377, 4021, 4022, 4022,
-     4022,  371,  367,  363, 4022, 4023, 4023, 4023,  359,  358,
-      357, 4023, 4024, 4024, 4024,  356,  355,  351, 4024, 4025,
-     4025, 4025,  342,  341,  337, 4025, 4026, 4026, 4026,  333,
-      329,  325, 4026, 4027, 4027, 4027,  324,  320,  317, 4027,
-     4028, 4028, 4028,  316,  315,  309, 4028, 4029, 4029, 4029,
-      308,  306,  303, 4029, 4030, 4030, 4030, 4030, 4030, 4030,
-     4030,  291, 4030, 4031, 4031, 4031,    0,    0,    0, 4031,
-     4032,    0,    0,    0, 4032, 4033, 4033, 4033,    0,    0,
-        0, 4033, 4034,    0,    0,    0, 4034, 4035, 4035, 4035,
-
-        0,    0,    0, 4035, 4036,    0,    0,    0, 4036, 4037,
-     4037, 4037,    0,    0,    0, 4037, 4038,    0,    0,    0,
-     4038, 4039, 4039, 4039,    0,    0,    0, 4039, 4040,    0,
-        0,    0, 4040, 4041, 4041, 4041,    0,    0,    0, 4041,
-     4042,    0,    0,    0, 4042, 4043, 4043, 4043,    0,    0,
-        0, 4043, 4044,    0,    0,    0, 4044, 4045, 4045, 4045,
-        0,    0,    0, 4045, 4046,    0,    0,    0, 4046, 4047,
-     4047, 4047,    0,    0,    0, 4047, 4048,    0,    0,    0,
-     4048, 4049, 4049, 4049,    0,    0,    0, 4049, 4050,    0,
-        0,    0, 4050, 4051, 4051, 4051,    0,    0,    0, 4051,
-
-     4052,    0,    0,    0, 4052, 4053, 4053, 4053,    0,    0,
-        0, 4053, 4054,    0,    0,    0, 4054, 4055, 4055, 4055,
-        0,    0,    0, 4055, 4056,    0,    0,    0, 4056, 4057,
-     4057, 4057,    0,    0,    0, 4057, 4058,    0,    0,    0,
-     4058, 4059, 4059, 4059,    0,    0,    0, 4059, 4060,    0,
-        0,    0, 4060, 4061, 4061, 4061,    0,    0,    0, 4061,
-     4062,    0,    0,    0, 4062, 4063, 4063, 4063,    0,    0,
-        0, 4063, 4064,    0,    0,    0, 4064, 4065, 4065, 4065,
-        0,    0,    0, 4065, 4066,    0,    0,    0, 4066, 4067,
-     4067, 4067,    0,    0,    0, 4067, 4068,    0,    0,    0,
-
-     4068, 4069, 4069, 4069,    0,    0,    0, 4069, 4070,    0,
-        0,    0, 4070, 4071, 4071, 4071,    0,    0,    0, 4071,
-     4072,    0,    0,    0, 4072, 4073, 4073, 4073,    0,    0,
-        0, 4073, 4074,    0,    0,    0, 4074, 4075, 4075, 4075,
-        0,    0,    0, 4075, 4076,    0,    0,    0, 4076, 4077,
-     4077, 4077,    0,    0,    0, 4077, 4078,    0,    0,    0,
-     4078, 4079, 4079, 4079,    0,    0,    0, 4079, 4080,    0,
-        0,    0, 4080, 4081, 4081, 4081,    0,    0,    0, 4081,
-     4082,    0,    0,    0, 4082, 4083, 4083, 4083,    0,    0,
-        0, 4083, 4084,    0,    0,    0, 4084, 4085, 4085, 4085,
-
-        0,    0,    0, 4085, 4086,    0,    0,    0, 4086, 4087,
-     4087, 4087,    0,    0,    0, 4087, 4088,    0,    0,    0,
-     4088, 4089, 4089, 4089,    0,    0,    0, 4089, 4090,    0,
-        0,    0, 4090, 4091, 4091, 4091,    0,    0,    0, 4091,
-     4092,    0,    0,    0, 4092, 4093, 4093, 4093, 4093, 4093,
-     4093, 4093, 4093, 4093, 4094,    0,    0,    0,    0, 4094,
-     4095, 4095, 4095,    0,    0,    0, 4095, 4096, 4096, 4096,
-     4096,    0,    0, 4096, 4096, 4097, 4097, 4097, 4097,    0,
-     4097,    0, 4097, 4098, 4098, 4098, 4098,    0,    0, 4098,
-     4098, 4099, 4099, 4099,    0,    0,    0, 4099, 4100, 4100,
-
-     4100, 4100,    0,    0, 4100, 4100, 4101, 4101, 4101,    0,
-        0,    0, 4101, 4102, 4102, 4102, 4102,    0,    0, 4102,
-     4102, 4103, 4103, 4103,    0,    0,    0, 4103, 4104, 4104,
-     4104, 4104,    0,    0, 4104, 4104, 4105, 4105, 4105, 4105,
-        0, 4105,    0, 4105, 4106, 4106, 4106, 4106,    0,    0,
-     4106, 4106, 4107, 4107, 4107, 4107,    0, 4107,    0, 4107,
-     4108, 4108, 4108, 4108,    0,    0, 4108, 4108, 4109, 4109,
-     4109, 4109,    0, 4109,    0, 4109, 4110, 4110, 4110, 4110,
-        0,    0, 4110, 4110, 4111, 4111, 4111, 4111,    0, 4111,
-        0, 4111, 4112, 4112, 4112, 4112,    0,    0, 4112, 4112,
-
-     4113, 4113, 4113,    0,    0,    0, 4113, 4114, 4114, 4114,
-     4114,    0,    0, 4114, 4114, 4115, 4115, 4115, 4115,    0,
-        0, 4115, 4115, 4116, 4116, 4116,    0,    0,    0, 4116,
-     4117, 4117, 4117, 4117,    0,    0, 4117, 4117, 4118, 4118,
-     4118,    0,    0,    0, 4118, 4119, 4119, 4119, 4119,    0,
-        0, 4119, 4119, 4120, 4120, 4120,    0,    0,    0, 4120,
-     4121, 4121, 4121, 4121,    0,    0, 4121, 4121, 4122, 4122,
-     4122,    0,    0,    0, 4122, 4123, 4123, 4123, 4123,    0,
-        0, 4123, 4123, 4124, 4124, 4124,    0,    0,    0, 4124,
-     4125, 4125, 4125, 4125,    0,    0, 4125, 4125, 4126, 4126,
-
-     4126,    0,    0,    0, 4126, 4127, 4127, 4127, 4127,    0,
-        0, 4127, 4127, 4128, 4128, 4128,    0,    0,    0, 4128,
-     4129, 4129, 4129, 4129,    0,    0, 4129, 4129, 4130, 4130,
-     4130,    0,    0,    0, 4130, 4131, 4131, 4131, 4131,    0,
-        0, 4131, 4131, 4132, 4132, 4132,    0,    0,    0, 4132,
-     4133, 4133, 4133, 4133,    0,    0, 4133, 4133, 4134, 4134,
-     4134,    0,    0,    0, 4134, 4135, 4135, 4135, 4135,    0,
-        0, 4135, 4135, 4136, 4136, 4136,    0,    0,    0, 4136,
-     4137, 4137, 4137, 4137,    0,    0, 4137, 4137, 4138, 4138,
-     4138,    0,    0,    0, 4138, 4139, 4139, 4139, 4139,    0,
-
-        0, 4139, 4139, 4140, 4140, 4140, 4140,    0, 4140,    0,
-     4140, 4141, 4141, 4141, 4141,    0,    0, 4141, 4141, 4142,
-     4142, 4142,    0,    0,    0, 4142, 4143, 4143, 4143, 4143,
-        0,    0, 4143, 4143, 4144, 4144, 4144,    0,    0,    0,
-     4144, 4145, 4145, 4145, 4145,    0,    0, 4145, 4145, 4146,
-     4146, 4146,    0,    0,    0, 4146, 4147, 4147, 4147, 4147,
-        0,    0, 4147, 4147, 4148, 4148, 4148,    0,    0,    0,
-     4148, 4149, 4149, 4149, 4149,    0,    0, 4149, 4149, 4150,
-     4150, 4150,    0,    0,    0, 4150, 4151, 4151, 4151, 4151,
-        0,    0, 4151, 4151, 4152, 4152, 4152,    0,    0,    0,
-
-     4152, 4153, 4153, 4153, 4153,    0,    0, 4153, 4153, 4154,
-     4154, 4154, 4154,    0, 4154,    0, 4154, 4155, 4155, 4155,
-     4155,    0,    0, 4155, 4155, 4156, 4156, 4156, 4156, 4156,
-     4156, 4156, 4156, 4156, 4157,    0, 4157,    0,    0, 4157,
-     4158, 4158, 4158,    0,    0,    0, 4158, 4159, 4159, 4159,
-     4159,    0,    0, 4159, 4159, 4160, 4160, 4160,    0,    0,
-        0, 4160, 4161, 4161, 4161, 4161,    0,    0, 4161, 4161,
-     4162, 4162, 4162,    0,    0,    0, 4162, 4163, 4163, 4163,
-     4163,    0,    0, 4163, 4163, 4164, 4164, 4164,    0,    0,
-        0, 4164, 4165, 4165, 4165, 4165,    0,    0, 4165, 4165,
-
-     4166, 4166, 4166,    0,    0,    0, 4166, 4167, 4167, 4167,
-     4167,    0,    0, 4167, 4167, 4168, 4168, 4168,    0,    0,
-        0, 4168, 4169, 4169, 4169, 4169,    0,    0, 4169, 4169,
-     4170, 4170, 4170, 4170,    0,    0, 4170, 4170, 4171, 4171,
-     4171,    0,    0,    0, 4171, 4172, 4172, 4172, 4172,    0,
-        0, 4172, 4172, 4173, 4173, 4173,    0,    0,    0, 4173,
-     4174, 4174, 4174, 4174,    0,    0, 4174, 4174, 4175, 4175,
-     4175,    0,    0,    0, 4175, 4176, 4176, 4176, 4176,    0,
-        0, 4176, 4176, 4177, 4177, 4177, 4177,    0,    0, 4177,
-     4177, 4178, 4178, 4178,    0,    0,    0, 4178, 4179, 4179,
-
-     4179, 4179,    0,    0, 4179, 4179, 4180, 4180, 4180, 4180,
-        0, 4180,    0, 4180, 4181, 4181, 4181, 4181,    0,    0,
-     4181, 4181, 4182, 4182, 4182, 4182,    0, 4182,    0, 4182,
-     4183, 4183, 4183, 4183,    0,    0, 4183, 4183, 4184, 4184,
-     4184,    0,    0,    0, 4184, 4185, 4185, 4185, 4185,    0,
-        0, 4185, 4185, 4186, 4186, 4186,    0,    0,    0, 4186,
-     4187, 4187, 4187, 4187,    0,    0, 4187, 4187, 4188, 4188,
-     4188,    0,    0,    0, 4188, 4189, 4189, 4189, 4189,    0,
-        0, 4189, 4189, 4190, 4190, 4190, 4190,    0, 4190,    0,
-     4190, 4191, 4191, 4191, 4191,    0,    0, 4191, 4191, 4192,
-
-     4192, 4192,    0,    0,    0, 4192, 4193, 4193, 4193, 4193,
-        0,    0, 4193, 4193, 4194, 4194, 4194,    0,    0,    0,
-     4194, 4195, 4195, 4195, 4195,    0,    0, 4195, 4195, 4196,
-     4196, 4196,    0,    0,    0, 4196, 4197, 4197, 4197, 4197,
-        0,    0, 4197, 4197, 4198, 4198, 4198,    0,    0,    0,
-     4198, 4199, 4199, 4199, 4199,    0,    0, 4199, 4199, 4200,
-     4200, 4200,    0,    0,    0, 4200, 4201, 4201, 4201, 4201,
-        0,    0, 4201, 4201, 4202, 4202, 4202,    0,    0,    0,
-     4202, 4203, 4203, 4203, 4203,    0,    0, 4203, 4203, 4204,
-     4204, 4204,    0,    0,    0, 4204, 4205, 4205, 4205, 4205,
-
-        0,    0, 4205, 4205, 4206, 4206, 4206,    0,    0,    0,
-     4206, 4207, 4207, 4207, 4207,    0,    0, 4207, 4207, 4208,
-     4208, 4208,    0,    0,    0, 4208, 4209, 4209, 4209, 4209,
-        0,    0, 4209, 4209, 4210, 4210, 4210, 4210,    0, 4210,
-        0, 4210, 4211, 4211, 4211, 4211,    0,    0, 4211, 4211,
-     4212, 4212, 4212,    0,    0,    0, 4212, 4213, 4213, 4213,
-     4213,    0,    0, 4213, 4213, 4214, 4214, 4214,    0,    0,
-        0, 4214, 4215, 4215, 4215, 4215,    0,    0, 4215, 4215,
-     4216, 4216, 4216,    0,    0,    0, 4216, 4217, 4217, 4217,
-     4217,    0,    0, 4217, 4217, 4218, 4218, 4218, 4218, 4218,
-
-     4218, 4218, 4218, 4218, 4219, 4219, 4219, 4219, 4219, 4219,
-     4219, 4219, 4219, 4220, 4220, 4220,    0,    0,    0, 4220,
-     4221, 4221, 4221,    0,    0,    0, 4221, 4222, 4222, 4222,
-     4222,    0,    0, 4222, 4222, 4223, 4223, 4223,    0,    0,
-        0, 4223, 4224, 4224, 4224, 4224,    0,    0, 4224, 4224,
-     4225, 4225, 4225, 4225,    0, 4225,    0, 4225, 4226, 4226,
-     4226, 4226,    0,    0, 4226, 4226, 4227, 4227, 4227,    0,
-        0,    0, 4227, 4228, 4228, 4228, 4228,    0,    0, 4228,
-     4228, 4229, 4229, 4229,    0,    0,    0, 4229, 4230, 4230,
-     4230, 4230,    0,    0, 4230, 4230, 4231, 4231, 4231, 4231,
-
-        0,    0, 4231, 4231, 4232, 4232, 4232,    0,    0,    0,
-     4232, 4233, 4233, 4233, 4233,    0,    0, 4233, 4233, 4234,
-     4234, 4234,    0,    0,    0, 4234, 4235, 4235, 4235, 4235,
-        0,    0, 4235, 4235, 4236, 4236, 4236, 4236,    0, 4236,
-        0, 4236, 4237, 4237, 4237, 4237,    0,    0, 4237, 4237,
-     4238, 4238, 4238, 4238,    0,    0, 4238, 4238, 4239, 4239,
-     4239,    0,    0,    0, 4239, 4240, 4240, 4240, 4240,    0,
-        0, 4240, 4240, 4241, 4241, 4241, 4241,    0,    0, 4241,
-     4241, 4242, 4242, 4242, 4242,    0,    0, 4242, 4242, 4243,
-     4243, 4243,    0,    0,    0, 4243, 4244, 4244, 4244, 4244,
-
-        0,    0, 4244, 4244, 4245, 4245, 4245,    0,    0,    0,
-     4245, 4246, 4246, 4246, 4246,    0,    0, 4246, 4246, 4247,
-     4247, 4247, 4247,    0, 4247,    0, 4247, 4248, 4248, 4248,
-     4248,    0,    0, 4248, 4248, 4249, 4249, 4249,    0,    0,
-        0, 4249, 4250, 4250, 4250, 4250,    0,    0, 4250, 4250,
-     4251, 4251, 4251,    0,    0,    0, 4251, 4252, 4252, 4252,
-     4252,    0,    0, 4252, 4252, 4253, 4253, 4253,    0,    0,
-        0, 4253, 4254, 4254, 4254, 4254,    0,    0, 4254, 4254,
-     4255, 4255, 4255,    0,    0,    0, 4255, 4256, 4256, 4256,
-     4256,    0,    0, 4256, 4256, 4257, 4257, 4257, 4257,    0,
-
-     4257,    0, 4257, 4258, 4258, 4258, 4258,    0,    0, 4258,
-     4258, 4259, 4259, 4259,    0,    0,    0, 4259, 4260, 4260,
-     4260, 4260,    0,    0, 4260, 4260, 4261, 4261, 4261,    0,
-        0,    0, 4261, 4262, 4262, 4262, 4262,    0,    0, 4262,
-     4262, 4263, 4263, 4263,    0,    0,    0, 4263, 4264, 4264,
-     4264, 4264,    0,    0, 4264, 4264, 4265, 4265, 4265,    0,
-        0,    0, 4265, 4266, 4266, 4266, 4266,    0,    0, 4266,
-     4266, 4267, 4267, 4267,    0,    0,    0, 4267, 4268, 4268,
-     4268, 4268,    0,    0, 4268, 4268, 4269, 4269, 4269,    0,
-        0,    0, 4269, 4270, 4270, 4270, 4270,    0,    0, 4270,
-
-     4270, 4271, 4271, 4271,    0,    0,    0, 4271, 4272, 4272,
-     4272, 4272,    0,    0, 4272, 4272, 4273, 4273, 4273,    0,
-        0,    0, 4273, 4274, 4274, 4274, 4274,    0,    0, 4274,
-     4274, 4275, 4275, 4275,    0,    0,    0, 4275, 4276, 4276,
-     4276, 4276,    0,    0, 4276, 4276, 4277, 4277, 4277, 4277,
-     4277, 4277, 4277, 4277, 4277, 4278, 4278, 4278, 4278, 4278,
-     4278, 4278, 4278, 4278, 4279, 4279, 4279,    0,    0,    0,
-     4279, 4280, 4280, 4280, 4280,    0, 4280,    0, 4280, 4281,
-     4281, 4281, 4281,    0,    0, 4281, 4281, 4282, 4282, 4282,
-        0,    0,    0, 4282, 4283, 4283, 4283, 4283,    0,    0,
-
-     4283, 4283, 4284, 4284, 4284, 4284,    0,    0, 4284, 4284,
-     4285, 4285, 4285,    0,    0,    0, 4285, 4286, 4286, 4286,
-     4286,    0,    0, 4286, 4286, 4287, 4287, 4287, 4287,    0,
-     4287,    0, 4287, 4288, 4288, 4288, 4288,    0,    0, 4288,
-     4288, 4289, 4289, 4289, 4289,    0,    0, 4289, 4289, 4290,
-     4290, 4290, 4290,    0, 4290,    0, 4290, 4291, 4291, 4291,
-     4291,    0,    0, 4291, 4291, 4292, 4292, 4292, 4292,    0,
-     4292,    0, 4292, 4293, 4293, 4293, 4293,    0,    0, 4293,
-     4293, 4294, 4294, 4294, 4294,    0, 4294,    0, 4294, 4295,
-     4295, 4295, 4295,    0,    0, 4295, 4295, 4296, 4296, 4296,
+      257,  257, 2877,  257,  257,  257,  257,  257, 1151, 1159,
+     1159, 1159, 1164, 1164, 1164, 2893, 2899, 1165, 1165, 1165,
+     1155, 1168, 1168, 1168, 2900, 2850, 1159, 1172, 1172, 1172,
+     1164, 2853, 2901,  257,  257, 1165, 2850, 2902, 1168, 1261,
+     1261, 1261, 2853, 1261,  257, 1172, 1261, 2903, 2904, 1934,
+     1934, 1934, 2905,  257,  258,  258,  258,  258,  258,  258,
+      258,  258,  258,  258,  258,  258,  258,  258,  258, 2906,
+      258,  258,  258,  258,  258, 1170, 1170, 1170, 2907, 1165,
+
+     1173, 1173, 1173, 2908, 1175, 1175, 1175, 1176, 1176, 1176,
+     2910, 2911, 1170, 1180, 1180, 1180, 1934, 2912, 1173, 2869,
+      258,  258, 1175, 2913, 2914, 1176, 1946, 1946, 1946, 2869,
+     1180,  258, 1269, 1269, 1269, 2869, 1269, 2915, 2916, 1269,
+      258,  295,  295,  295,  295,  295,  295,  295,  295,  295,
+      295,  295,  295,  295,  295,  295, 2870,  295,  295,  295,
+      295,  295, 1173, 1185, 1185, 1185, 2870, 2917, 1176, 1188,
+     1188, 1188, 2870, 2918, 1186, 1186, 1186, 1190, 1190, 1190,
+     2919, 1185, 1191, 1191, 1191, 2920, 1188,  295,  295, 1192,
+     1192, 1192, 1186,  295, 2921, 1190,  295, 1281, 1281, 1281,
+
+     1191, 1281, 2927, 2928, 1281, 2925, 1192, 2924,  295,  296,
+      296,  296,  296,  296,  296,  296,  296,  296,  296,  296,
+      296,  296,  296,  296, 2929,  296,  296,  296,  296,  296,
+     1186, 1195, 1195, 1195, 1196, 1196, 1196, 2924, 1191, 1199,
+     1199, 1199, 1200, 1200, 1200, 1204, 1204, 1204, 2925, 1195,
+     2930, 2931, 1196, 2932, 2933,  296,  296, 1199, 2934, 2935,
+     1200,  296, 1204, 2936,  296, 1206, 1206, 1206, 1209, 1209,
+     1209, 2937, 2938, 1210, 1210, 1210,  296,  344, 2926, 1213,
+     1213, 1213, 1206, 2939,  344, 2941, 1209, 1214, 1214, 1214,
+     2943, 1210, 2944,  344,  344, 2945, 1196, 1213, 1224, 1224,
+
+     1224, 1225, 1225, 1225, 1200, 1214, 1947, 1947, 1947, 1226,
+     1226, 1226, 2947, 1229, 1229, 1229, 1224, 2519, 2519, 1225,
+     2519, 2926,  344,  344,  344, 1210, 1226, 2948, 2519,  344,
+      344, 1229, 2949,  344,  344, 2519, 2953,  344, 2961,  344,
+      344,  344, 1230, 1230, 1230, 2966, 1214,  344,  346, 2953,
+     1232, 1232, 1232, 1234, 1234, 1234, 1236, 1236, 1236, 2891,
+     1230, 1240, 1240, 1240,  346,  346, 1225, 1232, 2967, 2891,
+     1234, 2954, 2891, 1236, 1241, 1241, 1241, 2968, 2969, 1240,
+     1242, 1242, 1242, 2970, 2954, 1243, 1243, 1243, 2971, 1244,
+     1244, 1244, 1241,  346,  346,  346, 2972, 1242, 2973, 2974,
+
+      346,  346, 1243, 2975,  346,  346, 1244, 1230,  346, 2976,
+      346,  346,  346, 1245, 1245, 1245, 2984, 2986,  346,  728,
+     2990, 2991, 1241, 1246, 1246, 1246,  728, 1248, 1248, 1248,
+     2892, 1245, 1250, 1250, 1250,  728,  728, 1251, 1251, 1251,
+     2892, 1246, 2992, 2892, 1248, 1254, 1254, 1254, 2993, 1244,
+     1250, 1257, 1257, 1257, 2994, 1251, 1258, 1258, 1258, 1264,
+     1264, 1264, 1254, 2995,  728,  728,  728, 2997, 3009, 1257,
+     3010,  728,  728, 3012, 1258,  728,  728, 1264, 3013,  728,
+     3015,  728,  728,  728, 3024, 1246, 1260, 1260, 1260,  728,
+     1265, 1265, 1265, 1268, 1268, 1268, 1272, 1272, 1272, 1251,
+
+     1273, 1273, 1273, 1260, 1278, 1278, 1278, 3025, 1265, 3026,
+     1268, 1279, 1279, 1279, 1272, 1280, 1280, 1280, 1273, 1283,
+     1283, 1283, 1278, 1258, 1284, 1284, 1284, 3027, 3004, 1279,
+     3029, 3030, 1280, 1288, 1288, 1288, 3005, 1283, 1289, 1289,
+     1289, 3004, 1284, 1290, 1290, 1290, 1291, 1291, 1291, 3005,
+     1288, 1292, 1292, 1292, 3031, 1289, 3032, 1265, 3035, 3036,
+     1290, 3037, 3011, 1291, 3038, 1273, 1293, 1293, 1293, 1292,
+     1306, 1306, 1306, 3039, 1306, 3011, 1279, 1306, 1310, 1310,
+     1310, 1311, 1311, 1311, 1293, 3014, 1284, 3040, 3041, 1289,
+     1313, 1313, 1313, 1354, 1354, 1354, 1310, 3042, 3014, 1311,
+
+     1358, 1358, 1358, 3043, 1289, 3044, 1291, 3045, 1313, 3046,
+     1354, 1355, 1355, 1355, 3054, 1355, 3052, 1358, 1355, 1359,
+     1359, 1359, 3055, 1359, 3051, 3056, 1359, 3057, 1293, 1361,
+     1361, 1361, 1362, 1362, 1362, 1364, 1364, 1364, 1367, 1367,
+     1367, 1371, 1371, 1371, 1372, 1372, 1372, 1361, 3058, 3059,
+     1362, 3060, 3052, 1364, 3061, 1367, 1374, 1374, 1374, 1371,
+     3062, 3063, 1372, 1377, 1377, 1377, 1378, 1378, 1378, 3064,
+     1380, 1380, 1380, 3051, 1374, 1382, 1382, 1382, 3065, 1382,
+     3066, 1377, 1382, 3068, 1378, 1386, 1386, 1386, 1380, 1387,
+     1387, 1387, 1389, 1389, 1389, 1390, 1390, 1390, 2520, 2520,
+
+     1364, 2520, 3070, 1386, 1391, 1391, 1391, 1387, 1391, 2520,
+     1389, 1391, 1390, 1394, 1394, 1394, 2520, 3071, 1395, 1395,
+     1395, 3073, 1395, 1374, 1380, 1395, 1396, 1396, 1396, 3075,
+     1394, 1397, 1397, 1397, 1399, 1399, 1399, 1400, 1400, 1400,
+     3079, 3080, 1389, 3081, 1396, 3082, 1401, 1401, 1401, 1397,
+     1401, 3086, 1399, 1401, 1400, 1402, 1402, 1402, 1403, 1403,
+     1403, 3094, 1403, 3095, 3096, 1403, 1404, 1404, 1404, 1405,
+     1405, 1405, 1402, 1407, 1407, 1407, 1408, 1408, 1408, 1409,
+     1409, 1409, 3097, 1409, 1404, 3098, 1409, 1405, 1412, 1412,
+     1412, 1407, 3099, 1408, 1413, 1413, 1413, 1399, 1413, 3100,
+
+     3101, 1413, 1414, 1414, 1414, 1412, 1415, 1415, 1415, 1417,
+     1417, 1417, 1418, 1418, 1418, 3102, 1418, 3103, 3104, 1418,
+     1414, 1421, 1421, 1421, 1415, 1421, 3108, 1417, 1421, 1424,
+     1424, 1424, 3111, 1425, 1425, 1425, 1407, 1425, 3112, 3113,
+     1425, 1430, 1430, 1430, 3114, 3115, 1424, 1431, 1431, 1431,
+     1433, 1433, 1433, 1437, 1437, 1437, 3116, 1437, 3117, 1430,
+     1437, 1440, 1440, 1440, 3120, 1431, 3124, 3125, 1433, 1441,
+     1441, 1441, 1417, 1441, 3126, 3127, 1441, 3128, 1440, 1444,
+     1444, 1444, 1445, 1445, 1445, 3129, 1445, 3130, 3131, 1445,
+     1455, 1455, 1455, 1456, 1456, 1456, 1444, 3132, 3133, 1433,
+
+     1458, 1458, 1458, 1459, 1459, 1459, 3134, 1459, 1455, 3135,
+     1459, 1456, 1462, 1462, 1462, 1463, 1463, 1463, 1458, 1465,
+     1465, 1465, 1468, 1468, 1468, 1469, 1469, 1469, 3147, 1469,
+     1462, 3148, 1469, 1463, 1475, 1475, 1475, 1465, 3149, 1468,
+     1476, 1476, 1476, 1478, 1478, 1478, 1480, 1480, 1480, 1481,
+     1481, 1481, 1475, 1481, 2104, 3150, 1481, 3151, 1476, 3152,
+     2104, 1478, 3153, 1480, 2104, 1484, 1484, 1484, 1458, 1484,
+     2104, 3154, 1484, 1487, 1487, 1487, 1488, 1488, 1488, 3156,
+     1465, 1490, 1490, 1490, 1491, 1491, 1491, 1492, 1492, 1492,
+     3157, 1487, 3158, 3159, 1488, 1493, 1493, 1493, 3160, 1490,
+
+     3161, 1491, 1495, 1495, 1495, 1492, 1504, 1504, 1504, 1478,
+     1498, 1498, 1498, 1493, 1498, 3162, 3163, 1498, 3164, 3165,
+     1495, 1505, 1505, 1505, 1504, 1507, 1507, 1507, 1509, 1509,
+     1509, 3166, 1509, 3167, 3171, 1509, 1512, 1512, 1512, 1505,
+     1513, 1513, 1513, 1507, 1515, 1515, 1515, 1490, 3175, 1516,
+     1516, 1516, 1495, 1516, 1512, 3176, 1516, 3177, 1513, 1520,
+     1520, 1520, 1515, 1521, 1521, 1521, 1523, 1523, 1523, 3171,
+     1524, 1524, 1524, 1525, 1525, 1525, 3180, 1520, 1526, 1526,
+     1526, 1521, 3181, 3182, 1523, 3077, 1507, 1524, 3183, 3186,
+     1525, 1527, 1527, 1527, 3188, 3077, 1526, 1529, 1529, 1529,
+
+     1534, 1534, 1534, 3192, 1534, 1515, 3195, 1534, 3196, 1527,
+     1537, 1537, 1537, 3077, 3197, 1529, 3198, 1523, 1538, 1538,
+     1538, 1525, 1538, 3199, 3077, 1538, 3200, 1537, 1541, 1541,
+     1541, 1542, 1542, 1542, 1544, 1544, 1544, 1547, 1547, 1547,
+     1548, 1548, 1548, 1550, 1550, 1550, 1541, 3201, 3202, 1542,
+     3203, 3204, 1544, 3205, 3206, 1547, 3211, 3219, 1548, 3220,
+     3221, 1550, 1556, 1556, 1556, 1529, 1560, 1560, 1560, 1561,
+     1561, 1561, 1563, 1563, 1563, 3222, 1564, 1564, 1564, 1556,
+     1564, 3223, 3224, 1564, 1560, 3225, 1544, 1561, 3226, 3227,
+     1563, 1550, 1568, 1568, 1568, 1569, 1569, 1569, 1571, 1571,
+
+     1571, 1573, 1573, 1573, 3078, 1573, 2656, 2656, 1573, 2656,
+     1568, 3228, 3234, 1569, 3078, 3235, 1571, 2656, 1576, 1576,
+     1576, 1577, 1577, 1577, 2656, 1577, 3237, 3238, 1577, 1578,
+     1578, 1578, 3078, 3240, 1563, 1576, 1579, 1579, 1579, 3241,
+     1580, 1580, 1580, 3078, 1580, 3242, 1578, 1580, 1582, 1582,
+     1582, 3243, 3244, 1579, 1584, 1584, 1584, 1585, 1585, 1585,
+     1571, 1587, 1587, 1587, 3245, 1582, 1588, 1588, 1588, 1589,
+     1589, 1589, 1584, 1589, 3246, 1585, 1589, 3247, 3248, 1587,
+     1590, 1590, 1590, 1588, 1591, 1591, 1591, 3249, 1591, 3250,
+     3251, 1591, 1593, 1593, 1593, 3252, 3255, 1590, 1594, 1594,
+
+     1594, 1596, 1596, 1596, 1598, 1598, 1598, 3256, 1598, 3257,
+     1593, 1598, 1601, 1601, 1601, 3258, 1594, 3259, 3260, 1596,
+     3261, 3262, 1587, 1602, 1602, 1602, 1604, 1604, 1604, 3264,
+     1601, 1607, 1607, 1607, 3265, 1607, 3267, 3268, 1607, 3269,
+     3271, 1602, 3273, 3274, 1604, 1611, 1611, 1611, 1612, 1612,
+     1612, 3275, 1614, 1614, 1614, 1616, 1616, 1616, 3138, 1616,
+     3278, 3279, 1616, 1611, 3280, 3281, 1612, 3284, 3138, 1596,
+     1614, 1620, 1620, 1620, 1621, 1621, 1621, 1622, 1622, 1622,
+     1624, 1624, 1624, 1626, 1626, 1626, 3138, 3285, 1620, 1627,
+     1627, 1627, 1621, 1627, 1604, 1622, 1627, 3138, 1624, 3286,
+
+     1626, 1630, 1630, 1630, 1632, 1632, 1632, 1633, 1633, 1633,
+     1635, 1635, 1635, 3287, 1614, 1637, 1637, 1637, 1630, 1639,
+     1639, 1639, 1632, 3288, 3289, 1633, 3290, 3291, 1635, 1640,
+     1640, 1640, 1637, 1642, 1642, 1642, 3292, 1639, 3299, 1643,
+     1643, 1643, 1624, 1643, 3293, 3300, 1643, 1640, 1647, 1647,
+     1647, 1642, 1648, 1648, 1648, 1650, 1650, 1650, 1635, 1654,
+     1654, 1654, 3302, 1630, 3303, 3304, 1647, 1655, 1655, 1655,
+     1648, 1655, 3306, 1650, 1655, 3308, 1654, 1658, 1658, 1658,
+     3311, 1642, 1659, 1659, 1659, 3313, 1659, 3314, 3293, 1659,
+     1661, 1661, 1661, 3315, 1658, 1662, 1662, 1662, 3316, 1664,
+
+     1664, 1664, 1666, 1666, 1666, 1672, 1672, 1672, 1661, 1722,
+     1722, 1722, 3317, 1662, 3318, 3319, 1650, 1664, 3320, 3321,
+     1666, 1666, 3322, 1672, 1713, 1713, 1713, 1722, 1713, 3323,
+     3324, 1713, 1718, 1718, 1718, 3327, 1718, 3331, 3332, 1718,
+     1725, 1725, 1725, 1726, 1726, 1726, 3334, 1726, 3139, 3335,
+     1726, 1730, 1730, 1730, 1733, 1733, 1733, 1725, 3139, 3336,
+     1664, 1732, 1732, 1732, 3338, 1736, 1736, 1736, 3339, 1730,
+     3344, 1722, 1733, 1737, 1737, 1737, 3139, 1737, 1732, 3345,
+     1737, 3346, 3347, 1736, 1742, 1742, 1742, 3139, 1742, 3348,
+     3349, 1742, 1745, 1745, 1745, 1746, 1746, 1746, 3350, 1746,
+
+     3351, 3352, 1746, 3353, 1749, 1749, 1749, 3354, 1749, 3355,
+     1745, 1749, 3356, 1730, 1752, 1752, 1752, 1753, 1753, 1753,
+     3357, 1753, 1733, 1736, 1753, 3358, 1758, 1758, 1758, 3359,
+     1758, 3360, 1752, 1758, 1761, 1761, 1761, 1762, 1762, 1762,
+     1745, 1762, 3364, 3365, 1762, 3366, 1767, 1767, 1767, 1769,
+     1769, 1769, 1761, 1770, 1770, 1770, 1771, 1771, 1771, 1772,
+     1772, 1772, 1752, 1767, 1773, 1773, 1773, 1769, 3367, 3368,
+     1770, 3369, 3370, 1771, 3371, 3374, 1772, 1778, 1778, 1778,
+     3375, 1773, 1761, 1774, 1774, 1774, 3376, 1774, 3377, 3378,
+     1774, 1775, 1775, 1775, 1778, 1775, 3379, 3381, 1775, 1779,
+
+     1779, 1779, 1780, 1780, 1780, 1769, 3382, 1772, 1781, 1781,
+     1781, 1782, 1782, 1782, 3384, 3385, 1779, 3386, 3388, 1780,
+     1783, 1783, 1783, 1771, 3389, 1781, 3390, 3391, 1782, 1778,
+     3392, 1784, 1784, 1784, 1785, 1785, 1785, 1783, 1786, 1786,
+     1786, 1787, 1787, 1787, 1788, 1788, 1788, 1779, 1784, 3393,
+     3394, 1785, 1792, 1792, 1792, 1786, 1781, 3395, 1787, 1789,
+     1789, 1789, 1788, 1793, 1793, 1793, 3396, 1793, 3404, 1792,
+     1793, 3405, 3407, 1780, 3399, 3397, 1782, 1789, 1795, 1795,
+     1795, 1783, 1797, 1797, 1797, 1799, 1799, 1799, 3399, 1800,
+     1800, 1800, 3408, 1800, 3412, 1795, 1800, 1801, 1801, 1801,
+
+     1797, 1786, 1799, 1787, 3414, 1785, 1802, 1802, 1802, 3400,
+     1788, 3416, 1789, 3418, 3420, 1801, 3422, 1803, 1803, 1803,
+     3400, 1803, 3397, 1802, 1803, 1804, 1804, 1804, 1810, 1810,
+     1810, 3426, 1812, 1812, 1812, 1813, 1813, 1813, 3169, 1814,
+     1814, 1814, 3432, 1804, 3428, 3433, 1810, 3435, 3169, 1797,
+     1812, 3429, 1813, 1815, 1815, 1815, 3428, 1814, 1816, 1816,
+     1816, 3436, 1816, 3429, 1801, 1816, 3169, 1818, 1818, 1818,
+     1815, 1820, 1820, 1820, 1823, 1823, 1823, 3169, 1823, 3438,
+     3449, 1823, 3451, 3453, 1804, 1818, 1810, 3454, 1820, 3457,
+     1812, 1814, 1826, 1826, 1826, 1828, 1828, 1828, 1831, 1831,
+
+     1831, 1837, 1837, 1837, 1838, 1838, 1838, 3458, 1838, 1826,
+     3461, 1838, 3463, 1828, 3465, 3467, 1831, 3469, 1837, 1842,
+     1842, 1842, 1843, 1843, 1843, 1844, 1844, 1844, 1818, 1846,
+     1846, 1846, 3471, 1846, 3472, 3443, 1846, 1842, 3444, 1843,
+     1849, 1849, 1849, 1844, 1850, 1850, 1850, 3443, 1850, 3474,
+     3444, 1850, 1851, 1851, 1851, 3475, 1851, 1849, 3479, 1851,
+     1828, 1855, 1855, 1855, 3480, 1831, 1856, 1856, 1856, 1842,
+     1856, 3482, 3483, 1856, 1858, 1858, 1858, 3485, 1855, 1859,
+     1859, 1859, 3487, 1859, 3489, 3491, 1859, 3495, 1844, 1862,
+     1862, 1862, 1858, 1862, 3492, 3497, 1862, 1866, 1866, 1866,
+
+     1868, 1868, 1868, 1872, 1872, 1872, 1874, 1874, 1874, 1875,
+     1875, 1875, 1876, 1876, 1876, 1866, 1876, 3500, 1868, 1876,
+     3501, 1872, 3502, 1874, 3493, 1858, 1875, 1877, 1877, 1877,
+     1879, 1879, 1879, 1880, 1880, 1880, 3492, 1880, 3493, 3506,
+     1880, 1883, 1883, 1883, 3507, 1877, 3508, 1879, 1885, 1885,
+     1885, 1886, 1886, 1886, 3517, 1886, 3494, 3494, 1886, 1883,
+     1887, 1887, 1887, 3503, 1866, 1885, 3518, 1868, 1872, 1888,
+     1888, 1888, 1890, 1890, 1890, 3496, 3522, 1887, 1894, 1894,
+     1894, 3503, 1894, 3509, 3522, 1894, 3496, 1888, 3524, 3528,
+     1890, 1883, 1877, 1899, 1899, 1899, 3524, 1899, 3509, 3521,
+
+     1899, 3529, 1903, 1903, 1903, 1906, 1906, 1906, 1948, 1948,
+     1948, 1950, 1950, 1950, 1951, 1951, 1951, 3530, 3521, 1888,
+     1903, 3531, 3538, 1906, 1890, 1953, 1953, 1953, 1954, 1954,
+     1954, 1955, 1955, 1955, 1956, 1956, 1956, 3523, 1957, 1957,
+     1957, 1958, 1958, 1958, 3539, 1961, 1961, 1961, 1955, 1961,
+     3540, 1956, 1961, 3541, 1903, 1957, 3523, 1906, 1950, 1958,
+     1967, 1967, 1967, 1969, 1969, 1969, 3542, 3543, 1970, 1970,
+     1970, 3553, 1970, 1948, 1906, 1970, 3554, 3555, 1967, 3533,
+     1969, 1971, 1971, 1971, 1974, 1974, 1974, 1975, 1975, 1975,
+     1953, 3535, 3534, 1954, 1976, 1976, 1976, 3559, 3533, 1971,
+
+     3534, 3560, 1974, 1957, 1975, 1977, 1977, 1977, 3561, 1958,
+     3535, 1976, 1978, 1978, 1978, 1979, 1979, 1979, 1980, 1980,
+     1980, 3536, 3556, 1977, 3170, 1967, 1981, 1981, 1981, 3536,
+     1978, 3569, 1979, 1974, 3170, 1980, 1982, 1982, 1982, 3570,
+     3556, 1971, 3562, 3571, 1981, 1983, 1983, 1983, 1984, 1984,
+     1984, 3573, 3170, 1982, 1985, 1985, 1985, 3562, 1985, 3574,
+     3575, 1985, 1983, 3170, 3577, 1984, 1986, 1986, 1986, 3578,
+     3579, 1977, 1987, 1987, 1987, 2018, 2018, 2018, 1978, 1988,
+     1988, 1988, 3580, 1986, 1989, 1989, 1989, 3582, 1989, 3583,
+     1987, 1989, 1981, 1990, 1990, 1990, 1988, 1991, 1991, 1991,
+
+     3584, 1992, 1992, 1992, 1983, 1992, 3589, 3590, 1992, 3591,
+     1990, 1995, 1995, 1995, 1991, 1996, 1996, 1996, 1997, 1997,
+     1997, 1998, 1998, 1998, 1999, 1999, 1999, 3592, 1995, 2000,
+     2000, 2000, 1996, 1987, 3593, 1997, 3594, 3595, 1998, 3596,
+     3597, 1999, 2001, 2001, 2001, 3598, 2000, 2002, 2002, 2002,
+     3599, 2002, 3600, 3603, 2002, 2003, 2003, 2003, 3604, 2001,
+     3605, 3606, 1991, 3607, 3608, 1996, 3609, 2004, 2004, 2004,
+     3610, 1999, 2003, 2005, 2005, 2005, 1995, 2006, 2006, 2006,
+     1998, 3613, 3614, 2000, 2004, 2007, 2007, 2007, 3615, 3616,
+     2005, 3403, 2010, 2010, 2010, 2006, 2010, 3617, 3618, 2010,
+
+     2013, 2013, 2013, 2007, 2014, 2014, 2014, 2015, 2015, 2015,
+     3403, 2015, 3403, 3619, 2015, 2004, 3620, 2013, 2017, 2017,
+     2017, 2014, 2019, 2019, 2019, 3403, 2019, 2005, 3621, 2019,
+     2022, 2022, 2022, 2023, 2023, 2023, 2017, 2023, 3623, 3624,
+     2023, 2007, 3625, 3626, 2006, 2026, 2026, 2026, 2022, 2031,
+     2031, 2031, 2033, 2033, 2033, 2034, 2034, 2034, 2035, 2035,
+     2035, 3628, 2035, 2026, 3630, 2035, 3631, 2031, 3632, 3633,
+     2033, 3634, 2034, 2036, 2036, 2036, 3635, 2022, 2037, 2037,
+     2037, 3636, 2037, 3637, 3638, 2037, 2041, 2041, 2041, 3639,
+     3640, 2036, 2043, 2043, 2043, 3644, 2044, 2044, 2044, 2033,
+
+     2044, 3645, 3646, 2044, 2041, 2045, 2045, 2045, 3642, 2043,
+     2047, 2047, 2047, 2026, 2048, 2048, 2048, 3647, 2048, 3643,
+     3642, 2048, 2045, 2050, 2050, 2050, 3406, 2047, 2053, 2053,
+     2053, 3643, 2036, 2054, 2054, 2054, 2059, 2059, 2059, 3648,
+     2059, 2050, 3406, 2059, 3406, 3649, 2053, 2065, 2065, 2065,
+     2066, 2066, 2066, 2041, 2067, 2067, 2067, 3406, 2067, 3650,
+     3651, 2067, 2068, 2068, 2068, 2065, 3652, 2066, 2070, 2070,
+     2070, 3654, 2070, 3659, 3660, 2070, 2078, 2078, 2078, 3661,
+     2068, 2053, 2074, 2074, 2074, 3662, 2074, 3663, 3664, 2074,
+     2080, 2080, 2080, 3665, 2078, 2082, 2082, 2082, 3666, 2065,
+
+     2083, 2083, 2083, 2084, 2084, 2084, 3670, 3671, 2080, 2085,
+     2085, 2085, 3673, 2082, 2086, 2086, 2086, 2083, 3675, 3676,
+     2084, 3677, 2088, 2088, 2088, 3678, 2085, 2089, 2089, 2089,
+     3679, 2089, 2086, 3680, 2089, 2093, 2093, 2093, 2078, 2088,
+     3681, 3481, 2080, 3682, 2090, 2090, 2090, 2082, 2090, 3683,
+     3686, 2090, 3687, 2093, 2095, 2095, 2095, 3481, 2095, 3481,
+     3688, 2095, 2086, 2100, 2100, 2100, 3689, 2102, 2102, 2102,
+     2084, 2102, 3481, 3690, 2102, 2105, 2105, 2105, 2106, 2106,
+     2106, 2100, 2106, 2093, 3684, 2106, 2107, 2107, 2107, 2109,
+     2109, 2109, 2105, 2113, 2113, 2113, 2114, 2114, 2114, 2115,
+
+     2115, 2115, 3691, 3692, 2107, 3693, 3696, 2109, 3697, 3684,
+     2113, 3698, 3699, 2114, 3700, 2100, 2115, 2116, 2116, 2116,
+     2121, 2121, 2121, 2123, 2123, 2123, 2129, 2129, 2129, 2134,
+     2134, 2134, 2137, 2137, 2137, 2116, 3701, 2121, 2107, 2138,
+     2138, 2138, 2139, 2139, 2139, 2141, 2141, 2141, 2151, 2151,
+     2151, 3702, 3703, 2116, 2152, 2152, 2152, 2154, 2154, 2154,
+     2157, 2157, 2157, 3704, 2115, 2158, 2158, 2158, 3705, 2158,
+     3706, 3707, 2158, 2159, 2159, 2159, 3710, 2157, 2160, 2160,
+     2160, 3711, 2160, 3712, 3713, 2160, 2162, 2162, 2162, 3714,
+     2159, 2168, 2168, 2168, 2170, 2170, 2170, 3715, 2170, 3716,
+
+     3717, 2170, 3720, 3721, 2162, 2173, 2173, 2173, 3722, 2168,
+     2175, 2175, 2175, 2176, 2176, 2176, 2177, 2177, 2177, 2179,
+     2179, 2179, 3723, 2173, 2181, 2181, 2181, 2175, 2178, 2178,
+     2178, 2176, 2178, 2177, 3724, 2178, 2179, 2180, 2180, 2180,
+     3725, 2180, 2181, 3726, 2180, 2182, 2182, 2182, 2183, 2183,
+     2183, 3727, 3728, 2162, 2184, 2184, 2184, 2173, 2184, 3729,
+     3731, 2184, 3732, 2182, 3733, 2183, 2185, 2185, 2185, 2186,
+     2186, 2186, 3734, 2186, 3735, 2176, 2186, 2187, 2187, 2187,
+     2188, 2188, 2188, 2185, 2189, 2189, 2189, 3736, 2189, 3737,
+     2181, 2189, 2190, 2190, 2190, 2187, 3478, 2188, 2191, 2191,
+
+     2191, 3738, 2191, 3739, 3740, 2191, 2194, 2194, 2194, 2190,
+     3730, 2182, 2195, 2195, 2195, 3478, 2195, 3478, 3741, 2195,
+     2196, 2196, 2196, 2194, 2197, 2197, 2197, 3742, 2197, 3730,
+     3478, 2197, 2200, 2200, 2200, 2201, 2201, 2201, 2196, 2201,
+     3743, 3744, 2201, 2187, 2205, 2205, 2205, 3745, 3746, 2200,
+     2206, 2206, 2206, 3747, 2206, 3748, 3749, 2206, 2207, 2207,
+     2207, 2205, 2210, 2210, 2210, 3750, 2210, 3751, 3752, 2210,
+     3753, 3754, 2196, 3755, 3756, 2207, 2213, 2213, 2213, 2214,
+     2214, 2214, 3757, 2214, 3758, 3761, 2214, 2217, 2217, 2217,
+     2218, 2218, 2218, 2213, 2221, 2221, 2221, 2222, 2222, 2222,
+
+     3762, 2222, 3763, 3764, 2222, 2217, 3765, 3766, 2218, 3767,
+     3768, 2221, 2223, 2223, 2223, 3770, 2223, 3769, 3771, 2223,
+     2227, 2227, 2227, 2229, 2229, 2229, 3773, 2230, 2230, 2230,
+     2231, 2231, 2231, 2233, 2233, 2233, 3774, 3769, 2227, 2217,
+     2236, 2236, 2236, 3775, 2218, 2230, 3777, 3778, 2231, 3779,
+     2233, 2239, 2239, 2239, 3780, 2240, 2240, 2240, 2236, 2240,
+     3781, 3782, 2240, 3783, 2243, 2243, 2243, 3784, 3785, 2239,
+     2245, 2245, 2245, 3786, 2250, 2250, 2250, 2257, 2257, 2257,
+     2233, 2231, 2243, 2247, 2247, 2247, 2230, 2247, 2245, 3787,
+     2247, 2250, 2251, 2251, 2251, 2257, 2251, 3788, 3789, 2251,
+
+     3790, 2239, 2253, 2253, 2253, 3791, 2253, 3792, 3793, 2253,
+     3794, 2243, 2260, 2260, 2260, 2261, 2261, 2261, 2262, 2262,
+     2262, 2263, 2263, 2263, 2265, 2265, 2265, 3795, 3796, 2260,
+     2270, 2270, 2270, 2261, 2271, 2271, 2271, 3797, 2271, 3798,
+     3799, 2271, 2274, 2274, 2274, 2277, 2277, 2277, 2270, 2279,
+     2279, 2279, 2281, 2281, 2281, 2283, 2283, 2283, 3801, 3802,
+     2274, 3803, 2277, 2284, 2284, 2284, 3805, 2279, 3807, 3808,
+     2281, 3810, 3811, 2283, 2285, 2285, 2285, 2261, 2285, 3813,
+     2284, 2285, 2286, 2286, 2286, 2287, 2287, 2287, 2288, 2288,
+     2288, 3806, 2288, 3814, 3815, 2288, 2270, 3806, 3816, 2286,
+
+     3817, 3818, 2287, 2289, 2289, 2289, 2290, 2290, 2290, 2279,
+     2291, 2291, 2291, 3820, 2291, 3821, 3822, 2291, 3824, 3825,
+     2283, 2289, 3826, 2290, 2294, 2294, 2294, 2298, 2298, 2298,
+     2299, 2299, 2299, 2308, 2308, 2308, 3828, 2308, 3829, 3830,
+     2308, 3832, 2294, 3833, 3834, 2298, 3836, 2299, 2311, 2311,
+     2311, 2312, 2312, 2312, 2313, 2313, 2313, 2289, 2318, 2318,
+     2318, 3837, 3839, 2319, 2319, 2319, 2311, 2319, 2312, 3840,
+     2319, 3842, 2313, 3844, 3845, 2318, 3839, 3846, 2294, 2320,
+     2320, 2320, 2321, 2321, 2321, 3847, 2321, 3849, 3850, 2321,
+     2323, 2323, 2323, 3852, 3853, 2311, 2320, 2327, 2327, 2327,
+
+     2328, 2328, 2328, 3855, 2328, 3856, 3858, 2328, 2323, 2329,
+     2329, 2329, 3859, 3860, 2327, 2335, 2335, 2335, 2336, 2336,
+     2336, 2337, 2337, 2337, 2339, 2339, 2339, 2343, 2343, 2343,
+     2344, 2344, 2344, 2345, 2345, 2345, 2346, 2346, 2346, 2349,
+     2349, 2349, 2354, 2354, 2354, 2355, 2355, 2355, 2357, 2357,
+     2357, 3862, 2323, 2358, 2358, 2358, 2359, 2359, 2359, 2362,
+     2362, 2362, 3865, 2362, 3866, 3867, 2362, 2365, 2365, 2365,
+     3868, 2365, 3869, 3870, 2365, 2369, 2369, 2369, 2371, 2371,
+     2371, 3871, 3872, 2346, 2372, 2372, 2372, 2373, 2373, 2373,
+     2374, 2374, 2374, 2369, 3873, 2371, 2375, 2375, 2375, 3874,
+
+     3875, 2372, 3876, 2359, 2373, 3877, 3878, 2374, 2378, 2378,
+     2378, 2380, 2380, 2380, 2375, 2381, 2381, 2381, 3879, 2381,
+     3880, 3884, 2381, 2382, 2382, 2382, 2378, 2369, 2380, 3886,
+     2383, 2383, 2383, 3888, 2383, 3889, 2372, 2383, 2386, 2386,
+     2386, 2382, 2386, 3890, 3891, 2386, 2389, 2389, 2389, 3892,
+     2374, 3893, 2373, 2390, 2390, 2390, 2391, 2391, 2391, 3894,
+     2391, 3895, 3903, 2391, 2389, 3898, 2389, 2657, 2657, 2378,
+     2657, 2390, 2394, 2394, 2394, 3905, 2394, 3899, 2657, 2394,
+     2397, 2397, 2397, 3907, 2382, 2657, 2398, 2398, 2398, 2390,
+     2398, 3909, 3964, 2398, 2401, 2401, 2401, 3918, 2397, 2402,
+
+     2402, 2402, 3898, 2402, 1531, 3922, 2402, 3919, 2403, 2403,
+     2403, 2401, 2403, 3922, 3899, 2403, 2406, 2406, 2406, 2407,
+     2407, 2407, 3964, 2407, 2397, 3923, 2407, 3920, 2413, 2413,
+     2413, 3920, 2413, 3923, 2406, 2413, 2416, 2416, 2416, 2417,
+     2417, 2417, 3918, 2417, 3910, 3911, 2417, 2420, 2420, 2420,
+     3916, 2420, 3919, 2416, 2420, 2424, 2424, 2424, 2425, 2425,
+     2425, 2426, 2426, 2426, 2429, 2429, 2429, 1530, 2429, 3924,
+     3917, 2429, 2424, 2433, 2433, 2433, 2425, 3924, 3926, 2426,
+     2434, 2434, 2434, 2406, 2436, 2436, 2436, 3946, 2437, 2437,
+     2437, 2433, 2437, 3910, 3911, 2437, 3921, 3925, 2434, 3916,
+
+     3921, 2436, 2442, 2442, 2442, 3925, 3932, 2443, 2443, 2443,
+     2445, 2445, 2445, 3927, 2448, 2448, 2448, 1519, 2448, 3917,
+     2442, 2448, 3928, 2425, 1508, 2443, 3926, 1503, 2445, 2433,
+     1502, 3946, 2434, 2454, 2454, 2454, 2455, 2455, 2455, 3930,
+     2455, 3929, 3932, 2455, 2456, 2456, 2456, 2457, 2457, 2457,
+     2454, 2458, 2458, 2458, 2459, 2459, 2459, 2460, 2460, 2460,
+     3928, 3927, 2456, 2461, 2461, 2461, 2462, 2462, 2462, 2442,
+     2443, 2464, 2464, 2464, 2460, 2463, 2463, 2463, 3933, 3929,
+     2461, 3930, 3972, 2462, 2466, 2466, 2466, 3931, 1501, 2464,
+     3972, 3934, 2463, 2467, 2467, 2467, 3947, 2467, 1497, 3935,
+
+     2467, 2466, 2469, 2469, 2469, 2471, 2471, 2471, 3938, 2456,
+     2474, 2474, 2474, 4008, 3933, 2461, 3939, 2475, 2475, 2475,
+     2469, 2475, 3936, 2471, 2475, 2478, 2478, 2478, 2474, 3931,
+     3937, 2462, 2479, 2479, 2479, 2463, 2479, 2464, 3934, 2479,
+     3947, 3938, 2478, 2480, 2480, 2480, 3935, 2480, 3942, 3939,
+     2480, 2483, 2483, 2483, 2484, 2484, 2484, 2485, 2485, 2485,
+     3936, 2485, 4008, 3956, 2485, 2486, 2486, 2486, 3937, 2483,
+     3958, 2484, 2490, 2490, 2490, 2492, 2492, 2492, 2493, 2493,
+     2493, 3944, 2493, 2486, 3942, 2493, 2504, 2504, 2504, 3945,
+     2490, 3948, 2492, 2505, 2505, 2505, 3943, 3940, 2506, 2506,
+
+     2506, 3956, 2506, 2483, 2504, 2506, 3940, 2507, 2507, 2507,
+     2505, 2507, 3941, 3958, 2507, 3965, 3944, 2486, 2510, 2510,
+     2510, 3941, 2510, 1496, 3945, 2510, 2514, 2514, 2514, 2515,
+     2515, 2515, 3943, 2518, 2518, 2518, 2504, 2518, 3948, 1479,
+     2518, 2521, 2521, 2521, 2514, 3965, 3949, 2515, 2522, 2522,
+     2522, 2523, 2523, 2523, 2527, 2527, 2527, 2528, 2528, 2528,
+     2530, 2530, 2530, 2531, 2531, 2531, 2533, 2533, 2533, 2534,
+     2534, 2534, 2535, 2535, 2535, 2539, 2539, 2539, 2540, 2540,
+     2540, 2544, 2544, 2544, 2545, 2545, 2545, 2547, 2547, 2547,
+     2548, 2548, 2548, 3949, 2514, 2553, 2553, 2553, 2554, 2554,
+
+     2554, 2555, 2555, 2555, 2556, 2556, 2556, 3950, 2556, 3951,
+     3957, 2556, 1474, 2553, 2557, 2557, 2557, 1473, 2555, 2558,
+     2558, 2558, 2559, 2559, 2559, 2560, 2560, 2560, 2561, 2561,
+     2561, 2557, 2562, 2562, 2562, 3952, 2558, 1472, 3968, 2559,
+     2563, 2563, 2563, 3950, 2563, 3951, 2561, 2563, 3957, 2562,
+     2566, 2566, 2566, 3953, 2567, 2567, 2567, 2568, 2568, 2568,
+     2569, 2569, 2569, 2570, 2570, 2570, 3969, 2570, 2566, 3952,
+     2570, 2558, 2567, 3968, 2559, 2568, 3954, 3959, 2569, 2573,
+     2573, 2573, 2577, 2577, 2577, 3954, 2577, 3953, 1467, 2577,
+     3974, 2567, 2580, 2580, 2580, 2561, 3960, 2573, 2583, 2583,
+
+     2583, 3969, 2566, 2584, 2584, 2584, 3973, 2584, 3962, 2580,
+     2584, 2585, 2585, 2585, 3973, 2583, 2586, 2586, 2586, 2568,
+     3959, 3975, 2569, 2591, 2591, 2591, 2592, 2592, 2592, 2585,
+     2593, 2593, 2593, 1466, 2586, 2594, 2594, 2594, 3974, 2594,
+     3978, 2591, 2594, 3960, 2592, 3963, 3962, 2593, 2597, 2597,
+     2597, 2598, 2598, 2598, 2599, 2599, 2599, 2600, 2600, 2600,
+     2601, 2601, 2601, 3955, 3966, 2597, 3967, 3976, 2598, 3975,
+     3986, 2599, 3955, 3966, 2600, 3967, 3961, 2593, 2601, 2602,
+     2602, 2602, 3978, 3963, 2591, 2603, 2603, 2603, 2607, 2607,
+     2607, 2608, 2608, 2608, 1453, 2608, 1452, 2602, 2608, 2611,
+
+     2611, 2611, 2603, 3986, 2597, 3976, 2599, 2612, 2612, 2612,
+     2613, 2613, 2613, 2598, 2615, 2615, 2615, 2611, 2614, 2614,
+     2614, 2601, 2614, 3961, 3970, 2614, 3979, 2613, 2616, 2616,
+     2616, 2615, 2617, 2617, 2617, 2618, 2618, 2618, 2619, 2619,
+     2619, 2623, 2623, 2623, 2602, 2616, 2624, 2624, 2624, 2617,
+     2620, 2620, 2620, 2618, 2620, 2619, 3987, 2620, 2623, 2611,
+     2628, 2628, 2628, 3977, 2624, 2630, 2630, 2630, 3979, 2630,
+     3971, 3970, 2630, 2633, 2633, 2633, 3984, 3994, 2628, 3988,
+     2616, 2634, 2634, 2634, 2617, 2634, 1451, 3988, 2634, 3987,
+     3982, 2633, 2637, 2637, 2637, 2641, 2641, 2641, 4004, 2641,
+
+     4005, 3977, 2641, 2654, 2654, 2654, 3980, 4004, 2623, 4005,
+     2637, 2655, 2655, 2655, 3984, 2655, 1450, 3971, 2655, 3994,
+     1449, 2654, 2659, 2659, 2659, 2660, 2660, 2660, 2673, 2673,
+     2673, 2674, 2674, 2674, 2678, 2678, 2678, 3982, 3981, 2637,
+     2659, 1448, 3980, 2660, 2679, 2679, 2679, 2681, 2681, 2681,
+     2684, 2684, 2684, 2685, 2685, 2685, 2689, 2689, 2689, 2692,
+     2692, 2692, 2694, 2694, 2694, 2654, 2696, 2696, 2696, 2697,
+     2697, 2697, 4012, 2697, 3981, 3995, 2697, 2700, 2700, 2700,
+     2694, 1447, 3985, 2701, 2701, 2701, 4012, 2701, 2660, 2659,
+     2701, 2702, 2702, 2702, 2700, 2703, 2703, 2703, 2704, 2704,
+
+     2704, 2705, 2705, 2705, 2706, 2706, 2706, 3989, 2702, 2707,
+     2707, 2707, 2703, 2707, 3983, 3989, 2707, 3995, 3990, 2705,
+     3985, 2706, 2708, 2708, 2708, 2709, 2709, 2709, 2710, 2710,
+     2710, 2711, 2711, 2711, 2712, 2712, 2712, 2718, 2718, 2718,
+     2708, 1446, 4013, 2709, 1436, 3991, 2710, 1435, 1434, 2711,
+     4009, 1429, 2712, 4013, 2718, 2719, 2719, 2719, 3996, 2719,
+     1428, 3983, 2719, 2722, 2722, 2722, 3990, 2722, 3992, 3993,
+     2722, 2725, 2725, 2725, 2729, 2729, 2729, 2730, 2730, 2730,
+     2731, 2731, 2731, 2733, 2733, 2733, 2741, 2741, 2741, 2725,
+     2709, 2729, 2711, 3991, 3996, 2730, 2710, 3997, 2731, 4009,
+
+     2733, 2734, 2734, 2734, 2741, 2734, 3992, 3993, 2734, 2738,
+     2738, 2738, 2739, 2739, 2739, 2740, 2740, 2740, 1427, 2740,
+     1426, 1411, 2740, 2742, 2742, 2742, 2738, 4002, 1410, 2739,
+     2743, 2743, 2743, 3997, 4000, 2730, 2744, 2744, 2744, 1393,
+     2744, 2742, 3998, 2744, 2747, 2747, 2747, 2743, 2748, 2748,
+     2748, 2749, 2749, 2749, 4001, 2750, 2750, 2750, 3999, 2750,
+     4002, 2747, 2750, 2753, 2753, 2753, 2754, 2754, 2754, 2749,
+     2754, 1392, 4000, 2754, 2755, 2755, 2755, 2756, 2756, 2756,
+     2753, 2757, 2757, 2757, 1385, 2742, 2759, 2759, 2759, 3998,
+     1381, 2755, 4001, 1376, 2756, 2764, 2764, 2764, 1375, 2757,
+
+     2760, 2760, 2760, 2759, 2760, 3999, 1370, 2760, 2766, 2766,
+     2766, 1369, 1368, 2764, 1366, 2779, 2779, 2779, 2791, 2791,
+     2791, 2810, 2810, 2810, 1365, 1360, 2766, 2811, 2811, 2811,
+     2814, 2814, 2814, 2779, 1357, 4003, 2791, 2818, 2818, 2818,
+     2821, 2821, 2821, 2822, 2822, 2822, 2823, 2823, 2823, 1356,
+     2823, 1353, 1352, 2823, 2826, 2826, 2826, 2827, 2827, 2827,
+     2822, 2827, 1351, 1350, 2827, 2828, 2828, 2828, 4003, 1349,
+     2791, 2826, 2830, 2830, 2830, 2766, 2779, 2829, 2829, 2829,
+     4006, 2829, 2828, 4007, 2829, 2832, 2832, 2832, 4010, 2832,
+     2830, 1348, 2832, 2835, 2835, 2835, 2837, 2837, 2837, 2838,
+
+     2838, 2838, 2839, 2839, 2839, 2842, 2842, 2842, 2844, 2844,
+     2844, 2835, 2844, 4006, 2837, 2844, 4007, 2838, 1347, 4011,
+     2839, 4010, 2842, 2856, 2856, 2856, 2857, 2857, 2857, 2858,
+     2858, 2858, 1346, 2858, 1345, 1344, 2858, 2859, 2859, 2859,
+     2856, 1343, 1342, 2857, 2860, 2860, 2860, 1341, 2860, 1340,
+     1339, 2860, 4011, 1338, 2839, 2859, 1335, 1334, 2837, 2866,
+     2866, 2866, 1333, 2867, 2867, 2867, 2838, 2867, 1332, 1331,
+     2867, 2868, 2868, 2868, 1329, 2868, 2866, 1328, 2868, 2871,
+     2871, 2871, 2873, 2873, 2873, 2874, 2874, 2874, 1327, 2874,
+     1326, 1325, 2874, 2878, 2878, 2878, 1324, 2871, 1323, 1322,
+
+     2873, 2879, 2879, 2879, 2880, 2880, 2880, 1321, 2880, 1320,
+     2878, 2880, 2881, 2881, 2881, 2883, 2883, 2883, 2879, 2883,
+     1319, 1318, 2883, 2886, 2886, 2886, 1317, 2887, 2887, 2887,
+     2881, 2887, 1316, 1315, 2887, 2888, 2888, 2888, 1309, 1305,
+     2886, 1302, 2889, 2889, 2889, 2873, 2889, 1301, 1300, 2889,
+     1298, 1294, 2888, 2890, 2890, 2890, 1287, 2890, 1286, 1285,
+     2890, 2894, 2894, 2894, 2895, 2895, 2895, 2896, 2896, 2896,
+     2897, 2897, 2897, 2898, 2898, 2898, 1282, 1277, 2894, 1276,
+     1275, 2895, 2909, 2909, 2909, 2896, 2922, 2922, 2922, 1271,
+     2898, 2923, 2923, 2923, 2940, 2940, 2940, 2942, 2942, 2942,
+
+     2909, 1270, 1267, 2922, 2946, 2946, 2946, 1263, 1262, 2923,
+     2950, 2950, 2950, 2951, 2951, 2951, 1259, 2951, 1256, 1253,
+     2951, 2952, 2952, 2952, 1252, 2952, 1247, 2950, 2952, 2955,
+     2955, 2955, 1239, 2955, 1238, 1237, 2955, 1235, 1231, 2896,
+     2958, 2958, 2958, 2909, 2959, 2959, 2959, 2960, 2960, 2960,
+     2962, 2962, 2962, 2963, 2963, 2963, 1228, 1223, 2958, 2964,
+     2964, 2964, 2959, 2964, 1222, 2960, 2964, 2962, 1221, 1220,
+     2963, 2965, 2965, 2965, 2977, 2977, 2977, 2978, 2978, 2978,
+     1219, 2978, 1218, 2960, 2978, 2979, 2979, 2979, 2965, 2979,
+     1217, 2977, 2979, 2982, 2982, 2982, 2959, 2985, 2985, 2985,
+
+     2987, 2987, 2987, 1216, 2987, 1215, 1212, 2987, 2958, 1211,
+     1208, 2982, 1207, 1203, 2985, 2996, 2996, 2996, 2998, 2998,
+     2998, 2999, 2999, 2999, 1201, 2999, 1198, 1197, 2999, 1194,
+     3000, 3000, 3000, 2996, 3000, 2998, 1187, 3000, 3003, 3003,
+     3003, 1184, 3003, 1183, 1182, 3003, 3006, 3006, 3006, 1179,
+     3006, 1178, 1174, 3006, 3016, 3016, 3016, 3017, 3017, 3017,
+     1167, 3017, 1163, 1162, 3017, 3018, 3018, 3018, 3019, 3019,
+     3019, 3016, 3019, 1161, 1158, 3019, 3020, 3020, 3020, 3021,
+     3021, 3021, 3018, 3022, 3022, 3022, 3023, 3023, 3023, 1157,
+     3023, 1156, 1149, 3023, 3020, 3034, 3034, 3034, 1148, 1147,
+
+     3022, 3047, 3047, 3047, 3048, 3048, 3048, 1146, 3048, 1145,
+     1144, 3048, 1143, 3034, 3049, 3049, 3049, 1142, 3047, 3053,
+     3053, 3053, 3067, 3067, 3067, 3069, 3069, 3069, 3072, 3072,
+     3072, 1141, 3049, 3074, 3074, 3074, 3053, 3053, 1137, 3020,
+     1106, 3076, 3076, 3076, 1103, 3076, 1100, 3034, 3076, 3083,
+     3083, 3083, 3084, 3084, 3084, 3085, 3085, 3085, 3087, 3087,
+     3087, 3088, 3088, 3088, 1099, 3088, 1096, 3083, 3088, 1095,
+     3084, 1094, 1093, 3085, 1092, 3087, 3089, 3089, 3089, 1091,
+     3089, 1084, 1083, 3089, 3092, 3092, 3092, 3093, 3093, 3093,
+     1082, 3093, 1080, 1079, 3093, 3105, 3105, 3105, 1078, 3105,
+
+     1077, 3092, 3105, 3109, 3109, 3109, 3110, 3110, 3110, 1076,
+     3110, 1075, 1074, 3110, 1073, 1072, 3083, 3085, 1071, 1070,
+     3109, 3118, 3118, 3118, 3121, 3121, 3121, 1069, 3121, 1067,
+     1066, 3121, 3136, 3136, 3136, 1065, 3137, 3137, 3137, 3118,
+     3137, 1064, 1063, 3137, 3140, 3140, 3140, 1062, 3140, 3136,
+     1061, 3140, 3143, 3143, 3143, 3144, 3144, 3144, 1060, 3144,
+     1059, 1057, 3144, 3155, 3155, 3155, 1056, 3168, 3168, 3168,
+     3143, 3168, 1055, 1054, 3168, 3172, 3172, 3172, 3173, 3173,
+     3173, 3155, 3174, 3174, 3174, 1053, 3174, 1052, 1051, 3174,
+     1050, 1049, 3172, 3172, 1048, 3173, 3173, 3187, 3187, 3187,
+
+     3174, 3189, 3189, 3189, 3143, 3190, 3190, 3190, 3191, 3191,
+     3191, 1044, 1040, 3155, 3193, 3193, 3193, 3194, 3194, 3194,
+     3207, 3207, 3207, 3208, 3208, 3208, 3210, 3210, 3210, 3212,
+     3212, 3212, 1039, 3212, 1038, 1037, 3212, 1036, 3207, 1032,
+     1030, 3208, 1029, 1028, 3210, 3215, 3215, 3215, 1027, 3215,
+     1026, 1025, 3215, 3218, 3218, 3218, 3229, 3229, 3229, 3230,
+     3230, 3230, 1024, 3230, 1015, 1014, 3230, 3233, 3233, 3233,
+     3218, 1010, 3207, 3229, 3253, 3253, 3253, 1009, 3254, 3254,
+     3254, 1008, 3254, 1007, 3233, 3254, 3263, 3263, 3263, 1004,
+     1003, 3253, 1001,  999, 3210, 3272, 3272, 3272, 3294, 3294,
+
+     3294, 3295, 3295, 3295, 3263, 3295,  996,  995, 3295,  994,
+     3296, 3296, 3296, 3272, 3296, 3294, 3294, 3296,  993, 3295,
+     3307, 3307, 3307, 3309, 3309, 3309,  991,  988, 3296, 3310,
+     3310, 3310, 3312, 3312, 3312, 3325, 3325, 3325, 3326, 3326,
+     3326, 3328, 3328, 3328, 3329, 3329, 3329,  987, 3329,  985,
+      984, 3329,  981, 3325,  979,  976, 3326,  975, 3328, 3330,
+     3330, 3330, 3272, 3297, 3297, 3297, 3297, 3297, 3297, 3297,
+     3297, 3297,  974,  973, 3297,  970, 3330,  969,  968, 3297,
+     3297, 3297, 3297, 3297, 3340, 3340, 3340, 3341, 3341, 3341,
+      967, 3341,  966,  965, 3341, 3343, 3343, 3343,  964, 3343,
+
+      962, 3340, 3343,  959,  958, 3326, 3342, 3342, 3342, 3297,
+     3297, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298,
+      954,  953, 3298, 3342, 3372, 3372, 3372, 3298, 3298, 3298,
+     3298, 3298, 3361, 3361, 3361,  952, 3361,  951,  950, 3361,
+      949,  940, 3372, 3380, 3380, 3380, 3398, 3398, 3398,  939,
+     3398,  936,  935, 3398, 3409, 3409, 3409, 3298, 3298,  934,
+      933, 3380,  932,  930, 3398, 3401, 3401, 3401, 3401, 3401,
+     3401, 3401, 3401, 3401,  929,  928, 3401, 3410, 3410, 3410,
+      925, 3401, 3401, 3401, 3401, 3401, 3423, 3423, 3423, 3425,
+     3425, 3425, 3427, 3427, 3427,  924, 3427,  923,  920, 3427,
+
+     3511, 3511, 3511,  919, 3423,  915,  913, 3425, 3430, 3430,
+     3430, 3401, 3401, 3402, 3402, 3402, 3402, 3402, 3402, 3402,
+     3402, 3402,  910,  909, 3402, 3430, 3512, 3512, 3512, 3402,
+     3402, 3402, 3402, 3402,  908, 3431, 3431, 3431,  907, 3431,
+      905, 3425, 3431, 3439, 3439, 3439,  902, 3439,  901,  900,
+     3439, 3442, 3442, 3442,  899, 3442,  896,  893, 3442, 3402,
+     3402, 3476, 3476, 3476, 3498, 3498, 3498, 3519, 3519, 3519,
+     3520, 3520, 3520, 3525, 3525, 3525,  890, 3525,  889, 3476,
+     3525,  888, 3498, 3498,  887, 3519,  886, 3520, 3532, 3532,
+     3532, 3537, 3537, 3537, 3568, 3568, 3568, 3572, 3572, 3572,
+
+     3585, 3585, 3585,  883,  880, 3532,  876,  875, 3537, 3587,
+     3587, 3587, 3568,  874,  873, 3572,  872,  871, 3585,  870,
+     3588, 3588, 3588,  869, 3588,  868, 3587, 3588, 3601, 3601,
+     3601, 3602, 3602, 3602,  867, 3602,  866,  864, 3602, 3611,
+     3611, 3611, 3629, 3629, 3629, 3601, 3612, 3612, 3612, 3572,
+     3612,  862,  859, 3612,  858,  857, 3611, 3641, 3641, 3641,
+     3629, 3641,  856,  855, 3641, 3656, 3656, 3656,  854, 3656,
+      849,  848, 3656, 3667, 3667, 3667,  847, 3667,  846, 3629,
+     3667, 3864, 3864, 3864, 3881, 3881, 3881,  843, 3881,  842,
+      841, 3881, 4014, 4014, 4014, 4015, 4015, 4015,  838, 3864,
+
+      837,  836, 3881,  835,  832,  831,  829,  826,  825,  821,
+     4014,  820,  819, 4015, 4018, 4018, 4018, 4018, 4018, 4018,
+     4018, 4018, 4018, 4019, 4019, 4019, 4019, 4019, 4019, 4019,
+     4019, 4019, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020,
+     4020, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021,
+     4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4023,
+     4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4024, 4024,
+     4024, 4024, 4024, 4024, 4024, 4024, 4024, 4025, 4025, 4025,
+     4025, 4025, 4025, 4025, 4025, 4025, 4026, 4026, 4026, 4026,
+     4026, 4026, 4026, 4026, 4026, 4027, 4027, 4027, 4027, 4027,
+
+     4027, 4027, 4027, 4027, 4028, 4028, 4028, 4028, 4028, 4028,
+     4028, 4028, 4028, 4029, 4029, 4029, 4029, 4029, 4029, 4029,
+     4029, 4029, 4030, 4030, 4030, 4030, 4030, 4030, 4030, 4030,
+     4030, 4031, 4031, 4031, 4031, 4031, 4031, 4031, 4031, 4031,
+     4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4033,
+     4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4034, 4034,
+     4034, 4034, 4034, 4034, 4034, 4034, 4034, 4035, 4035, 4035,
+     4035, 4035, 4035, 4035, 4035, 4035, 4036, 4036, 4036, 4036,
+     4036, 4036, 4036, 4036, 4036, 4037, 4037, 4037, 4037, 4037,
+     4037, 4037, 4037, 4037, 4038, 4038, 4038, 4038, 4038, 4038,
+
+     4038, 4038, 4038, 4039, 4039, 4039, 4039, 4039, 4039, 4039,
+     4039, 4039, 4040, 4040, 4040, 4040, 4040, 4040, 4040, 4040,
+     4040, 4041, 4041, 4041, 4041, 4041, 4041, 4041, 4041, 4041,
+     4042, 4042, 4042, 4042, 4042, 4042, 4042, 4042, 4042, 4043,
+     4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4044, 4044,
+     4044, 4044, 4044, 4044, 4044, 4044, 4044, 4045, 4045, 4045,
+     4045, 4045, 4045, 4045, 4045, 4045, 4046, 4046, 4046, 4046,
+     4046, 4046, 4046, 4046, 4046, 4047, 4047, 4047, 4047, 4047,
+     4047, 4047, 4047, 4047, 4048, 4048, 4048, 4048, 4048, 4048,
+     4048, 4048, 4048, 4049, 4049, 4049, 4049, 4049, 4049, 4049,
+
+     4049, 4049, 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050,
+     4050, 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051,
+     4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4053,
+     4053, 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4054, 4054,
+     4054, 4054, 4054, 4054, 4054, 4054, 4054, 4055, 4055, 4055,
+     4055, 4055, 4055, 4055, 4055, 4055, 4056, 4056, 4056, 4056,
+     4056, 4056, 4056, 4056, 4056, 4057, 4057, 4057, 4057, 4057,
+     4057, 4057, 4057, 4057, 4058, 4058, 4058, 4058, 4058, 4058,
+     4058, 4058, 4058, 4059, 4059, 4059, 4059, 4059, 4059, 4059,
+     4059, 4059, 4060, 4060, 4060, 4060, 4060, 4060, 4060, 4060,
+
+     4060, 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061,
+     4062, 4062, 4062, 4062, 4062, 4062, 4062, 4062, 4062, 4063,
+     4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4064, 4064,
+     4064, 4064, 4064, 4064, 4064, 4064, 4064, 4065, 4065, 4065,
+     4065, 4065, 4065, 4065, 4065, 4065, 4066, 4066, 4066, 4066,
+     4066, 4066, 4066, 4066, 4066, 4067, 4067, 4067, 4067, 4067,
+     4067, 4067, 4067, 4067, 4068, 4068, 4068, 4068, 4068, 4068,
+     4068, 4068, 4068, 4069, 4069, 4069, 4069, 4069, 4069, 4069,
+     4069, 4069, 4070, 4070, 4070, 4070, 4070, 4070, 4070, 4070,
+     4070, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071,
+
+     4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4073,
+     4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4074, 4074,
+     4074, 4074, 4074, 4074, 4074, 4074, 4074, 4075, 4075, 4075,
+     4075, 4075, 4075, 4075, 4075, 4075, 4076, 4076, 4076, 4076,
+     4076, 4076, 4076, 4076, 4076, 4077, 4077, 4077, 4077, 4077,
+     4077, 4077, 4077, 4077, 4078, 4078, 4078, 4078, 4078, 4078,
+     4078, 4078, 4078, 4079, 4079, 4079, 4079, 4079, 4079, 4079,
+     4079, 4079, 4080, 4080, 4080, 4080, 4080, 4080, 4080, 4080,
+     4080, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081,
+     4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4083,
+
+     4083, 4083, 4083, 4083, 4083, 4083, 4083, 4083, 4084, 4084,
+     4084, 4084, 4084, 4084, 4084, 4084, 4084, 4085, 4085, 4085,
+     4085, 4085, 4085, 4085, 4085, 4085, 4086, 4086, 4086, 4086,
+     4086, 4086, 4086, 4086, 4086, 4087, 4087, 4087,  818,  817,
+      816, 4087, 4088, 4088, 4088,  813,  812,  811, 4088, 4089,
+     4089, 4089,  810,  809,  808, 4089, 4090, 4090, 4090,  803,
+      799,  798, 4090, 4091, 4091, 4091,  797,  796,  793, 4091,
+     4092, 4092, 4092,  792,  791,  788, 4092, 4093, 4093, 4093,
+      786,  785,  784, 4093, 4094, 4094, 4094,  781,  780,  779,
+     4094, 4095, 4095, 4095,  778,  774,  773, 4095, 4096, 4096,
+
+     4096,  772,  768,  767, 4096, 4097, 4097, 4097,  766,  765,
+      759, 4097, 4098, 4098, 4098,  758,  756,  748, 4098, 4099,
+     4099, 4099,  747,  743,  739, 4099, 4100, 4100, 4100,  734,
+      729,  725, 4100, 4101, 4101, 4101,  724,  720,  714, 4101,
+     4102, 4102, 4102,  713,  712,  708, 4102, 4103, 4103, 4103,
+      705,  703,  702, 4103, 4104, 4104, 4104,  701,  697,  693,
+     4104, 4105, 4105, 4105,  689,  688,  687, 4105, 4106, 4106,
+     4106,  686,  682,  678, 4106, 4107, 4107, 4107,  675,  674,
+      673, 4107, 4108, 4108, 4108,  672,  668,  662, 4108, 4109,
+     4109, 4109,  661,  657,  649, 4109, 4110, 4110, 4110,  645,
+
+      638,  636, 4110, 4111, 4111, 4111,  635,  631,  625, 4111,
+     4112, 4112, 4112,  624,  620,  613, 4112, 4113, 4113, 4113,
+      612,  611,  610, 4113, 4114, 4114, 4114,  609,  605,  594,
+     4114, 4115, 4115, 4115,  590,  582,  581, 4115, 4116, 4116,
+     4116,  580,  579,  578, 4116, 4117, 4117, 4117,  574,  568,
+      567, 4117, 4118, 4118, 4118, 4118, 4118, 4118, 4118,  563,
+     4118, 4119, 4119, 4119,  557,  556,  552, 4119, 4120,  546,
+      545,  541, 4120, 4121, 4121, 4121,  537,  533,  532, 4121,
+     4122,  531,  527,  523, 4122, 4123, 4123, 4123,  519,  515,
+      509, 4123, 4124,  508,  507,  503, 4124, 4125, 4125, 4125,
+
+      499,  494,  493, 4125, 4126,  492,  491,  487, 4126, 4127,
+     4127, 4127,  483,  480,  476, 4127, 4128,  472,  469,  466,
+     4128, 4129, 4129, 4129,  464,  463,  458, 4129, 4130,  451,
+      450,  449, 4130, 4131, 4131, 4131,  448,  447,  443, 4131,
+     4132,  436,  435,  434, 4132, 4133, 4133, 4133,  430,  423,
+      422, 4133, 4134,  418,  411,  410, 4134, 4135, 4135, 4135,
+      409,  405,  399, 4135, 4136,  398,  397,  393, 4136, 4137,
+     4137, 4137,  387,  383,  379, 4137, 4138,  375,  374,  373,
+     4138, 4139, 4139, 4139,  372,  371,  367, 4139, 4140,  358,
+      357,  353, 4140, 4141, 4141, 4141,  349,  345,  341, 4141,
+
+     4142,  340,  336,  333, 4142, 4143, 4143, 4143,  332,  331,
+      325, 4143, 4144,  324,  322,  319, 4144, 4145, 4145, 4145,
+      307,    0,    0, 4145, 4146,    0,    0,    0, 4146, 4147,
+     4147, 4147,    0,    0,    0, 4147, 4148,    0,    0,    0,
+     4148, 4149, 4149, 4149,    0,    0,    0, 4149, 4150,    0,
+        0,    0, 4150, 4151, 4151, 4151,    0,    0,    0, 4151,
+     4152,    0,    0,    0, 4152, 4153, 4153, 4153,    0,    0,
+        0, 4153, 4154,    0,    0,    0, 4154, 4155, 4155, 4155,
+        0,    0,    0, 4155, 4156,    0,    0,    0, 4156, 4157,
+     4157, 4157,    0,    0,    0, 4157, 4158,    0,    0,    0,
+
+     4158, 4159, 4159, 4159,    0,    0,    0, 4159, 4160,    0,
+        0,    0, 4160, 4161, 4161, 4161,    0,    0,    0, 4161,
+     4162,    0,    0,    0, 4162, 4163, 4163, 4163,    0,    0,
+        0, 4163, 4164,    0,    0,    0, 4164, 4165, 4165, 4165,
+        0,    0,    0, 4165, 4166,    0,    0,    0, 4166, 4167,
+     4167, 4167,    0,    0,    0, 4167, 4168,    0,    0,    0,
+     4168, 4169, 4169, 4169,    0,    0,    0, 4169, 4170,    0,
+        0,    0, 4170, 4171, 4171, 4171,    0,    0,    0, 4171,
+     4172,    0,    0,    0, 4172, 4173, 4173, 4173,    0,    0,
+        0, 4173, 4174,    0,    0,    0, 4174, 4175, 4175, 4175,
+
+        0,    0,    0, 4175, 4176,    0,    0,    0, 4176, 4177,
+     4177, 4177,    0,    0,    0, 4177, 4178,    0,    0,    0,
+     4178, 4179, 4179, 4179,    0,    0,    0, 4179, 4180,    0,
+        0,    0, 4180, 4181, 4181, 4181, 4181, 4181, 4181, 4181,
+     4181, 4181, 4182,    0,    0,    0,    0, 4182, 4183, 4183,
+     4183,    0,    0,    0, 4183, 4184, 4184, 4184, 4184,    0,
+        0, 4184, 4184, 4185, 4185, 4185, 4185,    0, 4185,    0,
+     4185, 4186, 4186, 4186, 4186,    0,    0, 4186, 4186, 4187,
+     4187, 4187,    0,    0,    0, 4187, 4188, 4188, 4188, 4188,
+        0,    0, 4188, 4188, 4189, 4189, 4189,    0,    0,    0,
+
+     4189, 4190, 4190, 4190, 4190,    0,    0, 4190, 4190, 4191,
+     4191, 4191,    0,    0,    0, 4191, 4192, 4192, 4192, 4192,
+        0,    0, 4192, 4192, 4193, 4193, 4193, 4193,    0, 4193,
+        0, 4193, 4194, 4194, 4194, 4194,    0,    0, 4194, 4194,
+     4195, 4195, 4195, 4195,    0, 4195,    0, 4195, 4196, 4196,
+     4196, 4196,    0,    0, 4196, 4196, 4197, 4197, 4197, 4197,
+        0, 4197,    0, 4197, 4198, 4198, 4198, 4198,    0,    0,
+     4198, 4198, 4199, 4199, 4199, 4199,    0, 4199,    0, 4199,
+     4200, 4200, 4200, 4200,    0,    0, 4200, 4200, 4201, 4201,
+     4201,    0,    0,    0, 4201, 4202, 4202, 4202, 4202,    0,
+
+        0, 4202, 4202, 4203, 4203, 4203, 4203,    0,    0, 4203,
+     4203, 4204, 4204, 4204,    0,    0,    0, 4204, 4205, 4205,
+     4205, 4205,    0,    0, 4205, 4205, 4206, 4206, 4206,    0,
+        0,    0, 4206, 4207, 4207, 4207, 4207,    0,    0, 4207,
+     4207, 4208, 4208, 4208,    0,    0,    0, 4208, 4209, 4209,
+     4209, 4209,    0,    0, 4209, 4209, 4210, 4210, 4210,    0,
+        0,    0, 4210, 4211, 4211, 4211, 4211,    0,    0, 4211,
+     4211, 4212, 4212, 4212,    0,    0,    0, 4212, 4213, 4213,
+     4213, 4213,    0,    0, 4213, 4213, 4214, 4214, 4214,    0,
+        0,    0, 4214, 4215, 4215, 4215, 4215,    0,    0, 4215,
+
+     4215, 4216, 4216, 4216,    0,    0,    0, 4216, 4217, 4217,
+     4217, 4217,    0,    0, 4217, 4217, 4218, 4218, 4218,    0,
+        0,    0, 4218, 4219, 4219, 4219, 4219,    0,    0, 4219,
+     4219, 4220, 4220, 4220,    0,    0,    0, 4220, 4221, 4221,
+     4221, 4221,    0,    0, 4221, 4221, 4222, 4222, 4222,    0,
+        0,    0, 4222, 4223, 4223, 4223, 4223,    0,    0, 4223,
+     4223, 4224, 4224, 4224,    0,    0,    0, 4224, 4225, 4225,
+     4225, 4225,    0,    0, 4225, 4225, 4226, 4226, 4226,    0,
+        0,    0, 4226, 4227, 4227, 4227, 4227,    0,    0, 4227,
+     4227, 4228, 4228, 4228, 4228,    0, 4228,    0, 4228, 4229,
+
+     4229, 4229, 4229,    0,    0, 4229, 4229, 4230, 4230, 4230,
+        0,    0,    0, 4230, 4231, 4231, 4231, 4231,    0,    0,
+     4231, 4231, 4232, 4232, 4232,    0,    0,    0, 4232, 4233,
+     4233, 4233, 4233,    0,    0, 4233, 4233, 4234, 4234, 4234,
+        0,    0,    0, 4234, 4235, 4235, 4235, 4235,    0,    0,
+     4235, 4235, 4236, 4236, 4236,    0,    0,    0, 4236, 4237,
+     4237, 4237, 4237,    0,    0, 4237, 4237, 4238, 4238, 4238,
+        0,    0,    0, 4238, 4239, 4239, 4239, 4239,    0,    0,
+     4239, 4239, 4240, 4240, 4240,    0,    0,    0, 4240, 4241,
+     4241, 4241, 4241,    0,    0, 4241, 4241, 4242, 4242, 4242,
+
+     4242,    0, 4242,    0, 4242, 4243, 4243, 4243, 4243,    0,
+        0, 4243, 4243, 4244, 4244, 4244, 4244, 4244, 4244, 4244,
+     4244, 4244, 4245,    0, 4245,    0,    0, 4245, 4246, 4246,
+     4246,    0,    0,    0, 4246, 4247, 4247, 4247, 4247,    0,
+        0, 4247, 4247, 4248, 4248, 4248,    0,    0,    0, 4248,
+     4249, 4249, 4249, 4249,    0,    0, 4249, 4249, 4250, 4250,
+     4250,    0,    0,    0, 4250, 4251, 4251, 4251, 4251,    0,
+        0, 4251, 4251, 4252, 4252, 4252,    0,    0,    0, 4252,
+     4253, 4253, 4253, 4253,    0,    0, 4253, 4253, 4254, 4254,
+     4254,    0,    0,    0, 4254, 4255, 4255, 4255, 4255,    0,
+
+        0, 4255, 4255, 4256, 4256, 4256,    0,    0,    0, 4256,
+     4257, 4257, 4257, 4257,    0,    0, 4257, 4257, 4258, 4258,
+     4258, 4258,    0,    0, 4258, 4258, 4259, 4259, 4259,    0,
+        0,    0, 4259, 4260, 4260, 4260, 4260,    0,    0, 4260,
+     4260, 4261, 4261, 4261,    0,    0,    0, 4261, 4262, 4262,
+     4262, 4262,    0,    0, 4262, 4262, 4263, 4263, 4263,    0,
+        0,    0, 4263, 4264, 4264, 4264, 4264,    0,    0, 4264,
+     4264, 4265, 4265, 4265, 4265,    0,    0, 4265, 4265, 4266,
+     4266, 4266,    0,    0,    0, 4266, 4267, 4267, 4267, 4267,
+        0,    0, 4267, 4267, 4268, 4268, 4268, 4268,    0, 4268,
+
+        0, 4268, 4269, 4269, 4269, 4269,    0,    0, 4269, 4269,
+     4270, 4270, 4270, 4270,    0, 4270,    0, 4270, 4271, 4271,
+     4271, 4271,    0,    0, 4271, 4271, 4272, 4272, 4272,    0,
+        0,    0, 4272, 4273, 4273, 4273, 4273,    0,    0, 4273,
+     4273, 4274, 4274, 4274,    0,    0,    0, 4274, 4275, 4275,
+     4275, 4275,    0,    0, 4275, 4275, 4276, 4276, 4276,    0,
+        0,    0, 4276, 4277, 4277, 4277, 4277,    0,    0, 4277,
+     4277, 4278, 4278, 4278, 4278,    0, 4278,    0, 4278, 4279,
+     4279, 4279, 4279,    0,    0, 4279, 4279, 4280, 4280, 4280,
+        0,    0,    0, 4280, 4281, 4281, 4281, 4281,    0,    0,
+
+     4281, 4281, 4282, 4282, 4282,    0,    0,    0, 4282, 4283,
+     4283, 4283, 4283,    0,    0, 4283, 4283, 4284, 4284, 4284,
+        0,    0,    0, 4284, 4285, 4285, 4285, 4285,    0,    0,
+     4285, 4285, 4286, 4286, 4286,    0,    0,    0, 4286, 4287,
+     4287, 4287, 4287,    0,    0, 4287, 4287, 4288, 4288, 4288,
+        0,    0,    0, 4288, 4289, 4289, 4289, 4289,    0,    0,
+     4289, 4289, 4290, 4290, 4290,    0,    0,    0, 4290, 4291,
+     4291, 4291, 4291,    0,    0, 4291, 4291, 4292, 4292, 4292,
+        0,    0,    0, 4292, 4293, 4293, 4293, 4293,    0,    0,
+     4293, 4293, 4294, 4294, 4294,    0,    0,    0, 4294, 4295,
 
-     4296,    0,    0, 4296, 4296, 4297, 4297, 4297,    0,    0,
-        0, 4297, 4298, 4298, 4298, 4298,    0,    0, 4298, 4298,
+     4295, 4295, 4295,    0,    0, 4295, 4295, 4296, 4296, 4296,
+        0,    0,    0, 4296, 4297, 4297, 4297, 4297,    0,    0,
+     4297, 4297, 4298, 4298, 4298, 4298,    0, 4298,    0, 4298,
      4299, 4299, 4299, 4299,    0,    0, 4299, 4299, 4300, 4300,
-     4300, 4300,    0,    0, 4300, 4300, 4301, 4301, 4301,    0,
-        0,    0, 4301, 4302, 4302, 4302, 4302,    0,    0, 4302,
-     4302, 4303, 4303, 4303,    0,    0,    0, 4303, 4304, 4304,
-     4304, 4304,    0,    0, 4304, 4304, 4305, 4305, 4305, 4305,
-        0,    0, 4305, 4305, 4306, 4306, 4306,    0,    0,    0,
-     4306, 4307, 4307, 4307, 4307,    0,    0, 4307, 4307, 4308,
-     4308, 4308,    0,    0,    0, 4308, 4309, 4309, 4309, 4309,
-
-        0,    0, 4309, 4309, 4310, 4310, 4310,    0,    0,    0,
-     4310, 4311, 4311, 4311, 4311,    0,    0, 4311, 4311, 4312,
-     4312, 4312,    0,    0,    0, 4312, 4313, 4313, 4313, 4313,
-        0,    0, 4313, 4313, 4314, 4314, 4314, 4314,    0,    0,
-     4314, 4314, 4315, 4315, 4315,    0,    0,    0, 4315, 4316,
-     4316, 4316, 4316,    0,    0, 4316, 4316, 4317, 4317, 4317,
-        0,    0,    0, 4317, 4318, 4318, 4318, 4318,    0,    0,
-     4318, 4318, 4319, 4319, 4319,    0,    0,    0, 4319, 4320,
-     4320, 4320, 4320,    0,    0, 4320, 4320, 4321, 4321, 4321,
-     4321,    0, 4321,    0, 4321, 4322, 4322, 4322, 4322,    0,
-
-        0, 4322, 4322, 4323, 4323, 4323,    0,    0,    0, 4323,
-     4324, 4324, 4324, 4324,    0,    0, 4324, 4324, 4325, 4325,
-     4325,    0,    0,    0, 4325, 4326, 4326, 4326, 4326,    0,
-        0, 4326, 4326, 4327, 4327, 4327,    0,    0,    0, 4327,
-     4328, 4328, 4328, 4328,    0,    0, 4328, 4328, 4329, 4329,
-     4329,    0,    0,    0, 4329, 4330, 4330, 4330, 4330,    0,
-        0, 4330, 4330, 4331, 4331, 4331, 4331,    0, 4331,    0,
-     4331, 4332, 4332, 4332, 4332,    0,    0, 4332, 4332, 4333,
-     4333, 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4334, 4334,
-     4334, 4334, 4334, 4334, 4334, 4334, 4334, 4335, 4335, 4335,
-
-     4335,    0, 4335,    0, 4335, 4336, 4336, 4336,    0,    0,
-        0, 4336, 4337, 4337, 4337, 4337,    0,    0, 4337, 4337,
-     4338, 4338, 4338,    0,    0,    0, 4338, 4339, 4339, 4339,
-     4339,    0,    0, 4339, 4339, 4340, 4340, 4340, 4340,    0,
+     4300,    0,    0,    0, 4300, 4301, 4301, 4301, 4301,    0,
+        0, 4301, 4301, 4302, 4302, 4302,    0,    0,    0, 4302,
+     4303, 4303, 4303, 4303,    0,    0, 4303, 4303, 4304, 4304,
+     4304,    0,    0,    0, 4304, 4305, 4305, 4305, 4305,    0,
+        0, 4305, 4305, 4306, 4306, 4306, 4306, 4306, 4306, 4306,
+     4306, 4306, 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307,
+
+     4307, 4308, 4308, 4308,    0,    0,    0, 4308, 4309, 4309,
+     4309,    0,    0,    0, 4309, 4310, 4310, 4310, 4310,    0,
+        0, 4310, 4310, 4311, 4311, 4311,    0,    0,    0, 4311,
+     4312, 4312, 4312, 4312,    0,    0, 4312, 4312, 4313, 4313,
+     4313, 4313,    0, 4313,    0, 4313, 4314, 4314, 4314, 4314,
+        0,    0, 4314, 4314, 4315, 4315, 4315,    0,    0,    0,
+     4315, 4316, 4316, 4316, 4316,    0,    0, 4316, 4316, 4317,
+     4317, 4317,    0,    0,    0, 4317, 4318, 4318, 4318, 4318,
+        0,    0, 4318, 4318, 4319, 4319, 4319, 4319,    0,    0,
+     4319, 4319, 4320, 4320, 4320,    0,    0,    0, 4320, 4321,
+
+     4321, 4321, 4321,    0,    0, 4321, 4321, 4322, 4322, 4322,
+        0,    0,    0, 4322, 4323, 4323, 4323, 4323,    0,    0,
+     4323, 4323, 4324, 4324, 4324, 4324,    0, 4324,    0, 4324,
+     4325, 4325, 4325, 4325,    0,    0, 4325, 4325, 4326, 4326,
+     4326, 4326,    0,    0, 4326, 4326, 4327, 4327, 4327,    0,
+        0,    0, 4327, 4328, 4328, 4328, 4328,    0,    0, 4328,
+     4328, 4329, 4329, 4329, 4329,    0,    0, 4329, 4329, 4330,
+     4330, 4330, 4330,    0,    0, 4330, 4330, 4331, 4331, 4331,
+        0,    0,    0, 4331, 4332, 4332, 4332, 4332,    0,    0,
+     4332, 4332, 4333, 4333, 4333,    0,    0,    0, 4333, 4334,
+
+     4334, 4334, 4334,    0,    0, 4334, 4334, 4335, 4335, 4335,
+     4335,    0, 4335,    0, 4335, 4336, 4336, 4336, 4336,    0,
+        0, 4336, 4336, 4337, 4337, 4337,    0,    0,    0, 4337,
+     4338, 4338, 4338, 4338,    0,    0, 4338, 4338, 4339, 4339,
+     4339,    0,    0,    0, 4339, 4340, 4340, 4340, 4340,    0,
         0, 4340, 4340, 4341, 4341, 4341,    0,    0,    0, 4341,
      4342, 4342, 4342, 4342,    0,    0, 4342, 4342, 4343, 4343,
-     4343, 4343,    0,    0, 4343, 4343, 4344, 4344, 4344, 4344,
-        0,    0, 4344, 4344, 4345, 4345, 4345, 4345,    0,    0,
-     4345, 4345, 4346, 4346, 4346, 4346,    0, 4346,    0, 4346,
-     4347, 4347, 4347, 4347,    0,    0, 4347, 4347, 4348, 4348,
-
-     4348,    0,    0,    0, 4348, 4349, 4349, 4349, 4349,    0,
-        0, 4349, 4349, 4350, 4350, 4350, 4350,    0,    0, 4350,
-     4350, 4351, 4351, 4351,    0,    0,    0, 4351, 4352, 4352,
-     4352, 4352,    0,    0, 4352, 4352, 4353, 4353, 4353, 4353,
-        0,    0, 4353, 4353, 4354, 4354, 4354,    0,    0,    0,
-     4354, 4355, 4355, 4355,    0,    0,    0, 4355, 4356, 4356,
-     4356, 4356,    0,    0, 4356, 4356, 4357, 4357, 4357, 4357,
-        0,    0, 4357, 4357, 4358, 4358, 4358,    0,    0,    0,
-     4358, 4359, 4359, 4359, 4359,    0,    0, 4359, 4359, 4360,
-     4360, 4360,    0,    0,    0, 4360, 4361, 4361, 4361, 4361,
-
-        0, 4361,    0, 4361, 4362, 4362, 4362, 4362,    0,    0,
-     4362, 4362, 4363, 4363, 4363,    0,    0,    0, 4363, 4364,
-     4364, 4364, 4364,    0,    0, 4364, 4364, 4365, 4365, 4365,
-        0,    0,    0, 4365, 4366, 4366, 4366, 4366,    0,    0,
+     4343,    0,    0,    0, 4343, 4344, 4344, 4344, 4344,    0,
+        0, 4344, 4344, 4345, 4345, 4345, 4345,    0, 4345,    0,
+     4345, 4346, 4346, 4346, 4346,    0,    0, 4346, 4346, 4347,
+
+     4347, 4347,    0,    0,    0, 4347, 4348, 4348, 4348, 4348,
+        0,    0, 4348, 4348, 4349, 4349, 4349,    0,    0,    0,
+     4349, 4350, 4350, 4350, 4350,    0,    0, 4350, 4350, 4351,
+     4351, 4351,    0,    0,    0, 4351, 4352, 4352, 4352, 4352,
+        0,    0, 4352, 4352, 4353, 4353, 4353,    0,    0,    0,
+     4353, 4354, 4354, 4354, 4354,    0,    0, 4354, 4354, 4355,
+     4355, 4355,    0,    0,    0, 4355, 4356, 4356, 4356, 4356,
+        0,    0, 4356, 4356, 4357, 4357, 4357,    0,    0,    0,
+     4357, 4358, 4358, 4358, 4358,    0,    0, 4358, 4358, 4359,
+     4359, 4359,    0,    0,    0, 4359, 4360, 4360, 4360, 4360,
+
+        0,    0, 4360, 4360, 4361, 4361, 4361,    0,    0,    0,
+     4361, 4362, 4362, 4362, 4362,    0,    0, 4362, 4362, 4363,
+     4363, 4363,    0,    0,    0, 4363, 4364, 4364, 4364, 4364,
+        0,    0, 4364, 4364, 4365, 4365, 4365, 4365, 4365, 4365,
+     4365, 4365, 4365, 4366, 4366, 4366, 4366, 4366, 4366, 4366,
      4366, 4366, 4367, 4367, 4367,    0,    0,    0, 4367, 4368,
-     4368, 4368, 4368,    0,    0, 4368, 4368, 4369, 4369, 4369,
-        0,    0,    0, 4369, 4370, 4370, 4370, 4370,    0,    0,
-     4370, 4370, 4371, 4371, 4371, 4371,    0, 4371,    0, 4371,
+     4368, 4368, 4368,    0, 4368,    0, 4368, 4369, 4369, 4369,
+     4369,    0,    0, 4369, 4369, 4370, 4370, 4370,    0,    0,
+        0, 4370, 4371, 4371, 4371, 4371,    0,    0, 4371, 4371,
      4372, 4372, 4372, 4372,    0,    0, 4372, 4372, 4373, 4373,
-     4373, 4373,    0, 4373,    0, 4373, 4374, 4374, 4374, 4374,
 
-        0,    0, 4374, 4374, 4375, 4375, 4375,    0,    0,    0,
+     4373,    0,    0,    0, 4373, 4374, 4374, 4374, 4374,    0,
+        0, 4374, 4374, 4375, 4375, 4375, 4375,    0, 4375,    0,
      4375, 4376, 4376, 4376, 4376,    0,    0, 4376, 4376, 4377,
-     4377, 4377, 4377,    0, 4377,    0, 4377, 4378, 4378, 4378,
-     4378,    0,    0, 4378, 4378, 4379, 4379, 4379, 4379,    0,
-     4379,    0, 4379, 4380, 4380, 4380,    0,    0,    0, 4380,
-     4381, 4381, 4381, 4381,    0,    0, 4381, 4381, 4382, 4382,
-     4382, 4382, 4382, 4382, 4382, 4382, 4382, 4383, 4383, 4383,
-     4383, 4383, 4383, 4383, 4383, 4383, 4384, 4384, 4384,    0,
-        0,    0, 4384, 4385, 4385, 4385, 4385,    0,    0, 4385,
-     4385, 4386, 4386, 4386, 4386,    0, 4386,    0, 4386, 4387,
-
-     4387, 4387, 4387,    0,    0, 4387, 4387, 4388, 4388, 4388,
-        0,    0,    0, 4388, 4389, 4389, 4389, 4389,    0,    0,
-     4389, 4389, 4390, 4390, 4390, 4390,    0,    0, 4390, 4390,
-     4391, 4391, 4391, 4391,    0,    0, 4391, 4391, 4392, 4392,
-     4392, 4392,    0,    0, 4392, 4392, 4393, 4393, 4393, 4393,
-        0,    0, 4393, 4393, 4394, 4394, 4394,    0,    0,    0,
-     4394, 4395, 4395, 4395, 4395,    0,    0, 4395, 4395, 4396,
-     4396, 4396, 4396,    0,    0, 4396, 4396, 4397, 4397, 4397,
-        0,    0,    0, 4397, 4398, 4398, 4398, 4398,    0,    0,
-     4398, 4398, 4399, 4399, 4399, 4399,    0,    0, 4399, 4399,
-
-     4400, 4400, 4400,    0,    0,    0, 4400, 4401, 4401, 4401,
-        0,    0,    0, 4401, 4402, 4402, 4402, 4402,    0,    0,
-     4402, 4402, 4403, 4403, 4403, 4403,    0,    0, 4403, 4403,
-     4404, 4404, 4404,    0,    0,    0, 4404, 4405, 4405, 4405,
-        0,    0,    0, 4405, 4406, 4406, 4406, 4406,    0,    0,
-     4406, 4406, 4407, 4407, 4407, 4407,    0, 4407,    0, 4407,
-     4408, 4408, 4408, 4408,    0,    0, 4408, 4408, 4409, 4409,
-     4409,    0,    0,    0, 4409, 4410, 4410, 4410, 4410,    0,
-        0, 4410, 4410, 4411, 4411, 4411,    0,    0,    0, 4411,
-     4412, 4412, 4412,    0,    0,    0, 4412, 4413, 4413, 4413,
-
-     4413,    0,    0, 4413, 4413, 4414, 4414, 4414, 4414,    0,
-        0, 4414, 4414, 4415, 4415, 4415, 4415,    0,    0, 4415,
-     4415, 4416, 4416, 4416,    0,    0,    0, 4416, 4417, 4417,
-     4417, 4417,    0,    0, 4417, 4417, 4418, 4418, 4418,    0,
-        0,    0, 4418, 4419, 4419, 4419, 4419,    0,    0, 4419,
-     4419, 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420,
-     4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4422,
-     4422, 4422,    0,    0,    0, 4422, 4423, 4423, 4423, 4423,
-        0,    0, 4423, 4423, 4424, 4424, 4424, 4424,    0, 4424,
-        0, 4424, 4425, 4425, 4425, 4425,    0,    0, 4425, 4425,
-
-     4426, 4426, 4426, 4426,    0, 4426,    0, 4426, 4427, 4427,
-     4427, 4427,    0,    0, 4427, 4427, 4428, 4428, 4428, 4428,
-        0,    0, 4428, 4428, 4429, 4429, 4429, 4429,    0,    0,
-     4429, 4429, 4430, 4430, 4430, 4430,    0,    0, 4430, 4430,
-     4431, 4431, 4431, 4431,    0,    0, 4431, 4431, 4432, 4432,
-     4432,    0,    0,    0, 4432, 4433, 4433, 4433, 4433,    0,
-        0, 4433, 4433, 4434, 4434, 4434,    0,    0,    0, 4434,
-     4435, 4435, 4435, 4435,    0,    0, 4435, 4435, 4436, 4436,
-     4436, 4436,    0,    0, 4436, 4436, 4437, 4437, 4437, 4437,
-        0, 4437,    0, 4437, 4438, 4438, 4438, 4438,    0, 4438,
-
-        0, 4438, 4439, 4439, 4439, 4439,    0,    0, 4439, 4439,
-     4440, 4440, 4440, 4440,    0,    0, 4440, 4440, 4441, 4441,
-     4441, 4441,    0, 4441,    0, 4441, 4442, 4442, 4442,    0,
-        0,    0, 4442, 4443, 4443, 4443, 4443,    0,    0, 4443,
-     4443, 4444, 4444, 4444, 4444,    0, 4444,    0, 4444, 4445,
-     4445, 4445, 4445,    0,    0, 4445, 4445, 4446, 4446, 4446,
-     4446,    0, 4446,    0, 4446, 4447, 4447, 4447,    0,    0,
-        0, 4447, 4448, 4448, 4448,    0,    0,    0, 4448, 4449,
-     4449, 4449, 4449,    0,    0, 4449, 4449, 4450, 4450, 4450,
-     4450,    0,    0, 4450, 4450, 4451, 4451, 4451,    0,    0,
-
-        0, 4451, 4452, 4452, 4452, 4452,    0,    0, 4452, 4452,
-     4453, 4453, 4453,    0,    0,    0, 4453, 4454, 4454, 4454,
-     4454,    0,    0, 4454, 4454, 4455, 4455, 4455, 4455, 4455,
-     4455, 4455, 4455, 4455, 4456, 4456, 4456, 4456, 4456, 4456,
-     4456, 4456, 4456, 4457, 4457, 4457,    0,    0,    0, 4457,
-     4458, 4458, 4458, 4458,    0, 4458,    0, 4458, 4459, 4459,
-     4459, 4459,    0,    0, 4459, 4459, 4460, 4460, 4460, 4460,
-        0,    0, 4460, 4460, 4461, 4461, 4461, 4461,    0,    0,
-     4461, 4461, 4462, 4462, 4462, 4462,    0,    0, 4462, 4462,
-     4463, 4463, 4463, 4463,    0,    0, 4463, 4463, 4464, 4464,
-
-     4464,    0,    0,    0, 4464, 4465, 4465, 4465,    0,    0,
-        0, 4465, 4466, 4466, 4466, 4466,    0,    0, 4466, 4466,
-     4467, 4467, 4467,    0,    0,    0, 4467, 4468, 4468, 4468,
-     4468,    0,    0, 4468, 4468, 4469, 4469, 4469, 4469,    0,
-        0, 4469, 4469, 4470, 4470, 4470,    0,    0,    0, 4470,
-     4471, 4471, 4471, 4471,    0,    0, 4471, 4471, 4472, 4472,
-     4472, 4472,    0, 4472,    0, 4472, 4473, 4473, 4473,    0,
-        0,    0, 4473, 4474, 4474, 4474,    0,    0,    0, 4474,
-     4475, 4475, 4475,    0,    0,    0, 4475, 4476, 4476, 4476,
-     4476, 4476, 4476, 4476, 4476, 4476, 4477, 4477, 4477, 4477,
-
-     4477, 4477, 4477, 4477, 4477, 4478, 4478, 4478, 4478, 4478,
-     4478, 4478, 4478, 4478, 4479, 4479, 4479, 4479, 4479, 4479,
-     4479, 4479, 4479, 4480, 4480, 4480, 4480, 4480, 4480, 4480,
-     4480, 4480, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481,
-     4481, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-
-     3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
-     3929, 3929, 3929, 3929, 3929, 3929, 3929
+     4377, 4377, 4377,    0,    0, 4377, 4377, 4378, 4378, 4378,
+     4378,    0, 4378,    0, 4378, 4379, 4379, 4379, 4379,    0,
+        0, 4379, 4379, 4380, 4380, 4380, 4380,    0, 4380,    0,
+     4380, 4381, 4381, 4381, 4381,    0,    0, 4381, 4381, 4382,
+     4382, 4382, 4382,    0, 4382,    0, 4382, 4383, 4383, 4383,
+     4383,    0,    0, 4383, 4383, 4384, 4384, 4384, 4384,    0,
+        0, 4384, 4384, 4385, 4385, 4385,    0,    0,    0, 4385,
+
+     4386, 4386, 4386, 4386,    0,    0, 4386, 4386, 4387, 4387,
+     4387, 4387,    0,    0, 4387, 4387, 4388, 4388, 4388, 4388,
+        0,    0, 4388, 4388, 4389, 4389, 4389,    0,    0,    0,
+     4389, 4390, 4390, 4390, 4390,    0,    0, 4390, 4390, 4391,
+     4391, 4391,    0,    0,    0, 4391, 4392, 4392, 4392, 4392,
+        0,    0, 4392, 4392, 4393, 4393, 4393, 4393,    0,    0,
+     4393, 4393, 4394, 4394, 4394,    0,    0,    0, 4394, 4395,
+     4395, 4395, 4395,    0,    0, 4395, 4395, 4396, 4396, 4396,
+        0,    0,    0, 4396, 4397, 4397, 4397, 4397,    0,    0,
+     4397, 4397, 4398, 4398, 4398,    0,    0,    0, 4398, 4399,
+
+     4399, 4399, 4399,    0,    0, 4399, 4399, 4400, 4400, 4400,
+        0,    0,    0, 4400, 4401, 4401, 4401, 4401,    0,    0,
+     4401, 4401, 4402, 4402, 4402, 4402,    0,    0, 4402, 4402,
+     4403, 4403, 4403,    0,    0,    0, 4403, 4404, 4404, 4404,
+     4404,    0,    0, 4404, 4404, 4405, 4405, 4405,    0,    0,
+        0, 4405, 4406, 4406, 4406, 4406,    0,    0, 4406, 4406,
+     4407, 4407, 4407,    0,    0,    0, 4407, 4408, 4408, 4408,
+     4408,    0,    0, 4408, 4408, 4409, 4409, 4409, 4409,    0,
+     4409,    0, 4409, 4410, 4410, 4410, 4410,    0,    0, 4410,
+     4410, 4411, 4411, 4411,    0,    0,    0, 4411, 4412, 4412,
+
+     4412, 4412,    0,    0, 4412, 4412, 4413, 4413, 4413,    0,
+        0,    0, 4413, 4414, 4414, 4414, 4414,    0,    0, 4414,
+     4414, 4415, 4415, 4415,    0,    0,    0, 4415, 4416, 4416,
+     4416, 4416,    0,    0, 4416, 4416, 4417, 4417, 4417,    0,
+        0,    0, 4417, 4418, 4418, 4418, 4418,    0,    0, 4418,
+     4418, 4419, 4419, 4419, 4419,    0, 4419,    0, 4419, 4420,
+     4420, 4420, 4420,    0,    0, 4420, 4420, 4421, 4421, 4421,
+     4421, 4421, 4421, 4421, 4421, 4421, 4422, 4422, 4422, 4422,
+     4422, 4422, 4422, 4422, 4422, 4423, 4423, 4423, 4423,    0,
+     4423,    0, 4423, 4424, 4424, 4424,    0,    0,    0, 4424,
+
+     4425, 4425, 4425, 4425,    0,    0, 4425, 4425, 4426, 4426,
+     4426,    0,    0,    0, 4426, 4427, 4427, 4427, 4427,    0,
+        0, 4427, 4427, 4428, 4428, 4428, 4428,    0,    0, 4428,
+     4428, 4429, 4429, 4429,    0,    0,    0, 4429, 4430, 4430,
+     4430, 4430,    0,    0, 4430, 4430, 4431, 4431, 4431, 4431,
+        0,    0, 4431, 4431, 4432, 4432, 4432, 4432,    0,    0,
+     4432, 4432, 4433, 4433, 4433, 4433,    0,    0, 4433, 4433,
+     4434, 4434, 4434, 4434,    0, 4434,    0, 4434, 4435, 4435,
+     4435, 4435,    0,    0, 4435, 4435, 4436, 4436, 4436,    0,
+        0,    0, 4436, 4437, 4437, 4437, 4437,    0,    0, 4437,
+
+     4437, 4438, 4438, 4438, 4438,    0,    0, 4438, 4438, 4439,
+     4439, 4439,    0,    0,    0, 4439, 4440, 4440, 4440, 4440,
+        0,    0, 4440, 4440, 4441, 4441, 4441, 4441,    0,    0,
+     4441, 4441, 4442, 4442, 4442,    0,    0,    0, 4442, 4443,
+     4443, 4443,    0,    0,    0, 4443, 4444, 4444, 4444, 4444,
+        0,    0, 4444, 4444, 4445, 4445, 4445, 4445,    0,    0,
+     4445, 4445, 4446, 4446, 4446,    0,    0,    0, 4446, 4447,
+     4447, 4447, 4447,    0,    0, 4447, 4447, 4448, 4448, 4448,
+        0,    0,    0, 4448, 4449, 4449, 4449, 4449,    0, 4449,
+        0, 4449, 4450, 4450, 4450, 4450,    0,    0, 4450, 4450,
+
+     4451, 4451, 4451,    0,    0,    0, 4451, 4452, 4452, 4452,
+     4452,    0,    0, 4452, 4452, 4453, 4453, 4453,    0,    0,
+        0, 4453, 4454, 4454, 4454, 4454,    0,    0, 4454, 4454,
+     4455, 4455, 4455,    0,    0,    0, 4455, 4456, 4456, 4456,
+     4456,    0,    0, 4456, 4456, 4457, 4457, 4457,    0,    0,
+        0, 4457, 4458, 4458, 4458, 4458,    0,    0, 4458, 4458,
+     4459, 4459, 4459, 4459,    0, 4459,    0, 4459, 4460, 4460,
+     4460, 4460,    0,    0, 4460, 4460, 4461, 4461, 4461, 4461,
+        0, 4461,    0, 4461, 4462, 4462, 4462, 4462,    0,    0,
+     4462, 4462, 4463, 4463, 4463,    0,    0,    0, 4463, 4464,
+
+     4464, 4464, 4464,    0,    0, 4464, 4464, 4465, 4465, 4465,
+     4465,    0, 4465,    0, 4465, 4466, 4466, 4466, 4466,    0,
+        0, 4466, 4466, 4467, 4467, 4467, 4467,    0, 4467,    0,
+     4467, 4468, 4468, 4468,    0,    0,    0, 4468, 4469, 4469,
+     4469, 4469,    0,    0, 4469, 4469, 4470, 4470, 4470, 4470,
+     4470, 4470, 4470, 4470, 4470, 4471, 4471, 4471, 4471, 4471,
+     4471, 4471, 4471, 4471, 4472, 4472, 4472,    0,    0,    0,
+     4472, 4473, 4473, 4473, 4473,    0,    0, 4473, 4473, 4474,
+     4474, 4474, 4474,    0, 4474,    0, 4474, 4475, 4475, 4475,
+     4475,    0,    0, 4475, 4475, 4476, 4476, 4476,    0,    0,
+
+        0, 4476, 4477, 4477, 4477, 4477,    0,    0, 4477, 4477,
+     4478, 4478, 4478, 4478,    0,    0, 4478, 4478, 4479, 4479,
+     4479, 4479,    0,    0, 4479, 4479, 4480, 4480, 4480, 4480,
+        0,    0, 4480, 4480, 4481, 4481, 4481, 4481,    0,    0,
+     4481, 4481, 4482, 4482, 4482,    0,    0,    0, 4482, 4483,
+     4483, 4483, 4483,    0,    0, 4483, 4483, 4484, 4484, 4484,
+     4484,    0,    0, 4484, 4484, 4485, 4485, 4485,    0,    0,
+        0, 4485, 4486, 4486, 4486, 4486,    0,    0, 4486, 4486,
+     4487, 4487, 4487, 4487,    0,    0, 4487, 4487, 4488, 4488,
+     4488,    0,    0,    0, 4488, 4489, 4489, 4489,    0,    0,
+
+        0, 4489, 4490, 4490, 4490, 4490,    0,    0, 4490, 4490,
+     4491, 4491, 4491, 4491,    0,    0, 4491, 4491, 4492, 4492,
+     4492,    0,    0,    0, 4492, 4493, 4493, 4493,    0,    0,
+        0, 4493, 4494, 4494, 4494, 4494,    0,    0, 4494, 4494,
+     4495, 4495, 4495, 4495,    0, 4495,    0, 4495, 4496, 4496,
+     4496, 4496,    0,    0, 4496, 4496, 4497, 4497, 4497,    0,
+        0,    0, 4497, 4498, 4498, 4498, 4498,    0,    0, 4498,
+     4498, 4499, 4499, 4499,    0,    0,    0, 4499, 4500, 4500,
+     4500,    0,    0,    0, 4500, 4501, 4501, 4501, 4501,    0,
+        0, 4501, 4501, 4502, 4502, 4502, 4502,    0,    0, 4502,
+
+     4502, 4503, 4503, 4503, 4503,    0,    0, 4503, 4503, 4504,
+     4504, 4504,    0,    0,    0, 4504, 4505, 4505, 4505, 4505,
+        0,    0, 4505, 4505, 4506, 4506, 4506,    0,    0,    0,
+     4506, 4507, 4507, 4507, 4507,    0,    0, 4507, 4507, 4508,
+     4508, 4508, 4508, 4508, 4508, 4508, 4508, 4508, 4509, 4509,
+     4509, 4509, 4509, 4509, 4509, 4509, 4509, 4510, 4510, 4510,
+        0,    0,    0, 4510, 4511, 4511, 4511, 4511,    0,    0,
+     4511, 4511, 4512, 4512, 4512, 4512,    0, 4512,    0, 4512,
+     4513, 4513, 4513, 4513,    0,    0, 4513, 4513, 4514, 4514,
+     4514, 4514,    0, 4514,    0, 4514, 4515, 4515, 4515, 4515,
+
+        0,    0, 4515, 4515, 4516, 4516, 4516, 4516,    0,    0,
+     4516, 4516, 4517, 4517, 4517, 4517,    0,    0, 4517, 4517,
+     4518, 4518, 4518, 4518,    0,    0, 4518, 4518, 4519, 4519,
+     4519, 4519,    0,    0, 4519, 4519, 4520, 4520, 4520,    0,
+        0,    0, 4520, 4521, 4521, 4521, 4521,    0,    0, 4521,
+     4521, 4522, 4522, 4522,    0,    0,    0, 4522, 4523, 4523,
+     4523, 4523,    0,    0, 4523, 4523, 4524, 4524, 4524, 4524,
+        0,    0, 4524, 4524, 4525, 4525, 4525, 4525,    0, 4525,
+        0, 4525, 4526, 4526, 4526, 4526,    0, 4526,    0, 4526,
+     4527, 4527, 4527, 4527,    0,    0, 4527, 4527, 4528, 4528,
+
+     4528, 4528,    0,    0, 4528, 4528, 4529, 4529, 4529, 4529,
+        0, 4529,    0, 4529, 4530, 4530, 4530,    0,    0,    0,
+     4530, 4531, 4531, 4531, 4531,    0,    0, 4531, 4531, 4532,
+     4532, 4532, 4532,    0, 4532,    0, 4532, 4533, 4533, 4533,
+     4533,    0,    0, 4533, 4533, 4534, 4534, 4534, 4534,    0,
+     4534,    0, 4534, 4535, 4535, 4535,    0,    0,    0, 4535,
+     4536, 4536, 4536,    0,    0,    0, 4536, 4537, 4537, 4537,
+     4537,    0,    0, 4537, 4537, 4538, 4538, 4538, 4538,    0,
+        0, 4538, 4538, 4539, 4539, 4539,    0,    0,    0, 4539,
+     4540, 4540, 4540, 4540,    0,    0, 4540, 4540, 4541, 4541,
+
+     4541,    0,    0,    0, 4541, 4542, 4542, 4542, 4542,    0,
+        0, 4542, 4542, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+     4543, 4543, 4544, 4544, 4544, 4544, 4544, 4544, 4544, 4544,
+     4544, 4545, 4545, 4545,    0,    0,    0, 4545, 4546, 4546,
+     4546, 4546,    0, 4546,    0, 4546, 4547, 4547, 4547, 4547,
+        0,    0, 4547, 4547, 4548, 4548, 4548, 4548,    0,    0,
+     4548, 4548, 4549, 4549, 4549, 4549,    0,    0, 4549, 4549,
+     4550, 4550, 4550, 4550,    0,    0, 4550, 4550, 4551, 4551,
+     4551, 4551,    0,    0, 4551, 4551, 4552, 4552, 4552,    0,
+        0,    0, 4552, 4553, 4553, 4553,    0,    0,    0, 4553,
+
+     4554, 4554, 4554, 4554,    0,    0, 4554, 4554, 4555, 4555,
+     4555,    0,    0,    0, 4555, 4556, 4556, 4556, 4556,    0,
+        0, 4556, 4556, 4557, 4557, 4557, 4557,    0,    0, 4557,
+     4557, 4558, 4558, 4558,    0,    0,    0, 4558, 4559, 4559,
+     4559, 4559,    0,    0, 4559, 4559, 4560, 4560, 4560, 4560,
+        0, 4560,    0, 4560, 4561, 4561, 4561,    0,    0,    0,
+     4561, 4562, 4562, 4562,    0,    0,    0, 4562, 4563, 4563,
+     4563,    0,    0,    0, 4563, 4564, 4564, 4564, 4564, 4564,
+     4564, 4564, 4564, 4564, 4565, 4565, 4565, 4565, 4565, 4565,
+     4565, 4565, 4565, 4566, 4566, 4566, 4566, 4566, 4566, 4566,
+
+     4566, 4566, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567,
+     4567, 4568, 4568, 4568, 4568, 4568, 4568, 4568, 4568, 4568,
+     4569, 4569, 4569, 4569, 4569, 4569, 4569, 4569, 4569, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+     4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+
+     4017, 4017, 4017, 4017, 4017
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[652] =
+static const flex_int32_t yy_rule_can_match_eol[664] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 1, 1, 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, 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, 
+    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, 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, 1, 1, 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, 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, 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, 0, 0, 0, 0, 1, 1, 
-    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 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, 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, 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,     };
+    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, 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, 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, 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, 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, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
+    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, 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, 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;
 
-extern int surf_parse__flex_debug;
-int surf_parse__flex_debug = 0;
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
 
 /* The intent behind this definition is that it'll catch
  * any uses of REJECT which flex missed.
@@ -5002,7 +5282,7 @@ int surf_parse__flex_debug = 0;
 #define yymore() yymore_used_but_not_detected
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
-char *surf_parse_text;
+char *yytext;
 /* Validating XML processor for src/surf/xml/simgrid.dtd.
  *
  * This program was generated with the FleXML XML processor generator.
@@ -5513,7 +5793,7 @@ static int inext = 1;
 #define BUFFERPUTC(C) (ck_blimit(), surfxml_bufferstack[bnext++] = (C))
 #define BUFFERDONE    (BUFFERPUTC('\0'))
 
-#define BUFFERLITERAL(C, P) surfxml_bufferliteral(C, &(P), surf_parse_text)
+#define BUFFERLITERAL(C, P) surfxml_bufferliteral(C, &(P), yytext)
 
 /* after this is called, there are at least 2 slots left in the stack */
 static int ck_blimit()
@@ -5750,13 +6030,21 @@ const char* *surfxml_statenames=NULL;
 #define S_surfxml_zone_6 135
 #define S_surfxml_zone_7 136
 #define S_surfxml_zone_8 137
-#define E_surfxml_zone 138
-#define AL_surfxml_zoneRoute 139
-#define S_surfxml_zoneRoute 140
-#define S_surfxml_zoneRoute_1 141
-#define S_surfxml_zoneRoute_2 142
-#define E_surfxml_zoneRoute 143
-#define IMPOSSIBLE 144
+#define S_surfxml_zone_9 138
+#define S_surfxml_zone_10 139
+#define S_surfxml_zone_11 140
+#define S_surfxml_zone_12 141
+#define S_surfxml_zone_13 142
+#define S_surfxml_zone_14 143
+#define S_surfxml_zone_15 144
+#define S_surfxml_zone_16 145
+#define E_surfxml_zone 146
+#define AL_surfxml_zoneRoute 147
+#define S_surfxml_zoneRoute 148
+#define S_surfxml_zoneRoute_1 149
+#define S_surfxml_zoneRoute_2 150
+#define E_surfxml_zoneRoute 151
+#define IMPOSSIBLE 152
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -5777,36 +6065,36 @@ const char* *surfxml_statenames=NULL;
 #define YY_EXTRA_TYPE void *
 #endif
 
-static int yy_init_globals (void );
+static int yy_init_globals ( void );
 
 /* Accessor methods to globals.
    These are made visible to non-reentrant scanners for convenience. */
 
-int surf_parse_lex_destroy (void );
+int yylex_destroy ( void );
 
-int surf_parse_get_debug (void );
+int yyget_debug ( void );
 
-void surf_parse_set_debug (int debug_flag  );
+void yyset_debug ( int debug_flag  );
 
-YY_EXTRA_TYPE surf_parse_get_extra (void );
+YY_EXTRA_TYPE yyget_extra ( void );
 
-void surf_parse_set_extra (YY_EXTRA_TYPE user_defined  );
+void yyset_extra ( YY_EXTRA_TYPE user_defined  );
 
-FILE *surf_parse_get_in (void );
+FILE *yyget_in ( void );
 
-void surf_parse_set_in  (FILE * _in_str  );
+void yyset_in  ( FILE * _in_str  );
 
-FILE *surf_parse_get_out (void );
+FILE *yyget_out ( void );
 
-void surf_parse_set_out  (FILE * _out_str  );
+void yyset_out  ( FILE * _out_str  );
 
-                       int surf_parse_get_leng (void );
+                       int yyget_leng ( void );
 
-char *surf_parse_get_text (void );
+char *yyget_text ( void );
 
-int surf_parse_get_lineno (void );
+int yyget_lineno ( void );
 
-void surf_parse_set_lineno (int _line_number  );
+void yyset_lineno ( int _line_number  );
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -5814,9 +6102,9 @@ void surf_parse_set_lineno (int _line_number  );
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int surf_parse_wrap (void );
+extern "C" int yywrap ( void );
 #else
-extern int surf_parse_wrap (void );
+extern int yywrap ( void );
 #endif
 #endif
 
@@ -5825,19 +6113,18 @@ extern int surf_parse_wrap (void );
 #endif
 
 #ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
+static void yy_flex_strncpy ( char *, const char *, int );
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
+static int yy_flex_strlen ( const char * );
 #endif
 
 #ifndef YY_NO_INPUT
-
 #ifdef __cplusplus
-static int yyinput (void );
+static int yyinput ( void );
 #else
-static int input (void );
+static int input ( void );
 #endif
 
 #endif
@@ -5846,9 +6133,9 @@ static int input (void );
         static int yy_start_stack_depth = 0;
         static int *yy_start_stack = NULL;
     
-    static void yy_push_state (int _new_state );
+    static void yy_push_state ( int _new_state );
     
-    static void yy_pop_state (void );
+    static void yy_pop_state ( void );
     
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
@@ -5865,7 +6152,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO do { if (fwrite( surf_parse_text, (size_t) surf_parse_leng, 1, surf_parse_out )) {} } while (0)
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -5878,18 +6165,18 @@ static int input (void );
                int c = '*'; \
                size_t n; \
                for ( n = 0; n < ( size_t ) max_size && \
-                            (c = getc( surf_parse_in )) != EOF && c != '\n'; ++n ) \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
                if ( c == '\n' ) \
                        buf[n++] = (char) c; \
-               if ( c == EOF && ferror( surf_parse_in ) ) \
+               if ( c == EOF && ferror( yyin ) ) \
                        YY_FATAL_ERROR( "input in flex scanner failed" ); \
                result = n; \
                } \
        else \
                { \
                errno=0; \
-               while ( (result = (int) fread(buf, 1, max_size, surf_parse_in))==0 && ferror(surf_parse_in)) \
+               while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
                        { \
                        if( errno != EINTR) \
                                { \
@@ -5897,7 +6184,7 @@ static int input (void );
                                break; \
                                } \
                        errno=0; \
-                       clearerr(surf_parse_in); \
+                       clearerr(yyin); \
                        } \
                }\
 \
@@ -5930,12 +6217,12 @@ static int input (void );
 #ifndef YY_DECL
 #define YY_DECL_IS_OURS 1
 
-extern int surf_parse_lex (void);
+extern int yylex (void);
 
-#define YY_DECL int surf_parse_lex (void)
+#define YY_DECL int yylex (void)
 #endif /* !YY_DECL */
 
-/* Code executed at the beginning of each rule, after surf_parse_text and surf_parse_leng
+/* Code executed at the beginning of each rule, after yytext and yyleng
  * have been set up.
  */
 #ifndef YY_USER_ACTION
@@ -5969,19 +6256,19 @@ YY_DECL
                if ( ! (yy_start) )
                        (yy_start) = 1; /* first start state */
 
-               if ( ! surf_parse_in )
-                       surf_parse_in = stdin;
+               if ( ! yyin )
+                       yyin = stdin;
 
-               if ( ! surf_parse_out )
-                       surf_parse_out = stdout;
+               if ( ! yyout )
+                       yyout = stdout;
 
                if ( ! YY_CURRENT_BUFFER ) {
-                       surf_parse_ensure_buffer_stack ();
+                       yyensure_buffer_stack ();
                        YY_CURRENT_BUFFER_LVALUE =
-                               surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE );
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
                }
 
-               surf_parse__load_buffer_state( );
+               yy_load_buffer_state(  );
                }
 
        {
@@ -6155,6 +6442,14 @@ YY_DECL
   surfxml_statenames[S_surfxml_zone_6] = "zone";
   surfxml_statenames[S_surfxml_zone_7] = "zone";
   surfxml_statenames[S_surfxml_zone_8] = "zone";
+  surfxml_statenames[S_surfxml_zone_9] = "zone";
+  surfxml_statenames[S_surfxml_zone_10] = "zone";
+  surfxml_statenames[S_surfxml_zone_11] = "zone";
+  surfxml_statenames[S_surfxml_zone_12] = "zone";
+  surfxml_statenames[S_surfxml_zone_13] = "zone";
+  surfxml_statenames[S_surfxml_zone_14] = "zone";
+  surfxml_statenames[S_surfxml_zone_15] = "zone";
+  surfxml_statenames[S_surfxml_zone_16] = "zone";
   surfxml_statenames[E_surfxml_zone] = "zone";
   surfxml_statenames[AL_surfxml_zoneRoute] = NULL;
   surfxml_statenames[S_surfxml_zoneRoute] = "zoneRoute";
@@ -6169,7 +6464,7 @@ YY_DECL
                {
                yy_cp = (yy_c_buf_p);
 
-               /* Support of surf_parse_text. */
+               /* Support of yytext. */
                *yy_cp = (yy_hold_char);
 
                /* yy_bp points to the position in yy_ch_buf of the start of
@@ -6190,13 +6485,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 >= 3930 )
-                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               if ( yy_current_state >= 4018 )
+                                       yy_c = yy_meta[yy_c];
                                }
-                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 13842 );
+               while ( yy_base[yy_current_state] != 13930 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -6211,11 +6506,11 @@ yy_find_action:
 
                if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
                        {
-                       unsigned int yyl;
-                       for ( yyl = 0; yyl < surf_parse_leng; ++yyl )
-                               if ( surf_parse_text[yyl] == '\n' )
+                       int yyl;
+                       for ( yyl = 0; yyl < yyleng; ++yyl )
+                               if ( yytext[yyl] == '\n' )
                                        
-    surf_parse_lineno++;
+    yylineno++;
 ;
                        }
 
@@ -6284,7 +6579,7 @@ SET(DOCTYPE);
 case 12:
 /* rule 12 can match eol */
 YY_RULE_SETUP
-FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in <platform>), please update it with tools/simgrid_update_xml.pl",surf_parse_text);
+FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in <platform>), please update it with tools/simgrid_update_xml.pl",yytext);
        YY_BREAK
 
 case 13:
@@ -6295,11 +6590,11 @@ SET(ROOT_surfxml_platform);
 case 14:
 /* rule 14 can match eol */
 YY_RULE_SETUP
-FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in <platform>), please update it with tools/simgrid_update_xml.pl",surf_parse_text);
+FAIL("Bad declaration %s.\nIf your are using a XML v3 file (check the version attribute in <platform>), please update it with tools/simgrid_update_xml.pl",yytext);
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in prolog.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in prolog.", yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(PROLOG):
 case YY_STATE_EOF(DOCTYPE):
@@ -6428,11 +6723,11 @@ YY_RULE_SETUP
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of AS element.", yytext[0]);
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `AS' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_AS):
 FAIL("EOF in attribute list of `AS' element.");
@@ -6456,11 +6751,11 @@ YY_RULE_SETUP
 case 45:
 /* rule 45 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</AS>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</AS>' expected.",yytext);
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</AS>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</AS>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_AS):
 case YY_STATE_EOF(S_surfxml_AS):
@@ -6550,6 +6845,20 @@ YY_RULE_SETUP
 A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
        YY_BREAK
 case 61:
+/* rule 61 can match eol */
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_yes;
+       YY_BREAK
+case 63:
+/* rule 63 can match eol */
+case 64:
+/* rule 64 can match eol */
+YY_RULE_SETUP
+A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_no;
+       YY_BREAK
+case 65:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_dst) FAIL("Required attribute `dst' not set for `ASroute' element.");
@@ -6559,7 +6868,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute);
  }
        YY_BREAK
-case 62:
+case 66:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_dst) FAIL("Required attribute `dst' not set for `ASroute' element.");
@@ -6568,88 +6877,46 @@ YY_RULE_SETUP
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
   LEAVE; STag_surfxml_ASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_ASroute(); popbuffer(); /* attribute */
   switch (YY_START) {
-    case S_surfxml_AS_1:
-    case S_surfxml_AS_3:
-    case S_surfxml_AS_5:
-      SET(S_surfxml_AS_6);
-      break;
-    case S_surfxml_AS:
-    case S_surfxml_AS_4:
-    case S_surfxml_AS_6:
-    case S_surfxml_AS_7:
-    case S_surfxml_AS_8:
-      SET(S_surfxml_AS_8);
-      break;
-    case S_surfxml_zone_3:
-    case S_surfxml_zone_5:
-    case S_surfxml_zone_6:
-      SET(S_surfxml_zone_6);
-      break;
-    case S_surfxml_zone:
-    case S_surfxml_zone_1:
-    case S_surfxml_zone_4:
-    case S_surfxml_zone_7:
-    case S_surfxml_zone_8:
-      SET(S_surfxml_zone_8);
-      break;
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 63:
+case 67:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of ASroute element.", yytext[0]);
        YY_BREAK
-case 64:
+case 68:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `ASroute' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_ASroute):
 FAIL("EOF in attribute list of `ASroute' element.");
        YY_BREAK
 
-case 65:
-/* rule 65 can match eol */
+case 69:
+/* rule 69 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_ASroute();
   popbuffer(); /* attribute */
   switch (YY_START) {
-    case S_surfxml_AS_1:
-    case S_surfxml_AS_3:
-    case S_surfxml_AS_5:
-      SET(S_surfxml_AS_6);
-      break;
-    case S_surfxml_AS:
-    case S_surfxml_AS_4:
-    case S_surfxml_AS_6:
-    case S_surfxml_AS_7:
-    case S_surfxml_AS_8:
-      SET(S_surfxml_AS_8);
-      break;
-    case S_surfxml_zone_3:
-    case S_surfxml_zone_5:
-    case S_surfxml_zone_6:
-      SET(S_surfxml_zone_6);
-      break;
-    case S_surfxml_zone:
-    case S_surfxml_zone_1:
-    case S_surfxml_zone_4:
-    case S_surfxml_zone_7:
-    case S_surfxml_zone_8:
-      SET(S_surfxml_zone_8);
-      break;
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 66:
-/* rule 66 can match eol */
+case 70:
+/* rule 70 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",yytext);
        YY_BREAK
-case 67:
+case 71:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</ASroute>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</ASroute>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_ASroute):
 case YY_STATE_EOF(S_surfxml_ASroute):
@@ -6657,13 +6924,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2):
 FAIL("Premature EOF: `</ASroute>' expected.");
        YY_BREAK
 
-case 68:
-/* rule 68 can match eol */
+case 72:
+/* rule 72 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <actor> is not allowed here.");
        YY_BREAK
-case 69:
-/* rule 69 can match eol */
+case 73:
+/* rule 73 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_actor_function = 0;
@@ -6680,61 +6947,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 70:
-/* rule 70 can match eol */
-YY_RULE_SETUP
-if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");} surfxml_actor_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_function);
-       YY_BREAK
-case 71:
-/* rule 71 can match eol */
-YY_RULE_SETUP
-if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");}  surfxml_actor_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_function);
-       YY_BREAK
-case 72:
-/* rule 72 can match eol */
-YY_RULE_SETUP
-if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");} surfxml_actor_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_host);
-       YY_BREAK
-case 73:
-/* rule 73 can match eol */
-YY_RULE_SETUP
-if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");}  surfxml_actor_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_host);
-       YY_BREAK
 case 74:
 /* rule 74 can match eol */
 YY_RULE_SETUP
-if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_kill___time);
+if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");} surfxml_actor_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_function);
        YY_BREAK
 case 75:
 /* rule 75 can match eol */
 YY_RULE_SETUP
-if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");}  surfxml_actor_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_kill___time);
+if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");}  surfxml_actor_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_function);
        YY_BREAK
 case 76:
 /* rule 76 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");} surfxml_actor_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_host);
+       YY_BREAK
 case 77:
 /* rule 77 can match eol */
 YY_RULE_SETUP
-A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE;
+if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");}  surfxml_actor_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_host);
        YY_BREAK
 case 78:
 /* rule 78 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_kill___time);
+       YY_BREAK
 case 79:
 /* rule 79 can match eol */
 YY_RULE_SETUP
-A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_RESTART;
+if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");}  surfxml_actor_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_kill___time);
        YY_BREAK
 case 80:
 /* rule 80 can match eol */
-YY_RULE_SETUP
-if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");} surfxml_actor_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_start___time);
-       YY_BREAK
 case 81:
 /* rule 81 can match eol */
 YY_RULE_SETUP
-if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");}  surfxml_actor_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_start___time);
+A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE;
        YY_BREAK
 case 82:
+/* rule 82 can match eol */
+case 83:
+/* rule 83 can match eol */
+YY_RULE_SETUP
+A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_RESTART;
+       YY_BREAK
+case 84:
+/* rule 84 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");} surfxml_actor_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_start___time);
+       YY_BREAK
+case 85:
+/* rule 85 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");}  surfxml_actor_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_start___time);
+       YY_BREAK
+case 86:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element.");
@@ -6742,7 +7009,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_actor();surfxml_pcdata_ix = 0; ENTER(S_surfxml_actor);
  }
        YY_BREAK
-case 83:
+case 87:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element.");
@@ -6753,20 +7020,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 84:
+case 88:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of actor element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of actor element.", yytext[0]);
        YY_BREAK
-case 85:
+case 89:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `actor' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `actor' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_actor):
 FAIL("EOF in attribute list of `actor' element.");
        YY_BREAK
 
-case 86:
-/* rule 86 can match eol */
+case 90:
+/* rule 90 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6777,14 +7044,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 87:
-/* rule 87 can match eol */
+case 91:
+/* rule 91 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</actor>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</actor>' expected.",yytext);
        YY_BREAK
-case 88:
+case 92:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</actor>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</actor>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_actor):
 case YY_STATE_EOF(S_surfxml_actor):
@@ -6792,13 +7059,13 @@ case YY_STATE_EOF(S_surfxml_actor_2):
 FAIL("Premature EOF: `</actor>' expected.");
        YY_BREAK
 
-case 89:
-/* rule 89 can match eol */
+case 93:
+/* rule 93 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <argument> is not allowed here.");
        YY_BREAK
-case 90:
-/* rule 90 can match eol */
+case 94:
+/* rule 94 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
@@ -6807,24 +7074,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 91:
-/* rule 91 can match eol */
+case 95:
+/* rule 95 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 92:
-/* rule 92 can match eol */
+case 96:
+/* rule 96 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 93:
+case 97:
 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 94:
+case 98:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
@@ -6835,20 +7102,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 95:
+case 99:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of argument element.", yytext[0]);
        YY_BREAK
-case 96:
+case 100:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `argument' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 97:
-/* rule 97 can match eol */
+case 101:
+/* rule 101 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6860,26 +7127,26 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 98:
-/* rule 98 can match eol */
+case 102:
+/* rule 102 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</argument>' expected.",yytext);
        YY_BREAK
-case 99:
+case 103:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</argument>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_argument):
 FAIL("Premature EOF: `</argument>' expected.");
        YY_BREAK
 
-case 100:
-/* rule 100 can match eol */
+case 104:
+/* rule 104 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <backbone> is not allowed here.");
        YY_BREAK
-case 101:
-/* rule 101 can match eol */
+case 105:
+/* rule 105 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_backbone_bandwidth = 0;
@@ -6892,37 +7159,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 102:
-/* rule 102 can match eol */
+case 106:
+/* rule 106 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 103:
-/* rule 103 can match eol */
+case 107:
+/* rule 107 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 104:
-/* rule 104 can match eol */
+case 108:
+/* rule 108 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 105:
-/* rule 105 can match eol */
+case 109:
+/* rule 109 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 106:
-/* rule 106 can match eol */
+case 110:
+/* rule 110 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 107:
-/* rule 107 can match eol */
+case 111:
+/* rule 111 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 108:
+case 112:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element.");
@@ -6931,7 +7198,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone);
  }
        YY_BREAK
-case 109:
+case 113:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element.");
@@ -6940,24 +7207,25 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone(); surfxml_pcdata_ix = 0; ETag_surfxml_backbone(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 110:
+case 114:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of backbone element.", yytext[0]);
        YY_BREAK
-case 111:
+case 115:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `backbone' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_backbone):
 FAIL("EOF in attribute list of `backbone' element.");
        YY_BREAK
 
-case 112:
-/* rule 112 can match eol */
+case 116:
+/* rule 116 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6965,30 +7233,31 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 113:
-/* rule 113 can match eol */
+case 117:
+/* rule 117 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</backbone>' expected.",yytext);
        YY_BREAK
-case 114:
+case 118:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</backbone>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_backbone):
 FAIL("Premature EOF: `</backbone>' expected.");
        YY_BREAK
 
-case 115:
-/* rule 115 can match eol */
+case 119:
+/* rule 119 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassASroute> is not allowed here.");
        YY_BREAK
-case 116:
-/* rule 116 can match eol */
+case 120:
+/* rule 120 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassASroute_dst = 0;
@@ -7003,47 +7272,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 117:
-/* rule 117 can match eol */
+case 121:
+/* rule 121 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);
        YY_BREAK
-case 118:
-/* rule 118 can match eol */
+case 122:
+/* rule 122 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);
        YY_BREAK
-case 119:
-/* rule 119 can match eol */
+case 123:
+/* rule 123 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 120:
-/* rule 120 can match eol */
+case 124:
+/* rule 124 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 121:
-/* rule 121 can match eol */
+case 125:
+/* rule 125 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);
        YY_BREAK
-case 122:
-/* rule 122 can match eol */
+case 126:
+/* rule 126 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 123:
-/* rule 123 can match eol */
+case 127:
+/* rule 127 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 124:
-/* rule 124 can match eol */
+case 128:
+/* rule 128 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 125:
+case 129:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element.");
@@ -7053,7 +7322,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute);
  }
        YY_BREAK
-case 126:
+case 130:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element.");
@@ -7063,24 +7332,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassASroute(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 127:
+case 131:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", yytext[0]);
        YY_BREAK
-case 128:
+case 132:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_bypassASroute):
 FAIL("EOF in attribute list of `bypassASroute' element.");
        YY_BREAK
 
-case 129:
-/* rule 129 can match eol */
+case 133:
+/* rule 133 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7088,18 +7357,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 130:
-/* rule 130 can match eol */
+case 134:
+/* rule 134 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",yytext);
        YY_BREAK
-case 131:
+case 135:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</bypassASroute>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_bypassASroute):
 case YY_STATE_EOF(S_surfxml_bypassASroute):
@@ -7107,13 +7376,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute_2):
 FAIL("Premature EOF: `</bypassASroute>' expected.");
        YY_BREAK
 
-case 132:
-/* rule 132 can match eol */
+case 136:
+/* rule 136 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassRoute> is not allowed here.");
        YY_BREAK
-case 133:
-/* rule 133 can match eol */
+case 137:
+/* rule 137 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassRoute_dst = 0;
@@ -7124,27 +7393,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 134:
-/* rule 134 can match eol */
+case 138:
+/* rule 138 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 135:
-/* rule 135 can match eol */
+case 139:
+/* rule 139 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 136:
-/* rule 136 can match eol */
+case 140:
+/* rule 140 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 137:
-/* rule 137 can match eol */
+case 141:
+/* rule 141 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 138:
+case 142:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element.");
@@ -7152,7 +7421,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute);
  }
        YY_BREAK
-case 139:
+case 143:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element.");
@@ -7160,24 +7429,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassRoute(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
   }
  }
        YY_BREAK
-case 140:
+case 144:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", yytext[0]);
        YY_BREAK
-case 141:
+case 145:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_bypassRoute):
 FAIL("EOF in attribute list of `bypassRoute' element.");
        YY_BREAK
 
-case 142:
-/* rule 142 can match eol */
+case 146:
+/* rule 146 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7185,18 +7454,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
   }
  }
        YY_BREAK
-case 143:
-/* rule 143 can match eol */
+case 147:
+/* rule 147 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",yytext);
        YY_BREAK
-case 144:
+case 148:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</bypassRoute>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_bypassRoute):
 case YY_STATE_EOF(S_surfxml_bypassRoute):
@@ -7204,13 +7473,13 @@ case YY_STATE_EOF(S_surfxml_bypassRoute_2):
 FAIL("Premature EOF: `</bypassRoute>' expected.");
        YY_BREAK
 
-case 145:
-/* rule 145 can match eol */
+case 149:
+/* rule 149 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassZoneRoute> is not allowed here.");
        YY_BREAK
-case 146:
-/* rule 146 can match eol */
+case 150:
+/* rule 150 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassZoneRoute_dst = 0;
@@ -7225,47 +7494,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 147:
-/* rule 147 can match eol */
+case 151:
+/* rule 151 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_dst);
        YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 152:
+/* rule 152 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_dst);
        YY_BREAK
-case 149:
-/* rule 149 can match eol */
+case 153:
+/* rule 153 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst);
        YY_BREAK
-case 150:
-/* rule 150 can match eol */
+case 154:
+/* rule 154 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst);
        YY_BREAK
-case 151:
-/* rule 151 can match eol */
+case 155:
+/* rule 155 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src);
        YY_BREAK
-case 152:
-/* rule 152 can match eol */
+case 156:
+/* rule 156 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src);
        YY_BREAK
-case 153:
-/* rule 153 can match eol */
+case 157:
+/* rule 157 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_src);
        YY_BREAK
-case 154:
-/* rule 154 can match eol */
+case 158:
+/* rule 158 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_src);
        YY_BREAK
-case 155:
+case 159:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element.");
@@ -7275,7 +7544,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassZoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassZoneRoute);
  }
        YY_BREAK
-case 156:
+case 160:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element.");
@@ -7285,24 +7554,23 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassZoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassZoneRoute(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 157:
+case 161:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of bypassZoneRoute element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of bypassZoneRoute element.", yytext[0]);
        YY_BREAK
-case 158:
+case 162:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `bypassZoneRoute' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `bypassZoneRoute' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_bypassZoneRoute):
 FAIL("EOF in attribute list of `bypassZoneRoute' element.");
        YY_BREAK
 
-case 159:
-/* rule 159 can match eol */
+case 163:
+/* rule 163 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7310,18 +7578,17 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 160:
-/* rule 160 can match eol */
+case 164:
+/* rule 164 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</bypassZoneRoute>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</bypassZoneRoute>' expected.",yytext);
        YY_BREAK
-case 161:
+case 165:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</bypassZoneRoute>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</bypassZoneRoute>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_bypassZoneRoute):
 case YY_STATE_EOF(S_surfxml_bypassZoneRoute):
@@ -7329,13 +7596,13 @@ case YY_STATE_EOF(S_surfxml_bypassZoneRoute_2):
 FAIL("Premature EOF: `</bypassZoneRoute>' expected.");
        YY_BREAK
 
-case 162:
-/* rule 162 can match eol */
+case 166:
+/* rule 166 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cabinet> is not allowed here.");
        YY_BREAK
-case 163:
-/* rule 163 can match eol */
+case 167:
+/* rule 167 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cabinet_bw = 0;
@@ -7356,77 +7623,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 164:
-/* rule 164 can match eol */
+case 168:
+/* rule 168 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);
        YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 169:
+/* rule 169 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 166:
-/* rule 166 can match eol */
+case 170:
+/* rule 170 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 167:
-/* rule 167 can match eol */
+case 171:
+/* rule 171 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 168:
-/* rule 168 can match eol */
+case 172:
+/* rule 172 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 169:
-/* rule 169 can match eol */
+case 173:
+/* rule 173 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 170:
-/* rule 170 can match eol */
+case 174:
+/* rule 174 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);
        YY_BREAK
-case 171:
-/* rule 171 can match eol */
+case 175:
+/* rule 175 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);
        YY_BREAK
-case 172:
-/* rule 172 can match eol */
+case 176:
+/* rule 176 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);
        YY_BREAK
-case 173:
-/* rule 173 can match eol */
+case 177:
+/* rule 177 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);
        YY_BREAK
-case 174:
-/* rule 174 can match eol */
+case 178:
+/* rule 178 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cabinet>");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_speed);
        YY_BREAK
-case 175:
-/* rule 175 can match eol */
+case 179:
+/* rule 179 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cabinet>");}  surfxml_cabinet_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_speed);
        YY_BREAK
-case 176:
-/* rule 176 can match eol */
+case 180:
+/* rule 180 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);
        YY_BREAK
-case 177:
-/* rule 177 can match eol */
+case 181:
+/* rule 181 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);
        YY_BREAK
-case 178:
+case 182:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element.");
@@ -7439,7 +7706,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet);
  }
        YY_BREAK
-case 179:
+case 183:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element.");
@@ -7454,24 +7721,25 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 180:
+case 184:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of cabinet element.", yytext[0]);
        YY_BREAK
-case 181:
+case 185:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `cabinet' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_cabinet):
 FAIL("EOF in attribute list of `cabinet' element.");
        YY_BREAK
 
-case 182:
-/* rule 182 can match eol */
+case 186:
+/* rule 186 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7481,30 +7749,31 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 183:
-/* rule 183 can match eol */
+case 187:
+/* rule 187 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",yytext);
        YY_BREAK
-case 184:
+case 188:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</cabinet>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_cabinet):
 FAIL("Premature EOF: `</cabinet>' expected.");
        YY_BREAK
 
-case 185:
-/* rule 185 can match eol */
+case 189:
+/* rule 189 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cluster> is not allowed here.");
        YY_BREAK
-case 186:
-/* rule 186 can match eol */
+case 190:
+/* rule 190 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cluster_bb___bw = 0;
@@ -7547,227 +7816,227 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 187:
-/* rule 187 can match eol */
+case 191:
+/* rule 191 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 188:
-/* rule 188 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);
-       YY_BREAK
-case 189:
-/* rule 189 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 190:
-/* rule 190 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);
-       YY_BREAK
-case 191:
-/* rule 191 can match eol */
 case 192:
 /* rule 192 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
+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 193:
 /* rule 193 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 194:
 /* rule 194 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
+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 195:
 /* rule 195 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);
-       YY_BREAK
 case 196:
 /* rule 196 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);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
        YY_BREAK
 case 197:
 /* rule 197 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);
-       YY_BREAK
 case 198:
 /* rule 198 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);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
        YY_BREAK
 case 199:
 /* rule 199 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_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 200:
 /* rule 200 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_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 201:
 /* rule 201 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);
+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 202:
 /* rule 202 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);
+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 203:
 /* rule 203 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_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 204:
 /* rule 204 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_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 205:
 /* rule 205 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_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 206:
 /* rule 206 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);
+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 207:
 /* rule 207 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);
+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 208:
 /* rule 208 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);
+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 209:
 /* rule 209 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_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 210:
 /* rule 210 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_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 211:
 /* rule 211 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_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 212:
 /* rule 212 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_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 213:
 /* rule 213 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_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 214:
 /* rule 214 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_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 215:
 /* rule 215 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);
+       YY_BREAK
 case 216:
 /* rule 216 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
+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 217:
 /* rule 217 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);
+       YY_BREAK
 case 218:
 /* rule 218 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SPLITDUPLEX;
+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 219:
 /* rule 219 can match eol */
 case 220:
 /* rule 220 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_SHARED;
        YY_BREAK
 case 221:
 /* rule 221 can match eol */
 case 222:
 /* rule 222 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SPLITDUPLEX;
        YY_BREAK
 case 223:
 /* rule 223 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");} surfxml_cluster_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_speed);
-       YY_BREAK
 case 224:
 /* rule 224 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");}  surfxml_cluster_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_speed);
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
        YY_BREAK
 case 225:
 /* rule 225 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);
-       YY_BREAK
 case 226:
 /* rule 226 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);
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
        YY_BREAK
 case 227:
 /* rule 227 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");} surfxml_cluster_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_speed);
        YY_BREAK
 case 228:
 /* rule 228 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");}  surfxml_cluster_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_speed);
        YY_BREAK
 case 229:
 /* rule 229 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);
+       YY_BREAK
 case 230:
 /* rule 230 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
+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 231:
 /* rule 231 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+       YY_BREAK
 case 232:
 /* rule 232 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
 case 233:
 /* rule 233 can match eol */
 case 234:
 /* rule 234 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_FAT___TREE;
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
        YY_BREAK
 case 235:
 /* rule 235 can match eol */
 case 236:
 /* rule 236 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_DRAGONFLY;
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
        YY_BREAK
 case 237:
+/* rule 237 can match eol */
+case 238:
+/* rule 238 can match eol */
+YY_RULE_SETUP
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_FAT___TREE;
+       YY_BREAK
+case 239:
+/* rule 239 can match eol */
+case 240:
+/* rule 240 can match eol */
+YY_RULE_SETUP
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_DRAGONFLY;
+       YY_BREAK
+case 241:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
@@ -7780,7 +8049,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster);
  }
        YY_BREAK
-case 238:
+case 242:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
@@ -7799,20 +8068,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 239:
+case 243:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of cluster element.", yytext[0]);
        YY_BREAK
-case 240:
+case 244:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `cluster' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_cluster):
 FAIL("EOF in attribute list of `cluster' element.");
        YY_BREAK
 
-case 241:
-/* rule 241 can match eol */
+case 245:
+/* rule 245 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7826,14 +8095,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 242:
-/* rule 242 can match eol */
+case 246:
+/* rule 246 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</cluster>' expected.",yytext);
        YY_BREAK
-case 243:
+case 247:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</cluster>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_cluster):
 case YY_STATE_EOF(S_surfxml_cluster):
@@ -7841,13 +8110,13 @@ case YY_STATE_EOF(S_surfxml_cluster_2):
 FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
 
-case 244:
-/* rule 244 can match eol */
+case 248:
+/* rule 248 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <config> is not allowed here.");
        YY_BREAK
-case 245:
-/* rule 245 can match eol */
+case 249:
+/* rule 249 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_config_id = 0;
@@ -7856,23 +8125,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 246:
-/* rule 246 can match eol */
+case 250:
+/* rule 250 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 247:
-/* rule 247 can match eol */
+case 251:
+/* rule 251 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 248:
+case 252:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
  }
        YY_BREAK
-case 249:
+case 253:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
@@ -7881,20 +8150,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 250:
+case 254:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of config element.", yytext[0]);
        YY_BREAK
-case 251:
+case 255:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `config' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_config):
 FAIL("EOF in attribute list of `config' element.");
        YY_BREAK
 
-case 252:
-/* rule 252 can match eol */
+case 256:
+/* rule 256 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7905,14 +8174,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 253:
-/* rule 253 can match eol */
+case 257:
+/* rule 257 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</config>' expected.",yytext);
        YY_BREAK
-case 254:
+case 258:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</config>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_config):
 case YY_STATE_EOF(S_surfxml_config):
@@ -7920,13 +8189,13 @@ case YY_STATE_EOF(S_surfxml_config_2):
 FAIL("Premature EOF: `</config>' expected.");
        YY_BREAK
 
-case 255:
-/* rule 255 can match eol */
+case 259:
+/* rule 259 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host> is not allowed here.");
        YY_BREAK
-case 256:
-/* rule 256 can match eol */
+case 260:
+/* rule 260 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host_availability___file = 0;
@@ -7947,77 +8216,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 257:
-/* rule 257 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
-       YY_BREAK
-case 258:
-/* rule 258 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
-       YY_BREAK
-case 259:
-/* rule 259 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
-       YY_BREAK
-case 260:
-/* rule 260 can match eol */
-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 261:
 /* rule 261 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
 case 262:
 /* rule 262 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
 case 263:
 /* rule 263 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
+if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
 case 264:
 /* rule 264 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
+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 265:
 /* rule 265 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);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
 case 266:
 /* rule 266 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);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
 case 267:
 /* rule 267 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");} surfxml_host_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_speed);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
 case 268:
 /* rule 268 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");}  surfxml_host_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_speed);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
 case 269:
 /* rule 269 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
+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 270:
 /* rule 270 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
+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 271:
+/* rule 271 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");} surfxml_host_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_speed);
+       YY_BREAK
+case 272:
+/* rule 272 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");}  surfxml_host_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_speed);
+       YY_BREAK
+case 273:
+/* rule 273 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
+       YY_BREAK
+case 274:
+/* rule 274 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
+       YY_BREAK
+case 275:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -8025,7 +8294,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
  }
        YY_BREAK
-case 272:
+case 276:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -8033,24 +8302,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 273:
+case 277:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of host element.", yytext[0]);
        YY_BREAK
-case 274:
+case 278:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `host' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_host):
 FAIL("EOF in attribute list of `host' element.");
        YY_BREAK
 
-case 275:
-/* rule 275 can match eol */
+case 279:
+/* rule 279 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8058,18 +8327,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 276:
-/* rule 276 can match eol */
+case 280:
+/* rule 280 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</host>' expected.",yytext);
        YY_BREAK
-case 277:
+case 281:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</host>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_host):
 case YY_STATE_EOF(S_surfxml_host):
@@ -8077,13 +8346,13 @@ case YY_STATE_EOF(S_surfxml_host_2):
 FAIL("Premature EOF: `</host>' expected.");
        YY_BREAK
 
-case 278:
-/* rule 278 can match eol */
+case 282:
+/* rule 282 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host_link> is not allowed here.");
        YY_BREAK
-case 279:
-/* rule 279 can match eol */
+case 283:
+/* rule 283 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host___link_down = 0;
@@ -8096,37 +8365,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 280:
-/* rule 280 can match eol */
+case 284:
+/* rule 284 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 281:
-/* rule 281 can match eol */
+case 285:
+/* rule 285 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 282:
-/* rule 282 can match eol */
+case 286:
+/* rule 286 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 283:
-/* rule 283 can match eol */
+case 287:
+/* rule 287 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 284:
-/* rule 284 can match eol */
+case 288:
+/* rule 288 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 285:
-/* rule 285 can match eol */
+case 289:
+/* rule 289 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 286:
+case 290:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element.");
@@ -8135,7 +8404,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link);
  }
        YY_BREAK
-case 287:
+case 291:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element.");
@@ -8144,24 +8413,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link(); surfxml_pcdata_ix = 0; ETag_surfxml_host___link(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 288:
+case 292:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of host_link element.", yytext[0]);
        YY_BREAK
-case 289:
+case 293:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `host_link' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_host___link):
 FAIL("EOF in attribute list of `host_link' element.");
        YY_BREAK
 
-case 290:
-/* rule 290 can match eol */
+case 294:
+/* rule 294 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8169,31 +8438,31 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 291:
-/* rule 291 can match eol */
+case 295:
+/* rule 295 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</host_link>' expected.",yytext);
        YY_BREAK
-case 292:
+case 296:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</host_link>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_host___link):
 FAIL("Premature EOF: `</host_link>' expected.");
        YY_BREAK
 
-/* <!-- tag include is deprecated. Not documented, and soon removed -->  */
-case 293:
-/* rule 293 can match eol */
+/* <!-- tag include is deprecated. Not documented, and removed in v3.22 -->  */
+case 297:
+/* rule 297 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <include> is not allowed here.");
        YY_BREAK
-case 294:
-/* rule 294 can match eol */
+case 298:
+/* rule 298 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_include_file = 0;
@@ -8202,24 +8471,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 295:
-/* rule 295 can match eol */
+case 299:
+/* rule 299 can match eol */
 YY_RULE_SETUP
 if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_include>");} surfxml_include_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 296:
-/* rule 296 can match eol */
+case 300:
+/* rule 300 can match eol */
 YY_RULE_SETUP
 if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_include>");}  surfxml_include_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 297:
+case 301:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
   LEAVE; STag_surfxml_include();surfxml_pcdata_ix = 0; ENTER(S_surfxml_include);
  }
        YY_BREAK
-case 298:
+case 302:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
@@ -8228,24 +8497,25 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 299:
+case 303:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of include element.", yytext[0]);
        YY_BREAK
-case 300:
+case 304:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `include' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_include):
 FAIL("EOF in attribute list of `include' element.");
        YY_BREAK
 
-case 301:
-/* rule 301 can match eol */
+case 305:
+/* rule 305 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8255,18 +8525,19 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 302:
-/* rule 302 can match eol */
+case 306:
+/* rule 306 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</include>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</include>' expected.",yytext);
        YY_BREAK
-case 303:
+case 307:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</include>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</include>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_include):
 case YY_STATE_EOF(S_surfxml_include):
@@ -8274,13 +8545,13 @@ case YY_STATE_EOF(S_surfxml_include_2):
 FAIL("Premature EOF: `</include>' expected.");
        YY_BREAK
 
-case 304:
-/* rule 304 can match eol */
+case 308:
+/* rule 308 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link> is not allowed here.");
        YY_BREAK
-case 305:
-/* rule 305 can match eol */
+case 309:
+/* rule 309 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_bandwidth = 0;
@@ -8301,95 +8572,95 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 306:
-/* rule 306 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);
-       YY_BREAK
-case 307:
-/* rule 307 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);
-       YY_BREAK
-case 308:
-/* rule 308 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);
-       YY_BREAK
-case 309:
-/* rule 309 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);
-       YY_BREAK
 case 310:
 /* rule 310 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 311:
 /* rule 311 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 312:
 /* rule 312 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_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 313:
 /* rule 313 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_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 314:
 /* rule 314 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);
+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 315:
 /* rule 315 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);
+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 316:
 /* rule 316 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);
+       YY_BREAK
 case 317:
 /* rule 317 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
+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 318:
 /* rule 318 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 319:
 /* rule 319 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SPLITDUPLEX;
+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 320:
 /* rule 320 can match eol */
 case 321:
 /* rule 321 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
        YY_BREAK
 case 322:
 /* rule 322 can match eol */
 case 323:
 /* rule 323 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SPLITDUPLEX;
        YY_BREAK
 case 324:
 /* rule 324 can match eol */
+case 325:
+/* rule 325 can match eol */
+YY_RULE_SETUP
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
+       YY_BREAK
+case 326:
+/* rule 326 can match eol */
+case 327:
+/* rule 327 can match eol */
+YY_RULE_SETUP
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
+       YY_BREAK
+case 328:
+/* rule 328 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 325:
-/* rule 325 can match eol */
+case 329:
+/* rule 329 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);
        YY_BREAK
-case 326:
+case 330:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
@@ -8397,7 +8668,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 327:
+case 331:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
@@ -8405,24 +8676,25 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 328:
+case 332:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of link element.", yytext[0]);
        YY_BREAK
-case 329:
+case 333:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `link' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 330:
-/* rule 330 can match eol */
+case 334:
+/* rule 334 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8430,18 +8702,19 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 331:
-/* rule 331 can match eol */
+case 335:
+/* rule 335 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</link>' expected.",yytext);
        YY_BREAK
-case 332:
+case 336:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</link>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_link):
 case YY_STATE_EOF(S_surfxml_link):
@@ -8449,13 +8722,13 @@ case YY_STATE_EOF(S_surfxml_link_2):
 FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 333:
-/* rule 333 can match eol */
+case 337:
+/* rule 337 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link_ctn> is not allowed here.");
        YY_BREAK
-case 334:
-/* rule 334 can match eol */
+case 338:
+/* rule 338 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
@@ -8466,45 +8739,45 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 335:
-/* rule 335 can match eol */
-case 336:
-/* rule 336 can match eol */
+case 339:
+/* rule 339 can match eol */
+case 340:
+/* rule 340 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
        YY_BREAK
-case 337:
-/* rule 337 can match eol */
-case 338:
-/* rule 338 can match eol */
+case 341:
+/* rule 341 can match eol */
+case 342:
+/* rule 342 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
        YY_BREAK
-case 339:
-/* rule 339 can match eol */
-case 340:
-/* rule 340 can match eol */
+case 343:
+/* rule 343 can match eol */
+case 344:
+/* rule 344 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
        YY_BREAK
-case 341:
-/* rule 341 can match eol */
+case 345:
+/* rule 345 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 342:
-/* rule 342 can match eol */
+case 346:
+/* rule 346 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 343:
+case 347:
 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 344:
+case 348:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
@@ -8519,20 +8792,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 345:
+case 349:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of link_ctn element.", yytext[0]);
        YY_BREAK
-case 346:
+case 350:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `link_ctn' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_link___ctn):
 FAIL("EOF in attribute list of `link_ctn' element.");
        YY_BREAK
 
-case 347:
-/* rule 347 can match eol */
+case 351:
+/* rule 351 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8548,14 +8821,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 348:
-/* rule 348 can match eol */
+case 352:
+/* rule 352 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",yytext);
        YY_BREAK
-case 349:
+case 353:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</link_ctn>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_link___ctn):
 FAIL("Premature EOF: `</link_ctn>' expected.");
@@ -8563,13 +8836,13 @@ FAIL("Premature EOF: `</link_ctn>' expected.");
 
 /* <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->  */
-case 350:
-/* rule 350 can match eol */
+case 354:
+/* rule 354 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <model_prop> is not allowed here.");
        YY_BREAK
-case 351:
-/* rule 351 can match eol */
+case 355:
+/* rule 355 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_model___prop_id = 0;
@@ -8580,27 +8853,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 352:
-/* rule 352 can match eol */
+case 356:
+/* rule 356 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 353:
-/* rule 353 can match eol */
+case 357:
+/* rule 357 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");}  surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 354:
-/* rule 354 can match eol */
+case 358:
+/* rule 358 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 355:
-/* rule 355 can match eol */
+case 359:
+/* rule 359 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");}  surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 356:
+case 360:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -8608,7 +8881,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop);
  }
        YY_BREAK
-case 357:
+case 361:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -8619,20 +8892,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 358:
+case 362:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of model_prop element.", yytext[0]);
        YY_BREAK
-case 359:
+case 363:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `model_prop' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_model___prop):
 FAIL("EOF in attribute list of `model_prop' element.");
        YY_BREAK
 
-case 360:
-/* rule 360 can match eol */
+case 364:
+/* rule 364 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8643,26 +8916,26 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 361:
-/* rule 361 can match eol */
+case 365:
+/* rule 365 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",yytext);
        YY_BREAK
-case 362:
+case 366:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</model_prop>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</model_prop>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_model___prop):
 FAIL("Premature EOF: `</model_prop>' expected.");
        YY_BREAK
 
-case 363:
-/* rule 363 can match eol */
+case 367:
+/* rule 367 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <mount> is not allowed here.");
        YY_BREAK
-case 364:
-/* rule 364 can match eol */
+case 368:
+/* rule 368 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_mount_name = 0;
@@ -8673,27 +8946,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 365:
-/* rule 365 can match eol */
+case 369:
+/* rule 369 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 366:
-/* rule 366 can match eol */
+case 370:
+/* rule 370 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");}  surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 367:
-/* rule 367 can match eol */
+case 371:
+/* rule 371 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 368:
-/* rule 368 can match eol */
+case 372:
+/* rule 372 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");}  surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 369:
+case 373:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element.");
@@ -8701,7 +8974,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount);
  }
        YY_BREAK
-case 370:
+case 374:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element.");
@@ -8712,20 +8985,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 371:
+case 375:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of mount element.", yytext[0]);
        YY_BREAK
-case 372:
+case 376:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `mount' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_mount):
 FAIL("EOF in attribute list of `mount' element.");
        YY_BREAK
 
-case 373:
-/* rule 373 can match eol */
+case 377:
+/* rule 377 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8736,26 +9009,26 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 374:
-/* rule 374 can match eol */
+case 378:
+/* rule 378 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</mount>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</mount>' expected.",yytext);
        YY_BREAK
-case 375:
+case 379:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</mount>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</mount>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_mount):
 FAIL("Premature EOF: `</mount>' expected.");
        YY_BREAK
 
-case 376:
-/* rule 376 can match eol */
+case 380:
+/* rule 380 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <peer> is not allowed here.");
        YY_BREAK
-case 377:
-/* rule 377 can match eol */
+case 381:
+/* rule 381 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_peer_availability___file = 0;
@@ -8778,87 +9051,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 378:
-/* rule 378 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);
-       YY_BREAK
-case 379:
-/* rule 379 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 380:
-/* rule 380 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);
-       YY_BREAK
-case 381:
-/* rule 381 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);
-       YY_BREAK
 case 382:
 /* rule 382 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_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 383:
 /* rule 383 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_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 384:
 /* rule 384 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_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 385:
 /* rule 385 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_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 386:
 /* rule 386 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_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 387:
 /* rule 387 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_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 388:
 /* rule 388 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 389:
 /* rule 389 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 390:
 /* rule 390 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");} surfxml_peer_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_speed);
+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 391:
 /* rule 391 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");}  surfxml_peer_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_speed);
+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 392:
 /* rule 392 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);
+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 393:
 /* rule 393 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);
+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 394:
+/* rule 394 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");} surfxml_peer_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_speed);
+       YY_BREAK
+case 395:
+/* rule 395 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");}  surfxml_peer_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_speed);
+       YY_BREAK
+case 396:
+/* rule 396 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 397:
+/* rule 397 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 398:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element.");
@@ -8868,7 +9141,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer);
  }
        YY_BREAK
-case 395:
+case 399:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element.");
@@ -8884,20 +9157,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 396:
+case 400:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of peer element.", yytext[0]);
        YY_BREAK
-case 397:
+case 401:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `peer' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_peer):
 FAIL("EOF in attribute list of `peer' element.");
        YY_BREAK
 
-case 398:
-/* rule 398 can match eol */
+case 402:
+/* rule 402 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8911,85 +9184,85 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 399:
-/* rule 399 can match eol */
+case 403:
+/* rule 403 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</peer>' expected.",yytext);
        YY_BREAK
-case 400:
+case 404:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</peer>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_peer):
 FAIL("Premature EOF: `</peer>' expected.");
        YY_BREAK
 
 /* <!--
- *              DTD of SimGrid platform and deployment files.
- * More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html
- * To upgrade your files, use the tool simgrid_update_xml
- * * Things that will change in upcoming version 5 (TODO):
- *   - The following tags will be removed:
- *     - <include> spits an error since v3.18
- *     - <random> does nothing since a very long time
- *     - <as>, <asroute>, <bypassZoneRoute> and <process>, deprecated in DTD4.1
- *   - FULLDUPLEX sharing will be removed, deprecated in DTD4.2 (v3.19)
- * * New in DTD version 4.2 (in SimGrid 3.19): backward compatible change (v4 files are valid v4.2 files)
- *    - SPLITDUPLEX is the new spelling of the deprecated FULLDUPLEX
- * * New in DTD version 4.1 (in SimGrid 3.16): backward compatible change (v4 files are valid v4.1 files)
- *    - <zone> can be used as a synonym for the now deprecated <as>
- *    - <zoneRoute> can be used as a synonym for the now deprecated <asroute>
- *    - <bypassZoneRoute> an be used as a synonym for the now deprecated <bypassAsRoute>
- *    - <actor> can be used as a synonym for the now deprecated <process>
- * * New in DTD version 4 (in SimGrid 3.13):
- *    - Rename (power->speed) the attributes describing the amount of flop
- *      that a <host>, <peer>, <cluster> or <cabinet> can deliver per second.
- *    - In <trace_connect>, attribute kind="POWER" is now kind="SPEED".
- *    - In <host> and <link>, attributes availability and state are gone.
- *      It was redundent with state and availability traces, and with peak values.
- *    - In <cluster>, cannot set the availability nor state traces.
- *      This was too complex and unused.
- *    - The DOCTYPE points to the right URL (this file):
- *      http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd
- *    - Kill <gpu>. Was not doing anything.
- *    - A warning is emitted for unit-less values (they are still accepted).
- *      - speed. Default: 'f' or 'flops'. Also defined:
- *         'Yf',         'Zf',         'Ef',       'Pf',        'Tf',        'Gf',        'Mf',        'kf'
- *         'yottaflops', 'zettaflops', 'exaflops', 'petaflops', 'teraflops', 'gigaflops', 'megaflops', 'kiloflops'
- *      - bandwidth. Default: 'Bps' bytes per second
- *        In bytes and powers of 2  (1 KiBps = 1024 Bps): 'EiBps', 'PiBps', 'TiBps', 'GiBps', 'MiBps', 'KiBps'
- *        In bits  and powers of 2  (1 Bps = 8 bps)     : 'Eibps', 'Pibps', 'Tibps', 'Gibps', 'Mibps', 'Kibps'
- *        In bytes and powers of 10 (1 KBps = 1000 Bps) : 'EBps', 'PBps', 'TBps', 'GBps', 'MBps', 'kBps', 'Bps'
- *        In bits  and powers of 10                     : 'Ebps', 'Pbps', 'Tbps', 'Gbps', 'Mbps', 'kbps', 'bps'
- *        (Exa and Peta notations were introduced in SimGrid v3.14)
- *      - latency. Default: 's' second. Also defined:
- *        'w' week, 'd' day, 'h' hour, 'm' minute, 'ms' millisecond, 'us' microsecond, 'ns' nanosecond, 'ps' picosecond
- * * New in DTD version 3 (in SimGrid 3.5):
- *    - The AS tag were introduced. Every platform should now
- *      contain an englobing AS tag.
- *    - Routes are now symmetric by default.
- *    - Renamed tags (for sake of XML sanity):
- *      - LINK:CTN -> LINK_CTN
- *      - TRACE:CONNECT -> TRACE_CONNECT
- * * New in DTD version 2 (in SimGrid 3.4):
- *    - Renamed tags:
- *      - CPU -> HOST
- *      - NETWORK_LINK -> LINK
- *      - ROUTE_ELEMENT ->  LINK:CTN (changed again in v3)
- *      - PLATFORM_DESCRIPTION -> PLATFORM
- * * New in DTD version 1 (in SimGrid 3.3):
- *    - DTD is now versionned with the version attribute of platform
- *    - Unit change:
- *      - Link bandwidth: from Mb/s to b/s
- *      - CPU speed: from MFlop/s to Flop/s
- * -->  */
-case 401:
-/* rule 401 can match eol */
 *              DTD of SimGrid platform and deployment files.
 * More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html
 * To upgrade your files, use the tool simgrid_update_xml
 * * Things that will change in upcoming version 5 (TODO):
 *   - The following tags will be removed:
 *     - <include> spits an error since v3.18
 *     - <random> does nothing since a very long time
 *     - <as>, <asroute>, <bypassZoneRoute> and <process>, deprecated in DTD4.1
 *   - FULLDUPLEX sharing will be removed, deprecated in DTD4.2 (v3.19)
 * * New in DTD version 4.2 (in SimGrid 3.19): backward compatible change (v4 files are valid v4.2 files)
 *    - SPLITDUPLEX is the new spelling of the deprecated FULLDUPLEX
 * * New in DTD version 4.1 (in SimGrid 3.16): backward compatible change (v4 files are valid v4.1 files)
 *    - <zone> can be used as a synonym for the now deprecated <as>
 *    - <zoneRoute> can be used as a synonym for the now deprecated <asroute>
 *    - <bypassZoneRoute> an be used as a synonym for the now deprecated <bypassAsRoute>
 *    - <actor> can be used as a synonym for the now deprecated <process>
 * * New in DTD version 4 (in SimGrid 3.13):
 *    - Rename (power->speed) the attributes describing the amount of flop
 *      that a <host>, <peer>, <cluster> or <cabinet> can deliver per second.
 *    - In <trace_connect>, attribute kind="POWER" is now kind="SPEED".
 *    - In <host> and <link>, attributes availability and state are gone.
 *      It was redundent with state and availability traces, and with peak values.
 *    - In <cluster>, cannot set the availability nor state traces.
 *      This was too complex and unused.
 *    - The DOCTYPE points to the right URL (this file):
 *      http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd
 *    - Kill <gpu>. Was not doing anything.
 *    - A warning is emitted for unit-less values (they are still accepted).
 *      - speed. Default: 'f' or 'flops'. Also defined:
 *         'Yf',         'Zf',         'Ef',       'Pf',        'Tf',        'Gf',        'Mf',        'kf'
 *         'yottaflops', 'zettaflops', 'exaflops', 'petaflops', 'teraflops', 'gigaflops', 'megaflops', 'kiloflops'
 *      - bandwidth. Default: 'Bps' bytes per second
 *        In bytes and powers of 2  (1 KiBps = 1024 Bps): 'EiBps', 'PiBps', 'TiBps', 'GiBps', 'MiBps', 'KiBps'
 *        In bits  and powers of 2  (1 Bps = 8 bps)     : 'Eibps', 'Pibps', 'Tibps', 'Gibps', 'Mibps', 'Kibps'
 *        In bytes and powers of 10 (1 KBps = 1000 Bps) : 'EBps', 'PBps', 'TBps', 'GBps', 'MBps', 'kBps', 'Bps'
 *        In bits  and powers of 10                     : 'Ebps', 'Pbps', 'Tbps', 'Gbps', 'Mbps', 'kbps', 'bps'
 *        (Exa and Peta notations were introduced in SimGrid v3.14)
 *      - latency. Default: 's' second. Also defined:
 *        'w' week, 'd' day, 'h' hour, 'm' minute, 'ms' millisecond, 'us' microsecond, 'ns' nanosecond, 'ps' picosecond
 * * New in DTD version 3 (in SimGrid 3.5):
 *    - The AS tag were introduced. Every platform should now
 *      contain an englobing AS tag.
 *    - Routes are now symmetric by default.
 *    - Renamed tags (for sake of XML sanity):
 *      - LINK:CTN -> LINK_CTN
 *      - TRACE:CONNECT -> TRACE_CONNECT
 * * New in DTD version 2 (in SimGrid 3.4):
 *    - Renamed tags:
 *      - CPU -> HOST
 *      - NETWORK_LINK -> LINK
 *      - ROUTE_ELEMENT ->  LINK:CTN (changed again in v3)
 *      - PLATFORM_DESCRIPTION -> PLATFORM
 * * New in DTD version 1 (in SimGrid 3.3):
 *    - DTD is now versionned with the version attribute of platform
 *    - Unit change:
 *      - Link bandwidth: from Mb/s to b/s
 *      - CPU speed: from MFlop/s to Flop/s
 * -->  */
+case 405:
+/* rule 405 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <platform> is not allowed here.");
        YY_BREAK
-case 402:
-/* rule 402 can match eol */
+case 406:
+/* rule 406 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_platform_version = 1;
@@ -8998,23 +9271,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 403:
-/* rule 403 can match eol */
+case 407:
+/* rule 407 can match eol */
 YY_RULE_SETUP
 if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in <surfxml_platform>");} surfxml_platform_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version);
        YY_BREAK
-case 404:
-/* rule 404 can match eol */
+case 408:
+/* rule 408 can match eol */
 YY_RULE_SETUP
 if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in <surfxml_platform>");}  surfxml_platform_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version);
        YY_BREAK
-case 405:
+case 409:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform);
  }
        YY_BREAK
-case 406:
+case 410:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */
@@ -9023,20 +9296,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 407:
+case 411:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of platform element.", yytext[0]);
        YY_BREAK
-case 408:
+case 412:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `platform' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_platform):
 FAIL("EOF in attribute list of `platform' element.");
        YY_BREAK
 
-case 409:
-/* rule 409 can match eol */
+case 413:
+/* rule 413 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9047,14 +9320,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 410:
-/* rule 410 can match eol */
+case 414:
+/* rule 414 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</platform>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</platform>' expected.",yytext);
        YY_BREAK
-case 411:
+case 415:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</platform>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</platform>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_platform):
 case YY_STATE_EOF(S_surfxml_platform):
@@ -9066,13 +9339,13 @@ case YY_STATE_EOF(S_surfxml_platform_8):
 FAIL("Premature EOF: `</platform>' expected.");
        YY_BREAK
 
-case 412:
-/* rule 412 can match eol */
+case 416:
+/* rule 416 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <process> is not allowed here.");
        YY_BREAK
-case 413:
-/* rule 413 can match eol */
+case 417:
+/* rule 417 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_function = 0;
@@ -9089,61 +9362,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 414:
-/* rule 414 can match eol */
+case 418:
+/* rule 418 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);
        YY_BREAK
-case 415:
-/* rule 415 can match eol */
+case 419:
+/* rule 419 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);
        YY_BREAK
-case 416:
-/* rule 416 can match eol */
+case 420:
+/* rule 420 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 417:
-/* rule 417 can match eol */
+case 421:
+/* rule 421 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 418:
-/* rule 418 can match eol */
+case 422:
+/* rule 422 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 419:
-/* rule 419 can match eol */
+case 423:
+/* rule 423 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);
        YY_BREAK
-case 420:
-/* rule 420 can match eol */
-case 421:
-/* rule 421 can match eol */
+case 424:
+/* rule 424 can match eol */
+case 425:
+/* rule 425 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
        YY_BREAK
-case 422:
-/* rule 422 can match eol */
-case 423:
-/* rule 423 can match eol */
+case 426:
+/* rule 426 can match eol */
+case 427:
+/* rule 427 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
        YY_BREAK
-case 424:
-/* rule 424 can match eol */
+case 428:
+/* rule 428 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);
        YY_BREAK
-case 425:
-/* rule 425 can match eol */
+case 429:
+/* rule 429 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);
        YY_BREAK
-case 426:
+case 430:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element.");
@@ -9151,7 +9424,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 427:
+case 431:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element.");
@@ -9162,20 +9435,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 428:
+case 432:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of process element.", yytext[0]);
        YY_BREAK
-case 429:
+case 433:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `process' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 430:
-/* rule 430 can match eol */
+case 434:
+/* rule 434 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9186,14 +9459,14 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 431:
-/* rule 431 can match eol */
+case 435:
+/* rule 435 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</process>' expected.",yytext);
        YY_BREAK
-case 432:
+case 436:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</process>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_process):
 case YY_STATE_EOF(S_surfxml_process):
@@ -9203,13 +9476,13 @@ FAIL("Premature EOF: `</process>' expected.");
 
 /* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST prop key CDATA #REQUIRED> -->  */
-case 433:
-/* rule 433 can match eol */
+case 437:
+/* rule 437 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <prop> is not allowed here.");
        YY_BREAK
-case 434:
-/* rule 434 can match eol */
+case 438:
+/* rule 438 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_prop_id = 0;
@@ -9220,27 +9493,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 435:
-/* rule 435 can match eol */
+case 439:
+/* rule 439 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 436:
-/* rule 436 can match eol */
+case 440:
+/* rule 440 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 437:
-/* rule 437 can match eol */
+case 441:
+/* rule 441 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 438:
-/* rule 438 can match eol */
+case 442:
+/* rule 442 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 439:
+case 443:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9248,7 +9521,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 440:
+case 444:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9268,20 +9541,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 441:
+case 445:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of prop element.", yytext[0]);
        YY_BREAK
-case 442:
+case 446:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `prop' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 443:
-/* rule 443 can match eol */
+case 447:
+/* rule 447 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9301,26 +9574,26 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 444:
-/* rule 444 can match eol */
+case 448:
+/* rule 448 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</prop>' expected.",yytext);
        YY_BREAK
-case 445:
+case 449:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</prop>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_prop):
 FAIL("Premature EOF: `</prop>' expected.");
        YY_BREAK
 
-case 446:
-/* rule 446 can match eol */
+case 450:
+/* rule 450 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <random> is not allowed here.");
        YY_BREAK
-case 447:
-/* rule 447 can match eol */
+case 451:
+/* rule 451 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
@@ -9343,105 +9616,105 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 448:
-/* rule 448 can match eol */
-case 449:
-/* rule 449 can match eol */
-YY_RULE_SETUP
-A_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
-       YY_BREAK
-case 450:
-/* rule 450 can match eol */
-case 451:
-/* rule 451 can match eol */
-YY_RULE_SETUP
-A_surfxml_random_generator = A_surfxml_random_generator_RAND;
-       YY_BREAK
 case 452:
 /* rule 452 can match eol */
 case 453:
 /* rule 453 can match eol */
 YY_RULE_SETUP
-A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM;
+A_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
        YY_BREAK
 case 454:
 /* rule 454 can match eol */
 case 455:
 /* rule 455 can match eol */
 YY_RULE_SETUP
-A_surfxml_random_generator = A_surfxml_random_generator_NONE;
+A_surfxml_random_generator = A_surfxml_random_generator_RAND;
        YY_BREAK
 case 456:
 /* rule 456 can match eol */
-YY_RULE_SETUP
-if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");} surfxml_random_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id);
-       YY_BREAK
 case 457:
 /* rule 457 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");}  surfxml_random_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id);
+A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM;
        YY_BREAK
 case 458:
 /* rule 458 can match eol */
-YY_RULE_SETUP
-if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");} surfxml_random_max_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max);
-       YY_BREAK
 case 459:
 /* rule 459 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");}  surfxml_random_max_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max);
+A_surfxml_random_generator = A_surfxml_random_generator_NONE;
        YY_BREAK
 case 460:
 /* rule 460 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");} surfxml_random_mean_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean);
+if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");} surfxml_random_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id);
        YY_BREAK
 case 461:
 /* rule 461 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");}  surfxml_random_mean_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean);
+if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");}  surfxml_random_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id);
        YY_BREAK
 case 462:
 /* rule 462 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");} surfxml_random_min_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min);
+if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");} surfxml_random_max_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
 case 463:
 /* rule 463 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");}  surfxml_random_min_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min);
+if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");}  surfxml_random_max_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
 case 464:
 /* rule 464 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");} surfxml_random_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical);
+if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");} surfxml_random_mean_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
 case 465:
 /* rule 465 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");}  surfxml_random_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical);
+if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");}  surfxml_random_mean_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
 case 466:
 /* rule 466 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");} surfxml_random_seed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed);
+if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");} surfxml_random_min_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
 case 467:
 /* rule 467 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");}  surfxml_random_seed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed);
+if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");}  surfxml_random_min_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
 case 468:
 /* rule 468 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std___deviation);
+if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");} surfxml_random_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical);
        YY_BREAK
 case 469:
 /* rule 469 can match eol */
 YY_RULE_SETUP
-if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");}  surfxml_random_std___deviation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std___deviation);
+if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");}  surfxml_random_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical);
        YY_BREAK
 case 470:
+/* rule 470 can match eol */
+YY_RULE_SETUP
+if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");} surfxml_random_seed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed);
+       YY_BREAK
+case 471:
+/* rule 471 can match eol */
+YY_RULE_SETUP
+if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");}  surfxml_random_seed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed);
+       YY_BREAK
+case 472:
+/* rule 472 can match eol */
+YY_RULE_SETUP
+if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std___deviation);
+       YY_BREAK
+case 473:
+/* rule 473 can match eol */
+YY_RULE_SETUP
+if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");}  surfxml_random_std___deviation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std___deviation);
+       YY_BREAK
+case 474:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
@@ -9452,7 +9725,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(E_surfxml_random);
  }
        YY_BREAK
-case 471:
+case 475:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
@@ -9466,20 +9739,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 472:
+case 476:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of random element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of random element.", yytext[0]);
        YY_BREAK
-case 473:
+case 477:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `random' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_random):
 FAIL("EOF in attribute list of `random' element.");
        YY_BREAK
 
-case 474:
-/* rule 474 can match eol */
+case 478:
+/* rule 478 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9490,26 +9763,26 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 475:
-/* rule 475 can match eol */
+case 479:
+/* rule 479 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</random>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</random>' expected.",yytext);
        YY_BREAK
-case 476:
+case 480:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</random>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</random>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_random):
 FAIL("Premature EOF: `</random>' expected.");
        YY_BREAK
 
-case 477:
-/* rule 477 can match eol */
+case 481:
+/* rule 481 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <route> is not allowed here.");
        YY_BREAK
-case 478:
-/* rule 478 can match eol */
+case 482:
+/* rule 482 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_dst = 0;
@@ -9522,41 +9795,55 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 479:
-/* rule 479 can match eol */
+case 483:
+/* rule 483 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 480:
-/* rule 480 can match eol */
+case 484:
+/* rule 484 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);
        YY_BREAK
-case 481:
-/* rule 481 can match eol */
+case 485:
+/* rule 485 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 482:
-/* rule 482 can match eol */
+case 486:
+/* rule 486 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 483:
-/* rule 483 can match eol */
-case 484:
-/* rule 484 can match eol */
+case 487:
+/* rule 487 can match eol */
+case 488:
+/* rule 488 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
        YY_BREAK
-case 485:
-/* rule 485 can match eol */
-case 486:
-/* rule 486 can match eol */
+case 489:
+/* rule 489 can match eol */
+case 490:
+/* rule 490 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
        YY_BREAK
-case 487:
+case 491:
+/* rule 491 can match eol */
+case 492:
+/* rule 492 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_yes;
+       YY_BREAK
+case 493:
+/* rule 493 can match eol */
+case 494:
+/* rule 494 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_no;
+       YY_BREAK
+case 495:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
@@ -9564,7 +9851,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 488:
+case 496:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
@@ -9572,24 +9859,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route(); surfxml_pcdata_ix = 0; ETag_surfxml_route(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
   }
  }
        YY_BREAK
-case 489:
+case 497:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of route element.", yytext[0]);
        YY_BREAK
-case 490:
+case 498:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `route' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 491:
-/* rule 491 can match eol */
+case 499:
+/* rule 499 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9597,18 +9884,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
   }
  }
        YY_BREAK
-case 492:
-/* rule 492 can match eol */
+case 500:
+/* rule 500 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</route>' expected.",yytext);
        YY_BREAK
-case 493:
+case 501:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</route>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_route):
 case YY_STATE_EOF(S_surfxml_route):
@@ -9616,13 +9903,13 @@ case YY_STATE_EOF(S_surfxml_route_2):
 FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 494:
-/* rule 494 can match eol */
+case 502:
+/* rule 502 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <router> is not allowed here.");
        YY_BREAK
-case 495:
-/* rule 495 can match eol */
+case 503:
+/* rule 503 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_coordinates = 0;
@@ -9633,58 +9920,58 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 496:
-/* rule 496 can match eol */
+case 504:
+/* rule 504 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 497:
-/* rule 497 can match eol */
+case 505:
+/* rule 505 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 498:
-/* rule 498 can match eol */
+case 506:
+/* rule 506 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 499:
-/* rule 499 can match eol */
+case 507:
+/* rule 507 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 500:
+case 508:
 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 501:
+case 509:
 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; ETag_surfxml_router(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 502:
+case 510:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of router element.", yytext[0]);
        YY_BREAK
-case 503:
+case 511:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `router' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 504:
-/* rule 504 can match eol */
+case 512:
+/* rule 512 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9692,30 +9979,30 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 505:
-/* rule 505 can match eol */
+case 513:
+/* rule 513 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</router>' expected.",yytext);
        YY_BREAK
-case 506:
+case 514:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</router>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_router):
 FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 507:
-/* rule 507 can match eol */
+case 515:
+/* rule 515 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage> is not allowed here.");
        YY_BREAK
-case 508:
-/* rule 508 can match eol */
+case 516:
+/* rule 516 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage_attach = 0;
@@ -9730,47 +10017,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 509:
-/* rule 509 can match eol */
+case 517:
+/* rule 517 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");} surfxml_storage_attach_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_attach);
        YY_BREAK
-case 510:
-/* rule 510 can match eol */
+case 518:
+/* rule 518 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");}  surfxml_storage_attach_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_attach);
        YY_BREAK
-case 511:
-/* rule 511 can match eol */
+case 519:
+/* rule 519 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
-case 512:
-/* rule 512 can match eol */
+case 520:
+/* rule 520 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
-case 513:
-/* rule 513 can match eol */
+case 521:
+/* rule 521 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
-case 514:
-/* rule 514 can match eol */
+case 522:
+/* rule 522 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
-case 515:
-/* rule 515 can match eol */
+case 523:
+/* rule 523 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
-case 516:
-/* rule 516 can match eol */
+case 524:
+/* rule 524 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
-case 517:
+case 525:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
@@ -9779,7 +10066,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
  }
        YY_BREAK
-case 518:
+case 526:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
@@ -9788,24 +10075,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 519:
+case 527:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of storage element.", yytext[0]);
        YY_BREAK
-case 520:
+case 528:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `storage' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_storage):
 FAIL("EOF in attribute list of `storage' element.");
        YY_BREAK
 
-case 521:
-/* rule 521 can match eol */
+case 529:
+/* rule 529 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9813,18 +10100,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 522:
-/* rule 522 can match eol */
+case 530:
+/* rule 530 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</storage>' expected.",yytext);
        YY_BREAK
-case 523:
+case 531:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</storage>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_storage):
 case YY_STATE_EOF(S_surfxml_storage):
@@ -9832,13 +10119,13 @@ case YY_STATE_EOF(S_surfxml_storage_2):
 FAIL("Premature EOF: `</storage>' expected.");
        YY_BREAK
 
-case 524:
-/* rule 524 can match eol */
+case 532:
+/* rule 532 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage_type> is not allowed here.");
        YY_BREAK
-case 525:
-/* rule 525 can match eol */
+case 533:
+/* rule 533 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage___type_content = 0;
@@ -9853,47 +10140,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 526:
-/* rule 526 can match eol */
+case 534:
+/* rule 534 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
-case 527:
-/* rule 527 can match eol */
+case 535:
+/* rule 535 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");}  surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
-case 528:
-/* rule 528 can match eol */
+case 536:
+/* rule 536 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
-case 529:
-/* rule 529 can match eol */
+case 537:
+/* rule 537 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");}  surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
-case 530:
-/* rule 530 can match eol */
+case 538:
+/* rule 538 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
        YY_BREAK
-case 531:
-/* rule 531 can match eol */
+case 539:
+/* rule 539 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");}  surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
        YY_BREAK
-case 532:
-/* rule 532 can match eol */
+case 540:
+/* rule 540 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
-case 533:
-/* rule 533 can match eol */
+case 541:
+/* rule 541 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");}  surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
-case 534:
+case 542:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -9901,7 +10188,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type);
  }
        YY_BREAK
-case 535:
+case 543:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -9909,24 +10196,24 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage___type(); surfxml_pcdata_ix = 0; ETag_surfxml_storage___type(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 536:
+case 544:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of storage_type element.", yytext[0]);
        YY_BREAK
-case 537:
+case 545:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `storage_type' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_storage___type):
 FAIL("EOF in attribute list of `storage_type' element.");
        YY_BREAK
 
-case 538:
-/* rule 538 can match eol */
+case 546:
+/* rule 546 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9934,18 +10221,18 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_13: case S_surfxml_zone_14: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_14); break;
   }
  }
        YY_BREAK
-case 539:
-/* rule 539 can match eol */
+case 547:
+/* rule 547 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</storage_type>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</storage_type>' expected.",yytext);
        YY_BREAK
-case 540:
+case 548:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</storage_type>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</storage_type>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_storage___type):
 case YY_STATE_EOF(S_surfxml_storage___type):
@@ -9953,13 +10240,13 @@ case YY_STATE_EOF(S_surfxml_storage___type_2):
 FAIL("Premature EOF: `</storage_type>' expected.");
        YY_BREAK
 
-case 541:
-/* rule 541 can match eol */
+case 549:
+/* rule 549 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <trace> is not allowed here.");
        YY_BREAK
-case 542:
-/* rule 542 can match eol */
+case 550:
+/* rule 550 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_trace_file = 0;
@@ -9972,37 +10259,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 543:
-/* rule 543 can match eol */
+case 551:
+/* rule 551 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_trace>");} surfxml_trace_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
-case 544:
-/* rule 544 can match eol */
+case 552:
+/* rule 552 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_trace>");}  surfxml_trace_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
-case 545:
-/* rule 545 can match eol */
+case 553:
+/* rule 553 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_trace>");} surfxml_trace_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id);
        YY_BREAK
-case 546:
-/* rule 546 can match eol */
+case 554:
+/* rule 554 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_trace>");}  surfxml_trace_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id);
        YY_BREAK
-case 547:
-/* rule 547 can match eol */
+case 555:
+/* rule 555 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in <surfxml_trace>");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
-case 548:
-/* rule 548 can match eol */
+case 556:
+/* rule 556 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in <surfxml_trace>");}  surfxml_trace_periodicity_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
-case 549:
+case 557:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
@@ -10010,7 +10297,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace);
  }
        YY_BREAK
-case 550:
+case 558:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
@@ -10020,24 +10307,28 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone_10: case S_surfxml_zone_11: case S_surfxml_zone_6: case S_surfxml_zone_7: SET(S_surfxml_zone_11); break;
+   case S_surfxml_zone_13: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
+   case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_4: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 551:
+case 559:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of trace element.", yytext[0]);
        YY_BREAK
-case 552:
+case 560:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `trace' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_trace):
 FAIL("EOF in attribute list of `trace' element.");
        YY_BREAK
 
-case 553:
-/* rule 553 can match eol */
+case 561:
+/* rule 561 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -10049,26 +10340,30 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone_10: case S_surfxml_zone_11: case S_surfxml_zone_6: case S_surfxml_zone_7: SET(S_surfxml_zone_11); break;
+   case S_surfxml_zone_13: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
+   case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_4: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 554:
-/* rule 554 can match eol */
+case 562:
+/* rule 562 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</trace>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</trace>' expected.",yytext);
        YY_BREAK
 case YY_STATE_EOF(IN_trace):
 FAIL("Premature EOF: `</trace>' expected.");
        YY_BREAK
 
-case 555:
-/* rule 555 can match eol */
+case 563:
+/* rule 563 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <trace_connect> is not allowed here.");
        YY_BREAK
-case 556:
-/* rule 556 can match eol */
+case 564:
+/* rule 564 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_trace___connect_element = 0;
@@ -10081,62 +10376,62 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 557:
-/* rule 557 can match eol */
+case 565:
+/* rule 565 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in <surfxml_trace___connect>");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_element);
        YY_BREAK
-case 558:
-/* rule 558 can match eol */
+case 566:
+/* rule 566 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in <surfxml_trace___connect>");}  surfxml_trace___connect_element_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_element);
        YY_BREAK
-case 559:
-/* rule 559 can match eol */
-case 560:
-/* rule 560 can match eol */
+case 567:
+/* rule 567 can match eol */
+case 568:
+/* rule 568 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_HOST___AVAIL;
        YY_BREAK
-case 561:
-/* rule 561 can match eol */
-case 562:
-/* rule 562 can match eol */
+case 569:
+/* rule 569 can match eol */
+case 570:
+/* rule 570 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_SPEED;
        YY_BREAK
-case 563:
-/* rule 563 can match eol */
-case 564:
-/* rule 564 can match eol */
+case 571:
+/* rule 571 can match eol */
+case 572:
+/* rule 572 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LINK___AVAIL;
        YY_BREAK
-case 565:
-/* rule 565 can match eol */
-case 566:
-/* rule 566 can match eol */
+case 573:
+/* rule 573 can match eol */
+case 574:
+/* rule 574 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_BANDWIDTH;
        YY_BREAK
-case 567:
-/* rule 567 can match eol */
-case 568:
-/* rule 568 can match eol */
+case 575:
+/* rule 575 can match eol */
+case 576:
+/* rule 576 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LATENCY;
        YY_BREAK
-case 569:
-/* rule 569 can match eol */
+case 577:
+/* rule 577 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in <surfxml_trace___connect>");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_trace);
        YY_BREAK
-case 570:
-/* rule 570 can match eol */
+case 578:
+/* rule 578 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in <surfxml_trace___connect>");}  surfxml_trace___connect_trace_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_trace);
        YY_BREAK
-case 571:
+case 579:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element.");
@@ -10144,7 +10439,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_trace___connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace___connect);
  }
        YY_BREAK
-case 572:
+case 580:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element.");
@@ -10154,24 +10449,28 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone_10: case S_surfxml_zone_11: case S_surfxml_zone_6: case S_surfxml_zone_7: SET(S_surfxml_zone_11); break;
+   case S_surfxml_zone_13: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
+   case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_4: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 573:
+case 581:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of trace_connect element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of trace_connect element.", yytext[0]);
        YY_BREAK
-case 574:
+case 582:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `trace_connect' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `trace_connect' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_trace___connect):
 FAIL("EOF in attribute list of `trace_connect' element.");
        YY_BREAK
 
-case 575:
-/* rule 575 can match eol */
+case 583:
+/* rule 583 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -10181,30 +10480,41 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
-   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+   case S_surfxml_zone_10: case S_surfxml_zone_11: case S_surfxml_zone_6: case S_surfxml_zone_7: SET(S_surfxml_zone_11); break;
+   case S_surfxml_zone_13: SET(S_surfxml_zone_14); break;
+   case S_surfxml_zone: case S_surfxml_zone_12: case S_surfxml_zone_14: case S_surfxml_zone_15: case S_surfxml_zone_16: case S_surfxml_zone_1: case S_surfxml_zone_3: SET(S_surfxml_zone_16); break;
+   case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_4: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 576:
-/* rule 576 can match eol */
+case 584:
+/* rule 584 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</trace_connect>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</trace_connect>' expected.",yytext);
        YY_BREAK
-case 577:
+case 585:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</trace_connect>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</trace_connect>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_trace___connect):
 FAIL("Premature EOF: `</trace_connect>' expected.");
        YY_BREAK
 
-case 578:
-/* rule 578 can match eol */
+/* <!-- A zone is either an internal node that contains other zones, 
+  *      or a  leaf containing hosts and other leaf-like elements -->
+  *           (((AS|zone|include|link|backbone|cabinet|cluster|peer|trace|trace_connect)*,
+  *             (zoneRoute|ASroute|trace|trace_connect|bypassASroute)*,
+  *        (trace|trace_connect)*)
+  *       |((include|storage_type|storage|host|cabinet|router|link|backbone|trace|trace_connect|host_link)*,
+  *         (route|trace|trace_connect|bypassRoute)*)))>  */
+case 586:
+/* rule 586 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <zone> is not allowed here.");
        YY_BREAK
-case 579:
-/* rule 579 can match eol */
+case 587:
+/* rule 587 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_zone_id = 0;
@@ -10215,87 +10525,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 580:
-/* rule 580 can match eol */
+case 588:
+/* rule 588 can match eol */
 YY_RULE_SETUP
 if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_zone>");} surfxml_zone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zone_id);
        YY_BREAK
-case 581:
-/* rule 581 can match eol */
-YY_RULE_SETUP
-if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_zone>");}  surfxml_zone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zone_id);
-       YY_BREAK
-case 582:
-/* rule 582 can match eol */
-case 583:
-/* rule 583 can match eol */
-YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_Full;
-       YY_BREAK
-case 584:
-/* rule 584 can match eol */
-case 585:
-/* rule 585 can match eol */
-YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_Floyd;
-       YY_BREAK
-case 586:
-/* rule 586 can match eol */
-case 587:
-/* rule 587 can match eol */
-YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_Dijkstra;
-       YY_BREAK
-case 588:
-/* rule 588 can match eol */
 case 589:
 /* rule 589 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_DijkstraCache;
+if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_zone>");}  surfxml_zone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zone_id);
        YY_BREAK
 case 590:
 /* rule 590 can match eol */
 case 591:
 /* rule 591 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_None;
+A_surfxml_zone_routing = A_surfxml_zone_routing_Full;
        YY_BREAK
 case 592:
 /* rule 592 can match eol */
 case 593:
 /* rule 593 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_Vivaldi;
+A_surfxml_zone_routing = A_surfxml_zone_routing_Floyd;
        YY_BREAK
 case 594:
 /* rule 594 can match eol */
 case 595:
 /* rule 595 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_Cluster;
+A_surfxml_zone_routing = A_surfxml_zone_routing_Dijkstra;
        YY_BREAK
 case 596:
 /* rule 596 can match eol */
 case 597:
 /* rule 597 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterTorus;
+A_surfxml_zone_routing = A_surfxml_zone_routing_DijkstraCache;
        YY_BREAK
 case 598:
 /* rule 598 can match eol */
 case 599:
 /* rule 599 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterFatTree;
+A_surfxml_zone_routing = A_surfxml_zone_routing_None;
        YY_BREAK
 case 600:
 /* rule 600 can match eol */
 case 601:
 /* rule 601 can match eol */
 YY_RULE_SETUP
-A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterDragonfly;
+A_surfxml_zone_routing = A_surfxml_zone_routing_Vivaldi;
        YY_BREAK
 case 602:
+/* rule 602 can match eol */
+case 603:
+/* rule 603 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Cluster;
+       YY_BREAK
+case 604:
+/* rule 604 can match eol */
+case 605:
+/* rule 605 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterTorus;
+       YY_BREAK
+case 606:
+/* rule 606 can match eol */
+case 607:
+/* rule 607 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterFatTree;
+       YY_BREAK
+case 608:
+/* rule 608 can match eol */
+case 609:
+/* rule 609 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterDragonfly;
+       YY_BREAK
+case 610:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element.");
@@ -10303,7 +10613,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_zone();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zone);
  }
        YY_BREAK
-case 603:
+case 611:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element.");
@@ -10317,20 +10627,20 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 604:
+case 612:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of zone element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of zone element.", yytext[0]);
        YY_BREAK
-case 605:
+case 613:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `zone' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `zone' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_zone):
 FAIL("EOF in attribute list of `zone' element.");
        YY_BREAK
 
-case 606:
-/* rule 606 can match eol */
+case 614:
+/* rule 614 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -10344,32 +10654,37 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 607:
-/* rule 607 can match eol */
+case 615:
+/* rule 615 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</zone>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</zone>' expected.",yytext);
        YY_BREAK
-case 608:
+case 616:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</zone>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</zone>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_zone):
 case YY_STATE_EOF(S_surfxml_zone):
 case YY_STATE_EOF(S_surfxml_zone_1):
+case YY_STATE_EOF(S_surfxml_zone_11):
+case YY_STATE_EOF(S_surfxml_zone_12):
+case YY_STATE_EOF(S_surfxml_zone_14):
+case YY_STATE_EOF(S_surfxml_zone_16):
 case YY_STATE_EOF(S_surfxml_zone_3):
 case YY_STATE_EOF(S_surfxml_zone_4):
 case YY_STATE_EOF(S_surfxml_zone_6):
-case YY_STATE_EOF(S_surfxml_zone_8):
+case YY_STATE_EOF(S_surfxml_zone_7):
+case YY_STATE_EOF(S_surfxml_zone_9):
 FAIL("Premature EOF: `</zone>' expected.");
        YY_BREAK
 
-case 609:
-/* rule 609 can match eol */
+case 617:
+/* rule 617 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <zoneRoute> is not allowed here.");
        YY_BREAK
-case 610:
-/* rule 610 can match eol */
+case 618:
+/* rule 618 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_zoneRoute_dst = 0;
@@ -10386,61 +10701,75 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 611:
-/* rule 611 can match eol */
+case 619:
+/* rule 619 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_zoneRoute>");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_dst);
        YY_BREAK
-case 612:
-/* rule 612 can match eol */
+case 620:
+/* rule 620 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_zoneRoute>");}  surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_dst);
        YY_BREAK
-case 613:
-/* rule 613 can match eol */
+case 621:
+/* rule 621 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_zoneRoute>");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___dst);
        YY_BREAK
-case 614:
-/* rule 614 can match eol */
+case 622:
+/* rule 622 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_zoneRoute>");}  surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___dst);
        YY_BREAK
-case 615:
-/* rule 615 can match eol */
+case 623:
+/* rule 623 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_zoneRoute>");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___src);
        YY_BREAK
-case 616:
-/* rule 616 can match eol */
+case 624:
+/* rule 624 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_zoneRoute>");}  surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___src);
        YY_BREAK
-case 617:
-/* rule 617 can match eol */
+case 625:
+/* rule 625 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_zoneRoute>");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_src);
        YY_BREAK
-case 618:
-/* rule 618 can match eol */
+case 626:
+/* rule 626 can match eol */
 YY_RULE_SETUP
 if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_zoneRoute>");}  surfxml_zoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_src);
        YY_BREAK
-case 619:
-/* rule 619 can match eol */
-case 620:
-/* rule 620 can match eol */
+case 627:
+/* rule 627 can match eol */
+case 628:
+/* rule 628 can match eol */
 YY_RULE_SETUP
 A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES;
        YY_BREAK
-case 621:
-/* rule 621 can match eol */
-case 622:
-/* rule 622 can match eol */
+case 629:
+/* rule 629 can match eol */
+case 630:
+/* rule 630 can match eol */
 YY_RULE_SETUP
 A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_NO;
        YY_BREAK
-case 623:
+case 631:
+/* rule 631 can match eol */
+case 632:
+/* rule 632 can match eol */
+YY_RULE_SETUP
+A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_yes;
+       YY_BREAK
+case 633:
+/* rule 633 can match eol */
+case 634:
+/* rule 634 can match eol */
+YY_RULE_SETUP
+A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_no;
+       YY_BREAK
+case 635:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element.");
@@ -10450,7 +10779,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_zoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zoneRoute);
  }
        YY_BREAK
-case 624:
+case 636:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element.");
@@ -10459,88 +10788,46 @@ YY_RULE_SETUP
   if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element.");
   LEAVE; STag_surfxml_zoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_zoneRoute(); popbuffer(); /* attribute */
   switch (YY_START) {
-    case S_surfxml_AS_1:
-    case S_surfxml_AS_3:
-    case S_surfxml_AS_5:
-      SET(S_surfxml_AS_6);
-      break;
-    case S_surfxml_AS:
-    case S_surfxml_AS_4:
-    case S_surfxml_AS_6:
-    case S_surfxml_AS_7:
-    case S_surfxml_AS_8:
-      SET(S_surfxml_AS_8);
-      break;
-    case S_surfxml_zone_3:
-    case S_surfxml_zone_5:
-    case S_surfxml_zone_6:
-      SET(S_surfxml_zone_6);
-      break;
-    case S_surfxml_zone:
-    case S_surfxml_zone_1:
-    case S_surfxml_zone_4:
-    case S_surfxml_zone_7:
-    case S_surfxml_zone_8:
-      SET(S_surfxml_zone_8);
-      break;
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 625:
+case 637:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of zoneRoute element.", surf_parse_text[0]);
+FAIL("Unexpected character `%c' in attribute list of zoneRoute element.", yytext[0]);
        YY_BREAK
-case 626:
+case 638:
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `zoneRoute' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `zoneRoute' element start tag.",yytext);
        YY_BREAK
 case YY_STATE_EOF(AL_surfxml_zoneRoute):
 FAIL("EOF in attribute list of `zoneRoute' element.");
        YY_BREAK
 
-case 627:
-/* rule 627 can match eol */
+case 639:
+/* rule 639 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_zoneRoute();
   popbuffer(); /* attribute */
   switch (YY_START) {
-    case S_surfxml_AS_1:
-    case S_surfxml_AS_3:
-    case S_surfxml_AS_5:
-      SET(S_surfxml_AS_6);
-      break;
-    case S_surfxml_AS:
-    case S_surfxml_AS_4:
-    case S_surfxml_AS_6:
-    case S_surfxml_AS_7:
-    case S_surfxml_AS_8:
-      SET(S_surfxml_AS_8);
-      break;
-    case S_surfxml_zone_3:
-    case S_surfxml_zone_5:
-    case S_surfxml_zone_6:
-      SET(S_surfxml_zone_6);
-      break;
-    case S_surfxml_zone:
-    case S_surfxml_zone_1:
-    case S_surfxml_zone_4:
-    case S_surfxml_zone_7:
-    case S_surfxml_zone_8:
-      SET(S_surfxml_zone_8);
-      break;
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_8: case S_surfxml_zone_9: SET(S_surfxml_zone_9); break;
   }
  }
        YY_BREAK
-case 628:
-/* rule 628 can match eol */
+case 640:
+/* rule 640 can match eol */
 YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</zoneRoute>' expected.",surf_parse_text);
+FAIL("Unexpected end-tag `%s': `</zoneRoute>' expected.",yytext);
        YY_BREAK
-case 629:
+case 641:
 YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</zoneRoute>' expected.",surf_parse_text[0]);
+FAIL("Unexpected character `%c': `</zoneRoute>' expected.",yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(E_surfxml_zoneRoute):
 case YY_STATE_EOF(S_surfxml_zoneRoute):
@@ -10550,7 +10837,7 @@ FAIL("Premature EOF: `</zoneRoute>' expected.");
 
 /* EPILOG: after the root element. */
 
-case 630:
+case 642:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -10561,58 +10848,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 631:
+case 643:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 632:
+case 644:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 633:
+case 645:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 634:
+case 646:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 635:
+case 647:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 636:
+case 648:
 YY_RULE_SETUP
-BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
+BUFFERPUTC((unsigned char)atoi(yytext+2));
        YY_BREAK
-case 637:
+case 649:
 YY_RULE_SETUP
-BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
+BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16));
        YY_BREAK
 
-case 638:
-/* rule 638 can match eol */
-case 639:
-/* rule 639 can match eol */
-case 640:
-/* rule 640 can match eol */
-case 641:
-/* rule 641 can match eol */
+case 650:
+/* rule 650 can match eol */
+case 651:
+/* rule 651 can match eol */
+case 652:
+/* rule 652 can match eol */
+case 653:
+/* rule 653 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 642:
+case 654:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 643:
+case 655:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 644:
+case 656:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -10620,7 +10907,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 645:
+case 657:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -10628,24 +10915,24 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 646:
-/* rule 646 can match eol */
+case 658:
+/* rule 658 can match eol */
 YY_RULE_SETUP
-BUFFERPUTC(surf_parse_text[0]);
+BUFFERPUTC(yytext[0]);
        YY_BREAK
-case 647:
+case 659:
 YY_RULE_SETUP
-FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
+FAIL("Spurious `%c' in character data.",yytext[0]);
        YY_BREAK
 
-case 648:
+case 660:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
-/* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 649:
+/* "]""]"              BUFFERPUTC(yytext[0]); BUFFERPUTC(yytext[1]); */
+case 661:
 YY_RULE_SETUP
-BUFFERPUTC(surf_parse_text[0]);
+BUFFERPUTC(yytext[0]);
        YY_BREAK
 case YY_STATE_EOF(CDATA):
 FAIL("EOF in CDATA section.");
@@ -10655,13 +10942,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 650:
-/* rule 650 can match eol */
+case 662:
+/* rule 662 can match eol */
 YY_RULE_SETUP
-FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
+FAIL("Syntax error on character `%c'.", yytext[0]);
        YY_BREAK
 
-case 651:
+case 663:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -10689,7 +10976,10 @@ case YY_STATE_EOF(S_surfxml_storage_1):
 case YY_STATE_EOF(S_surfxml_storage___type_1):
 case YY_STATE_EOF(S_surfxml_zone_2):
 case YY_STATE_EOF(S_surfxml_zone_5):
-case YY_STATE_EOF(S_surfxml_zone_7):
+case YY_STATE_EOF(S_surfxml_zone_8):
+case YY_STATE_EOF(S_surfxml_zone_10):
+case YY_STATE_EOF(S_surfxml_zone_13):
+case YY_STATE_EOF(S_surfxml_zone_15):
 case YY_STATE_EOF(S_surfxml_zoneRoute_1):
 case YY_STATE_EOF(IMPOSSIBLE):
        yyterminate();
@@ -10707,15 +10997,15 @@ case YY_STATE_EOF(IMPOSSIBLE):
                        {
                        /* We're scanning a new file or input source.  It's
                         * possible that this happened because the user
-                        * just pointed surf_parse_in at a new source and called
-                        * surf_parse_lex().  If so, then we have to assure
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
                         * consistency between YY_CURRENT_BUFFER and our
                         * globals.  Here is the right place to do so, because
                         * this is the first action (other than possibly a
                         * back-up) that will match for the new input source.
                         */
                        (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-                       YY_CURRENT_BUFFER_LVALUE->yy_input_file = surf_parse_in;
+                       YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
                        YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
                        }
 
@@ -10768,11 +11058,11 @@ case YY_STATE_EOF(IMPOSSIBLE):
                                {
                                (yy_did_buffer_switch_on_eof) = 0;
 
-                               if ( surf_parse_wrap( ) )
+                               if ( yywrap(  ) )
                                        {
                                        /* Note: because we've taken care in
                                         * yy_get_next_buffer() to have set up
-                                        * surf_parse_text, we can now set up
+                                        * yytext, we can now set up
                                         * yy_c_buf_p so that if some total
                                         * hoser (like flex itself) wants to
                                         * call the scanner after we return the
@@ -10822,7 +11112,7 @@ case YY_STATE_EOF(IMPOSSIBLE):
        } /* end of action switch */
                } /* end of scanning one token */
        } /* end of user's declarations */
-} /* end of surf_parse_lex */
+} /* end of yylex */
 
 /* yy_get_next_buffer - try to read in a new buffer
  *
@@ -10900,7 +11190,8 @@ static int yy_get_next_buffer (void)
 
                                b->yy_ch_buf = (char *)
                                        /* Include room in for 2 EOB chars. */
-                                       surf_parse_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+                                       yyrealloc( (void *) b->yy_ch_buf,
+                                                        (yy_size_t) (b->yy_buf_size + 2)  );
                                }
                        else
                                /* Can't grow it, we don't own it. */
@@ -10932,7 +11223,7 @@ static int yy_get_next_buffer (void)
                if ( number_to_move == YY_MORE_ADJ )
                        {
                        ret_val = EOB_ACT_END_OF_FILE;
-                       surf_parse_restart(surf_parse_in  );
+                       yyrestart( yyin  );
                        }
 
                else
@@ -10949,9 +11240,12 @@ static int yy_get_next_buffer (void)
        if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
                /* Extend the array by 50%, plus the number we really need. */
                int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
-               YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) surf_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+               YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+                       (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
                if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
                        YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+               /* "- 2" to take care of EOB's */
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
        }
 
        (yy_n_chars) += number_to_move;
@@ -10983,10 +11277,10 @@ 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 >= 3930 )
-                               yy_c = yy_meta[(unsigned int) yy_c];
+                       if ( yy_current_state >= 4018 )
+                               yy_c = yy_meta[yy_c];
                        }
-               yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                }
 
        return yy_current_state;
@@ -11011,11 +11305,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 >= 3930 )
-                       yy_c = yy_meta[(unsigned int) yy_c];
+               if ( yy_current_state >= 4018 )
+                       yy_c = yy_meta[yy_c];
                }
-       yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
-       yy_is_jam = (yy_current_state == 3929);
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+       yy_is_jam = (yy_current_state == 4017);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -11048,7 +11342,7 @@ static int yy_get_next_buffer (void)
 
                else
                        { /* need more input */
-                       int offset = (yy_c_buf_p) - (yytext_ptr);
+                       int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
                        ++(yy_c_buf_p);
 
                        switch ( yy_get_next_buffer(  ) )
@@ -11065,13 +11359,13 @@ static int yy_get_next_buffer (void)
                                         */
 
                                        /* Reset buffer status. */
-                                       surf_parse_restart(surf_parse_in );
+                                       yyrestart( yyin );
 
                                        /*FALLTHROUGH*/
 
                                case EOB_ACT_END_OF_FILE:
                                        {
-                                       if ( surf_parse_wrap( ) )
+                                       if ( yywrap(  ) )
                                                return 0;
 
                                        if ( ! (yy_did_buffer_switch_on_eof) )
@@ -11091,12 +11385,12 @@ static int yy_get_next_buffer (void)
                }
 
        c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
-       *(yy_c_buf_p) = '\0';   /* preserve surf_parse_text */
+       *(yy_c_buf_p) = '\0';   /* preserve yytext */
        (yy_hold_char) = *++(yy_c_buf_p);
 
        if ( c == '\n' )
                
-    surf_parse_lineno++;
+    yylineno++;
 ;
 
        return c;
@@ -11108,32 +11402,32 @@ static int yy_get_next_buffer (void)
  * 
  * @note This function does not reset the start condition to @c INITIAL .
  */
-    void surf_parse_restart  (FILE * input_file )
+    void yyrestart  (FILE * input_file )
 {
     
        if ( ! YY_CURRENT_BUFFER ){
-        surf_parse_ensure_buffer_stack ();
+        yyensure_buffer_stack ();
                YY_CURRENT_BUFFER_LVALUE =
-            surf_parse__create_buffer(surf_parse_in,YY_BUF_SIZE );
+            yy_create_buffer( yyin, YY_BUF_SIZE );
        }
 
-       surf_parse__init_buffer(YY_CURRENT_BUFFER,input_file );
-       surf_parse__load_buffer_state( );
+       yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+       yy_load_buffer_state(  );
 }
 
 /** Switch to a different input buffer.
  * @param new_buffer The new input buffer.
  * 
  */
-    void surf_parse__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
 {
     
        /* TODO. We should be able to replace this entire function body
         * with
-        *              surf_parse_pop_buffer_state();
-        *              surf_parse_push_buffer_state(new_buffer);
+        *              yypop_buffer_state();
+        *              yypush_buffer_state(new_buffer);
      */
-       surf_parse_ensure_buffer_stack ();
+       yyensure_buffer_stack ();
        if ( YY_CURRENT_BUFFER == new_buffer )
                return;
 
@@ -11146,21 +11440,21 @@ static int yy_get_next_buffer (void)
                }
 
        YY_CURRENT_BUFFER_LVALUE = new_buffer;
-       surf_parse__load_buffer_state( );
+       yy_load_buffer_state(  );
 
        /* We don't actually know whether we did this switch during
-        * EOF (surf_parse_wrap()) processing, but the only time this flag
-        * is looked at is after surf_parse_wrap() is called, so it's safe
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
         * to go ahead and always set it.
         */
        (yy_did_buffer_switch_on_eof) = 1;
 }
 
-static void surf_parse__load_buffer_state  (void)
+static void yy_load_buffer_state  (void)
 {
        (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
        (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-       surf_parse_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+       yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
        (yy_hold_char) = *(yy_c_buf_p);
 }
 
@@ -11170,35 +11464,35 @@ static void surf_parse__load_buffer_state  (void)
  * 
  * @return the allocated buffer state.
  */
-    YY_BUFFER_STATE surf_parse__create_buffer  (FILE * file, int  size )
+    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
 {
        YY_BUFFER_STATE b;
     
-       b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state )  );
+       b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
        if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
-       b->yy_buf_size = (yy_size_t)size;
+       b->yy_buf_size = size;
 
        /* yy_ch_buf has to be 2 characters longer than the size given because
         * we need to put in 2 end-of-buffer characters.
         */
-       b->yy_ch_buf = (char *) surf_parse_alloc(b->yy_buf_size + 2  );
+       b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2)  );
        if ( ! b->yy_ch_buf )
-               YY_FATAL_ERROR( "out of dynamic memory in surf_parse__create_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
        b->yy_is_our_buffer = 1;
 
-       surf_parse__init_buffer(b,file );
+       yy_init_buffer( b, file );
 
        return b;
 }
 
 /** Destroy the buffer.
- * @param b a buffer created with surf_parse__create_buffer()
+ * @param b a buffer created with yy_create_buffer()
  * 
  */
-    void surf_parse__delete_buffer (YY_BUFFER_STATE  b )
+    void yy_delete_buffer (YY_BUFFER_STATE  b )
 {
     
        if ( ! b )
@@ -11208,27 +11502,27 @@ static void surf_parse__load_buffer_state  (void)
                YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
        if ( b->yy_is_our_buffer )
-               surf_parse_free((void *) b->yy_ch_buf  );
+               yyfree( (void *) b->yy_ch_buf  );
 
-       surf_parse_free((void *) b  );
+       yyfree( (void *) b  );
 }
 
 /* Initializes or reinitializes a buffer.
  * This function is sometimes called more than once on the same buffer,
- * such as during a surf_parse_restart() or at EOF.
+ * such as during a yyrestart() or at EOF.
  */
-    static void surf_parse__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
 
 {
        int oerrno = errno;
     
-       surf_parse__flush_buffer(b );
+       yy_flush_buffer( b );
 
        b->yy_input_file = file;
        b->yy_fill_buffer = 1;
 
-    /* If b is the current buffer, then surf_parse__init_buffer was _probably_
-     * called from surf_parse_restart() or through yy_get_next_buffer.
+    /* If b is the current buffer, then yy_init_buffer was _probably_
+     * called from yyrestart() or through yy_get_next_buffer.
      * In that case, we don't want to reset the lineno or column.
      */
     if (b != YY_CURRENT_BUFFER){
@@ -11245,7 +11539,7 @@ static void surf_parse__load_buffer_state  (void)
  * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
  * 
  */
-    void surf_parse__flush_buffer (YY_BUFFER_STATE  b )
+    void yy_flush_buffer (YY_BUFFER_STATE  b )
 {
        if ( ! b )
                return;
@@ -11265,7 +11559,7 @@ static void surf_parse__load_buffer_state  (void)
        b->yy_buffer_status = YY_BUFFER_NEW;
 
        if ( b == YY_CURRENT_BUFFER )
-               surf_parse__load_buffer_state( );
+               yy_load_buffer_state(  );
 }
 
 /** Pushes the new state onto the stack. The new state becomes
@@ -11274,14 +11568,14 @@ static void surf_parse__load_buffer_state  (void)
  *  @param new_buffer The new state.
  *  
  */
-void surf_parse_push_buffer_state (YY_BUFFER_STATE new_buffer )
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
 {
        if (new_buffer == NULL)
                return;
 
-       surf_parse_ensure_buffer_stack();
+       yyensure_buffer_stack();
 
-       /* This block is copied from surf_parse__switch_to_buffer. */
+       /* This block is copied from yy_switch_to_buffer. */
        if ( YY_CURRENT_BUFFER )
                {
                /* Flush out information for old buffer. */
@@ -11295,8 +11589,8 @@ void surf_parse_push_buffer_state (YY_BUFFER_STATE new_buffer )
                (yy_buffer_stack_top)++;
        YY_CURRENT_BUFFER_LVALUE = new_buffer;
 
-       /* copied from surf_parse__switch_to_buffer. */
-       surf_parse__load_buffer_state( );
+       /* copied from yy_switch_to_buffer. */
+       yy_load_buffer_state(  );
        (yy_did_buffer_switch_on_eof) = 1;
 }
 
@@ -11304,18 +11598,18 @@ void surf_parse_push_buffer_state (YY_BUFFER_STATE new_buffer )
  *  The next element becomes the new top.
  *  
  */
-void surf_parse_pop_buffer_state (void)
+void yypop_buffer_state (void)
 {
        if (!YY_CURRENT_BUFFER)
                return;
 
-       surf_parse__delete_buffer(YY_CURRENT_BUFFER );
+       yy_delete_buffer(YY_CURRENT_BUFFER );
        YY_CURRENT_BUFFER_LVALUE = NULL;
        if ((yy_buffer_stack_top) > 0)
                --(yy_buffer_stack_top);
 
        if (YY_CURRENT_BUFFER) {
-               surf_parse__load_buffer_state( );
+               yy_load_buffer_state(  );
                (yy_did_buffer_switch_on_eof) = 1;
        }
 }
@@ -11323,9 +11617,9 @@ void surf_parse_pop_buffer_state (void)
 /* Allocates the stack if it does not exist.
  *  Guarantees space for at least one push.
  */
-static void surf_parse_ensure_buffer_stack (void)
+static void yyensure_buffer_stack (void)
 {
-       int num_to_alloc;
+       yy_size_t num_to_alloc;
     
        if (!(yy_buffer_stack)) {
 
@@ -11334,11 +11628,11 @@ static void surf_parse_ensure_buffer_stack (void)
                 * immediate realloc on the next call.
          */
       num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
-               (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_alloc
+               (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
                                                                (num_to_alloc * sizeof(struct yy_buffer_state*)
                                                                );
                if ( ! (yy_buffer_stack) )
-                       YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" );
+                       YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
 
                memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 
@@ -11353,12 +11647,12 @@ static void surf_parse_ensure_buffer_stack (void)
                yy_size_t grow_size = 8 /* arbitrary grow size */;
 
                num_to_alloc = (yy_buffer_stack_max) + grow_size;
-               (yy_buffer_stack) = (struct yy_buffer_state**)surf_parse_realloc
+               (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
                                                                ((yy_buffer_stack),
                                                                num_to_alloc * sizeof(struct yy_buffer_state*)
                                                                );
                if ( ! (yy_buffer_stack) )
-                       YY_FATAL_ERROR( "out of dynamic memory in surf_parse_ensure_buffer_stack()" );
+                       YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
 
                /* zero only the new slots.*/
                memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -11372,7 +11666,7 @@ static void surf_parse_ensure_buffer_stack (void)
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE surf_parse__scan_buffer  (char * base, yy_size_t  size )
+YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
 {
        YY_BUFFER_STATE b;
     
@@ -11382,11 +11676,11 @@ YY_BUFFER_STATE surf_parse__scan_buffer  (char * base, yy_size_t  size )
                /* They forgot to leave room for the EOB's. */
                return NULL;
 
-       b = (YY_BUFFER_STATE) surf_parse_alloc(sizeof( struct yy_buffer_state )  );
+       b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
        if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
 
-       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_size = (int) (size - 2);      /* "- 2" to take care of EOB's */
        b->yy_buf_pos = b->yy_ch_buf = base;
        b->yy_is_our_buffer = 0;
        b->yy_input_file = NULL;
@@ -11396,33 +11690,33 @@ YY_BUFFER_STATE surf_parse__scan_buffer  (char * base, yy_size_t  size )
        b->yy_fill_buffer = 0;
        b->yy_buffer_status = YY_BUFFER_NEW;
 
-       surf_parse__switch_to_buffer(b  );
+       yy_switch_to_buffer( b  );
 
        return b;
 }
 
-/** Setup the input buffer state to scan a string. The next call to surf_parse_lex() will
+/** Setup the input buffer state to scan a string. The next call to yylex() will
  * scan from a @e copy of @a str.
  * @param yystr a NUL-terminated string to scan
  * 
  * @return the newly allocated buffer state object.
  * @note If you want to scan bytes that may contain NUL values, then use
- *       surf_parse__scan_bytes() instead.
+ *       yy_scan_bytes() instead.
  */
-YY_BUFFER_STATE surf_parse__scan_string (yyconst char * yystr )
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
 {
     
-       return surf_parse__scan_bytes(yystr,(int) strlen(yystr) );
+       return yy_scan_bytes( yystr, (int) strlen(yystr) );
 }
 
-/** Setup the input buffer state to scan the given bytes. The next call to surf_parse_lex() will
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
  * scan from a @e copy of @a bytes.
  * @param yybytes the byte buffer to scan
  * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE surf_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
 {
        YY_BUFFER_STATE b;
        char *buf;
@@ -11431,18 +11725,18 @@ YY_BUFFER_STATE surf_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_l
     
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = (yy_size_t) (_yybytes_len + 2);
-       buf = (char *) surf_parse_alloc(n  );
+       buf = (char *) yyalloc( n  );
        if ( ! buf )
-               YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_bytes()" );
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
 
        for ( i = 0; i < _yybytes_len; ++i )
                buf[i] = yybytes[i];
 
        buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
 
-       b = surf_parse__scan_buffer(buf,n );
+       b = yy_scan_buffer( buf, n );
        if ( ! b )
-               YY_FATAL_ERROR( "bad buffer in surf_parse__scan_bytes()" );
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
 
        /* It's okay to grow etc. this buffer, and we should throw it
         * away when we're done.
@@ -11462,10 +11756,11 @@ YY_BUFFER_STATE surf_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_l
                new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int );
 
                if ( ! (yy_start_stack) )
-                       (yy_start_stack) = (int *) surf_parse_alloc(new_size  );
+                       (yy_start_stack) = (int *) yyalloc( new_size  );
 
                else
-                       (yy_start_stack) = (int *) surf_parse_realloc((void *) (yy_start_stack),new_size  );
+                       (yy_start_stack) = (int *) yyrealloc(
+                                       (void *) (yy_start_stack), new_size  );
 
                if ( ! (yy_start_stack) )
                        YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
@@ -11488,9 +11783,9 @@ YY_BUFFER_STATE surf_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_l
 #define YY_EXIT_FAILURE 2
 #endif
 
-static void yynoreturn yy_fatal_error (yyconst char* msg )
+static void yynoreturn yy_fatal_error (const char* msg )
 {
-                       (void) fprintf( stderr, "%s\n", msg );
+                       fprintf( stderr, "%s\n", msg );
        exit( YY_EXIT_FAILURE );
 }
 
@@ -11500,14 +11795,14 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
 #define yyless(n) \
        do \
                { \
-               /* Undo effects of setting up surf_parse_text. */ \
+               /* Undo effects of setting up yytext. */ \
         int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
-               surf_parse_text[surf_parse_leng] = (yy_hold_char); \
-               (yy_c_buf_p) = surf_parse_text + yyless_macro_arg; \
+               yytext[yyleng] = (yy_hold_char); \
+               (yy_c_buf_p) = yytext + yyless_macro_arg; \
                (yy_hold_char) = *(yy_c_buf_p); \
                *(yy_c_buf_p) = '\0'; \
-               surf_parse_leng = yyless_macro_arg; \
+               yyleng = yyless_macro_arg; \
                } \
        while ( 0 )
 
@@ -11516,89 +11811,89 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
 /** Get the current line number.
  * 
  */
-int surf_parse_get_lineno  (void)
+int yyget_lineno  (void)
 {
     
-    return surf_parse_lineno;
+    return yylineno;
 }
 
 /** Get the input stream.
  * 
  */
-FILE *surf_parse_get_in  (void)
+FILE *yyget_in  (void)
 {
-        return surf_parse_in;
+        return yyin;
 }
 
 /** Get the output stream.
  * 
  */
-FILE *surf_parse_get_out  (void)
+FILE *yyget_out  (void)
 {
-        return surf_parse_out;
+        return yyout;
 }
 
 /** Get the length of the current token.
  * 
  */
-int surf_parse_get_leng  (void)
+int yyget_leng  (void)
 {
-        return surf_parse_leng;
+        return yyleng;
 }
 
 /** Get the current token.
  * 
  */
 
-char *surf_parse_get_text  (void)
+char *yyget_text  (void)
 {
-        return surf_parse_text;
+        return yytext;
 }
 
 /** Set the current line number.
  * @param _line_number line number
  * 
  */
-void surf_parse_set_lineno (int  _line_number )
+void yyset_lineno (int  _line_number )
 {
     
-    surf_parse_lineno = _line_number;
+    yylineno = _line_number;
 }
 
 /** Set the input stream. This does not discard the current
  * input buffer.
  * @param _in_str A readable stream.
  * 
- * @see surf_parse__switch_to_buffer
+ * @see yy_switch_to_buffer
  */
-void surf_parse_set_in (FILE *  _in_str )
+void yyset_in (FILE *  _in_str )
 {
-        surf_parse_in = _in_str ;
+        yyin = _in_str ;
 }
 
-void surf_parse_set_out (FILE *  _out_str )
+void yyset_out (FILE *  _out_str )
 {
-        surf_parse_out = _out_str ;
+        yyout = _out_str ;
 }
 
-int surf_parse_get_debug  (void)
+int yyget_debug  (void)
 {
-        return surf_parse__flex_debug;
+        return yy_flex_debug;
 }
 
-void surf_parse_set_debug (int  _bdebug )
+void yyset_debug (int  _bdebug )
 {
-        surf_parse__flex_debug = _bdebug ;
+        yy_flex_debug = _bdebug ;
 }
 
 static int yy_init_globals (void)
 {
         /* Initialization is the same as for the non-reentrant scanner.
-     * This function is called from surf_parse_lex_destroy(), so don't allocate here.
+     * This function is called from yylex_destroy(), so don't allocate here.
      */
 
-    /* We do not touch surf_parse_lineno unless the option is enabled. */
-    surf_parse_lineno =  1;
+    /* We do not touch yylineno unless the option is enabled. */
+    yylineno =  1;
     
     (yy_buffer_stack) = NULL;
     (yy_buffer_stack_top) = 0;
@@ -11613,40 +11908,40 @@ static int yy_init_globals (void)
 
 /* Defined in main.c */
 #ifdef YY_STDINIT
-    surf_parse_in = stdin;
-    surf_parse_out = stdout;
+    yyin = stdin;
+    yyout = stdout;
 #else
-    surf_parse_in = NULL;
-    surf_parse_out = NULL;
+    yyin = NULL;
+    yyout = NULL;
 #endif
 
     /* For future reference: Set errno on error, since we are called by
-     * surf_parse_lex_init()
+     * yylex_init()
      */
     return 0;
 }
 
-/* surf_parse_lex_destroy is for both reentrant and non-reentrant scanners. */
-int surf_parse_lex_destroy  (void)
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy  (void)
 {
     
     /* Pop the buffer stack, destroying each element. */
        while(YY_CURRENT_BUFFER){
-               surf_parse__delete_buffer(YY_CURRENT_BUFFER  );
+               yy_delete_buffer( YY_CURRENT_BUFFER  );
                YY_CURRENT_BUFFER_LVALUE = NULL;
-               surf_parse_pop_buffer_state();
+               yypop_buffer_state();
        }
 
        /* Destroy the stack itself. */
-       surf_parse_free((yy_buffer_stack) );
+       yyfree((yy_buffer_stack) );
        (yy_buffer_stack) = NULL;
 
     /* Destroy the start condition stack. */
-        surf_parse_free((yy_start_stack)  );
+        yyfree( (yy_start_stack)  );
         (yy_start_stack) = NULL;
 
     /* Reset the globals. This is important in a non-reentrant scanner so the next time
-     * surf_parse_lex() is called, initialization will occur. */
+     * yylex() is called, initialization will occur. */
     yy_init_globals( );
 
     return 0;
@@ -11657,7 +11952,7 @@ int surf_parse_lex_destroy  (void)
  */
 
 #ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
 {
                
        int i;
@@ -11667,7 +11962,7 @@ static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
+static int yy_flex_strlen (const char * s )
 {
        int n;
        for ( n = 0; s[n]; ++n )
@@ -11677,12 +11972,12 @@ static int yy_flex_strlen (yyconst char * s )
 }
 #endif
 
-void *surf_parse_alloc (yy_size_t  size )
+void *yyalloc (yy_size_t  size )
 {
                        return malloc(size);
 }
 
-void *surf_parse_realloc  (void * ptr, yy_size_t  size )
+void *yyrealloc  (void * ptr, yy_size_t  size )
 {
                
        /* The cast to (char *) in the following accommodates both
@@ -11695,9 +11990,9 @@ void *surf_parse_realloc  (void * ptr, yy_size_t  size )
        return realloc(ptr, size);
 }
 
-void surf_parse_free (void * ptr )
+void yyfree (void * ptr )
 {
-                       free( (char *) ptr );   /* see surf_parse_realloc() for (char *) cast */
+                       free( (char *) ptr );   /* see yyrealloc() for (char *) cast */
 }
 
 #define YYTABLES_NAME "yytables"
@@ -11737,14 +12032,14 @@ void print_surfxml_bufferstack()
 
 static void debug_enter(int state, const char* statename) {
   yy_push_state(state);
-  if (surf_parse__flex_debug) {
+  if (yy_flex_debug) {
        print_yy_stack("--ENTER(%s) : ",statename);
        print_surfxml_bufferstack();
   }
 }
 
 static void debug_leave(void) {
-    if (surf_parse__flex_debug) {
+    if (yy_flex_debug) {
         print_yy_stack("--LEAVE : ");
        print_surfxml_bufferstack();
     }
@@ -11753,7 +12048,7 @@ static void debug_leave(void) {
 
 static void debug_set(int state, const char* statename) {
   BEGIN(state);
-  if (surf_parse__flex_debug) print_yy_stack("--SET(%s) : ",statename);
+  if (yy_flex_debug) print_yy_stack("--SET(%s) : ",statename);
 }
 #endif
 
@@ -11777,7 +12072,7 @@ static int fail(const char* fmt, ...)
 #ifdef FLEXML_yylineno
     used = snprintf(flexml_err_msg,flexml_max_err_msg_size,
                   "Invalid XML (XML input line %d, state %d): ",
-                  surf_parse_lineno, YY_START);
+                  yylineno, YY_START);
 #else
     used = snprintf(flexml_err_msg,flexml_max_err_msg_size,
                   "Invalid XML (state %d): ",
index 5db30d4..2991ff7 100644 (file)
@@ -123,7 +123,7 @@ typedef int AT_surfxml_ASroute_gw___src;
 #define AU_surfxml_ASroute_gw___src NULL
 typedef int AT_surfxml_ASroute_src;
 #define AU_surfxml_ASroute_src NULL
-typedef enum { AU_surfxml_ASroute_symmetrical, A_surfxml_ASroute_symmetrical_YES,A_surfxml_ASroute_symmetrical_NO } AT_surfxml_ASroute_symmetrical;
+typedef enum { AU_surfxml_ASroute_symmetrical, A_surfxml_ASroute_symmetrical_YES,A_surfxml_ASroute_symmetrical_NO,A_surfxml_ASroute_symmetrical_yes,A_surfxml_ASroute_symmetrical_no } AT_surfxml_ASroute_symmetrical;
 typedef int AT_surfxml_actor_function;
 #define AU_surfxml_actor_function NULL
 typedef int AT_surfxml_actor_host;
@@ -306,7 +306,7 @@ typedef int AT_surfxml_route_dst;
 #define AU_surfxml_route_dst NULL
 typedef int AT_surfxml_route_src;
 #define AU_surfxml_route_src NULL
-typedef enum { AU_surfxml_route_symmetrical, A_surfxml_route_symmetrical_YES,A_surfxml_route_symmetrical_NO } AT_surfxml_route_symmetrical;
+typedef enum { AU_surfxml_route_symmetrical, A_surfxml_route_symmetrical_YES,A_surfxml_route_symmetrical_NO,A_surfxml_route_symmetrical_yes,A_surfxml_route_symmetrical_no } AT_surfxml_route_symmetrical;
 typedef int AT_surfxml_router_coordinates;
 #define AU_surfxml_router_coordinates NULL
 typedef int AT_surfxml_router_id;
@@ -349,7 +349,7 @@ typedef int AT_surfxml_zoneRoute_gw___src;
 #define AU_surfxml_zoneRoute_gw___src NULL
 typedef int AT_surfxml_zoneRoute_src;
 #define AU_surfxml_zoneRoute_src NULL
-typedef enum { AU_surfxml_zoneRoute_symmetrical, A_surfxml_zoneRoute_symmetrical_YES,A_surfxml_zoneRoute_symmetrical_NO } AT_surfxml_zoneRoute_symmetrical;
+typedef enum { AU_surfxml_zoneRoute_symmetrical, A_surfxml_zoneRoute_symmetrical_YES,A_surfxml_zoneRoute_symmetrical_NO,A_surfxml_zoneRoute_symmetrical_yes,A_surfxml_zoneRoute_symmetrical_no } AT_surfxml_zoneRoute_symmetrical;
 
 /* FleXML-provided data. */
 XBT_PUBLIC_DATA int surfxml_pcdata_ix;
index 3c8ecb3..80de20a 100644 (file)
@@ -191,9 +191,7 @@ std::vector<std::string> resolve_backtrace(xbt_backtrace_location_t const* loc,
 
   XBT_VERB("Fire a first command: '%s'", cmd.c_str());
   FILE* pipe = popen(cmd.c_str(), "r");
-  if (not pipe) {
-    xbt_die("Cannot fork addr2line to display the backtrace");
-  }
+  xbt_assert(pipe, "Cannot fork addr2line to display the backtrace");
 
   /* To read the output of addr2line */
   char line_func[1024];
@@ -290,7 +288,7 @@ std::vector<std::string> resolve_backtrace(xbt_backtrace_location_t const* loc,
 
         /* Here we go, fire an addr2line up */
         std::string subcmd = std::string(ADDR2LINE) + " -f -e " + p + " " + addrs[i];
-        XBT_VERB("Fire a new command: '%s'", subcmd.c_str());
+        XBT_VERB("Fire another command: '%s'", subcmd.c_str());
         FILE* subpipe = popen(subcmd.c_str(), "r");
         if (not subpipe) {
           xbt_die("Cannot fork addr2line to display the backtrace");
index 3d12053..b31d8fb 100644 (file)
@@ -19,6 +19,7 @@
 #include <typeinfo>
 #include <vector>
 
+#include "simgrid/Exception.hpp"
 #include "simgrid/sg_config.hpp"
 #include "xbt/dynar.h"
 #include "xbt/log.h"
@@ -26,7 +27,6 @@
 #include "xbt/sysdep.h"
 #include <xbt/config.h>
 #include <xbt/config.hpp>
-#include <xbt/ex.hpp>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support");
 
@@ -719,9 +719,9 @@ int xbt_cfg_get_boolean(const char *key)
 
 #include <string>
 
+#include "simgrid/Exception.hpp"
 #include "xbt.h"
 #include "xbt/ex.h"
-#include <xbt/ex.hpp>
 
 #include <xbt/config.hpp>
 
index 95b4d95..a3a625f 100644 (file)
@@ -14,8 +14,8 @@
 #include <string>
 #include <vector>
 
+#include "simgrid/Exception.hpp"
 #include <xbt/cunit.h>
-#include <xbt/ex.hpp>
 #include <xbt/string.hpp>
 
 /* output stream to use everywhere */
@@ -581,7 +581,7 @@ void _xbt_test_fail(const char *file, int line, const char *fmt, ...)
 
 void xbt_test_exception(xbt_ex_t e)
 {
-  _xbt_test_fail(e.throw_point().file, e.throw_point().line, "Exception %s raised: %s", xbt_ex_catname(e.category),
+  _xbt_test_fail(e.throw_point().file_, e.throw_point().line_, "Exception %s raised: %s", xbt_ex_catname(e.category),
                  e.what());
 }
 
index cac4d27..be4dd59 100644 (file)
@@ -6,13 +6,13 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/dict.h"
+#include "dict_private.h"
+#include "simgrid/Exception.hpp"
+#include "src/xbt_modinter.h"
 #include "xbt/ex.h"
-#include <xbt/ex.hpp>
 #include "xbt/log.h"
 #include "xbt/mallocator.h"
-#include "src/xbt_modinter.h"
 #include "xbt/str.h"
-#include "dict_private.h"
 
 #include <cstdio>
 #include <cstring>
@@ -454,11 +454,11 @@ void xbt_dict_postexit()
 }
 
 #ifdef SIMGRID_TEST
+#include "simgrid/Exception.hpp"
 #include "src/internal_config.h"
 #include "xbt.h"
 #include "xbt/ex.h"
 #include <ctime>
-#include <xbt/ex.hpp>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_dict);
 
index ff95c55..c2dd5f0 100644 (file)
@@ -6,12 +6,12 @@
 /* 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/dynar.h"
+#include "simgrid/Exception.hpp"
+#include "xbt/ex.h"
+#include "xbt/log.h"
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/ex.h"
-#include <xbt/ex.hpp>
-#include "xbt/dynar.h"
 #include <sys/types.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn, xbt, "Dynamic arrays");
diff --git a/src/xbt/ex.cpp b/src/xbt/ex.cpp
deleted file mode 100644 (file)
index 76f0837..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/* ex - Exception Handling                                                  */
-
-/* Copyright (c) 2005-2018. 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 <cstdio>
-#include <cstdlib>
-
-#include <xbt/backtrace.hpp>
-#include "src/internal_config.h"           /* execinfo when available */
-#include "xbt/ex.h"
-#include <xbt/ex.hpp>
-#include "xbt/log.h"
-#include "xbt/log.hpp"
-#include "xbt/backtrace.h"
-#include "xbt/backtrace.hpp"
-#include "src/xbt_modinter.h"       /* backtrace initialization headers */
-
-#include "simgrid/sg_config.hpp" /* Configuration mechanism of SimGrid */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mechanism");
-
-// DO NOT define ~xbt_ex() in ex.hpp.
-// Defining it here ensures that xbt_ex is defined only in libsimgrid, but not in libsimgrid-java.
-// Doing otherwise naturally breaks things (at least on freebsd with clang).
-
-xbt_ex::~xbt_ex() = default;
-
-void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func)
-{
-  xbt_ex e(simgrid::xbt::ThrowPoint(file, line, func), message);
-  xbt_free(message);
-  e.category = errcat;
-  e.value = value;
-  throw e;
-}
-
-/** @brief shows an exception content and the associated stack if available */
-void xbt_ex_display(xbt_ex_t * e)
-{
-  simgrid::xbt::log_exception(xbt_log_priority_critical, "UNCAUGHT EXCEPTION", *e);
-}
-
-/** @brief returns a short name for the given exception category */
-const char *xbt_ex_catname(xbt_errcat_t cat)
-{
-  switch (cat) {
-  case unknown_error:
-    return "unknown error";
-  case arg_error:
-    return "invalid argument";
-  case bound_error:
-    return "out of bounds";
-  case mismatch_error:
-    return "mismatch";
-  case not_found_error:
-    return "not found";
-  case system_error:
-    return "system error";
-  case network_error:
-    return "network error";
-  case timeout_error:
-    return "timeout";
-  case cancel_error:
-    return "action canceled";
-  case thread_error:
-    return "thread error";
-  case host_error:
-    return "host failed";
-  case tracing_error:
-    return "tracing error";
-  case io_error:
-    return "io error";
-  case vm_error:
-    return "vm error";
-  default:
-    return "INVALID ERROR";
-  }
-  return "INVALID ERROR";
-}
index 9d5ad43..c14e9ae 100644 (file)
@@ -3,47 +3,94 @@
 /* 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 <cstdlib>
-
-#include <atomic>
-#include <exception>
-#include <string>
-#include <typeinfo>
-#include <vector>
-#include <memory>
-#include <mutex>
-
-#include <xbt/backtrace.hpp>
+#include "simgrid/Exception.hpp"
 #include <xbt/config.hpp>
-#include <xbt/ex.hpp>
-#include <xbt/exception.hpp>
-#include <xbt/log.h>
 #include <xbt/log.hpp>
 
+#include <mutex>
+#include <sstream>
+
 XBT_LOG_EXTERNAL_CATEGORY(xbt);
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_exception, xbt, "Exceptions");
 
+// DO NOT define ~xbt_ex() in exception.hpp.
+// Defining it here ensures that xbt_ex is defined only in libsimgrid, but not in libsimgrid-java.
+// Doing otherwise naturally breaks things (at least on freebsd with clang).
+
+xbt_ex::~xbt_ex() = default;
+
+void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func)
+{
+  xbt_ex e(simgrid::xbt::ThrowPoint(XBT_THROW_POINT), message);
+  xbt_free(message);
+  e.category = errcat;
+  e.value    = value;
+  throw e;
+}
+
+/** @brief shows an exception content and the associated stack if available */
+void xbt_ex_display(xbt_ex_t* e)
+{
+  simgrid::xbt::log_exception(xbt_log_priority_critical, "UNCAUGHT EXCEPTION", *e);
+}
+
+/** @brief returns a short name for the given exception category */
+const char* xbt_ex_catname(xbt_errcat_t cat)
+{
+  switch (cat) {
+    case unknown_error:
+      return "unknown error";
+    case arg_error:
+      return "invalid argument";
+    case bound_error:
+      return "out of bounds";
+    case mismatch_error:
+      return "mismatch";
+    case not_found_error:
+      return "not found";
+    case system_error:
+      return "system error";
+    case network_error:
+      return "network error";
+    case timeout_error:
+      return "timeout";
+    case cancel_error:
+      return "action canceled";
+    case thread_error:
+      return "thread error";
+    case host_error:
+      return "host failed";
+    case tracing_error:
+      return "tracing error";
+    case io_error:
+      return "io error";
+    case vm_error:
+      return "vm error";
+    default:
+      return "INVALID ERROR";
+  }
+  return "INVALID ERROR";
+}
+
 namespace simgrid {
 namespace xbt {
 
-WithContextException::~WithContextException() = default;
-
 void log_exception(e_xbt_log_priority_t prio, const char* context, std::exception const& exception)
 {
   try {
     auto name = simgrid::xbt::demangle(typeid(exception).name());
 
-    auto* with_context = dynamic_cast<const simgrid::xbt::WithContextException*>(&exception);
+    auto* with_context = dynamic_cast<const simgrid::Exception*>(&exception);
     if (with_context != nullptr)
-      XBT_LOG(prio, "%s %s by %s/%d: %s", context, name.get(), with_context->process_name().c_str(),
-              with_context->pid(), exception.what());
+      XBT_LOG(prio, "%s %s by %s/%d: %s", context, name.get(), with_context->throw_point().procname_.c_str(),
+              with_context->throw_point().pid_, exception.what());
     else
       XBT_LOG(prio, "%s %s: %s", context, name.get(), exception.what());
 
     // Do we have a backtrace?
     if (with_context != nullptr && not simgrid::config::get_value<bool>("exception/cutpath")) {
-      auto backtrace =
-          simgrid::xbt::resolve_backtrace(with_context->backtrace().data(), with_context->backtrace().size());
+      auto backtrace = simgrid::xbt::resolve_backtrace(with_context->throw_point().backtrace_.data(),
+                                                       with_context->throw_point().backtrace_.size());
       for (std::string const& s : backtrace)
         XBT_LOG(prio, "  -> %s", s.c_str());
     }
@@ -138,4 +185,17 @@ void installExceptionHandler()
 }
 
 } // namespace xbt
+} // namespace simgrid
+
+void xbt_throw_impossible(const char* file, int line, const char* func)
+{
+  std::stringstream ss;
+  ss << file << ":" << line << ":" << func << ": The Impossible Did Happen (yet again). Please report this bug.";
+  throw std::runtime_error(ss.str());
+}
+void xbt_throw_unimplemented(const char* file, int line, const char* func)
+{
+  std::stringstream ss;
+  ss << file << ":" << line << ":" << func << ": Feature unimplemented yet. Please report this bug.";
+  throw std::runtime_error(ss.str());
 }
index eaab5a6..d8544dc 100644 (file)
@@ -6,9 +6,9 @@
 /* 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 "simgrid/Exception.hpp"
 #include "simgrid/simix.h" /* used implementation */
 #include "src/kernel/activity/ConditionVariableImpl.hpp"
-#include "xbt/ex.hpp"
 #include "xbt/synchro.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync, xbt, "Synchronization mechanism");
index af68627..7ee6981 100644 (file)
@@ -3,7 +3,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 "xbt/ex.hpp"
+#include "simgrid/Exception.hpp"
 #include "xbt/log.h"
 #include "xbt/replay.hpp"
 
index b0ab069..bd39729 100644 (file)
@@ -1,15 +1,13 @@
-/* xbt_str.cpp - various helping functions to deal with strings               */
+/* xbt_str.cpp - various helping functions to deal with strings             */
 
-/* Copyright (c) 2007-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2018. 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/ex.hpp>
+#include "simgrid/Exception.hpp"
 #include "xbt/misc.h"
-#include "xbt/sysdep.h"
-#include "xbt/str.h"            /* headers of these functions */
+#include "xbt/str.h" /* headers of these functions */
 
 /** @brief Splits a string into a dynar of strings
  *
@@ -264,7 +262,7 @@ double xbt_str_parse_double(const char* str, const char* error_msg)
 }
 
 #ifdef SIMGRID_TEST
-#include <xbt/ex.hpp>
+#include "simgrid/Exception.hpp"
 #include "xbt/str.h"
 
 XBT_TEST_SUITE("xbt_str", "String Handling");
index a321b13..8cbe590 100644 (file)
@@ -4,4 +4,4 @@ $ java -classpath ${classpath:=.} semaphoregc.SemaphoreGC ${srcdir:=.}/small_pla
 > [    0.0000] (0:maestro@) Using regular java threads.
 > [    0.0000] (1:SemCreator@Fafard) Creating 50 new Semaphores, yielding and triggering a GC after each
 > [  500.0000] (1:SemCreator@Fafard) It worked, we survived. The test is passed.
-> [  500.0000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  500.0000] (0:maestro@) MSG_main finished; Terminating the simulation...
index 55aabb5..c10a19d 100644 (file)
@@ -9,4 +9,4 @@ $ java -classpath ${classpath:=.} sleephostoff.SleepHostOff ${srcdir:=.}/small_p
 > [  0.020000] (2:Sleeper@Tremblay) catch HostException: Host Failure 
 > [  0.020000] (1:TestRunner@Fafard) Tremblay has been stopped
 > [  0.320000] (1:TestRunner@Fafard) Test sleep seems ok, cool! (number of Process : 1, it should be 1 (i.e. the Test one))
-> [  0.320000] (0:maestro@) MSG_main finished; Cleaning up the simulation...
+> [  0.320000] (0:maestro@) MSG_main finished; Terminating the simulation...
index 8f0b5b2..9d311e5 100644 (file)
@@ -3,8 +3,8 @@
 /* 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 "simgrid/Exception.hpp"
 #include "simgrid/msg.h"
-#include <xbt/ex.hpp>
 
 #include <stdio.h> /* sscanf */
 
@@ -31,7 +31,7 @@ static int process_daemon(int /*argc*/, char** /*argv*/)
     MSG_task_destroy(task);
     tasks_done++;
     if (res == MSG_HOST_FAILURE) {
-      XBT_INFO("Host as died as expected, do nothing else");
+      XBT_INFO("Host has died as expected, do nothing else");
       return 0;
     }
   }
@@ -39,16 +39,6 @@ static int process_daemon(int /*argc*/, char** /*argv*/)
   return 0;
 }
 
-static int process_sleep(int /*argc*/, char** /*argv*/)
-{
-  for (;;) {
-    XBT_INFO("  I'm alive but I should sleep");
-    MSG_process_sleep(10);
-  }
-  XBT_INFO("  I'm done. See you!");
-  return 0;
-}
-
 static int commTX(int /*argc*/, char** /*argv*/)
 {
   const char* mailbox = "comm";
@@ -56,15 +46,9 @@ static int commTX(int /*argc*/, char** /*argv*/)
   msg_task_t task = MSG_task_create("COMM", 0, 100000000, NULL);
   MSG_task_dsend(task, mailbox, task_cleanup_handler);
   // We should wait a bit (if not the process will end before the communication, hence an exception on the other side).
-  try {
-    MSG_process_sleep(30);
-  } catch (xbt_ex& e) {
-    if (e.category == host_error) {
-      XBT_INFO("The host has died ... as expected.");
-    } else {
-      XBT_ERROR("An unexpected exception has been raised.");
-      throw;
-    }
+  int res = MSG_process_sleep(30);
+  if (res == MSG_HOST_FAILURE) {
+    XBT_INFO("The host has died ... as expected.");
   }
   XBT_INFO("  TX done");
   return 0;
@@ -140,17 +124,7 @@ static int test_launcher(int /*argc*/, char** /*argv*/)
   test = 3;
   // Create a process running sucessive sleeps on a host and turn the host off during the execution of the process.
   if (xbt_dynar_search_or_negative(tests, &test) != -1) {
-    XBT_INFO("Test 3:");
-    MSG_host_on(jupiter);
-    argvF    = xbt_new(char*, 2);
-    argvF[0] = xbt_strdup("process_sleep");
-    MSG_process_create_with_arguments("process_sleep", process_sleep, NULL, jupiter, 1, argvF);
-    MSG_process_sleep(100);
-    XBT_INFO("  Turn off");
-    MSG_host_off(jupiter);
-    XBT_INFO("  sleep for 10 seconds");
-    MSG_process_sleep(10000);
-    XBT_INFO("number of Process : %d it should be 1 (i.e. the Test one))", MSG_process_get_number());
+    xbt_die("Test 3 is superseeded by activity-lifecycle");
   }
 
   test = 4;
index f89a77e..8a8b212 100644 (file)
@@ -24,25 +24,6 @@ $ ${bindir}/host_on_off_processes ${platfdir}/small_platform.xml 2 --log=no_loc
 > [Tremblay:test_launcher:(1) 20.000000] [msg_test/INFO]   Test done. See you!
 > [20.000000] [msg_test/INFO] Simulation time 20
 
-$ ${bindir}/host_on_off_processes ${platfdir}/small_platform.xml 3 --log=no_loc
-> [Tremblay:test_launcher:(1) 0.000000] [msg_test/INFO] Test 3:
-> [Jupiter:process_sleep:(2) 0.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 10.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 20.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 30.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 40.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 50.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 60.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 70.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 80.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Jupiter:process_sleep:(2) 90.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Tremblay:test_launcher:(1) 100.000000] [msg_test/INFO]   Turn off
-> [Jupiter:process_sleep:(2) 100.000000] [msg_test/INFO]   I'm alive but I should sleep
-> [Tremblay:test_launcher:(1) 100.000000] [msg_test/INFO]   sleep for 10 seconds
-> [Tremblay:test_launcher:(1) 10100.000000] [msg_test/INFO] number of Process : 1 it should be 1 (i.e. the Test one))
-> [Tremblay:test_launcher:(1) 10100.000000] [msg_test/INFO]   Test done. See you!
-> [10100.000000] [msg_test/INFO] Simulation time 10100
-
 $ ${bindir}/host_on_off_processes ${platfdir}/small_platform.xml 4 --log=no_loc
 > [Tremblay:test_launcher:(1) 0.000000] [msg_test/INFO] Test 4 (turn off src during a communication) : Create a Process/task to make a communication between Jupiter and Tremblay and turn off Jupiter during the communication
 > [Tremblay:commRX:(2) 10.000000] [msg_test/INFO]   Start RX
@@ -51,8 +32,6 @@ $ ${bindir}/host_on_off_processes ${platfdir}/small_platform.xml 4 --log=no_loc
 > [Tremblay:test_launcher:(1) 20.000000] [msg_test/INFO]   Turn Jupiter off
 > [Tremblay:test_launcher:(1) 20.000000] [msg_test/INFO] Test 4 is ok.  (number of Process : 2, it should be 1 or 2 if RX has not been satisfied). An exception is raised when we turn off a node that has a process sleeping
 > [Tremblay:test_launcher:(1) 20.000000] [msg_test/INFO]   Test done. See you!
-> [Jupiter:commTX:(3) 20.000000] [msg_test/INFO] The host has died ... as expected.
-> [Jupiter:commTX:(3) 20.000000] [msg_test/INFO]   TX done
 > [Tremblay:commRX:(2) 20.000000] [msg_test/INFO]   Receive message: TRANSFER_FAILURE
 > [Tremblay:commRX:(2) 20.000000] [msg_test/INFO]   RX Done
 > [20.000000] [msg_test/INFO] Simulation time 20
@@ -87,7 +66,7 @@ $ ${bindir}/host_on_off_processes ${platfdir}/small_platform.xml 6 --log=no_loc
 > [Jupiter:process_daemonJUPI:(3) 9.000011] [msg_test/INFO]   Execute daemon
 > [Tremblay:test_launcher:(1) 10.000000] [msg_test/INFO]   Turn Jupiter off
 > [Tremblay:test_launcher:(1) 10.000000] [msg_test/INFO]   Shutdown vm0
-> [Jupiter:process_daemonJUPI:(3) 10.000000] [msg_test/INFO] Host as died as expected, do nothing else
+> [Jupiter:process_daemonJUPI:(3) 10.000000] [msg_test/INFO] Host has died as expected, do nothing else
 > [Tremblay:test_launcher:(1) 10.000000] [msg_test/INFO]   Destroy vm0
 > [Tremblay:test_launcher:(1) 10.000000] [msg_test/INFO] Test 6 is also weird: when the node Jupiter is turned off once again, the VM and its daemon are not killed. However, the issue regarding the shutdown of hosted VMs can be seen a feature not a bug ;)
 > [Tremblay:test_launcher:(1) 10.000000] [msg_test/INFO]   Test done. See you!
index 035e1f6..54f8831 100644 (file)
@@ -3,7 +3,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 <xbt/ex.hpp>
+#include "simgrid/Exception.hpp"
 #include "simgrid/msg.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
index 3971b80..841fb3d 100644 (file)
@@ -3,11 +3,9 @@
 /* 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/ex.hpp>
+#include "simgrid/Exception.hpp"
 #include "simgrid/msg.h"
 
-#include <stdio.h> /* snprintf */
-
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 static std::vector<msg_task_t> tasks = std::vector<msg_task_t>();
index a0eb9f6..3230f31 100644 (file)
@@ -1,7 +1,8 @@
 foreach(x actor actor-autorestart actor-migration
+        activity-lifecycle
         comm-pt2pt
         cloud-interrupt-migration
-        concurrent_rw storage_client_server host_on_off_wait listen_async pid )
+        concurrent_rw storage_client_server listen_async pid )
   add_executable       (${x}  ${x}/${x}.cpp)
   target_link_libraries(${x}  simgrid)
   set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -11,7 +12,9 @@ endforeach()
 
 ## Add the tests.
 ## Some need to be run with all factories, some need not tesh to run
-foreach(x actor actor-autorestart actor-migration cloud-interrupt-migration concurrent_rw) # TODO: actor-autorestart is disabled for now
+foreach(x actor actor-autorestart actor-migration 
+        activity-lifecycle
+       cloud-interrupt-migration concurrent_rw) # TODO: actor-autorestart is disabled for now
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
   ADD_TESH_FACTORIES(tesh-s4u-${x} "thread;ucontext;raw;boost" --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
 endforeach()
@@ -20,7 +23,7 @@ endforeach()
 set(tesh_files    ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/actor-autorestart/actor-autorestart.tesh)
 
 
-foreach(x host_on_off_wait listen_async pid storage_client_server)
+foreach(x listen_async pid storage_client_server)
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
   ADD_TESH(tesh-s4u-${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
 endforeach()
@@ -32,4 +35,4 @@ ADD_TEST(tesh-s4u-comm-pt2pt   ${CMAKE_BINARY_DIR}/teshsuite/s4u/comm-pt2pt/comm
 
 set(teshsuite_src ${teshsuite_src}  PARENT_SCOPE)
 set(tesh_files    ${tesh_files}     PARENT_SCOPE)
-set(xml_files     ${xml_files}      PARENT_SCOPE)
+set(xml_files     ${xml_files}      ${CMAKE_CURRENT_SOURCE_DIR}/activity-lifecycle/testing_platform.xml PARENT_SCOPE)
diff --git a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp
new file mode 100644 (file)
index 0000000..2fde68e
--- /dev/null
@@ -0,0 +1,234 @@
+/* Copyright (c) 2010-2018. 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 "simgrid/s4u.hpp"
+
+#include <cmath>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+std::vector<simgrid::s4u::Host*> all_hosts;
+
+/* Helper function easing the testing of actor's ending condition */
+static void assert_exit(int status, double duration)
+{
+  double expected_time = simgrid::s4u::Engine::get_clock() + duration;
+  simgrid::s4u::this_actor::on_exit(
+      [status, expected_time](int got_status, void* /*ignored*/) {
+        xbt_assert(status == got_status, "Exit status mismatch. Expected %d, got %d", status, got_status);
+        xbt_assert(std::fabs(expected_time - simgrid::s4u::Engine::get_clock()) < 0.001,
+                   "Exit time mismatch. Expected %f", expected_time);
+        XBT_VERB("Checks on exit successful");
+      },
+      nullptr);
+}
+/* Helper function in charge of running a test and doing some sanity checks afterward */
+static void run_test(const char* test_name, std::function<void()> test)
+{
+  simgrid::s4u::Actor::create(test_name, all_hosts[0], test);
+  simgrid::s4u::this_actor::sleep_for(10);
+
+  /* Check that no actor remain (but on host[0], where main_dispatcher lives */
+  for (unsigned int i = 0; i < all_hosts.size(); i++) {
+    std::vector<simgrid::s4u::ActorPtr> all_actors = all_hosts[i]->get_all_actors();
+    unsigned int expected_count = (i == 0) ? 1 : 0; // host[0] contains main_dispatcher, all other are empty
+    if (all_actors.size() != expected_count) {
+      XBT_CRITICAL("Host %s contains %zu actors but %u are expected (i=%u). Existing actors: ",
+                   all_hosts[i]->get_cname(), all_actors.size(), expected_count, i);
+      for (auto act : all_actors)
+        XBT_CRITICAL(" - %s", act->get_cname());
+      xbt_die("This is wrong");
+    }
+  }
+  xbt_assert("TODO: Check that all LMM are empty");
+  XBT_INFO("SUCCESS: %s", test_name);
+  XBT_INFO("#########################################################################################################");
+}
+
+/**
+ ** Each tests
+ **/
+
+static void test_sleep()
+{
+  XBT_INFO("%s: Launch a sleep(5), and let it proceed", __func__);
+  bool global = false;
+
+  simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5", all_hosts[1], [&global]() {
+    assert_exit(0, 5.);
+    simgrid::s4u::this_actor::sleep_for(5);
+    global = true;
+  });
+  simgrid::s4u::this_actor::sleep_for(10);
+  xbt_assert(global, "The forked actor did not modify the global after sleeping. Was it killed before?");
+}
+
+static void test_sleep_kill_middle()
+{
+  XBT_INFO("%s: Launch a sleep(5), and kill it after 2 secs", __func__);
+
+  simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_killed", all_hosts[1], []() {
+    assert_exit(1, 2);
+    simgrid::s4u::this_actor::sleep_for(5);
+    xbt_die("I should be dead now");
+  });
+
+  simgrid::s4u::this_actor::sleep_for(2);
+  sleeper5->kill();
+}
+
+static void test_sleep_kill_begin()
+{
+  XBT_INFO("%s: Launch a sleep(5), and kill it right after start", __func__);
+
+  simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_killed", all_hosts[1], []() {
+    assert_exit(1, 0);
+    simgrid::s4u::this_actor::sleep_for(5);
+    xbt_die("I should be dead now");
+  });
+
+  simgrid::s4u::this_actor::yield();
+  sleeper5->kill();
+}
+
+static void test_sleep_restart_begin()
+{
+  XBT_INFO("%s: Launch a sleep(5), and restart its host right after start", __func__);
+
+  simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], []() {
+    assert_exit(1, 0);
+    simgrid::s4u::this_actor::sleep_for(5);
+    xbt_die("I should be dead now");
+  });
+
+  simgrid::s4u::this_actor::yield();
+  sleeper5->get_host()->turn_off();
+  sleeper5->get_host()->turn_on();
+  XBT_INFO("Test %s is ending", __func__);
+}
+
+static void test_sleep_restart_middle()
+{
+  XBT_INFO("%s: Launch a sleep(5), and restart its host after 2 secs", __func__);
+
+  simgrid::s4u::ActorPtr sleeper5 = simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], []() {
+    assert_exit(1, 2);
+    simgrid::s4u::this_actor::sleep_for(5);
+    xbt_die("I should be dead now");
+  });
+
+  simgrid::s4u::this_actor::sleep_for(2);
+  sleeper5->get_host()->turn_off();
+  sleeper5->get_host()->turn_on();
+  XBT_INFO("Test %s is ending", __func__);
+}
+static void test_sleep_restart_end()
+{
+  XBT_INFO("%s: Launch a sleep(5), and restart its host right when it stops", __func__);
+  bool sleeper_done = false;
+
+  simgrid::s4u::Actor::create("sleep5_restarted", all_hosts[1], [&sleeper_done]() {
+    assert_exit(0, 5);
+    simgrid::s4u::this_actor::sleep_for(5);
+    sleeper_done = true;
+  });
+  simgrid::s4u::Actor::create("killer", all_hosts[0], []() {
+    simgrid::s4u::this_actor::sleep_for(5);
+    XBT_INFO("Killer!");
+    all_hosts[1]->turn_off();
+    all_hosts[1]->turn_on();
+  });
+  simgrid::s4u::this_actor::sleep_for(10);
+  xbt_assert(sleeper_done,
+             "Restarted actor was already dead in the scheduling round during which the host_off simcall was issued");
+}
+
+static void test_comm()
+{
+  XBT_INFO("%s: Launch a communication", __func__);
+  bool send_done = false;
+  bool recv_done = false;
+
+  simgrid::s4u::Actor::create("sender", all_hosts[1], [&send_done]() {
+    assert_exit(0, 5);
+    char* payload = xbt_strdup("toto");
+    simgrid::s4u::Mailbox::by_name("mb")->put(payload, 5000);
+    send_done = true;
+  });
+  simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() {
+    assert_exit(0, 5);
+    void* payload = simgrid::s4u::Mailbox::by_name("mb")->get();
+    xbt_free(payload);
+    recv_done = true;
+  });
+
+  simgrid::s4u::this_actor::sleep_for(10);
+  xbt_assert(send_done, "Sender killed somehow. It shouldn't");
+  xbt_assert(recv_done, "Receiver killed somehow. It shouldn't");
+}
+
+static void test_comm_killsend()
+{
+  XBT_INFO("%s: Launch a communication and kill the sender", __func__);
+  bool send_done = false;
+  bool recv_done = false;
+
+  simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[1], [&send_done]() {
+    assert_exit(1, 2);
+    char* payload = xbt_strdup("toto");
+    simgrid::s4u::Mailbox::by_name("mb")->put(payload, 5000);
+    send_done = true;
+  });
+  simgrid::s4u::Actor::create("receiver", all_hosts[2], [&recv_done]() {
+    assert_exit(0, 2);
+    bool got_exception = false;
+    try {
+      void* payload = simgrid::s4u::Mailbox::by_name("mb")->get();
+      xbt_free(payload);
+    } catch (simgrid::NetworkFailureException const&) {
+      got_exception = true;
+    }
+    xbt_assert(got_exception);
+    recv_done = true;
+  });
+
+  simgrid::s4u::this_actor::sleep_for(2);
+  sender->kill();
+
+  xbt_assert(not send_done, "Sender was not killed properly");
+  // xbt_assert(recv_done, "Receiver killed somehow. It shouldn't");
+}
+
+/* We need an extra actor here, so that it can sleep until the end of each test */
+static void main_dispatcher()
+{
+  run_test("sleep", test_sleep);
+  run_test("sleep killed at start", test_sleep_kill_begin);
+  run_test("sleep killed in middle", test_sleep_kill_middle);
+  /* We cannot kill right at the end of the action because killer actors are always rescheduled to the end of the round
+   * to avoid that they exit before their victim dereferences their name */
+  run_test("sleep restarted at start", test_sleep_restart_begin);
+  run_test("sleep restarted at middle", test_sleep_restart_middle);
+  run_test("sleep restarted at end", test_sleep_restart_end);
+
+  run_test("comm", test_comm);
+  // run_test("comm kill sender", test_comm_killsend);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 1);
+  e.load_platform(argv[1]);
+
+  all_hosts = e.get_all_hosts();
+  simgrid::s4u::Actor::create("main_dispatcher", all_hosts[0], main_dispatcher);
+
+  e.run();
+
+  XBT_INFO("Simulation done");
+
+  return 0;
+}
diff --git a/teshsuite/s4u/activity-lifecycle/activity-lifecycle.tesh b/teshsuite/s4u/activity-lifecycle/activity-lifecycle.tesh
new file mode 100644 (file)
index 0000000..19c6b73
--- /dev/null
@@ -0,0 +1,2 @@
+! output display
+$ ${bindir:=.}/activity-lifecycle ${srcdir:=.}/testing_platform.xml
diff --git a/teshsuite/s4u/activity-lifecycle/testing_platform.xml b/teshsuite/s4u/activity-lifecycle/testing_platform.xml
new file mode 100644 (file)
index 0000000..8da35d7
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
+  <config>
+    <prop id="network/crosstraffic" value="0"/> 
+    <prop id="network/model" value="CM02"/>
+  </config>
+  
+  <zone id="zone0" routing="Full">
+    <host id="host0" speed="100Mf"/>
+    <host id="host1" speed="100Mf"/>
+    <host id="host2" speed="100Mf"/>
+    
+    <link id="link1" bandwidth="1000" latency="0"/>
+    <route src="host1" dst="host2">
+      <link_ctn id="link1"/>
+    </route>
+  </zone>
+</platform>
+                 
\ No newline at end of file
index 47e132a..ecfaf8b 100644 (file)
@@ -4,7 +4,6 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "simgrid/s4u.hpp"
-#include <xbt/ex.hpp>
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
 
@@ -14,13 +13,8 @@ static void dummy()
   try {
     simgrid::s4u::this_actor::sleep_for(200);
     XBT_INFO("I stop");
-  } catch (xbt_ex& e) {
-    if (e.category == host_error) {
-      XBT_DEBUG("The host has died ... as expected. This actor silently stops");
-    } else {
-      XBT_ERROR("An unexpected exception has been raised.");
-      throw;
-    }
+  } catch (simgrid::HostFailureException& e) {
+    XBT_DEBUG("The host has died ... as expected. This actor silently stops");
   }
 }
 
index e2ecd26..a835b8c 100644 (file)
@@ -3,6 +3,6 @@ $ ./actor-autorestart ${platfdir}/small_platform.xml
 > [Fafard:Dummy:(2) 0.000000] [s4u_test/INFO] I start
 > [Tremblay:Autostart:(1) 50.000000] [s4u_test/INFO] powering off Fafard
 > [Tremblay:Autostart:(1) 60.000000] [s4u_test/INFO] powering on Fafard
-> [Fafard:Dummy:(2) 60.000000] [s4u_test/INFO] I start
-> [Fafard:Dummy:(2) 260.000000] [s4u_test/INFO] I stop
+> [Fafard:Dummy:(3) 60.000000] [s4u_test/INFO] I start
+> [Fafard:Dummy:(3) 260.000000] [s4u_test/INFO] I stop
 > [260.000000] [s4u_test/INFO] Simulation time 260
diff --git a/teshsuite/s4u/host_on_off_wait/host_on_off_wait.cpp b/teshsuite/s4u/host_on_off_wait/host_on_off_wait.cpp
deleted file mode 100644 (file)
index 0ee7ad1..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2010-2018. 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 "simgrid/s4u.hpp"
-#include <xbt/ex.hpp>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
-
-static void master()
-{
-  simgrid::s4u::Host* jupiter = simgrid::s4u::Host::by_name("Jupiter");
-  XBT_INFO("Master waiting");
-  simgrid::s4u::this_actor::sleep_for(1);
-
-  XBT_INFO("Turning off the worker host");
-  jupiter->turn_off();
-  XBT_INFO("Master has finished");
-}
-
-static void worker()
-{
-  XBT_INFO("Worker waiting");
-  try {
-    simgrid::s4u::this_actor::sleep_for(5);
-  } catch (xbt_ex& e) {
-    if (e.category == host_error) {
-      XBT_INFO("The host has died ... as expected.");
-    } else {
-      XBT_ERROR("An unexpected exception has been raised.");
-      throw;
-    }
-  }
-}
-
-int main(int argc, char* argv[])
-{
-  simgrid::s4u::Engine e(&argc, argv);
-  e.load_platform(argv[1]);
-
-  simgrid::s4u::Actor::create("master", simgrid::s4u::Host::by_name("Tremblay"), master);
-  simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Jupiter"), worker);
-
-  e.run();
-  XBT_INFO("Simulation time %g", e.get_clock());
-
-  return 0;
-}
diff --git a/teshsuite/s4u/host_on_off_wait/host_on_off_wait.tesh b/teshsuite/s4u/host_on_off_wait/host_on_off_wait.tesh
deleted file mode 100644 (file)
index d82c303..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-$ ./host_on_off_wait ${platfdir}/small_platform.xml
-> [Tremblay:master:(1) 0.000000] [s4u_test/INFO] Master waiting
-> [Jupiter:worker:(2) 0.000000] [s4u_test/INFO] Worker waiting
-> [Tremblay:master:(1) 1.000000] [s4u_test/INFO] Turning off the worker host
-> [Tremblay:master:(1) 1.000000] [s4u_test/INFO] Master has finished
-> [Jupiter:worker:(2) 1.000000] [s4u_test/INFO] The host has died ... as expected.
-> [1.000000] [s4u_test/INFO] Simulation time 1
index 97e081c..85bf920 100644 (file)
@@ -93,7 +93,7 @@ if(enable_smpi)
     ADD_TESH(tesh-smpi-coll-alltoallv-${ALLTOALLV} --cfg smpi/alltoallv:${ALLTOALLV} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-alltoallv --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/coll-alltoallv coll-alltoallv.tesh)
   endforeach()
 
-  foreach (BARRIER ompi mpich ompi_basic_linear ompi_tree ompi_bruck ompi_recursivedoubling ompi_doublering mvapich2_pair mvapich2 impi)
+  foreach (BARRIER ompi mpich mpich_smp ompi_basic_linear ompi_tree ompi_bruck ompi_recursivedoubling ompi_doublering mvapich2_pair mvapich2 impi)
       ADD_TESH(tesh-smpi-coll-barrier-${BARRIER} --cfg smpi/barrier:${BARRIER} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-barrier --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/coll-barrier coll-barrier.tesh)
   endforeach()
 
index b8b7762..2a4d8f9 100644 (file)
@@ -19,22 +19,22 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll
 > [rank 13] -> Ginette
 > [rank 14] -> Ginette
 > [rank 15] -> Ginette
-> [  0.427764] (8:7@Jupiter) The quickest allreduce was redbcast on rank 7 and took 0.007546
-> [  0.427764] (5:4@Jupiter) The quickest allreduce was redbcast on rank 4 and took 0.007485
-> [  0.427764] (7:6@Jupiter) The quickest allreduce was redbcast on rank 6 and took 0.007515
-> [  0.427764] (6:5@Jupiter) The quickest allreduce was redbcast on rank 5 and took 0.007515
-> [  0.427976] (14:13@Ginette) The quickest allreduce was mvapich2_two_level on rank 13 and took 0.007278
-> [  0.427976] (13:12@Ginette) The quickest allreduce was mvapich2_two_level on rank 12 and took 0.007247
-> [  0.427976] (16:15@Ginette) The quickest allreduce was ompi on rank 15 and took 0.007263
-> [  0.427976] (15:14@Ginette) The quickest allreduce was mvapich2_two_level on rank 14 and took 0.007278
-> [  0.429367] (2:1@Tremblay) The quickest allreduce was redbcast on rank 1 and took 0.006006
-> [  0.429367] (3:2@Tremblay) The quickest allreduce was redbcast on rank 2 and took 0.006006
-> [  0.429367] (4:3@Tremblay) The quickest allreduce was redbcast on rank 3 and took 0.006037
-> [  0.430519] (12:11@Fafard) The quickest allreduce was mvapich2_two_level on rank 11 and took 0.006523
-> [  0.430519] (10:9@Fafard) The quickest allreduce was mvapich2_two_level on rank 9 and took 0.006492
-> [  0.430519] (9:8@Fafard) The quickest allreduce was mvapich2_two_level on rank 8 and took 0.006462
-> [  0.430519] (11:10@Fafard) The quickest allreduce was mvapich2_two_level on rank 10 and took 0.006492
-> [  0.434504] (1:0@Tremblay) For rank 0, the quickest was redbcast : 0.005991 , but global was mvapich2_two_level : 0.008672 at max
+> [  0.475403] (5:4@Jupiter) The quickest allreduce was redbcast on rank 4 and took 0.007485
+> [  0.475403] (6:5@Jupiter) The quickest allreduce was redbcast on rank 5 and took 0.007515
+> [  0.475403] (7:6@Jupiter) The quickest allreduce was redbcast on rank 6 and took 0.007515
+> [  0.475403] (8:7@Jupiter) The quickest allreduce was redbcast on rank 7 and took 0.007546
+> [  0.475616] (13:12@Ginette) The quickest allreduce was mvapich2_two_level on rank 12 and took 0.007247
+> [  0.475616] (14:13@Ginette) The quickest allreduce was mvapich2_two_level on rank 13 and took 0.007278
+> [  0.475616] (15:14@Ginette) The quickest allreduce was mvapich2_two_level on rank 14 and took 0.007278
+> [  0.475616] (16:15@Ginette) The quickest allreduce was ompi on rank 15 and took 0.007263
+> [  0.477007] (2:1@Tremblay) The quickest allreduce was redbcast on rank 1 and took 0.006006
+> [  0.477007] (3:2@Tremblay) The quickest allreduce was redbcast on rank 2 and took 0.006006
+> [  0.477007] (4:3@Tremblay) The quickest allreduce was redbcast on rank 3 and took 0.006037
+> [  0.478158] (10:9@Fafard) The quickest allreduce was mvapich2_two_level on rank 9 and took 0.006492
+> [  0.478158] (11:10@Fafard) The quickest allreduce was mvapich2_two_level on rank 10 and took 0.006492
+> [  0.478158] (12:11@Fafard) The quickest allreduce was mvapich2_two_level on rank 11 and took 0.006523
+> [  0.478158] (9:8@Fafard) The quickest allreduce was mvapich2_two_level on rank 8 and took 0.006462
+> [  0.482143] (1:0@Tremblay) For rank 0, the quickest was redbcast : 0.005991 , but global was mvapich2_two_level : 0.008672 at max
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
index 6f8fa28..28f0ac7 100644 (file)
@@ -218,14 +218,14 @@ if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
   foreach (test ${umpire_tests_passing})
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30")
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display" APPEND)
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll-selector:mpich \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
+    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
   endforeach()
 
   foreach (test ${umpire_tests_deadlock} ${umpire_tests_problematic} )
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30"     )
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! expect return 3" APPEND)
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display"  APPEND)
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll-selector:mpich \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
+    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
   endforeach()
 endif()
 
index 8f14987..d21fe8b 100644 (file)
@@ -46,7 +46,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 1d09059..f2cf3aa 100644 (file)
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
     //  sleep (30);
 
@@ -66,7 +66,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
      // sleep (60);
 
index 67cef7d..b80362f 100644 (file)
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
     //  sleep (30);
 
@@ -66,7 +66,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
      // sleep (60);
 
index 63058b1..a81e4d6 100644 (file)
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       //sleep (30);
 
@@ -66,7 +66,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       //sleep (60);
 
index 562af09..d73cdb1 100644 (file)
@@ -46,7 +46,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
      // sleep (60);
 
@@ -56,7 +56,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 889cf38..248d208 100644 (file)
@@ -46,7 +46,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       //sleep (60);
 
index a68a158..1f9e86d 100644 (file)
@@ -51,7 +51,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -61,7 +61,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 0d3adfc..0ba01ea 100644 (file)
@@ -51,7 +51,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -61,7 +61,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 1f4c0cd..95390f7 100644 (file)
@@ -55,7 +55,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -65,7 +65,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
      // sleep (30);
 
index b43b516..fe8be22 100644 (file)
@@ -55,7 +55,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -65,7 +65,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
      // sleep (30);
 
index bc9bef9..67f15aa 100644 (file)
@@ -55,7 +55,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
  //     sleep (30);
 
@@ -67,7 +67,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 3dc1c19..6c6965f 100644 (file)
@@ -55,7 +55,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
  //     sleep (30);
 
@@ -67,7 +67,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 2cf5d54..3d3364c 100644 (file)
@@ -53,7 +53,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -63,7 +63,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 0d22808..14c4831 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
   //    sleep (30);
 
@@ -68,7 +68,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index b484939..3e08adf 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -66,7 +66,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
      // sleep (30);
 
index e6b990f..8841969 100644 (file)
@@ -41,8 +41,8 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
-      memset (buf1, 1, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index 1b91f58..c3f864c 100644 (file)
@@ -35,7 +35,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
@@ -46,7 +46,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
index bb3eda6..1ab9cf9 100644 (file)
@@ -35,7 +35,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
@@ -52,7 +52,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
index 5e2dc29..e267da2 100644 (file)
@@ -51,7 +51,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -61,7 +61,7 @@ main (int argc, char **argv)
     {
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 2, MPI_COMM_WORLD, statuses);
 
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 4619532..7fd9113 100644 (file)
@@ -49,7 +49,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index 7fcd71d..e0bb126 100644 (file)
@@ -49,7 +49,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index 008c740..50509a6 100644 (file)
@@ -50,7 +50,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Recv (buf1, buf_size, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
 
index 8b34559..c6b2e60 100644 (file)
@@ -50,7 +50,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index 145f900..61a7d12 100644 (file)
@@ -51,14 +51,14 @@ main (int argc, char **argv)
 
       if (dnprocs > 1) {
        if (drank == 0) {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        }
        else if (drank == 1) {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index 0e15d1f..902fad2 100644 (file)
@@ -64,14 +64,14 @@ main (int argc, char **argv)
 
       if (dnprocs > 1) {
        if (drank == 0) {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        }
        else if (drank == 1) {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index 0c75f1f..0bcb22d 100644 (file)
@@ -56,14 +56,14 @@ main (int argc, char **argv)
 
       if (dnprocs > 1) {
        if (drank == 0) {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        }
        else if (drank == 1) {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index c115c5a..a4a8b7c 100644 (file)
@@ -36,14 +36,14 @@ main (int argc, char **argv)
     MPI_Comm_dup (MPI_COMM_WORLD, &comm);
 
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
 
       MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index 17ce7e5..e6551cb 100644 (file)
@@ -42,14 +42,14 @@ main (int argc, char **argv)
 
       if (dnprocs > 1) {
        if (drank == 0) {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        }
        else if (drank == 1) {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index c800ba6..fe3df2b 100644 (file)
@@ -48,14 +48,14 @@ main (int argc, char **argv)
 
       if (dnprocs > 1) {
        if (drank == 0) {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        }
        else if (drank == 1) {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index f3a345e..c04617d 100644 (file)
@@ -54,14 +54,14 @@ main (int argc, char **argv)
 
        if (rnprocs > drank) {
          if (rank % 2) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, drank, 0, intercomm, &status);
 
            MPI_Send (buf1, buf_size, MPI_INT, drank, 0, intercomm);
          }
          else {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Recv (buf1, buf_size, MPI_INT, drank, 0, intercomm, &status);
        
index 587569c..6054a7d 100644 (file)
@@ -64,14 +64,14 @@ main (int argc, char **argv)
 
        if (dnprocs > 1) {
          if (drank == 0) {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, comm, &status);
        
            MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
          }
          else if (drank == 1) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
index 60a3f6b..b9a5840 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
 
@@ -42,7 +42,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 
index 6798490..6b90e86 100644 (file)
@@ -24,13 +24,13 @@ main (int argc, char **argv)
   fflush (stdout);
 
   if (rank == 0) {
-    memset (buf0, 0, buf_size);
+    memset (buf0, 0, buf_size*sizeof(int));
     MPI_Bcast (buf0, buf_size, MPI_INT, 1, MPI_COMM_WORLD);    
     MPI_Bcast (buf0, buf_size, MPI_INT, 0, MPI_COMM_WORLD);    
   }
   else {
     if (rank == 1)
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
     MPI_Bcast (buf0, buf_size, MPI_INT, 0, MPI_COMM_WORLD);    
     MPI_Bcast (buf0, buf_size, MPI_INT, 1, MPI_COMM_WORLD);    
index 66d774b..67fc379 100644 (file)
@@ -32,8 +32,8 @@ main (int argc, char **argv)
   printf ("(%d) is alive on %s\n", rank, processor_name);
   fflush (stdout);
 
-  memset (sbuf, 0, buf_size);
-  memset (rbuf, 1, buf_size);
+  memset (sbuf, 0, buf_size*sizeof(int));
+  memset (rbuf, 1, buf_size*sizeof(int));
 
   MPI_Barrier (comm);
 
index 4cade73..ab6f32c 100644 (file)
@@ -32,8 +32,8 @@ main (int argc, char **argv)
   printf ("(%d) is alive on %s\n", rank, processor_name);
   fflush (stdout);
 
-  memset (buf0, 0, buf_size);
-  memset (buf1, 1, buf_size);
+  memset (buf0, 0, buf_size*sizeof(int));
+  memset (buf1, 1, buf_size*sizeof(int));
 
   MPI_Barrier (comm);
   MPI_Barrier (comm);
index a6da78d..69e7790 100644 (file)
@@ -32,8 +32,8 @@ main (int argc, char **argv)
   printf ("(%d) is alive on %s\n", rank, processor_name);
   fflush (stdout);
 
-  memset (buf0, 0, buf_size);
-  memset (buf1, 1, buf_size);
+  memset (buf0, 0, buf_size*sizeof(int));
+  memset (buf1, 1, buf_size*sizeof(int));
 
   MPI_Barrier (comm);
   MPI_Barrier (comm);
index 6981e60..47c383a 100644 (file)
@@ -35,7 +35,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       zero_to_two = 1;
 
@@ -47,7 +47,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 
index 80bc5b3..2e3278e 100644 (file)
@@ -39,7 +39,7 @@ main (int argc, char **argv)
   else if ((rank == 1) && (its_raining))
     {
       /* This code is never executed... */
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 5f05b58..9165e0d 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
 
       if (tnprocs > 1) {
        if (trank == 0) {       
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
        
          MPI_Send (buf0, buf_size, MPI_INT, 1, 0, temp);
        }
@@ -74,14 +74,14 @@ main (int argc, char **argv)
 
        if (rnprocs > drank) {
          if (rank % 2) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, drank, 0, intercomm, &status);
 
            MPI_Send (buf1, buf_size, MPI_INT, drank, 0, intercomm);
          }
          else {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Send (buf0, buf_size, MPI_INT, drank, 0, intercomm);
        
index 3dbfc76..fe6411e 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
                            INTERCOMM_CREATE_TAG, &intercomm);
 
       if ((trank == 0) && !(rank % 2)) {
-       memset (buf0, 0, buf_size);
+       memset (buf0, 0, buf_size*sizeof(int));
        
        MPI_Send (buf0, buf_size, MPI_INT, 1, 0, temp);
       }
@@ -73,14 +73,14 @@ main (int argc, char **argv)
 
        if (rnprocs > drank) {
          if (rank % 2) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, drank, 0, intercomm, &status);
 
            MPI_Send (buf1, buf_size, MPI_INT, drank, 0, intercomm);
          }
          else {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Send (buf0, buf_size, MPI_INT, drank, 0, intercomm);
        
index 908b887..663ded7 100644 (file)
@@ -55,7 +55,7 @@ main (int argc, char **argv)
                            INTERCOMM_CREATE_TAG, &intercomm);
 
       if (rank == 0) {
-       memset (buf0, 0, buf_size);
+       memset (buf0, 0, buf_size*sizeof(int));
        
        MPI_Send (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD);
       }
@@ -69,14 +69,14 @@ main (int argc, char **argv)
 
        if (rnprocs > drank) {
          if (rank % 2) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, drank, 0, intercomm, &status);
 
            MPI_Send (buf1, buf_size, MPI_INT, drank, 0, intercomm);
          }
          else {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Send (buf0, buf_size, MPI_INT, drank, 0, intercomm);
        
index c84e94f..25a53b5 100644 (file)
@@ -58,12 +58,12 @@ main (int argc, char **argv)
                            INTERCOMM_CREATE_TAG, &intercomm);
 
       if (rank == 2) {
-       memset (buf0, 0, buf_size);
+       memset (buf0, 0, buf_size*sizeof(int));
        
        MPI_Send (buf0, buf_size, MPI_INT, rleader, 0, MPI_COMM_WORLD);
       }
       else if (rank == 1) {
-       memset (buf0, 0, buf_size);
+       memset (buf0, 0, buf_size*sizeof(int));
        
        MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
       }
@@ -77,14 +77,14 @@ main (int argc, char **argv)
 
        if (rnprocs > drank) {
          if (rank % 2) {
-           memset (buf1, 1, buf_size);
+           memset (buf1, 1, buf_size*sizeof(int));
 
            MPI_Recv (buf0, buf_size, MPI_INT, drank, 0, intercomm, &status);
 
            MPI_Send (buf1, buf_size, MPI_INT, drank, 0, intercomm);
          }
          else {
-           memset (buf0, 0, buf_size);
+           memset (buf0, 0, buf_size*sizeof(int));
        
            MPI_Send (buf0, buf_size, MPI_INT, drank, 0, intercomm);
        
index f6dfc56..aeb4993 100644 (file)
@@ -79,14 +79,14 @@ main (int argc, char **argv)
 
              if (dnprocs > 1) {
                if (drank == 1) {
-                 memset (buf1, 1, buf_size);
+                 memset (buf1, 1, buf_size*sizeof(int));
 
                  MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm, &status);
 
                  MPI_Send (buf1, buf_size, MPI_INT, 0, 0, comm);
                }
                else if (drank == 0) {
-                 memset (buf0, 0, buf_size);
+                 memset (buf0, 0, buf_size*sizeof(int));
        
                  MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm);
        
@@ -102,14 +102,14 @@ main (int argc, char **argv)
 
              if (dnprocs > 1) {
                if (drank == 1) {
-                 memset (buf1, 1, buf_size);
+                 memset (buf1, 1, buf_size*sizeof(int));
 
                  MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, comm2, &status);
 
                  MPI_Send (buf1, buf_size, MPI_INT, 0, 0, comm2);
                }
                else if (drank == 0) {
-                 memset (buf0, 0, buf_size);
+                 memset (buf0, 0, buf_size*sizeof(int));
        
                  MPI_Send (buf0, buf_size, MPI_INT, 1, 0, comm2);
        
index a4ab3d0..d9a51a1 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
     {
       int dest = (rank == nprocs - 1) ? (0) : (rank + 1);
       int src = (rank == 0) ? (nprocs - 1) : (rank - 1);
-      memset (buf0, rank, buf_size);
+      memset (buf0, rank, buf_size*sizeof(int));
       MPI_Irecv (buf0, buf_size, MPI_INT, src, 0, MPI_COMM_WORLD, &req);
       MPI_Wait(&req,&status);
       MPI_Send (buf0, buf_size, MPI_INT, dest, 0, MPI_COMM_WORLD);
index a0a2bd4..6852086 100644 (file)
@@ -38,8 +38,8 @@ main (int argc, char **argv)
     {
       int dest = (rank == nprocs - 1) ? (0) : (rank + 1);
       int src = (rank == 0) ? (nprocs - 1) : (rank - 1);
-      memset (buf0, rank, buf_size);
-      memset (buf1, rank, buf_size);
+      memset (buf0, rank, buf_size*sizeof(int));
+      memset (buf1, rank, buf_size*sizeof(int));
       MPI_Irecv (buf0, buf_size, MPI_INT, src, 0, MPI_COMM_WORLD, &req1);
       MPI_Isend (buf1, buf_size, MPI_INT, dest, 0, MPI_COMM_WORLD, &req2);
       MPI_Wait(&req2,&status);
index b5f60b2..1b8d511 100644 (file)
@@ -40,8 +40,8 @@ main (int argc, char **argv)
     {
       int dest = (rank == nprocs - 1) ? (0) : (rank + 1);
       int src = (rank == 0) ? (nprocs - 1) : (rank - 1);
-      memset (buf0, rank, buf_size);
-      memset (buf1, rank, buf_size);
+      memset (buf0, rank, buf_size*sizeof(int));
+      memset (buf1, rank, buf_size*sizeof(int));
 
       for (i = 0; i < req_count; i++) {
        MPI_Irecv (buf0, buf_size, MPI_INT, src, 0, MPI_COMM_WORLD, &req1);
index 9eee182..58976d3 100644 (file)
@@ -50,8 +50,8 @@ main (int argc, char **argv)
   printf ("(%d) is alive on %s\n", rank, processor_name);
   fflush (stdout);
 
-  memset (buf0, 0, buf_size);
-  memset (buf1, 1, buf_size);
+  memset (buf0, 0, buf_size*sizeof(int));
+  memset (buf1, 1, buf_size*sizeof(int));
 
   /* 0 sends 1 two messages, but the request gets overwritten */
   switch (rank)
index 8baabb5..840c5db 100644 (file)
@@ -47,8 +47,8 @@ main (int argc, char **argv)
   printf ("(%d) is alive on %s\n", rank, processor_name);
   fflush (stdout);
 
-  memset (buf0, 1, buf_size);
-  memset (buf1, 2, buf_size);
+  memset (buf0, 1, buf_size*sizeof(int));
+  memset (buf1, 2, buf_size*sizeof(int));
 
   MPI_Barrier(MPI_COMM_WORLD);
 
index 3be717c..ef8b4dd 100644 (file)
@@ -51,7 +51,7 @@ main (int argc, char **argv)
     {
     case 0:
       for (i = 0; i < ITERATIONS; i++) {
-       memset (buf, 1, buf_size * REQS_PER_ITERATION);
+       memset (buf, 1, buf_size*sizeof(int) * REQS_PER_ITERATION);
 
        for (j = 0; j < REQS_PER_ITERATION; j++) {
          MPI_Isend (&buf[j*buf_size], buf_size, MPI_INT,
@@ -65,7 +65,7 @@ main (int argc, char **argv)
 
     case 1:
       for (i = 0; i < ITERATIONS; i++) {
-       memset (buf, 2, buf_size * REQS_PER_ITERATION);
+       memset (buf, 2, buf_size*sizeof(int) * REQS_PER_ITERATION);
 
        for (j = 0; j < REQS_PER_ITERATION; j++) {
          MPI_Irecv (&buf[j*buf_size], buf_size, MPI_INT,
index 3d408f6..107b0fc 100644 (file)
@@ -39,7 +39,7 @@ main (int argc, char **argv)
       }
     }
     else {
-      memset (buf, 1, buf_size);
+      memset (buf, 1, buf_size*sizeof(int));
 
       MPI_Send (buf, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index 4f64a27..daef65f 100644 (file)
@@ -233,7 +233,7 @@ main (int argc, char **argv)
          }
        }
        else {
-         memset (buf, 1, buf_size);
+         memset (buf, 1, buf_size*sizeof(int));
 
          MPI_Send (buf, buf_size, MPI_INT, 0, 0, dcomms[i]);
        }
@@ -249,7 +249,7 @@ main (int argc, char **argv)
     }
     else if ((rank % 3) == 2) {
       for (j = 0; j < intersize; j++) {
-       memset (buf, 1, buf_size);
+       memset (buf, 1, buf_size*sizeof(int));
 
        MPI_Send (buf, buf_size, MPI_INT, j, 0, intercomm);
       }
@@ -273,7 +273,7 @@ main (int argc, char **argv)
          }
        }
        else {
-         memset (buf, 1, buf_size);
+         memset (buf, 1, buf_size*sizeof(int));
 
          MPI_Send (buf, buf_size, MPI_INT, 0, 0, dcomms[i]);
        }
@@ -290,7 +290,7 @@ main (int argc, char **argv)
     }
     else if ((rank % 3) == 2) {
       for (j = 0; j < intersize; j++) {
-       memset (buf, 1, buf_size);
+       memset (buf, 1, buf_size*sizeof(int));
 
        MPI_Send (buf, buf_size, MPI_INT, j, 0, intercomm);
       }
index 05b03c8..8622177 100644 (file)
@@ -35,7 +35,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &req);
 
@@ -46,7 +46,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &req);
 
index 3f497c5..9d8c31d 100644 (file)
@@ -47,7 +47,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index f7924fd..01acc80 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       for (i = 3; i > 0; i--) {
        MPI_Recv (&flipbit, 1, MPI_INT, 0, i, MPI_COMM_WORLD, &status);
index 0ab83aa..ee2e2ae 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
@@ -45,7 +45,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
index 59ed5d0..de167a3 100644 (file)
@@ -43,8 +43,8 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
-      memset (buf1, 1, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index 7d17a6c..eedca26 100644 (file)
@@ -41,7 +41,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
        MPI_Irecv (buf1, buf_size, MPI_INT,
                 MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &req);
index d76749f..52b39a1 100644 (file)
@@ -49,7 +49,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index 0f9d331..057523c 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &req);
 
@@ -44,7 +44,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &req);
 
index 2318a95..1744416 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &req);
 
@@ -48,7 +48,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &req);
 
index 2c7f144..d3125b3 100644 (file)
@@ -57,7 +57,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -65,7 +65,7 @@ main (int argc, char **argv)
     }
   else if (rank == 2)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index 56c7e6c..b886746 100644 (file)
@@ -47,7 +47,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index 835d2a5..53e9785 100644 (file)
@@ -49,7 +49,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index b1def37..d341c7e 100644 (file)
@@ -47,7 +47,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index d8a7e89..dcfc430 100644 (file)
@@ -56,7 +56,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       for (i = 3; i > 0; i--) {
        MPI_Recv (&flipbit, 1, MPI_INT,
index 4a64b34..f4b58f0 100644 (file)
@@ -61,7 +61,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
@@ -71,7 +71,7 @@ main (int argc, char **argv)
     {
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
 
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
index a9e522b..21defbc 100644 (file)
@@ -50,7 +50,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index 20ff43c..6f90c53 100644 (file)
@@ -53,7 +53,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       for (i = 3; i > 0; i--) {
        MPI_Recv (&flipbit, 1, MPI_INT, 0, i, MPI_COMM_WORLD, &status);
index 7de46f9..fad99ca 100644 (file)
@@ -66,7 +66,7 @@ printf ("Done = %d\n", done);
     }
   else if (rank == 1)
     {
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       for (i = 3; i >= 0; i--) {
        MPI_Recv (&flipbit, 1, MPI_INT, 0, i, MPI_COMM_WORLD, &status);
index a78e7fe..0891d52 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
     {
       if (rank == 0)
        {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Sendrecv (buf0, buf_size, MPI_INT, 1, 0,
                        buf1, buf_size, MPI_INT, 1, 0,
@@ -52,7 +52,7 @@ main (int argc, char **argv)
        {
          if (rank == 1)
            {
-             memset (buf1, 1, buf_size);
+             memset (buf1, 1, buf_size*sizeof(int));
 
              MPI_Sendrecv (buf1, buf_size, MPI_INT, 0, 0,
                            buf0, buf_size, MPI_INT, 0, 0,
index 659c1c2..a323019 100644 (file)
@@ -31,17 +31,17 @@ main (int argc, char **argv)
   src = (rank + 1) % nprocs;
   dest = (rank - 1 + nprocs) % nprocs;
 
-  memset (buf0, 0, buf_size);
+  memset (buf0, 0, buf_size*sizeof(int));
 
   MPI_Sendrecv (buf0, buf_size, MPI_INT, dest, 0,
                buf1, buf_size, MPI_INT, src, 0, MPI_COMM_WORLD, &status);
 
-  memset (buf1, 1, buf_size);
+  memset (buf1, 1, buf_size*sizeof(int));
 
   MPI_Sendrecv (buf1, buf_size, MPI_INT, src, 0,
                buf0, buf_size, MPI_INT, dest, 0, MPI_COMM_WORLD, &status);
 
-  memset (buf0, 0, buf_size);
+  memset (buf0, 0, buf_size*sizeof(int));
 
   MPI_Sendrecv (buf0, buf_size, MPI_INT, dest, 0,
                buf1, buf_size, MPI_INT, src, 0, MPI_COMM_WORLD, &status);
index c3ba9bb..3562abd 100644 (file)
@@ -33,14 +33,14 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Sendrecv (buf0, buf_size, MPI_INT, 1, 0,
                    buf1, buf_size, MPI_INT, MPI_ANY_SOURCE, 0,
                    MPI_COMM_WORLD, &status);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv (buf0, buf_size, MPI_INT,
                MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
index 30e6e11..2ed4e13 100644 (file)
@@ -33,14 +33,14 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Sendrecv (buf0, buf_size, MPI_INT, 1, 0,
                    buf1, buf_size, MPI_INT, 1, 0,
                    MPI_COMM_WORLD, &status);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 
index ecadd93..c0ab9fc 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT,
@@ -47,13 +47,13 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT,
                     MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &aReq[0]);
@@ -64,7 +64,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
       MPI_Waitall (2, aReq, aStatus);
index c962cca..a1a2593 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -46,14 +46,14 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Send_init (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -63,7 +63,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
index ea4c12b..49c2795 100644 (file)
@@ -38,7 +38,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -48,7 +48,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
@@ -59,7 +59,7 @@ main (int argc, char **argv)
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Send_init (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -69,7 +69,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
index 6b34a58..9dd14e7 100644 (file)
@@ -37,7 +37,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -47,11 +47,11 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       /* activate a request twice */
       MPI_Start (&aReq[0]);
@@ -59,7 +59,7 @@ main (int argc, char **argv)
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Send_init (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -69,7 +69,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
index 100d58a..569f274 100644 (file)
@@ -39,7 +39,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -49,7 +49,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
@@ -60,7 +60,7 @@ main (int argc, char **argv)
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Send_init (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -70,7 +70,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
index 131a823..c3f82aa 100644 (file)
@@ -40,7 +40,7 @@ main (int argc, char **argv)
   }
   else {
     if (rank == 0) {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Send_init (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Recv_init (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -50,14 +50,14 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
       MPI_Waitall (2, aReq, aStatus);
     }
     else if (rank == 1) {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Recv_init (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[0]);
       MPI_Send_init (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &aReq[1]);
@@ -67,7 +67,7 @@ main (int argc, char **argv)
 
       MPI_Waitall (2, aReq, aStatus);
 
-      memset (buf1, 0, buf_size);
+      memset (buf1, 0, buf_size*sizeof(int));
 
       MPI_Startall (2, aReq);
 
index c85f143..e4325fb 100644 (file)
@@ -32,14 +32,14 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
       MPI_Send (buf0, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD);
       MPI_Recv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
     }
   else if (rank == 1)
     {
       MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
       MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
     }
 
index 1f8f98f..8c91f27 100644 (file)
@@ -36,7 +36,7 @@ main (int argc, char **argv)
     {
       if (rank == 0)
        {
-         memset (buf0, 0, buf_size);
+         memset (buf0, 0, buf_size*sizeof(int));
 
          MPI_Sendrecv (buf0, buf_size, MPI_INT, 1, 0,
                        buf1, buf_size, MPI_INT, 1, 0,
@@ -46,7 +46,7 @@ main (int argc, char **argv)
        }
       else if (rank == 1)
        {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Recv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 
@@ -56,7 +56,7 @@ main (int argc, char **argv)
        }
       else if (rank == 2)
        {
-         memset (buf1, 1, buf_size);
+         memset (buf1, 1, buf_size*sizeof(int));
 
          MPI_Send (buf1, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD);
 
index e528524..288be7c 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
     }
   else if (rank == 0)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Irecv (buf1, buf_size, MPI_INT, 1, 0, MPI_COMM_WORLD, &req);
 
@@ -44,7 +44,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf1, 1, buf_size);
+      memset (buf1, 1, buf_size*sizeof(int));
 
       MPI_Irecv (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &req);
 
index 5cf0a88..be2a1e0 100644 (file)
@@ -47,7 +47,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 0, buf_size);
+      memset (buf0, 0, buf_size*sizeof(int));
 
       MPI_Isend (buf0, buf_size, MPI_INT, 0, 0, MPI_COMM_WORLD, &reqs[0]);
 
index 76dcb1b..403ffb1 100644 (file)
@@ -54,7 +54,7 @@ main (int argc, char **argv)
     }
   else if (rank == 1)
     {
-      memset (buf0, 1, buf_size);
+      memset (buf0, 1, buf_size*sizeof(int));
 
       for (i = 3; i > 0; i--) {
        MPI_Recv (&flipbit, 1, MPI_INT, 0, i, MPI_COMM_WORLD, &status);
index 92448d1..eb782b8 100644 (file)
@@ -1,4 +1,4 @@
 p Test timers
-$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 1 ${bindir:=.}/timers -q --log=smpi_kernel.thres:warning --cfg=smpi/simulate-computation:no --cfg=smpi/host-speed:100000 --log=xbt_cfg.thres:warning
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 1 ${bindir:=.}/timers -q --log=smpi_kernel.thres:warning --cfg=smpi/simulate-computation:no --cfg=smpi/host-speed:100000 --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
 > [rank 0] -> Tremblay
 
index 5c9d4be..1d2eeae 100644 (file)
@@ -1,11 +1,12 @@
-/* Copyright (c) 2012-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2012-2018. 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/mmalloc.h"
+#include "simgrid/Exception.hpp"
 #include "xbt.h"
+#include "xbt/mmalloc.h"
+
 #include <cassert>
 #include <cstdio>
 #include <cstdlib>
@@ -14,8 +15,6 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <xbt/ex.hpp>
-
 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"this test");
 
 #define BUFFSIZE 204800
index bd9de44..cf18211 100644 (file)
@@ -173,6 +173,7 @@ set(SMPI_SRC
   src/smpi/colls/alltoallv/alltoallv-ring.cpp
   src/smpi/colls/barrier/barrier-ompi.cpp
   src/smpi/colls/barrier/barrier-mvapich2-pair.cpp
+  src/smpi/colls/barrier/barrier-mpich-smp.cpp
   src/smpi/colls/bcast/bcast-NTSB.cpp
   src/smpi/colls/bcast/bcast-NTSL-Isend.cpp
   src/smpi/colls/bcast/bcast-NTSL.cpp
@@ -275,7 +276,6 @@ set(XBT_SRC
   src/xbt/dict_cursor.c
   src/xbt/dict_elm.c
   src/xbt/dynar.cpp
-  src/xbt/ex.cpp
   src/xbt/exception.cpp
   src/xbt/graph.c
   src/xbt/log.c
@@ -670,6 +670,7 @@ set(headers_to_install
   include/simgrid/actor.h
   include/simgrid/barrier.h
   include/simgrid/engine.h
+  include/simgrid/Exception.hpp
   include/simgrid/chrono.hpp
   include/simgrid/plugins/dvfs.h
   include/simgrid/plugins/energy.h
@@ -749,8 +750,6 @@ set(headers_to_install
   include/xbt/dict.h
   include/xbt/dynar.h
   include/xbt/ex.h
-  include/xbt/ex.hpp
-  include/xbt/exception.hpp
   include/xbt/Extendable.hpp
   include/xbt/file.hpp
   include/xbt/functional.hpp
@@ -874,11 +873,9 @@ set(DOC_SOURCES
   doc/triva-time_interval.svg
 
   doc/doxygen/FAQ.doc
-  doc/doxygen/application.doc
   doc/doxygen/community.doc
   doc/doxygen/deployment.doc
   doc/doxygen/footer.html
-  doc/doxygen/getting_started.doc
   doc/doxygen/header.html
   doc/doxygen/howtos.doc
   doc/doxygen/index.doc
@@ -891,10 +888,7 @@ set(DOC_SOURCES
   doc/doxygen/install.doc
   doc/doxygen/install_yours.doc
   doc/doxygen/java.doc
-  doc/tuto-msg/tuto-msg.doc
-  doc/tuto-msg/overview.svg
   doc/doxygen/tutorial_smpi.doc
-  doc/doxygen/models.doc
   doc/doxygen/module-msg.doc
   doc/doxygen/module-s4u.doc
   doc/doxygen/module-sd.doc
@@ -912,7 +906,6 @@ set(DOC_SOURCES
   doc/doxygen/outcomes_vizu.doc
   doc/doxygen/platform.doc
   doc/doxygen/platform_lua.doc
-  doc/doxygen/scenario.doc
   doc/doxygen/stylesheet.css
   doc/doxygen/uhood.doc
   doc/doxygen/uhood_switch.doc
@@ -925,17 +918,44 @@ set(DOC_SOURCES
   doc/manpage/smpirun.1
   doc/manpage/tesh.pod
 
-  doc/tuto-msg/deployment0.xml
-  doc/tuto-msg/deployment1.xml
-  doc/tuto-msg/deployment2.xml
-  doc/tuto-msg/deployment3.xml
-  doc/tuto-msg/deployment_general.xml
-  doc/tuto-msg/Makefile
-  doc/tuto-msg/masterworker.c
-  doc/tuto-msg/masterworker-sol1.c
-  doc/tuto-msg/masterworker-sol2.c
-  doc/tuto-msg/masterworker-sol3.c
-  doc/tuto-msg/masterworker-sol4.c
+  docs/Build.sh
+  docs/requirements.txt
+  docs/source/conf.py
+  docs/source/Doxyfile
+
+  docs/source/img/eclipseScreenShot.png
+  docs/source/img/extlink.png
+  docs/source/img/extlink.svg
+  docs/source/img/graphical-toc.svg
+
+  docs/source/application.rst
+  docs/source/app_s4u.rst
+  docs/source/index.rst
+  docs/source/intro_concepts.rst
+  docs/source/introduction.rst
+  docs/source/intro_install.rst
+  docs/source/intro_yours.rst
+  docs/source/main_concepts.rst
+  docs/source/models.rst
+  docs/source/platform.rst
+  docs/source/scenar_config.rst
+  docs/source/scenario.rst
+
+  docs/source/tuto_s4u.rst
+  docs/source/tuto_s4u/deployment1.xml
+  docs/source/tuto_s4u/deployment2.xml
+  docs/source/tuto_s4u/deployment3.xml
+  docs/source/tuto_s4u/deployment4.xml
+  docs/source/tuto_s4u/draw_gantt.R
+  docs/source/tuto_s4u/img/intro.svg
+  docs/source/tuto_s4u/img/question.svg
+  docs/source/tuto_s4u/img/result.png
+  docs/source/tuto_s4u/img/Rscript-screenshot.png
+  docs/source/tuto_s4u/img/vite-screenshot.png
+  docs/source/tuto_s4u/master-workers-lab1.cpp
+  docs/source/tuto_s4u/master-workers-lab2.cpp
+  docs/source/tuto_s4u/master-workers-lab3.cpp
+  docs/source/tuto_s4u/master-workers-lab4.cpp
 
   CITATION.bib
   )
index 24b8b07..1a92e35 100644 (file)
@@ -134,7 +134,7 @@ if(CMAKE_COMPILER_IS_GNUCC AND GCCLIBATOMIC_LIBRARY)
     set(SIMGRID_DEP   "${SIMGRID_DEP}   -Wl,--as-needed -latomic -Wl,--no-as-needed")
 endif()
 
-if(enable_model-checking AND CMAKE_COMPILER_IS_GNUCC AND (NOT LINKER_VERSION VERSION_LESS "2.30"))
+if(enable_model-checking AND (NOT LINKER_VERSION VERSION_LESS "2.30"))
     set(SIMGRID_DEP   "${SIMGRID_DEP}   -Wl,-znoseparate-code")
 endif()
 
index f6f0e47..0f2c6a0 100644 (file)
@@ -143,26 +143,3 @@ if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
 else()
   set(EXTRA_DIST       ${EXTRA_DIST}       src/surf/trace_mgr_test.cpp)
 endif()
-
-# Also test the tutorial, unless under Sanitizer or memcheck
-if((NOT enable_memcheck) AND (NOT enable_address_sanitizer) AND (NOT enable_undefined_sanitizer) AND (NOT enable_thread_sanitizer))
-  FILE(COPY doc/tuto-msg DESTINATION doc FILES_MATCHING PATTERN "Makefile" PATTERN "*.c")
-  set(tuto-src-path "${CMAKE_SOURCE_DIR}/doc/tuto-msg")
-  set(tuto-bin-path "${CMAKE_BINARY_DIR}/doc/tuto-msg")
-  set(tuto-platform-file "${CMAKE_SOURCE_DIR}/examples/platforms/small_platform.xml")
-  set(tuto-make "make -C ${tuto-bin-path} CC=${CMAKE_C_COMPILER} EXTRA_CFLAGS=\"-I${CMAKE_SOURCE_DIR}/include -I${CMAKE_BINARY_DIR}/include -L${CMAKE_BINARY_DIR}/lib -Wl,-rpath ${CMAKE_BINARY_DIR}/lib\"")
-  ADD_TEST(tuto-msg-clean sh -xc "${tuto-make} clean")
-  ADD_TEST(tuto-msg-0 sh -xc "${tuto-make} masterworker      && ${tuto-bin-path}/masterworker      ${tuto-platform-file} ${tuto-src-path}/deployment0.xml")
-  ADD_TEST(tuto-msg-1 sh -xc "${tuto-make} masterworker-sol1 && ${tuto-bin-path}/masterworker-sol1 ${tuto-platform-file} ${tuto-src-path}/deployment1.xml")
-  ADD_TEST(tuto-msg-2 sh -xc "${tuto-make} masterworker-sol2 && ${tuto-bin-path}/masterworker-sol2 ${tuto-platform-file} ${tuto-src-path}/deployment2.xml")
-  ADD_TEST(tuto-msg-3 sh -xc "${tuto-make} masterworker-sol3 && ${tuto-bin-path}/masterworker-sol3 ${tuto-platform-file} ${tuto-src-path}/deployment3.xml")
-  ADD_TEST(tuto-msg-4 sh -xc "${tuto-make} masterworker-sol4 && ${tuto-bin-path}/masterworker-sol4 ${tuto-platform-file} ${tuto-src-path}/deployment3.xml")
-
-  SET_TESTS_PROPERTIES(tuto-msg-clean PROPERTIES FIXTURES_SETUP tuto-msg-clean)
-  SET_TESTS_PROPERTIES(tuto-msg-0 tuto-msg-1 tuto-msg-2 tuto-msg-3 tuto-msg-4 PROPERTIES FIXTURES_REQUIRED tuto-msg-clean)
-
-  FOREACH(TUTOTEST tuto-msg-0 tuto-msg-1 tuto-msg-2 tuto-msg-3 tuto-msg-4)
-  SET_TESTS_PROPERTIES(${TUTOTEST}
-                       PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib")
-  ENDFOREACH()
-endif()
diff --git a/tools/docker/.gitignore b/tools/docker/.gitignore
new file mode 100644 (file)
index 0000000..397b4a7
--- /dev/null
@@ -0,0 +1 @@
+*.log
diff --git a/tools/docker/Dockerfile.build-deps b/tools/docker/Dockerfile.build-deps
new file mode 100644 (file)
index 0000000..f3ebc9e
--- /dev/null
@@ -0,0 +1,18 @@
+# Base image 
+FROM debian:testing
+
+# - Install SimGrid's dependencies
+RUN apt update && \
+    apt install -y \
+       g++ gcc gfortran default-jdk \
+       git \
+       valgrind \
+       libboost-dev libboost-all-dev \
+       cmake \
+       python3-pip \
+       doxygen fig2dev \
+       chrpath \
+       libdw-dev libevent-dev libunwind8-dev \
+       && \
+    pip3 install breathe exhale sphinx>=1.8.0b1 sphinx_rtd_theme
+                  
\ No newline at end of file
diff --git a/tools/docker/Dockerfile.stable b/tools/docker/Dockerfile.stable
new file mode 100644 (file)
index 0000000..3d35303
--- /dev/null
@@ -0,0 +1,23 @@
+# Base image 
+FROM debian:testing
+
+ARG DLURL
+
+# - Install SimGrid's dependencies
+# - Compile and install SimGrid itself
+RUN echo "DOWNLOAD_URL: ${DLURL}" && \
+    apt update && apt install -y wget && \
+    mkdir /src && cd /src && \
+    wget https://framagit.org/${DLURL} && \
+    tar xf SimGrid-* && rm SimGrid-*tar.gz && \
+    cd SimGrid-* && \
+    apt install -y g++ gcc git valgrind default-jdk gfortran libboost-dev libboost-all-dev cmake dpkg-dev && \
+    cmake -DCMAKE_INSTALL_PREFIX=/usr/ -Denable_documentation=OFF -Denable_java=ON -Denable_smpi=ON -Denable_compile_optimizations=ON . && \
+    make -j4 && \
+    mkdir debian/ && touch debian/control && dpkg-shlibdeps --ignore-missing-info lib/*.so -llib/ -O/tmp/deps && \
+    make install && make clean && \
+    apt remove -y  g++ gcc git valgrind default-jdk gfortran libboost-dev libboost-all-dev cmake dpkg-dev wget && \
+    apt install `sed -e 's/shlibs:Depends=//' -e 's/([^)]*)//g' -e 's/,//g' /tmp/deps` && \
+    apt autoremove -y && apt autoclean && apt clean
+
+    
\ No newline at end of file
diff --git a/tools/docker/Dockerfile.tuto-s4u b/tools/docker/Dockerfile.tuto-s4u
new file mode 100644 (file)
index 0000000..777897c
--- /dev/null
@@ -0,0 +1,8 @@
+# Base image 
+FROM simgrid/unstable
+
+# - Clone simgrid-template-s4u, as it is needed by the tutorial
+RUN apt install -y pajeng r-base r-cran-ggplot2 r-cran-dplyr cmake g++ git && \
+    cd /src && \
+    git clone --depth=1 https://framagit.org/simgrid/simgrid-template-s4u.git simgrid-template-s4u.git && \
+    apt autoremove -y && apt clean && apt autoclean
\ No newline at end of file
diff --git a/tools/docker/Dockerfile.unstable b/tools/docker/Dockerfile.unstable
new file mode 100644 (file)
index 0000000..0262d91
--- /dev/null
@@ -0,0 +1,17 @@
+# Base image 
+FROM debian:testing
+
+# - Install SimGrid's dependencies 
+# - Compile and install SimGrid itself. Clean the tree.
+# - Remove everything that was installed, and re-install what's needed by the SimGrid libraries before the Gran Final Cleanup
+RUN apt update && \
+    apt install -y g++ gcc git valgrind default-jdk gfortran libboost-dev libboost-all-dev cmake dpkg-dev && \
+    mkdir /src/ && cd /src && git clone --depth=1 https://framagit.org/simgrid/simgrid.git simgrid.git && \
+    cd simgrid.git && \
+    cmake -DCMAKE_INSTALL_PREFIX=/usr/ -Denable_documentation=OFF -Denable_java=ON -Denable_smpi=ON -Denable_compile_optimizations=ON . && \
+    make -j4 install && \
+    mkdir debian/ && touch debian/control && dpkg-shlibdeps --ignore-missing-info lib/*.so -llib/ -O/tmp/deps && \
+    git reset --hard master && git clean -dfx && \
+    apt remove -y  g++ gcc git valgrind default-jdk gfortran libboost-dev libboost-all-dev cmake dpkg-dev && \
+    apt install `sed -e 's/shlibs:Depends=//' -e 's/([^)]*)//g' -e 's/,//g' /tmp/deps` && \
+    apt autoremove -y && apt autoclean && apt clean
diff --git a/tools/docker/Makefile b/tools/docker/Makefile
new file mode 100644 (file)
index 0000000..e189fc9
--- /dev/null
@@ -0,0 +1,47 @@
+default:
+       @echo "Existing Targets:"
+       @echo "   make build-deps -> build an image with all possible SimGrid dependencies"
+       @echo "   make stable     -> build the latest stable version of SimGrid (with SMPI w/o MC)"
+       @echo "   make unstable   -> build the git version of SimGrid (with SMPI, w/o MC)"
+       @echo "   make tuto-s4u   -> build all what you need to take the S4U tutorial"
+       @echo "   make push       -> push all images to the cloud"
+       @echo "All our images are based on debian:testing"
+       @echo "Also possible: DOCKER_EXTRA=--no-cache make unstable"
+
+stable:
+       export last_tag=`wget https://framagit.org/simgrid/simgrid/tags 2>/dev/null -O - | grep /simgrid/simgrid/tags/v | head -n1  | sed 's/[^>]*>//' | sed 's/<.*//'`; \
+       export url=`wget https://framagit.org/simgrid/simgrid/tags/$${last_tag} 2>/dev/null -O - | grep SimGrid- | perl -pe 's/.*?<li><a href="//' | sed 's/tar.gz.*/tar.gz/'` ;\
+       echo URL:$${url} ; \
+       docker build -f Dockerfile.stable \
+                --build-arg DLURL=$${url} \
+                -t simgrid/stable:latest \
+                 -t simgrid/stable:$${last_tag} \
+                $(DOCKER_EXTRA) \
+                 . | tee > stable.log
+
+unstable:
+       docker build -f Dockerfile.unstable \
+                -t simgrid/unstable:latest \
+                 -t simgrid/unstable:$$(date --iso-8601) \
+                $(DOCKER_EXTRA) \
+                 . | tee > unstable.log
+
+build-deps:
+       docker build -f Dockerfile.build-deps \
+                -t simgrid/build-deps:latest \
+                 -t simgrid/build-deps:$$(date --iso-8601) \
+                $(DOCKER_EXTRA) \
+                 . | tee > build-deps.log
+
+tuto-s4u: 
+       docker build -f Dockerfile.tuto-s4u \
+                -t simgrid/tuto-s4u:latest \
+                 -t simgrid/tuto-s4u:$$(date --iso-8601) \
+                $(DOCKER_EXTRA) \
+                 . | tee > tuto.log
+
+push:
+       docker push simgrid/build-deps
+       docker push simgrid/stable
+       docker push simgrid/unstable
+       docker push simgrid/tuto-s4u
index c1f1629..a1031b0 100644 (file)
 
 + contrib/.*
 
-+ docs/requirements\.txt
-+ docs/source/.*
-
 + tools/appveyor-irc-notify\.py
++ tools/docker/.*
 + tools/git-hooks/.*
 + tools/internal/.*
 + tools/jenkins/.*
index a07a219..c2cf23b 100755 (executable)
@@ -60,7 +60,7 @@ do
       os="Ubuntu 14.04 (<a href=\"https://docs.travis-ci.com/user/reference/trusty/\">Trusty</a>) 64 bits"
     else
       node="<a href=\"https://travis-ci.org/simgrid/simgrid\">travis-mac</a>"
-      os="Mac OSX Sierra (kernel: 16.7.0)"
+      os="Mac OSX High Sierra (kernel: 17.4.0)"
     fi
     boost=$(get_boost)
     compiler=$(get_compiler)
index 59e5751..b75ab27 100755 (executable)
@@ -326,6 +326,10 @@ class Cmd(object):
             except OSError:
                 # os.getpgid failed. OK. No cleanup.
                 pass
+        except PermissionError:
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': The binary is not executable.")
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Current dir: "+os.getcwd())
+            tesh_exit(3)            
         except NotADirectoryError:
             print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': The path to binary does not exist.")
             print("["+FileReader().filename+":"+str(self.linenumber)+"] Current dir: "+os.getcwd())