Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merging branch 5018:5083 into trunk
authorquasar <quasar@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 29 Nov 2007 13:16:45 +0000 (13:16 +0000)
committerquasar <quasar@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 29 Nov 2007 13:16:45 +0000 (13:16 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5084 48e7efb5-ca39-0410-a469-dd3cf9ba447f

32 files changed:
configure
examples/platforms/metaxml-random.xml [new file with mode: 0644]
examples/platforms/metaxml.xml [new file with mode: 0644]
examples/simdag/Makefile.am
examples/simdag/Makefile.in
examples/simdag/metaxml/metaxml_test.trace [new file with mode: 0644]
examples/simdag/metaxml/metaxml_test2.trace [new file with mode: 0644]
examples/simdag/metaxml/sd_test.c [new file with mode: 0644]
include/surf/surfxml.h
include/surf/surfxml_parse.h
libtool
src/Makefile.am
src/Makefile.in
src/dict_unit.c
src/include/surf/random_mgr.h [new file with mode: 0644]
src/include/surf/surf.h
src/include/surf/trace_mgr.h
src/simgrid_units_main.c
src/simix/smx_environment.c
src/surf/cpu.c
src/surf/network.c
src/surf/network_gtnets.c
src/surf/random_mgr.c [new file with mode: 0644]
src/surf/surf_private.h
src/surf/surfxml.c
src/surf/surfxml.dtd
src/surf/surfxml.l
src/surf/surfxml_parse.c
src/surf/trace_mgr.c
src/surf/workstation_KCCFLN05.c
src/surf/workstation_ptask_L07.c
src/xbt/dict.c

index 4733b6c..6745285 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
 #! /bin/sh
-# From configure.ac Revision: 4976 .
+# From configure.ac Revision: 5053 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for simgrid 3.3-svn.
 #
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for simgrid 3.3-svn.
 #
diff --git a/examples/platforms/metaxml-random.xml b/examples/platforms/metaxml-random.xml
new file mode 100644 (file)
index 0000000..345499d
--- /dev/null
@@ -0,0 +1,35 @@
+<!-- This file shows how to define 2 sets of hosts, their corresponding links and how you can bind them using the route:multi tag 
+     Also it shows how to use the random generator for generating random cpu power
+-->
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "surfxml.dtd">
+<platform version="2">
+
+  <random id="rand_lyon" min="237333000" max="437333000" mean="337333000" std_deviation="100000000"/>
+  <random id="rand_lille" min="137333000" max="250000000" mean="237333000" std_deviation="400000000"/>
+
+  <set id="Lille" prefix="lille_" suffix="_host" radical="0-5"/> 
+  <set id="Lyon" prefix="lyon_" suffix="_host" radical="0-3"/> 
+  <foreach set_id="Lyon">
+    <host id="$1" power="$rand(rand_lyon)"/>
+    <link id="$1" bandwidth="3297750" latency="0.000007234"/>
+  </foreach>
+  <foreach set_id="Lille">
+    <host id="$1" power="$rand(rand_lille)"/>
+    <link id="$1" bandwidth="3297750" latency="0.000007234"/>
+  </foreach>
+
+  <route:multi src="Lille" dst="Lille" symmetric="NO">
+    <link:ctn id="$src"/>
+  </route:multi>
+
+  <route:multi src="Lyon" dst="Lyon" symmetric="NO">
+    <link:ctn id="$src"/>
+  </route:multi>
+
+  <route:multi src="Lille" dst="Lyon">
+    <link:ctn id="$src"/>
+    <link:ctn id="$dst"/>
+  </route:multi>
+
+</platform>
diff --git a/examples/platforms/metaxml.xml b/examples/platforms/metaxml.xml
new file mode 100644 (file)
index 0000000..3d31e0e
--- /dev/null
@@ -0,0 +1,54 @@
+<!-- This platform shows the use of traces, clusters and sets of hosts defined with the new XML format. It also explains how to define
+     routes between sets of hosts using the route:multi tag
+-->
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "surfxml.dtd">
+<platform version="2">
+
+   <!-- define a trace inside the XML file -->
+   <trace id="mytrace" periodicity="12">
+       5 100
+       17 200
+       15 140
+   </trace>
+  
+  <!-- define a cluster for Nancy. Hosts, links, backbone, routes for inter linkage and external linkage are generated by the parser automatically --> 
+  <cluster id="Nancy" prefix="nancy_" suffix="_host" radical="0-2" power="1234566789" bw="125000000" lat="0.00005" bb_bw="50000000" bb_lat="0.001"/>
+
+  <!-- Now we will define in 5 steps the same thing for cluster Lille but using the tags foreach and route:multi -->
+
+  <!-- 1. Define Lille set -->
+  <set id="Lille" prefix="lille_" suffix="_host" radical="0-2"/>
+
+  <!-- 2. Define the Lille group (host+link) -->
+  <foreach set_id="Lille">
+    <host id="$1" power="1234566789"/>
+    <link id="$1" bandwidth="125000000" latency="0.00005"/>
+  </foreach>
+
+  <!-- 3. Backbones for Lille hosts -->
+  <link id="Lille_bb" bandwidth="50000000" latency="0.00005"/>
+
+  <!-- Define backbone for communication between Nancy and Lille-->
+  <link id="INTER-bb" bandwidth="125000000" latency="0.000100"/>
+
+  <!-- 4. Define startpoint for Lille -> $* (All other hosts including Nancy hosts) routes (it is symmetric: $* -> Lille). It is the starting point so it overrides all previosly routes!!! -->
+  <route:multi src="Lille" dst="$*" action="OVERRIDE">
+    <link:ctn id="$src"/>
+  </route:multi>
+
+  <!-- 5. Define Lille intra-cluster communication. Default behaviour POSTPEND links to already existing routes, and NOT symmetric because all routes are created in the first pass.  If you choose symmetric you will duplicate links due to POSTPEND !!!-->
+  <route:multi src="Lille" dst="Lille" symmetric="NO">
+    <link:ctn id="Lille_bb"/>
+  </route:multi>
+
+  <!-- Add other links to routes. Default behaviour POSTPEND links to already existing routes -->
+  <route:multi src="Nancy" dst="Lille">
+    <link:ctn id="INTER-bb"/>
+    <link:ctn id="$dst"/>
+  </route:multi>
+
+  <!-- Connect the trace with the host nancy_0_host -->
+  <trace:connect kind="POWER" trace_id="mytrace" element="HOST" connector_id="nancy_0_host"/>
+
+</platform>
index 3b9a7ac..f4f0e50 100644 (file)
@@ -14,7 +14,7 @@ CLEANFILES = sd_test.trace
 
 TESTS_ENVIRONMENT = $(top_builddir)/tools/tesh/tesh
 
 
 TESTS_ENVIRONMENT = $(top_builddir)/tools/tesh/tesh
 
-TESTS = test_simdag.tesh test_simdag2.tesh properties/test_prop.tesh
+TESTS = test_simdag.tesh test_simdag2.tesh properties/test_prop.tesh metaxml/metaxml_test.trace
 check_PROGRAMS = sd_test sd_test2 properties/sd_prop
 
 bin_PROGRAMS = 
 check_PROGRAMS = sd_test sd_test2 properties/sd_prop
 
 bin_PROGRAMS = 
@@ -22,6 +22,9 @@ bin_PROGRAMS =
 properties_sd_prop_SOURCES = properties/sd_prop.c
 properties_sd_prop_LDADD = $(top_builddir)/src/libsimgrid.la
 
 properties_sd_prop_SOURCES = properties/sd_prop.c
 properties_sd_prop_LDADD = $(top_builddir)/src/libsimgrid.la
 
+metaxml_sd_test_SOURCES = metaxml/sd_test.c
+metaxml_sd_test_LDADD = $(top_builddir)/src/libsimgrid.la
+
 sd_test_SOURCES = sd_test.c
 sd_test_LDADD =        $(top_builddir)/src/libsimgrid.la
 
 sd_test_SOURCES = sd_test.c
 sd_test_LDADD =        $(top_builddir)/src/libsimgrid.la
 
index bf30daa..1cba511 100644 (file)
@@ -238,9 +238,11 @@ EXTRA_DIST = 2clusters.xml \
 
 CLEANFILES = sd_test.trace
 TESTS_ENVIRONMENT = $(top_builddir)/tools/tesh/tesh
 
 CLEANFILES = sd_test.trace
 TESTS_ENVIRONMENT = $(top_builddir)/tools/tesh/tesh
-TESTS = test_simdag.tesh test_simdag2.tesh properties/test_prop.tesh
+TESTS = test_simdag.tesh test_simdag2.tesh properties/test_prop.tesh metaxml/metaxml_test.trace
 properties_sd_prop_SOURCES = properties/sd_prop.c
 properties_sd_prop_LDADD = $(top_builddir)/src/libsimgrid.la
 properties_sd_prop_SOURCES = properties/sd_prop.c
 properties_sd_prop_LDADD = $(top_builddir)/src/libsimgrid.la
+metaxml_sd_test_SOURCES = metaxml/sd_test.c
+metaxml_sd_test_LDADD = $(top_builddir)/src/libsimgrid.la
 sd_test_SOURCES = sd_test.c
 sd_test_LDADD = $(top_builddir)/src/libsimgrid.la
 sd_test2_SOURCES = sd_test2.c
 sd_test_SOURCES = sd_test.c
 sd_test_LDADD = $(top_builddir)/src/libsimgrid.la
 sd_test2_SOURCES = sd_test2.c
diff --git a/examples/simdag/metaxml/metaxml_test.trace b/examples/simdag/metaxml/metaxml_test.trace
new file mode 100644 (file)
index 0000000..1c9505a
--- /dev/null
@@ -0,0 +1,76 @@
+#! ./tesh
+
+p Simple test of simdag with metaxml tags
+
+$ $SG_TEST_EXENV metaxml/sd_test ${srcdir:=.}/../platforms/metaxml.xml
+> [0.000000] [sd_test/INFO] Route between nancy_0_host and nancy_0_host:
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Nancy_bb: latency = 0.001000, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_0_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_0_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_0_host and nancy_1_host:
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Nancy_bb: latency = 0.001000, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and nancy_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Lille_bb: latency = 0.000050, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Lille_bb: latency = 0.000050, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and nancy_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and nancy_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link nancy_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Lille_bb: latency = 0.000050, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Lille_bb: latency = 0.000050, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and nancy_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_1_host and nancy_0_host:
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Nancy_bb: latency = 0.001000, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_1_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_1_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link INTER-bb: latency = 0.000100, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO] Route between nancy_1_host and nancy_1_host:
+> [0.000000] [sd_test/INFO]    Link nancy_1_host: latency = 0.000050, bandwidth = 125000000.000000
+> [0.000000] [sd_test/INFO]    Link Nancy_bb: latency = 0.001000, bandwidth = 50000000.000000
+> [0.000000] [sd_test/INFO] Computation time for 2000000.000000 flops on nancy_0_host: 0.001620
+> [0.000000] [sd_test/INFO] Computation time for 1000000.000000 flops on lille_1_host: 0.000810
+> [0.000000] [sd_test/INFO] Estimated time for 'Task D': 1.500600
+> [0.000000] [sd_kernel/INFO] Starting simulation...
+> [0.000000] [sd_kernel/INFO] Executing task 'Task D'
+> [863309.428714] [sd_kernel/INFO] Task 'Task D' done
+> [863309.428714] [sd_kernel/INFO] Executing task 'Task B'
+> [863309.428714] [sd_kernel/INFO] Executing task 'Task C'
+> [1438849.000343] [sd_kernel/INFO] Task 'Task B' done
+> [1438849.000343] [sd_task/INFO] Watch point reached with task 'Task B'!
+> [1438849.000343] [sd_kernel/INFO] Simulation finished
+> [1438849.000343] [sd_test/INFO] Task 'Task D' start time: 0.000000, finish time: 863309.428714
+> [1438849.000343] [sd_test/INFO] Task 'Task B' start time: 863309.428714, finish time: 1438849.000343
+
+
diff --git a/examples/simdag/metaxml/metaxml_test2.trace b/examples/simdag/metaxml/metaxml_test2.trace
new file mode 100644 (file)
index 0000000..bedde93
--- /dev/null
@@ -0,0 +1,177 @@
+#! ./tesh
+
+p Simple test of simdag with metaxml tags
+
+$ $SG_TEST_EXENV metaxml/sd_test ${srcdir:=.}/../platforms/metaxml-random.xml
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_2_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_1_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_4_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_1_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_0_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_3_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lille_0_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lille_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lyon_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lille_4_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_4_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lille_1_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_1_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lyon_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lille_3_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_3_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lille_0_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO]    Link lille_0_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Route between lyon_2_host and lyon_2_host:
+> [0.000000] [sd_test/INFO]    Link lyon_2_host: latency = 0.000007, bandwidth = 3297750.000000
+> [0.000000] [sd_test/INFO] Computation time for 2000000.000000 flops on lille_2_host: 0.011885
+> [0.000000] [sd_test/INFO] Computation time for 1000000.000000 flops on lyon_1_host: 0.004046
+> [0.000000] [sd_test/INFO] Estimated time for 'Task D': 54.826318
+> [0.000000] [sd_kernel/INFO] Starting simulation...
+> [0.000000] [sd_kernel/INFO] Executing task 'Task D'
+> [90.971131] [sd_kernel/INFO] Task 'Task D' done
+> [90.971131] [sd_kernel/INFO] Executing task 'Task B'
+> [90.971131] [sd_kernel/INFO] Executing task 'Task C'
+> [151.618557] [sd_kernel/INFO] Task 'Task B' done
+> [151.618557] [sd_task/INFO] Watch point reached with task 'Task B'!
+> [151.618557] [sd_kernel/INFO] Simulation finished
+> [151.618557] [sd_test/INFO] Task 'Task D' start time: 0.000000, finish time: 90.971131
+> [151.618557] [sd_test/INFO] Task 'Task B' start time: 90.971131, finish time: 151.618557
+
diff --git a/examples/simdag/metaxml/sd_test.c b/examples/simdag/metaxml/sd_test.c
new file mode 100644 (file)
index 0000000..f8434ea
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+   See examples/platforms/metaxml.xml and examples/platforms/metaxml_platform.xml files for examples on how to use the cluster, foreach, set, route:multi, trace and trace:connect tags
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include "simdag/simdag.h"
+#include "xbt/ex.h"
+#include "xbt/log.h"
+#include "xbt/dynar.h"
+#include "xbt/dict.h"
+#include "xbt/time.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(sd_test,
+                            "Logging specific to this SimDag example");
+
+int main(int argc, char **argv) {
+  /* initialisation of SD */
+  SD_init(&argc, argv);
+
+  /*  xbt_log_control_set("sd.thres=debug"); */
+
+  if (argc < 2) {
+    INFO1("Usage: %s platform_file", argv[0]);
+    INFO1("example: %s sd_platform.xml", argv[0]);
+    exit(1);
+  }
+
+  /* creation of the environment */
+  const char * platform_file = argv[1];
+  SD_create_environment(platform_file);
+
+  /* test the estimation functions */
+  const SD_workstation_t *workstations = SD_workstation_get_list();
+  int ws_nr = SD_workstation_get_number();
+
+  SD_workstation_t w1 = NULL;
+  SD_workstation_t w2 = NULL;
+  const char *name1, *name2;
+  /* Show routes between all workstation */
+  int i,j,k;
+  for (i=0; i<ws_nr; i++){
+    for (j=0;j<ws_nr; j++){
+      w1 = workstations[i];
+      w2 = workstations[j];
+      name1 = SD_workstation_get_name(w1);
+      name2 = SD_workstation_get_name(w2);
+      INFO2("Route between %s and %s:", name1, name2);   
+      const SD_link_t *route = SD_route_get_list(w1, w2);
+      int route_size = SD_route_get_size(w1, w2);
+      for (k = 0; k < route_size; k++) {
+        INFO3("\tLink %s: latency = %f, bandwidth = %f", SD_link_get_name(route[k]),
+         SD_link_get_current_latency(route[k]), SD_link_get_current_bandwidth(route[k]));
+      }
+    }
+  }
+
+  /* Simulate */
+
+  w1 = workstations[0];
+  w2 = workstations[1];
+  SD_workstation_set_access_mode(w2, SD_WORKSTATION_SEQUENTIAL_ACCESS);
+  name1 = SD_workstation_get_name(w1);
+  name2 = SD_workstation_get_name(w2);
+
+  const double computation_amount1 = 2000000;
+  const double computation_amount2 = 1000000;
+  const double communication_amount12 = 2000000;
+  const double communication_amount21 = 3000000;
+  INFO3("Computation time for %f flops on %s: %f", computation_amount1, name1,
+       SD_workstation_get_computation_time(w1, computation_amount1));
+  INFO3("Computation time for %f flops on %s: %f", computation_amount2, name2,
+       SD_workstation_get_computation_time(w2, computation_amount2));
+
+  /* creation of the tasks and their dependencies */
+  SD_task_t taskA = SD_task_create("Task A", NULL, 10.0);
+  SD_task_t taskB = SD_task_create("Task B", NULL, 40.0);
+  SD_task_t taskC = SD_task_create("Task C", NULL, 30.0);
+  SD_task_t taskD = SD_task_create("Task D", NULL, 60.0);
+  
+
+  SD_task_dependency_add(NULL, NULL, taskB, taskA);
+  SD_task_dependency_add(NULL, NULL, taskC, taskA);
+  SD_task_dependency_add(NULL, NULL, taskD, taskB);
+  SD_task_dependency_add(NULL, NULL, taskD, taskC);
+
+  xbt_ex_t ex;
+
+  TRY {
+    SD_task_dependency_add(NULL, NULL, taskA, taskA); /* shouldn't work and must raise an exception */
+    xbt_die("Hey, I can add a dependency between Task A and Task A!");
+  }
+  CATCH (ex) {
+    if (ex.category != arg_error)
+
+      RETHROW; /* this is a serious error */
+    xbt_ex_free(ex);
+  }
+  
+  TRY {
+    SD_task_dependency_add(NULL, NULL, taskB, taskA); /* shouldn't work and must raise an exception */
+    xbt_die("Oh oh, I can add an already existing dependency!");
+  }
+  CATCH (ex) {
+    if (ex.category != arg_error)
+      RETHROW;
+    xbt_ex_free(ex);
+  }
+
+  TRY {
+    SD_task_dependency_remove(taskA, taskC); /* shouldn't work and must raise an exception */
+    xbt_die("Dude, I can remove an unknown dependency!");
+  }
+  CATCH (ex) {
+    if (ex.category != arg_error)
+      RETHROW;
+    xbt_ex_free(ex);
+  }
+
+  TRY {
+    SD_task_dependency_remove(taskC, taskC); /* shouldn't work and must raise an exception */
+    xbt_die("Wow, I can remove a dependency between Task C and itself!");
+  }
+  CATCH (ex) {
+    if (ex.category != arg_error)
+      RETHROW;
+    xbt_ex_free(ex);
+  }
+
+
+  /* if everything is ok, no exception is forwarded or rethrown by main() */
+
+  /* watch points */
+  SD_task_watch(taskD, SD_DONE);
+  SD_task_watch(taskB, SD_DONE);
+  SD_task_unwatch(taskD, SD_DONE);
+  
+
+  /* scheduling parameters */
+
+  const int workstation_number = 2;
+  const SD_workstation_t workstation_list[] = {w1, w2};
+  double computation_amount[] = {computation_amount1, computation_amount2};
+  double communication_amount[] =
+    {
+      0, communication_amount12,
+      communication_amount21, 0
+    };
+  double rate = -1.0;
+
+  /* estimated time */
+  SD_task_t task = taskD;
+  INFO2("Estimated time for '%s': %f", SD_task_get_name(task),
+       SD_task_get_execution_time(task, workstation_number, workstation_list,
+                                  computation_amount, communication_amount, rate));
+
+  /* let's launch the simulation! */
+
+  SD_task_schedule(taskA, workstation_number, workstation_list,
+                  computation_amount, communication_amount, rate);
+  SD_task_schedule(taskB, workstation_number, workstation_list,
+                  computation_amount, communication_amount, rate);
+  SD_task_schedule(taskC, workstation_number, workstation_list,
+                  computation_amount, communication_amount, rate);
+  SD_task_schedule(taskD, workstation_number, workstation_list,
+                  computation_amount, communication_amount, rate);
+
+  SD_task_t *changed_tasks;
+
+  changed_tasks = SD_simulate(-1.0);
+  for (i = 0; changed_tasks[i] != NULL; i++) {
+    INFO3("Task '%s' start time: %f, finish time: %f",
+         SD_task_get_name(changed_tasks[i]),
+         SD_task_get_start_time(changed_tasks[i]),
+         SD_task_get_finish_time(changed_tasks[i]));
+  }
+  
+  xbt_assert0(changed_tasks[0] == taskD &&
+             changed_tasks[1] == taskB &&
+             changed_tasks[2] == NULL,
+             "Unexpected simulation results");
+
+  xbt_free(changed_tasks);
+
+  DEBUG0("Destroying tasks...");
+
+  SD_task_destroy(taskA);
+  SD_task_destroy(taskB);
+  SD_task_destroy(taskC);
+  SD_task_destroy(taskD);
+
+  DEBUG0("Tasks destroyed. Exiting SimDag...");
+
+  SD_exit();
+  return 0;
+}
+
index 20a08ad..36f41b6 100644 (file)
@@ -1,10 +1,10 @@
 /* XML processor/application API for surf/surfxml.dtd.
 /* XML processor/application API for surf/surfxml.dtd.
- * Generated 2007/11/08 11:56:21.
+ * Generated 2007/11/29 14:32:37.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
- * (Id: flexml.pl,v 1.63 2007/10/11 14:46:08 mquinson Exp).
+ * (Id: flexml.pl,v 1.61 2006/09/13 16:34:33 wdowling Exp).
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
@@ -53,14 +53,28 @@ XBT_PUBLIC(void ) STag_surfxml_platform(void);
 XBT_PUBLIC(void ) ETag_surfxml_platform(void);
 XBT_PUBLIC(void ) STag_surfxml_include(void);
 XBT_PUBLIC(void ) ETag_surfxml_include(void);
 XBT_PUBLIC(void ) ETag_surfxml_platform(void);
 XBT_PUBLIC(void ) STag_surfxml_include(void);
 XBT_PUBLIC(void ) ETag_surfxml_include(void);
+XBT_PUBLIC(void ) STag_surfxml_trace(void);
+XBT_PUBLIC(void ) ETag_surfxml_trace(void);
+XBT_PUBLIC(void ) STag_surfxml_random(void);
+XBT_PUBLIC(void ) ETag_surfxml_random(void);
+XBT_PUBLIC(void ) STag_surfxml_trace_c_connect(void);
+XBT_PUBLIC(void ) ETag_surfxml_trace_c_connect(void);
+XBT_PUBLIC(void ) STag_surfxml_set(void);
+XBT_PUBLIC(void ) ETag_surfxml_set(void);
+XBT_PUBLIC(void ) STag_surfxml_foreach(void);
+XBT_PUBLIC(void ) ETag_surfxml_foreach(void);
 XBT_PUBLIC(void ) STag_surfxml_host(void);
 XBT_PUBLIC(void ) ETag_surfxml_host(void);
 XBT_PUBLIC(void ) STag_surfxml_prop(void);
 XBT_PUBLIC(void ) ETag_surfxml_prop(void);
 XBT_PUBLIC(void ) STag_surfxml_host(void);
 XBT_PUBLIC(void ) ETag_surfxml_host(void);
 XBT_PUBLIC(void ) STag_surfxml_prop(void);
 XBT_PUBLIC(void ) ETag_surfxml_prop(void);
+XBT_PUBLIC(void ) STag_surfxml_cluster(void);
+XBT_PUBLIC(void ) ETag_surfxml_cluster(void);
 XBT_PUBLIC(void ) STag_surfxml_router(void);
 XBT_PUBLIC(void ) ETag_surfxml_router(void);
 XBT_PUBLIC(void ) STag_surfxml_link(void);
 XBT_PUBLIC(void ) ETag_surfxml_link(void);
 XBT_PUBLIC(void ) STag_surfxml_router(void);
 XBT_PUBLIC(void ) ETag_surfxml_router(void);
 XBT_PUBLIC(void ) STag_surfxml_link(void);
 XBT_PUBLIC(void ) ETag_surfxml_link(void);
+XBT_PUBLIC(void ) STag_surfxml_route_c_multi(void);
+XBT_PUBLIC(void ) ETag_surfxml_route_c_multi(void);
 XBT_PUBLIC(void ) STag_surfxml_route(void);
 XBT_PUBLIC(void ) ETag_surfxml_route(void);
 XBT_PUBLIC(void ) STag_surfxml_link_c_ctn(void);
 XBT_PUBLIC(void ) STag_surfxml_route(void);
 XBT_PUBLIC(void ) ETag_surfxml_route(void);
 XBT_PUBLIC(void ) STag_surfxml_link_c_ctn(void);
@@ -71,75 +85,133 @@ XBT_PUBLIC(void ) STag_surfxml_argument(void);
 XBT_PUBLIC(void ) ETag_surfxml_argument(void);
 
 /* XML application data. */
 XBT_PUBLIC(void ) ETag_surfxml_argument(void);
 
 /* XML application data. */
-typedef int AT_surfxml_link_id;
-#define AU_surfxml_link_id NULL
+typedef enum { AU_surfxml_random_generator, A_surfxml_random_generator_DRAND48,A_surfxml_random_generator_RAND } AT_surfxml_random_generator;
 typedef int AT_surfxml_prop_id;
 #define AU_surfxml_prop_id NULL
 typedef int AT_surfxml_host_interference_recv;
 #define AU_surfxml_host_interference_recv NULL
 typedef int AT_surfxml_host_id;
 #define AU_surfxml_host_id NULL
 typedef int AT_surfxml_prop_id;
 #define AU_surfxml_prop_id NULL
 typedef int AT_surfxml_host_interference_recv;
 #define AU_surfxml_host_interference_recv NULL
 typedef int AT_surfxml_host_id;
 #define AU_surfxml_host_id NULL
+typedef int AT_surfxml_set_id;
+#define AU_surfxml_set_id NULL
 typedef int AT_surfxml_link_latency_file;
 #define AU_surfxml_link_latency_file NULL
 typedef int AT_surfxml_link_latency_file;
 #define AU_surfxml_link_latency_file NULL
-typedef int AT_surfxml_process_host;
-#define AU_surfxml_process_host NULL
-typedef int AT_surfxml_host_availability_file;
-#define AU_surfxml_host_availability_file NULL
 typedef enum { AU_surfxml_host_state, A_surfxml_host_state_ON,A_surfxml_host_state_OFF } AT_surfxml_host_state;
 typedef int AT_surfxml_host_interference_send_recv;
 #define AU_surfxml_host_interference_send_recv NULL
 typedef enum { AU_surfxml_host_state, A_surfxml_host_state_ON,A_surfxml_host_state_OFF } AT_surfxml_host_state;
 typedef int AT_surfxml_host_interference_send_recv;
 #define AU_surfxml_host_interference_send_recv NULL
-typedef int AT_surfxml_route_impact_on_dst_with_other_send;
-#define AU_surfxml_route_impact_on_dst_with_other_send NULL
 typedef int AT_surfxml_host_interference_send;
 #define AU_surfxml_host_interference_send NULL
 typedef int AT_surfxml_host_interference_send;
 #define AU_surfxml_host_interference_send NULL
+typedef int AT_surfxml_set_suffix;
+#define AU_surfxml_set_suffix NULL
 typedef int AT_surfxml_route_impact_on_dst;
 #define AU_surfxml_route_impact_on_dst NULL
 typedef int AT_surfxml_route_impact_on_dst;
 #define AU_surfxml_route_impact_on_dst NULL
-typedef int AT_surfxml_prop_value;
-#define AU_surfxml_prop_value NULL
-typedef int AT_surfxml_route_impact_on_src_with_other_recv;
-#define AU_surfxml_route_impact_on_src_with_other_recv NULL
 typedef int AT_surfxml_host_power;
 #define AU_surfxml_host_power NULL
 typedef int AT_surfxml_host_power;
 #define AU_surfxml_host_power NULL
-typedef int AT_surfxml_link_state_file;
-#define AU_surfxml_link_state_file NULL
 typedef int AT_surfxml_router_id;
 #define AU_surfxml_router_id NULL
 typedef int AT_surfxml_process_start_time;
 #define AU_surfxml_process_start_time NULL
 typedef int AT_surfxml_router_id;
 #define AU_surfxml_router_id NULL
 typedef int AT_surfxml_process_start_time;
 #define AU_surfxml_process_start_time NULL
+typedef int AT_surfxml_cluster_suffix;
+#define AU_surfxml_cluster_suffix NULL
 typedef int AT_surfxml_platform_xmlns_c_route;
 #define AU_surfxml_platform_xmlns_c_route NULL
 typedef int AT_surfxml_platform_xmlns_c_route;
 #define AU_surfxml_platform_xmlns_c_route NULL
-typedef int AT_surfxml_process_function;
-#define AU_surfxml_process_function NULL
-typedef int AT_surfxml_host_max_outgoing_rate;
-#define AU_surfxml_host_max_outgoing_rate NULL
+typedef int AT_surfxml_cluster_prefix;
+#define AU_surfxml_cluster_prefix NULL
+typedef int AT_surfxml_trace_file;
+#define AU_surfxml_trace_file NULL
+typedef enum { AU_surfxml_route_action, A_surfxml_route_action_POSTPEND,A_surfxml_route_action_PREPEND,A_surfxml_route_action_OVERRIDE } AT_surfxml_route_action;
 typedef enum { AU_surfxml_link_sharing_policy, A_surfxml_link_sharing_policy_SHARED,A_surfxml_link_sharing_policy_FATPIPE } AT_surfxml_link_sharing_policy;
 typedef enum { AU_surfxml_link_sharing_policy, A_surfxml_link_sharing_policy_SHARED,A_surfxml_link_sharing_policy_FATPIPE } AT_surfxml_link_sharing_policy;
-typedef int AT_surfxml_link_c_ctn_id;
-#define AU_surfxml_link_c_ctn_id NULL
+typedef int AT_surfxml_random_min;
+#define AU_surfxml_random_min NULL
 typedef int AT_surfxml_process_kill_time;
 #define AU_surfxml_process_kill_time NULL
 typedef int AT_surfxml_process_kill_time;
 #define AU_surfxml_process_kill_time NULL
-typedef int AT_surfxml_host_availability;
-#define AU_surfxml_host_availability NULL
+typedef int AT_surfxml_cluster_bb_bw;
+#define AU_surfxml_cluster_bb_bw NULL
+typedef enum { AU_surfxml_trace_c_connect_element, A_surfxml_trace_c_connect_element_HOST,A_surfxml_trace_c_connect_element_LINK } AT_surfxml_trace_c_connect_element;
 typedef int AT_surfxml_argument_value;
 #define AU_surfxml_argument_value NULL
 typedef enum { AU_surfxml_link_state, A_surfxml_link_state_ON,A_surfxml_link_state_OFF } AT_surfxml_link_state;
 typedef int AT_surfxml_argument_value;
 #define AU_surfxml_argument_value NULL
 typedef enum { AU_surfxml_link_state, A_surfxml_link_state_ON,A_surfxml_link_state_OFF } AT_surfxml_link_state;
-typedef int AT_surfxml_route_src;
-#define AU_surfxml_route_src NULL
 typedef int AT_surfxml_route_impact_on_src;
 #define AU_surfxml_route_impact_on_src NULL
 typedef int AT_surfxml_link_bandwidth;
 #define AU_surfxml_link_bandwidth NULL
 typedef int AT_surfxml_route_impact_on_src;
 #define AU_surfxml_route_impact_on_src NULL
 typedef int AT_surfxml_link_bandwidth;
 #define AU_surfxml_link_bandwidth NULL
+typedef int AT_surfxml_cluster_id;
+#define AU_surfxml_cluster_id NULL
+typedef int AT_surfxml_random_mean;
+#define AU_surfxml_random_mean NULL
+typedef int AT_surfxml_cluster_bb_lat;
+#define AU_surfxml_cluster_bb_lat NULL
 typedef int AT_surfxml_link_latency;
 #define AU_surfxml_link_latency NULL
 typedef int AT_surfxml_link_latency;
 #define AU_surfxml_link_latency NULL
+typedef int AT_surfxml_trace_c_connect_trace_id;
+#define AU_surfxml_trace_c_connect_trace_id NULL
 typedef int AT_surfxml_platform_xmlns_c_link;
 #define AU_surfxml_platform_xmlns_c_link NULL
 typedef int AT_surfxml_platform_xmlns_c_link;
 #define AU_surfxml_platform_xmlns_c_link NULL
-typedef int AT_surfxml_include_file;
-#define AU_surfxml_include_file NULL
 typedef int AT_surfxml_link_bandwidth_file;
 #define AU_surfxml_link_bandwidth_file NULL
 typedef int AT_surfxml_link_bandwidth_file;
 #define AU_surfxml_link_bandwidth_file NULL
+typedef int AT_surfxml_random_id;
+#define AU_surfxml_random_id NULL
+typedef int AT_surfxml_set_radical;
+#define AU_surfxml_set_radical NULL
+typedef int AT_surfxml_random_max;
+#define AU_surfxml_random_max NULL
+typedef int AT_surfxml_link_id;
+#define AU_surfxml_link_id NULL
+typedef int AT_surfxml_process_host;
+#define AU_surfxml_process_host NULL
+typedef int AT_surfxml_host_availability_file;
+#define AU_surfxml_host_availability_file NULL
+typedef int AT_surfxml_cluster_lat;
+#define AU_surfxml_cluster_lat NULL
+typedef int AT_surfxml_trace_periodicity;
+#define AU_surfxml_trace_periodicity NULL
+typedef int AT_surfxml_foreach_set_id;
+#define AU_surfxml_foreach_set_id NULL
+typedef int AT_surfxml_route_impact_on_dst_with_other_send;
+#define AU_surfxml_route_impact_on_dst_with_other_send NULL
+typedef int AT_surfxml_prop_value;
+#define AU_surfxml_prop_value NULL
+typedef int AT_surfxml_route_impact_on_src_with_other_recv;
+#define AU_surfxml_route_impact_on_src_with_other_recv NULL
+typedef int AT_surfxml_link_state_file;
+#define AU_surfxml_link_state_file NULL
+typedef int AT_surfxml_set_prefix;
+#define AU_surfxml_set_prefix NULL
+typedef int AT_surfxml_cluster_power;
+#define AU_surfxml_cluster_power NULL
+typedef int AT_surfxml_process_function;
+#define AU_surfxml_process_function NULL
+typedef int AT_surfxml_host_max_outgoing_rate;
+#define AU_surfxml_host_max_outgoing_rate NULL
+typedef int AT_surfxml_link_c_ctn_id;
+#define AU_surfxml_link_c_ctn_id NULL
+typedef int AT_surfxml_host_availability;
+#define AU_surfxml_host_availability NULL
+typedef int AT_surfxml_route_src;
+#define AU_surfxml_route_src NULL
+typedef int AT_surfxml_route_c_multi_src;
+#define AU_surfxml_route_c_multi_src NULL
+typedef enum { AU_surfxml_route_c_multi_action, A_surfxml_route_c_multi_action_POSTPEND,A_surfxml_route_c_multi_action_PREPEND,A_surfxml_route_c_multi_action_OVERRIDE } AT_surfxml_route_c_multi_action;
+typedef int AT_surfxml_trace_id;
+#define AU_surfxml_trace_id NULL
+typedef int AT_surfxml_cluster_radical;
+#define AU_surfxml_cluster_radical NULL
+typedef int AT_surfxml_include_file;
+#define AU_surfxml_include_file NULL
+typedef int AT_surfxml_random_std_deviation;
+#define AU_surfxml_random_std_deviation NULL
+typedef enum { AU_surfxml_trace_c_connect_kind, A_surfxml_trace_c_connect_kind_AVAILABILITY,A_surfxml_trace_c_connect_kind_BANDWIDTH,A_surfxml_trace_c_connect_kind_LATENCY,A_surfxml_trace_c_connect_kind_POWER } AT_surfxml_trace_c_connect_kind;
+typedef int AT_surfxml_trace_c_connect_connector_id;
+#define AU_surfxml_trace_c_connect_connector_id NULL
+typedef int AT_surfxml_route_c_multi_dst;
+#define AU_surfxml_route_c_multi_dst NULL
 typedef int AT_surfxml_host_state_file;
 #define AU_surfxml_host_state_file NULL
 typedef int AT_surfxml_host_state_file;
 #define AU_surfxml_host_state_file NULL
+typedef enum { AU_surfxml_route_c_multi_symmetric, A_surfxml_route_c_multi_symmetric_YES,A_surfxml_route_c_multi_symmetric_NO } AT_surfxml_route_c_multi_symmetric;
 typedef int AT_surfxml_route_dst;
 #define AU_surfxml_route_dst NULL
 typedef int AT_surfxml_route_dst;
 #define AU_surfxml_route_dst NULL
+typedef int AT_surfxml_cluster_bw;
+#define AU_surfxml_cluster_bw NULL
 typedef int AT_surfxml_platform_version;
 #define AU_surfxml_platform_version NULL
 
 typedef int AT_surfxml_platform_version;
 #define AU_surfxml_platform_version NULL
 
@@ -147,78 +219,142 @@ typedef int AT_surfxml_platform_version;
 XBT_PUBLIC_DATA(int ) surfxml_pcdata_ix;
 XBT_PUBLIC_DATA(char *) surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
 XBT_PUBLIC_DATA(int ) surfxml_pcdata_ix;
 XBT_PUBLIC_DATA(char *) surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
-XBT_PUBLIC_DATA(AT_surfxml_link_id ) AX_surfxml_link_id;
-#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+XBT_PUBLIC_DATA(AT_surfxml_random_generator ) AX_surfxml_random_generator;
+#define A_surfxml_random_generator AX_surfxml_random_generator
 XBT_PUBLIC_DATA(AT_surfxml_prop_id ) AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_recv ) AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 XBT_PUBLIC_DATA(AT_surfxml_host_id ) AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
 XBT_PUBLIC_DATA(AT_surfxml_prop_id ) AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_recv ) AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 XBT_PUBLIC_DATA(AT_surfxml_host_id ) AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
+XBT_PUBLIC_DATA(AT_surfxml_set_id ) AX_surfxml_set_id;
+#define A_surfxml_set_id (surfxml_bufferstack + AX_surfxml_set_id)
 XBT_PUBLIC_DATA(AT_surfxml_link_latency_file ) AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
 XBT_PUBLIC_DATA(AT_surfxml_link_latency_file ) AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
-XBT_PUBLIC_DATA(AT_surfxml_process_host ) AX_surfxml_process_host;
-#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
-XBT_PUBLIC_DATA(AT_surfxml_host_availability_file ) AX_surfxml_host_availability_file;
-#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
 XBT_PUBLIC_DATA(AT_surfxml_host_state ) AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_send_recv ) AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
 XBT_PUBLIC_DATA(AT_surfxml_host_state ) AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_send_recv ) AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
-XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_dst_with_other_send ) AX_surfxml_route_impact_on_dst_with_other_send;
-#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_send ) AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
 XBT_PUBLIC_DATA(AT_surfxml_host_interference_send ) AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
+XBT_PUBLIC_DATA(AT_surfxml_set_suffix ) AX_surfxml_set_suffix;
+#define A_surfxml_set_suffix (surfxml_bufferstack + AX_surfxml_set_suffix)
 XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_dst ) AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
 XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_dst ) AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
-XBT_PUBLIC_DATA(AT_surfxml_prop_value ) AX_surfxml_prop_value;
-#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
-XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_src_with_other_recv ) AX_surfxml_route_impact_on_src_with_other_recv;
-#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
 XBT_PUBLIC_DATA(AT_surfxml_host_power ) AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
 XBT_PUBLIC_DATA(AT_surfxml_host_power ) AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
-XBT_PUBLIC_DATA(AT_surfxml_link_state_file ) AX_surfxml_link_state_file;
-#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
 XBT_PUBLIC_DATA(AT_surfxml_router_id ) AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 XBT_PUBLIC_DATA(AT_surfxml_process_start_time ) AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
 XBT_PUBLIC_DATA(AT_surfxml_router_id ) AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 XBT_PUBLIC_DATA(AT_surfxml_process_start_time ) AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_suffix ) AX_surfxml_cluster_suffix;
+#define A_surfxml_cluster_suffix (surfxml_bufferstack + AX_surfxml_cluster_suffix)
 XBT_PUBLIC_DATA(AT_surfxml_platform_xmlns_c_route ) AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
 XBT_PUBLIC_DATA(AT_surfxml_platform_xmlns_c_route ) AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
-XBT_PUBLIC_DATA(AT_surfxml_process_function ) AX_surfxml_process_function;
-#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
-XBT_PUBLIC_DATA(AT_surfxml_host_max_outgoing_rate ) AX_surfxml_host_max_outgoing_rate;
-#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_prefix ) AX_surfxml_cluster_prefix;
+#define A_surfxml_cluster_prefix (surfxml_bufferstack + AX_surfxml_cluster_prefix)
+XBT_PUBLIC_DATA(AT_surfxml_trace_file ) AX_surfxml_trace_file;
+#define A_surfxml_trace_file (surfxml_bufferstack + AX_surfxml_trace_file)
+XBT_PUBLIC_DATA(AT_surfxml_route_action ) AX_surfxml_route_action;
+#define A_surfxml_route_action AX_surfxml_route_action
 XBT_PUBLIC_DATA(AT_surfxml_link_sharing_policy ) AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
 XBT_PUBLIC_DATA(AT_surfxml_link_sharing_policy ) AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
-XBT_PUBLIC_DATA(AT_surfxml_link_c_ctn_id ) AX_surfxml_link_c_ctn_id;
-#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+XBT_PUBLIC_DATA(AT_surfxml_random_min ) AX_surfxml_random_min;
+#define A_surfxml_random_min (surfxml_bufferstack + AX_surfxml_random_min)
 XBT_PUBLIC_DATA(AT_surfxml_process_kill_time ) AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
 XBT_PUBLIC_DATA(AT_surfxml_process_kill_time ) AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
-XBT_PUBLIC_DATA(AT_surfxml_host_availability ) AX_surfxml_host_availability;
-#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_bb_bw ) AX_surfxml_cluster_bb_bw;
+#define A_surfxml_cluster_bb_bw (surfxml_bufferstack + AX_surfxml_cluster_bb_bw)
+XBT_PUBLIC_DATA(AT_surfxml_trace_c_connect_element ) AX_surfxml_trace_c_connect_element;
+#define A_surfxml_trace_c_connect_element AX_surfxml_trace_c_connect_element
 XBT_PUBLIC_DATA(AT_surfxml_argument_value ) AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 XBT_PUBLIC_DATA(AT_surfxml_link_state ) AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
 XBT_PUBLIC_DATA(AT_surfxml_argument_value ) AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 XBT_PUBLIC_DATA(AT_surfxml_link_state ) AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
-XBT_PUBLIC_DATA(AT_surfxml_route_src ) AX_surfxml_route_src;
-#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
 XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_src ) AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 XBT_PUBLIC_DATA(AT_surfxml_link_bandwidth ) AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
 XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_src ) AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 XBT_PUBLIC_DATA(AT_surfxml_link_bandwidth ) AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_id ) AX_surfxml_cluster_id;
+#define A_surfxml_cluster_id (surfxml_bufferstack + AX_surfxml_cluster_id)
+XBT_PUBLIC_DATA(AT_surfxml_random_mean ) AX_surfxml_random_mean;
+#define A_surfxml_random_mean (surfxml_bufferstack + AX_surfxml_random_mean)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_bb_lat ) AX_surfxml_cluster_bb_lat;
+#define A_surfxml_cluster_bb_lat (surfxml_bufferstack + AX_surfxml_cluster_bb_lat)
 XBT_PUBLIC_DATA(AT_surfxml_link_latency ) AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
 XBT_PUBLIC_DATA(AT_surfxml_link_latency ) AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
+XBT_PUBLIC_DATA(AT_surfxml_trace_c_connect_trace_id ) AX_surfxml_trace_c_connect_trace_id;
+#define A_surfxml_trace_c_connect_trace_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_trace_id)
 XBT_PUBLIC_DATA(AT_surfxml_platform_xmlns_c_link ) AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
 XBT_PUBLIC_DATA(AT_surfxml_platform_xmlns_c_link ) AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
-XBT_PUBLIC_DATA(AT_surfxml_include_file ) AX_surfxml_include_file;
-#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
 XBT_PUBLIC_DATA(AT_surfxml_link_bandwidth_file ) AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
 XBT_PUBLIC_DATA(AT_surfxml_link_bandwidth_file ) AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
+XBT_PUBLIC_DATA(AT_surfxml_random_id ) AX_surfxml_random_id;
+#define A_surfxml_random_id (surfxml_bufferstack + AX_surfxml_random_id)
+XBT_PUBLIC_DATA(AT_surfxml_set_radical ) AX_surfxml_set_radical;
+#define A_surfxml_set_radical (surfxml_bufferstack + AX_surfxml_set_radical)
+XBT_PUBLIC_DATA(AT_surfxml_random_max ) AX_surfxml_random_max;
+#define A_surfxml_random_max (surfxml_bufferstack + AX_surfxml_random_max)
+XBT_PUBLIC_DATA(AT_surfxml_link_id ) AX_surfxml_link_id;
+#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+XBT_PUBLIC_DATA(AT_surfxml_process_host ) AX_surfxml_process_host;
+#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
+XBT_PUBLIC_DATA(AT_surfxml_host_availability_file ) AX_surfxml_host_availability_file;
+#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_lat ) AX_surfxml_cluster_lat;
+#define A_surfxml_cluster_lat (surfxml_bufferstack + AX_surfxml_cluster_lat)
+XBT_PUBLIC_DATA(AT_surfxml_trace_periodicity ) AX_surfxml_trace_periodicity;
+#define A_surfxml_trace_periodicity (surfxml_bufferstack + AX_surfxml_trace_periodicity)
+XBT_PUBLIC_DATA(AT_surfxml_foreach_set_id ) AX_surfxml_foreach_set_id;
+#define A_surfxml_foreach_set_id (surfxml_bufferstack + AX_surfxml_foreach_set_id)
+XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_dst_with_other_send ) AX_surfxml_route_impact_on_dst_with_other_send;
+#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
+XBT_PUBLIC_DATA(AT_surfxml_prop_value ) AX_surfxml_prop_value;
+#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
+XBT_PUBLIC_DATA(AT_surfxml_route_impact_on_src_with_other_recv ) AX_surfxml_route_impact_on_src_with_other_recv;
+#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
+XBT_PUBLIC_DATA(AT_surfxml_link_state_file ) AX_surfxml_link_state_file;
+#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
+XBT_PUBLIC_DATA(AT_surfxml_set_prefix ) AX_surfxml_set_prefix;
+#define A_surfxml_set_prefix (surfxml_bufferstack + AX_surfxml_set_prefix)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_power ) AX_surfxml_cluster_power;
+#define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
+XBT_PUBLIC_DATA(AT_surfxml_process_function ) AX_surfxml_process_function;
+#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
+XBT_PUBLIC_DATA(AT_surfxml_host_max_outgoing_rate ) AX_surfxml_host_max_outgoing_rate;
+#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+XBT_PUBLIC_DATA(AT_surfxml_link_c_ctn_id ) AX_surfxml_link_c_ctn_id;
+#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+XBT_PUBLIC_DATA(AT_surfxml_host_availability ) AX_surfxml_host_availability;
+#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+XBT_PUBLIC_DATA(AT_surfxml_route_src ) AX_surfxml_route_src;
+#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
+XBT_PUBLIC_DATA(AT_surfxml_route_c_multi_src ) AX_surfxml_route_c_multi_src;
+#define A_surfxml_route_c_multi_src (surfxml_bufferstack + AX_surfxml_route_c_multi_src)
+XBT_PUBLIC_DATA(AT_surfxml_route_c_multi_action ) AX_surfxml_route_c_multi_action;
+#define A_surfxml_route_c_multi_action AX_surfxml_route_c_multi_action
+XBT_PUBLIC_DATA(AT_surfxml_trace_id ) AX_surfxml_trace_id;
+#define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_radical ) AX_surfxml_cluster_radical;
+#define A_surfxml_cluster_radical (surfxml_bufferstack + AX_surfxml_cluster_radical)
+XBT_PUBLIC_DATA(AT_surfxml_include_file ) AX_surfxml_include_file;
+#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
+XBT_PUBLIC_DATA(AT_surfxml_random_std_deviation ) AX_surfxml_random_std_deviation;
+#define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation)
+XBT_PUBLIC_DATA(AT_surfxml_trace_c_connect_kind ) AX_surfxml_trace_c_connect_kind;
+#define A_surfxml_trace_c_connect_kind AX_surfxml_trace_c_connect_kind
+XBT_PUBLIC_DATA(AT_surfxml_trace_c_connect_connector_id ) AX_surfxml_trace_c_connect_connector_id;
+#define A_surfxml_trace_c_connect_connector_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_connector_id)
+XBT_PUBLIC_DATA(AT_surfxml_route_c_multi_dst ) AX_surfxml_route_c_multi_dst;
+#define A_surfxml_route_c_multi_dst (surfxml_bufferstack + AX_surfxml_route_c_multi_dst)
 XBT_PUBLIC_DATA(AT_surfxml_host_state_file ) AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
 XBT_PUBLIC_DATA(AT_surfxml_host_state_file ) AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
+XBT_PUBLIC_DATA(AT_surfxml_route_c_multi_symmetric ) AX_surfxml_route_c_multi_symmetric;
+#define A_surfxml_route_c_multi_symmetric AX_surfxml_route_c_multi_symmetric
 XBT_PUBLIC_DATA(AT_surfxml_route_dst ) AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
 XBT_PUBLIC_DATA(AT_surfxml_route_dst ) AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
+XBT_PUBLIC_DATA(AT_surfxml_cluster_bw ) AX_surfxml_cluster_bw;
+#define A_surfxml_cluster_bw (surfxml_bufferstack + AX_surfxml_cluster_bw)
 XBT_PUBLIC_DATA(AT_surfxml_platform_version ) AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
 XBT_PUBLIC_DATA(AT_surfxml_platform_version ) AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
index deb183c..a8b5e5c 100644 (file)
@@ -32,12 +32,27 @@ XBT_PUBLIC(xbt_dynar_t) STag_surfxml_argument_cb_list;
 XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_argument_cb_list;
 XBT_PUBLIC(xbt_dynar_t) STag_surfxml_prop_cb_list;
 XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_prop_cb_list;
 XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_argument_cb_list;
 XBT_PUBLIC(xbt_dynar_t) STag_surfxml_prop_cb_list;
 XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_prop_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_set_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_set_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_foreach_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_foreach_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_route_c_multi_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_route_c_multi_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_cluster_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_cluster_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_trace_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_trace_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_trace_c_connect_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_trace_c_connect_cb_list;
+XBT_PUBLIC(xbt_dynar_t) STag_surfxml_random_cb_list;
+XBT_PUBLIC(xbt_dynar_t) ETag_surfxml_random_cb_list;
 
 XBT_PUBLIC(void) surf_parse_open(const char *file);
 XBT_PUBLIC(void) surf_parse_close(void);
 XBT_PUBLIC(void) surf_parse_reset_parser(void);
 XBT_PUBLIC(void) surf_parse_free_callbacks(void);
 XBT_PUBLIC(void) surf_parse_get_double(double *value,const char *string);
 
 XBT_PUBLIC(void) surf_parse_open(const char *file);
 XBT_PUBLIC(void) surf_parse_close(void);
 XBT_PUBLIC(void) surf_parse_reset_parser(void);
 XBT_PUBLIC(void) surf_parse_free_callbacks(void);
 XBT_PUBLIC(void) surf_parse_get_double(double *value,const char *string);
+XBT_PUBLIC(void) surf_parse_get_int(int *value,const char *string);
 
 /* Prototypes of the functions offered by flex */
 XBT_PUBLIC(int) surf_parse_lex(void);
 
 /* Prototypes of the functions offered by flex */
 XBT_PUBLIC(int) surf_parse_lex(void);
@@ -72,11 +87,5 @@ XBT_PUBLIC_DATA(int_f_void_t) surf_parse; /* Entry-point to the parser. Set this
 
 XBT_PUBLIC(void) surfxml_add_callback(xbt_dynar_t cb_list, void_f_void_t function);
 
 
 XBT_PUBLIC(void) surfxml_add_callback(xbt_dynar_t cb_list, void_f_void_t function);
 
-/* This is used by all models when creating the routing table while parsing */
-XBT_PUBLIC_DATA(xbt_dict_t) route_table;
-XBT_PUBLIC_DATA(xbt_dynar_t) route_link_list;
-XBT_PUBLIC_DATA(xbt_dynar_t) links;
-XBT_PUBLIC_DATA(xbt_dynar_t) keys;
-
 
 #endif
 
 #endif
diff --git a/libtool b/libtool
index b0ed201..3322f10 100755 (executable)
--- a/libtool
+++ b/libtool
@@ -1,4 +1,4 @@
-#! /bin/sh
+#! /bin/bash
 
 # libtoolT - Provide generalized library-building support services.
 # Generated automatically by  (GNU simgrid 3.3-svn)
 
 # libtoolT - Provide generalized library-building support services.
 # Generated automatically by  (GNU simgrid 3.3-svn)
@@ -44,10 +44,10 @@ available_tags=" CXX GCJ"
 
 # ### BEGIN LIBTOOL CONFIG
 
 
 # ### BEGIN LIBTOOL CONFIG
 
-# Libtool was configured on host blaise:
+# Libtool was configured on host ubuntu:
 
 # Shell to use when invoking shell scripts.
 
 # Shell to use when invoking shell scripts.
-SHELL="/bin/sh"
+SHELL="/bin/bash"
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
@@ -66,12 +66,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -97,7 +97,7 @@ with_gcc=yes
 EGREP="/bin/grep -E"
 
 # The linker used to build libraries.
 EGREP="/bin/grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -325,10 +325,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/ /lib/i486-linux-gnu/4.2.3/ /lib/../lib/ /usr/lib/i486-linux-gnu/4.2.3/ /usr/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../ /lib/ /usr/lib/"
+sys_lib_search_path_spec=" /usr/lib/gcc/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../x86_64-linux-gnu/lib/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../ /lib/x86_64-linux-gnu/4.1.2/ /lib/ /usr/lib/x86_64-linux-gnu/4.1.2/ /usr/lib/"
 
 # Run-time system search path for libraries
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /lib/i486-linux-gnu /usr/lib/i486-linux-gnu /usr/lib/R/lib /usr/local/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -7349,10 +7349,10 @@ disable_libs=static
 # End:
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
 # End:
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-# Libtool was configured on host blaise:
+# Libtool was configured on host ubuntu:
 
 # Shell to use when invoking shell scripts.
 
 # Shell to use when invoking shell scripts.
-SHELL="/bin/sh"
+SHELL="/bin/bash"
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
@@ -7371,12 +7371,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -7402,7 +7402,7 @@ with_gcc=yes
 EGREP="/bin/grep -E"
 
 # The linker used to build libraries.
 EGREP="/bin/grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -7531,11 +7531,11 @@ striplib="strip --strip-unneeded"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
-predep_objects="/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.2.3/crtbeginS.o"
+predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.1.2/crtbeginS.o"
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdep_objects="/usr/lib/gcc/i486-linux-gnu/4.2.3/crtendS.o /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crtn.o"
+postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.1.2/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../lib64/crtn.o"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
@@ -7547,7 +7547,7 @@ postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path="-L/usr/lib/gcc/i486-linux-gnu/4.2.3 -L/usr/lib/gcc/i486-linux-gnu/4.2.3 -L/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i486-linux-gnu/4.2.3/../../.."
+compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.1.2 -L/usr/lib/gcc/x86_64-linux-gnu/4.1.2 -L/usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64"
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
@@ -7627,10 +7627,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../i486-linux-gnu/4.2.3/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/ /lib/i486-linux-gnu/4.2.3/ /lib/../lib/ /usr/lib/i486-linux-gnu/4.2.3/ /usr/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/ /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../ /lib/ /usr/lib/"
+sys_lib_search_path_spec=" /usr/lib/gcc/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../x86_64-linux-gnu/lib/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../x86_64-linux-gnu/4.1.2/ /usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../ /lib/x86_64-linux-gnu/4.1.2/ /lib/ /usr/lib/x86_64-linux-gnu/4.1.2/ /usr/lib/"
 
 # Run-time system search path for libraries
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /lib/i486-linux-gnu /usr/lib/i486-linux-gnu /usr/lib/R/lib /usr/local/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -7654,10 +7654,10 @@ include_expsyms=""
 
 # ### BEGIN LIBTOOL TAG CONFIG: GCJ
 
 
 # ### BEGIN LIBTOOL TAG CONFIG: GCJ
 
-# Libtool was configured on host blaise:
+# Libtool was configured on host ubuntu:
 
 # Shell to use when invoking shell scripts.
 
 # Shell to use when invoking shell scripts.
-SHELL="/bin/sh"
+SHELL="/bin/bash"
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
 
 # Whether or not to build shared libraries.
 build_libtool_libs=yes
@@ -7676,12 +7676,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -7753,14 +7753,14 @@ shrext_cmds='.so'
 exeext=""
 
 # Additional compiler flags for building library objects.
 exeext=""
 
 # Additional compiler flags for building library objects.
-pic_flag=" -fPIC"
+pic_flag=""
 pic_mode=default
 
 # What is the maximum length of a command?
 max_cmd_len=32768
 
 # Does compiler simultaneously support -c and -o options?
 pic_mode=default
 
 # What is the maximum length of a command?
 max_cmd_len=32768
 
 # Does compiler simultaneously support -c and -o options?
-compiler_c_o="yes"
+compiler_c_o="no"
 
 # Must we lock files when doing compilation?
 need_locks="no"
 
 # Must we lock files when doing compilation?
 need_locks="no"
@@ -7935,10 +7935,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
 link_all_deplibs=no
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i486-linux-gnu/4.2.1/ /usr/lib/gcc/i486-linux-gnu/4.2.1/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../../i486-linux-gnu/lib/i486-linux-gnu/4.2.1/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../../i486-linux-gnu/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../i486-linux-gnu/4.2.1/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../../lib/ /lib/i486-linux-gnu/4.2.1/ /lib/../lib/ /usr/lib/i486-linux-gnu/4.2.1/ /usr/lib/../lib/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../../i486-linux-gnu/lib/ /usr/lib/gcc/i486-linux-gnu/4.2.1/../../../ /lib/ /usr/lib/"
+sys_lib_search_path_spec=""
 
 # Run-time system search path for libraries
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /lib/i486-linux-gnu /usr/lib/i486-linux-gnu /usr/lib/R/lib /usr/local/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
index d9dc6eb..78f4659 100644 (file)
@@ -54,6 +54,7 @@ EXTRA_DIST= \
        include/surf/trace_mgr.h \
        include/surf/surf.h \
        include/surf/surfxml_parse_private.h \
        include/surf/trace_mgr.h \
        include/surf/surf.h \
        include/surf/surfxml_parse_private.h \
+       include/surf/random_mgr.h \
        \
        include/xbt/context.h \
        include/xbt/xbt_os_time.h \
        \
        include/xbt/context.h \
        include/xbt/xbt_os_time.h \
@@ -165,6 +166,7 @@ SURF_SRC= \
   surf/fair_bottleneck.c                                                              \
   surf/lagrange.c                                                            \
   surf/trace_mgr.c                                                           \
   surf/fair_bottleneck.c                                                              \
   surf/lagrange.c                                                            \
   surf/trace_mgr.c                                                           \
+  surf/random_mgr.c                                                           \
   surf/surf.c                                                                \
   surf/surfxml_parse.c                                                       \
   surf/cpu.c   surf/network.c   surf/workstation.c                           \
   surf/surf.c                                                                \
   surf/surfxml_parse.c                                                       \
   surf/cpu.c   surf/network.c   surf/workstation.c                           \
index 025272a..d32041a 100644 (file)
@@ -130,8 +130,8 @@ am__libsimgrid_la_SOURCES_DIST = xbt/snprintf.c xbt/xbt_str.c \
        xbt/xbt_matrix.c xbt/xbt_queue.c xbt/xbt_peer.c xbt/xbt_main.c \
        xbt/config.c xbt/cunit.c xbt/graphxml_parse.c surf/maxmin.c \
        surf/fair_bottleneck.c surf/lagrange.c surf/trace_mgr.c \
        xbt/xbt_matrix.c xbt/xbt_queue.c xbt/xbt_peer.c xbt/xbt_main.c \
        xbt/config.c xbt/cunit.c xbt/graphxml_parse.c surf/maxmin.c \
        surf/fair_bottleneck.c surf/lagrange.c surf/trace_mgr.c \
-       surf/surf.c surf/surfxml_parse.c surf/cpu.c surf/network.c \
-       surf/workstation.c surf/surf_timer.c \
+       surf/random_mgr.c surf/surf.c surf/surfxml_parse.c surf/cpu.c \
+       surf/network.c surf/workstation.c surf/surf_timer.c \
        surf/workstation_KCCFLN05.c surf/workstation_ptask_L07.c \
        xbt/xbt_sg_stubs.c xbt/xbt_os_thread.c \
        xbt/xbt_thread_context.c xbt/xbt_ucontext.c \
        surf/workstation_KCCFLN05.c surf/workstation_ptask_L07.c \
        xbt/xbt_sg_stubs.c xbt/xbt_os_thread.c \
        xbt/xbt_thread_context.c xbt/xbt_ucontext.c \
@@ -169,9 +169,10 @@ am__libsimgrid_la_SOURCES_DIST = xbt/snprintf.c xbt/xbt_str.c \
 @CONTEXT_THREADS_TRUE@ xbt_thread_context.lo
 @CONTEXT_THREADS_FALSE@am__objects_7 = xbt_ucontext.lo
 am__objects_8 = maxmin.lo fair_bottleneck.lo lagrange.lo trace_mgr.lo \
 @CONTEXT_THREADS_TRUE@ xbt_thread_context.lo
 @CONTEXT_THREADS_FALSE@am__objects_7 = xbt_ucontext.lo
 am__objects_8 = maxmin.lo fair_bottleneck.lo lagrange.lo trace_mgr.lo \
-       surf.lo surfxml_parse.lo cpu.lo network.lo workstation.lo \
-       surf_timer.lo workstation_KCCFLN05.lo workstation_ptask_L07.lo \
-       xbt_sg_stubs.lo $(am__objects_6) $(am__objects_7)
+       random_mgr.lo surf.lo surfxml_parse.lo cpu.lo network.lo \
+       workstation.lo surf_timer.lo workstation_KCCFLN05.lo \
+       workstation_ptask_L07.lo xbt_sg_stubs.lo $(am__objects_6) \
+       $(am__objects_7)
 am__objects_9 = gtnets_simulator.lo gtnets_topology.lo \
        gtnets_interface.lo network_gtnets.lo
 @HAVE_GTNETS_TRUE@am__objects_10 = $(am__objects_9)
 am__objects_9 = gtnets_simulator.lo gtnets_topology.lo \
        gtnets_interface.lo network_gtnets.lo
 @HAVE_GTNETS_TRUE@am__objects_10 = $(am__objects_9)
@@ -403,11 +404,12 @@ EXTRA_DIST = portable.h xbt/mallocator_private.h xbt/dynar_private.h \
        surf/surfxml.c surf/surfxml.dtd surf/network_private.h \
        surf/network_gtnets_private.h include/surf/maxmin.h \
        include/surf/trace_mgr.h include/surf/surf.h \
        surf/surfxml.c surf/surfxml.dtd surf/network_private.h \
        surf/network_gtnets_private.h include/surf/maxmin.h \
        include/surf/trace_mgr.h include/surf/surf.h \
-       include/surf/surfxml_parse_private.h include/xbt/context.h \
-       include/xbt/xbt_os_time.h include/xbt/xbt_os_thread.h \
-       msg/private.h simdag/private.h gras/DataDesc/ddt_parse.yy.l \
-       gras/Virtu/virtu_rl.h gras/Virtu/virtu_sg.h \
-       gras/Virtu/virtu_interface.h gras/Virtu/virtu_private.h \
+       include/surf/surfxml_parse_private.h include/surf/random_mgr.h \
+       include/xbt/context.h include/xbt/xbt_os_time.h \
+       include/xbt/xbt_os_thread.h msg/private.h simdag/private.h \
+       gras/DataDesc/ddt_parse.yy.l gras/Virtu/virtu_rl.h \
+       gras/Virtu/virtu_sg.h gras/Virtu/virtu_interface.h \
+       gras/Virtu/virtu_private.h \
        gras/Transport/transport_interface.h \
        amok/Bandwidth/bandwidth_private.h amok/amok_modinter.h \
        include/simix/simix.h include/simix/datatypes.h \
        gras/Transport/transport_interface.h \
        amok/Bandwidth/bandwidth_private.h amok/amok_modinter.h \
        include/simix/simix.h include/simix/datatypes.h \
@@ -496,8 +498,9 @@ XBT_SG_SRC = \
   xbt/xbt_sg_time.c     
 
 SURF_SRC = surf/maxmin.c surf/fair_bottleneck.c surf/lagrange.c \
   xbt/xbt_sg_time.c     
 
 SURF_SRC = surf/maxmin.c surf/fair_bottleneck.c surf/lagrange.c \
-       surf/trace_mgr.c surf/surf.c surf/surfxml_parse.c surf/cpu.c \
-       surf/network.c surf/workstation.c surf/surf_timer.c \
+       surf/trace_mgr.c surf/random_mgr.c surf/surf.c \
+       surf/surfxml_parse.c surf/cpu.c surf/network.c \
+       surf/workstation.c surf/surf_timer.c \
        surf/workstation_KCCFLN05.c surf/workstation_ptask_L07.c \
        xbt/xbt_sg_stubs.c $(am__append_1) $(am__append_2)
 GTNETS_SRC = \
        surf/workstation_KCCFLN05.c surf/workstation_ptask_L07.c \
        xbt/xbt_sg_stubs.c $(am__append_1) $(am__append_2)
 GTNETS_SRC = \
@@ -823,6 +826,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network_gtnets.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peermanagement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network_gtnets.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peermanagement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random_mgr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_dns.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_emul.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_msg.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_dns.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_emul.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rl_msg.Plo@am__quote@
@@ -1374,6 +1378,13 @@ trace_mgr.lo: surf/trace_mgr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o trace_mgr.lo `test -f 'surf/trace_mgr.c' || echo '$(srcdir)/'`surf/trace_mgr.c
 
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o trace_mgr.lo `test -f 'surf/trace_mgr.c' || echo '$(srcdir)/'`surf/trace_mgr.c
 
+random_mgr.lo: surf/random_mgr.c
+@am__fastdepCC_TRUE@   $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT random_mgr.lo -MD -MP -MF $(DEPDIR)/random_mgr.Tpo -c -o random_mgr.lo `test -f 'surf/random_mgr.c' || echo '$(srcdir)/'`surf/random_mgr.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/random_mgr.Tpo $(DEPDIR)/random_mgr.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='surf/random_mgr.c' object='random_mgr.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o random_mgr.lo `test -f 'surf/random_mgr.c' || echo '$(srcdir)/'`surf/random_mgr.c
+
 surf.lo: surf/surf.c
 @am__fastdepCC_TRUE@   $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surf.lo -MD -MP -MF $(DEPDIR)/surf.Tpo -c -o surf.lo `test -f 'surf/surf.c' || echo '$(srcdir)/'`surf/surf.c
 @am__fastdepCC_TRUE@   mv -f $(DEPDIR)/surf.Tpo $(DEPDIR)/surf.Plo
 surf.lo: surf/surf.c
 @am__fastdepCC_TRUE@   $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surf.lo -MD -MP -MF $(DEPDIR)/surf.Tpo -c -o surf.lo `test -f 'surf/surf.c' || echo '$(srcdir)/'`surf/surf.c
 @am__fastdepCC_TRUE@   mv -f $(DEPDIR)/surf.Tpo $(DEPDIR)/surf.Plo
index 3905f6e..185cbd2 100644 (file)
@@ -8,7 +8,7 @@
 /* GENERATED FILE, DO NOT EDIT */
 /*******************************/
 
 /* GENERATED FILE, DO NOT EDIT */
 /*******************************/
 
-# 489 "xbt/dict.c" 
+# 494 "xbt/dict.c" 
 #include "xbt.h"
 #include "xbt/ex.h"
 #include "portable.h"
 #include "xbt.h"
 #include "xbt/ex.h"
 #include "portable.h"
diff --git a/src/include/surf/random_mgr.h b/src/include/surf/random_mgr.h
new file mode 100644 (file)
index 0000000..7233e71
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _SURF_RMGR_H
+#define _SURF_RMGR_H
+
+#include "xbt/heap.h"
+#include "xbt/dict.h"
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+
+typedef enum {NONE, DRAND48, RAND} Generator;
+
+typedef struct random_data_desc {
+  int max, min, mean, stdDeviation;
+  Generator generator;
+} s_random_data_t, *random_data_t;
+
+XBT_PUBLIC_DATA(xbt_dict_t) random_data_list;
+
+XBT_PUBLIC(float) random_generate(random_data_t random);
+XBT_PUBLIC(random_data_t) random_new(int generator, int min, int max, int mean, int stdDeviation);
+
+#endif                         /* _SURF_RMGR_H */
index a7f7c2a..ac5da2b 100644 (file)
@@ -550,13 +550,39 @@ void parse_properties(void);
 void free_string(void*);
 
 /* Prototypes for functions handling routing and were factorized succesfully from the models */
 void free_string(void*);
 
 /* Prototypes for functions handling routing and were factorized succesfully from the models */
-void init_route_table(void);
-void make_route_table(void);
+void init_data(void);
 void parse_route_elem(void);
 
 /* surf parse file related */
 void parse_platform_file(const char* file);
 
 void parse_route_elem(void);
 
 /* surf parse file related */
 void parse_platform_file(const char* file);
 
+/* Stores the sets */
+XBT_PUBLIC_DATA(xbt_dict_t) set_list;
+
+void parse_foreach(void);
+void parse_sets(void);
+void parse_route_multi_set_endpoints(void);
+void parse_route_multi_set_route(void);
+void parse_cluster(void);
+void parse_trace_init(void);
+void parse_trace_finalize(void);
+void parse_trace_c_connect(void);
+
+void manage_route(xbt_dict_t route_table, const char* route_name, int action, int isMultiRoute);
+int route_action;
+
+/* This is used by all models when creating the routing table while parsing */
+xbt_dict_t route_table, route_multi_table;
+xbt_dynar_t route_link_list;
+
+/* For the trace and trace:connect tag */
+xbt_dict_t traces_set_list;
+xbt_dynar_t traces_connect_list;
+
+double get_cpu_power(const char* power);
+void init_randomness(void);
+void add_randomness(void);
+
 SG_END_DECL()
 
 #endif                         /* _SURF_SURF_H */
 SG_END_DECL()
 
 #endif                         /* _SURF_SURF_H */
index 5a3a4e3..484631b 100644 (file)
@@ -21,6 +21,7 @@ XBT_PUBLIC(tmgr_history_t) tmgr_history_new(void);
 XBT_PUBLIC(void) tmgr_history_free(tmgr_history_t history);
 
 XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new(const char *filename);
 XBT_PUBLIC(void) tmgr_history_free(tmgr_history_t history);
 
 XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new(const char *filename);
+XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new_from_string(const char* id, const char *input, double periodicity);
 XBT_PUBLIC(tmgr_trace_t) tmgr_empty_trace_new(void);
 XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace);
 
 XBT_PUBLIC(tmgr_trace_t) tmgr_empty_trace_new(void);
 XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace);
 
index abe0c75..7e5de8d 100644 (file)
@@ -57,7 +57,10 @@ extern xbt_test_unit_t _xbt_current_unit;
     void test_config_use(void);
   /* SGU: END FILE */
 
     void test_config_use(void);
   /* SGU: END FILE */
 
-/* SGU: END PROTOTYPES */
+  /* SGU: BEGIN FILE ./xbt/cunit.c */
+    void test_expected_failure(void);
+  /* SGU: END FILE */
+
 
 /*******************************/
 /* GENERATED FILE, DO NOT EDIT */
 
 /*******************************/
 /* GENERATED FILE, DO NOT EDIT */
@@ -125,6 +128,11 @@ int main(int argc, char *argv[]) {
       xbt_test_suite_push(suite, "use", test_config_use, "Data retrieving tests");
     /* SGU: END FILE */
 
       xbt_test_suite_push(suite, "use", test_config_use, "Data retrieving tests");
     /* SGU: END FILE */
 
+    /* SGU: BEGIN FILE ./xbt/cunit.c */
+      suite = xbt_test_suite_by_name("cunit","Testsuite mechanism autotest");
+      xbt_test_suite_push(suite, "expect", test_expected_failure, "expected failures");
+    /* SGU: END FILE */
+
   /* SGU: END SUITES DECLARATION */
       
   xbt_init(&argc,argv);
   /* SGU: END SUITES DECLARATION */
       
   xbt_init(&argc,argv);
index 0489887..6ca21ae 100644 (file)
@@ -9,6 +9,7 @@
 #include "private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
+#include "xbt/xbt_os_time.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix,
                                "Logging specific to SIMIX (environment)");
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix,
                                "Logging specific to SIMIX (environment)");
@@ -96,7 +97,10 @@ void SIMIX_create_environment(const char *file)
     surf_cpu_model_description[cpu_id].model_init(file);
     surf_network_model_description[network_id].model_init(file);
 
     surf_cpu_model_description[cpu_id].model_init(file);
     surf_network_model_description[network_id].model_init(file);
 
+    double start = xbt_os_time();  
     parse_platform_file(file);
     parse_platform_file(file);
+    double end = xbt_os_time();
+    DEBUG1("PARSE TIME: %lg", (end-start));
     parsed = 1;        
   }
 
     parsed = 1;        
   }
 
@@ -105,7 +109,10 @@ void SIMIX_create_environment(const char *file)
   surf_workstation_model_description[workstation_id].
       model_init(file);
 
   surf_workstation_model_description[workstation_id].
       model_init(file);
 
+  double s = xbt_os_time();  
   if  (!parsed) parse_platform_file(file);
   if  (!parsed) parse_platform_file(file);
+  double e = xbt_os_time();
+  INFO1("PARSE TIME: %lg", (e-s));
 
   _simix_init_status = 2;      /* inited; don't change settings now */
 
 
   _simix_init_status = 2;      /* inited; don't change settings now */
 
index 3d2bdc7..5abfc22 100644 (file)
@@ -69,7 +69,7 @@ static void parse_cpu_init(void)
   e_surf_cpu_state_t state_initial = SURF_CPU_OFF;
   tmgr_trace_t state_trace = NULL;
 
   e_surf_cpu_state_t state_initial = SURF_CPU_OFF;
   tmgr_trace_t state_trace = NULL;
 
-  surf_parse_get_double(&power_scale, A_surfxml_host_power);
+  power_scale = get_cpu_power(A_surfxml_host_power);
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
@@ -88,11 +88,48 @@ static void parse_cpu_init(void)
 
 }
 
 
 }
 
+static int called = 0;
+
+static void add_traces(void)
+{
+   xbt_dynar_t trace_connect = NULL;
+   unsigned int cpt;
+   int connect_element, connect_kind;
+   char *value, *trace_id, *connector_id;
+   cpu_Cas01_t host = NULL;
+   tmgr_trace_t trace;
+   
+   if (called) return;
+   called = 1;
+
+   /*for all trace connects parse them and update traces for hosts */
+   xbt_dynar_foreach (traces_connect_list, cpt, value) {
+     trace_connect = xbt_str_split_str(value, "##");
+     trace_id        = xbt_dynar_get_as(trace_connect, 0, char*);
+     connect_element = atoi(xbt_dynar_get_as(trace_connect, 1, char*)); 
+     connect_kind    = atoi(xbt_dynar_get_as(trace_connect, 2, char*));
+     connector_id    = xbt_dynar_get_as(trace_connect, 3, char*);
+
+     xbt_assert1((trace = xbt_dict_get_or_null(traces_set_list, trace_id)), "Trace %s undefined", trace_id);
+
+     if (connect_element == A_surfxml_trace_c_connect_element_HOST) {
+        xbt_assert1((host = xbt_dict_get_or_null(cpu_set, connector_id)), "Host %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: host->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+           case A_surfxml_trace_c_connect_kind_POWER: host->power_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+        }
+     }
+   }
+}
+
 static void define_callbacks(const char *file)
 {
   surf_parse_reset_parser();
   surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init);
   surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
 static void define_callbacks(const char *file)
 {
   surf_parse_reset_parser();
   surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init);
   surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
+  surfxml_add_callback(STag_surfxml_random_cb_list, &init_randomness);
+  surfxml_add_callback(ETag_surfxml_random_cb_list, &add_randomness);
 }
 
 static void *name_service(const char *name)
 }
 
 static void *name_service(const char *name)
index a754926..9e7aeaa 100644 (file)
@@ -160,7 +160,7 @@ static void parse_route_set_endpoints(void)
 {
   src_id = network_card_new(A_surfxml_route_src);
   dst_id = network_card_new(A_surfxml_route_dst);
 {
   src_id = network_card_new(A_surfxml_route_src);
   dst_id = network_card_new(A_surfxml_route_dst);
-
+  route_action = A_surfxml_route_action;
   route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
 }
 
   route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
 }
 
@@ -168,8 +168,8 @@ static void parse_route_set_route(void)
 {
   char *name;
   if (src_id != -1 && dst_id != -1) {
 {
   char *name;
   if (src_id != -1 && dst_id != -1) {
-    name = bprintf("%d##%d",src_id, dst_id);
-    xbt_dict_set(route_table, name, route_link_list, NULL);
+    name = bprintf("%x#%x",src_id, dst_id);
+    manage_route(route_table, name, route_action, 0);
     free(name);    
   }
 }
     free(name);    
   }
 }
@@ -198,26 +198,38 @@ static void add_route(void)
   unsigned int cpt = 0;    
   int link_list_capacity = 0;
   link_CM02_t *link_list = NULL;
   unsigned int cpt = 0;    
   int link_list_capacity = 0;
   link_CM02_t *link_list = NULL;
-  char* link;
+  xbt_dict_cursor_t cursor = NULL;
+  char *key,*data;
+  const char *sep = "#";
+  xbt_dynar_t links, keys;
 
   if (routing_table == NULL) create_routing_table();
 
 
   if (routing_table == NULL) create_routing_table();
 
-  link_list_capacity = xbt_dynar_length(links);
-  link_list = xbt_new(link_CM02_t, link_list_capacity);
+  xbt_dict_foreach(route_table, cursor, key, data) {
+    nb_link = 0;
+    links = (xbt_dynar_t)data;
+    keys = xbt_str_split_str(key, sep);
+
+    link_list_capacity = xbt_dynar_length(links);
+    link_list = xbt_new(link_CM02_t, link_list_capacity);
 
 
-  src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
-  dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
+    src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
+    dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
  
  
-  link = NULL;
-  xbt_dynar_foreach (links, cpt, link) {
+    char* link = NULL;
+    xbt_dynar_foreach (links, cpt, link) {
       TRY {
        link_list[nb_link++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
       TRY {
        link_list[nb_link++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
-  }
-  route_new(src_id, dst_id, link_list, nb_link);
+    }
+    route_new(src_id, dst_id, link_list, nb_link);
+    xbt_dynar_free(&links);
+   }
+
+   xbt_dict_free(&route_table);
 
 }
 
 
 }
 
@@ -226,18 +238,66 @@ static void count_hosts(void)
    host_number++;
 }
 
    host_number++;
 }
 
+static int called = 0;
+
+static void add_traces(void)
+{
+   xbt_dynar_t trace_connect = NULL;
+   unsigned int cpt;
+   int connect_element, connect_kind;
+   char *value, *trace_id, *connector_id;
+   link_CM02_t link;
+   tmgr_trace_t trace;
+   
+   if (called) return;
+   called = 1;
+
+   /*for all trace connects parse them and update traces for hosts or links */
+   xbt_dynar_foreach (traces_connect_list, cpt, value) {
+     trace_connect = xbt_str_split_str(value, "#");
+     trace_id        = xbt_dynar_get_as(trace_connect, 0, char*);
+     connect_element = atoi(xbt_dynar_get_as(trace_connect, 1, char*)); 
+     connect_kind    = atoi(xbt_dynar_get_as(trace_connect, 2, char*));
+     connector_id    = xbt_dynar_get_as(trace_connect, 3, char*);
+
+     xbt_assert1((trace = xbt_dict_get_or_null(traces_set_list, trace_id)), "Trace %s undefined", trace_id);
+
+     if (connect_element == A_surfxml_trace_c_connect_element_LINK) {
+        xbt_assert1((link = xbt_dict_get_or_null(link_set, connector_id)), "Link %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: link->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_BANDWIDTH: link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_LATENCY: link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+        }
+     }
+   }
+
+   xbt_dynar_free(&trace_connect);
+   xbt_dynar_free(&traces_connect_list);
+   xbt_dict_free(&traces_set_list); 
+}
+
 static void define_callbacks(const char *file)
 {
   /* Figuring out the network links */
 static void define_callbacks(const char *file)
 {
   /* Figuring out the network links */
-  surfxml_add_callback(STag_surfxml_host_cb_list, count_hosts);
-  surfxml_add_callback(STag_surfxml_link_cb_list, parse_link_init);
-  surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
-  surfxml_add_callback(STag_surfxml_route_cb_list, parse_route_set_endpoints);
-  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, parse_route_elem);
-  surfxml_add_callback(ETag_surfxml_route_cb_list, parse_route_set_route);
-  surfxml_add_callback(STag_surfxml_platform_cb_list, init_route_table);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_route);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_loopback);
+  surfxml_add_callback(STag_surfxml_host_cb_list, &count_hosts);
+  surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_init);
+  surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties);
+  surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem);
+  surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
+  surfxml_add_callback(STag_surfxml_platform_cb_list, &init_data);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_loopback);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
+  surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets);
+  surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_route);
+  surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_foreach);
+  surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_cluster);
+  surfxml_add_callback(STag_surfxml_trace_cb_list, &parse_trace_init);
+  surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_trace_finalize);
+  surfxml_add_callback(STag_surfxml_trace_c_connect_cb_list, &parse_trace_c_connect);
 }
 
 static void *name_service(const char *name)
 }
 
 static void *name_service(const char *name)
index d6fe8a9..e30d059 100644 (file)
@@ -253,7 +253,7 @@ static void parse_route_set_route(void)
 /*  if (nb_link > 1)
     route_new(src_id, dst_id, link_name, nb_link);
 */
 /*  if (nb_link > 1)
     route_new(src_id, dst_id, link_name, nb_link);
 */
-    name = bprintf("%d##%d",src_id, dst_id);
+    name = bprintf("%x#%x",src_id, dst_id);
     xbt_dict_set(route_table, name, route_link_list, NULL);
     free(name);    
 }
     xbt_dict_set(route_table, name, route_link_list, NULL);
     free(name);    
 }
@@ -271,27 +271,40 @@ static void add_route()
   xbt_ex_t e;
   unsigned int cpt = 0;    
   int i = 0;
   xbt_ex_t e;
   unsigned int cpt = 0;    
   int i = 0;
+  xbt_dict_cursor_t cursor = NULL;
+  char *key,*data;
+  const char *sep = "#";
+  xbt_dynar_t links, keys;
 
 
-  nb_link = xbt_dynar_length(links);
-  link_name = xbt_realloc(link_name, (nb_link) * sizeof(char *));
+  xbt_dict_foreach(route_table, cursor, key, data) {
+    nb_link = 0;
+    links = (xbt_dynar_t)data;
+    keys = xbt_str_split_str(key, sep);
+
+    nb_link = xbt_dynar_length(links);
+    link_name = xbt_realloc(link_name, (nb_link) * sizeof(char *));
 
 
-  src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
-  dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
+    src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
+    dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
   
   
-  i = 0;
-  char* link = NULL;
-  xbt_dynar_foreach (links, cpt, link) {
+    i = 0;
+    char* link = NULL;
+    xbt_dynar_foreach (links, cpt, link) {
       TRY {
         link_name[i++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
       TRY {
         link_name[i++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
-  }
-  if (nb_link > 1)
-    route_new(src_id, dst_id, link_name, nb_link);
-  if (nb_link == 1)
-    route_onehop_new(src_id, dst_id, link_name, nb_link);
+    }
+    if (nb_link > 1)
+      route_new(src_id, dst_id, link_name, nb_link);
+    if (nb_link == 1)
+      route_onehop_new(src_id, dst_id, link_name, nb_link);
+    xbt_dynar_free(&links);
+   }
+
+   xbt_dict_free(&route_table);
 }
 
 /* Main XML parsing */
 }
 
 /* Main XML parsing */
@@ -303,8 +316,14 @@ static void define_callbacks(const char *file)
   surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
   surfxml_add_callback(ETag_surfxml_route_element_cb_list, &parse_route_elem);
 /* surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_onehop_route);*/
   surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
   surfxml_add_callback(ETag_surfxml_route_element_cb_list, &parse_route_elem);
 /* surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_onehop_route);*/
+  surfxml_add_callback(STag_surfxml_platform_cb_list, &init_data);
   surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
   surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
   surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
   surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
+  surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets);
+  surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_route);
+  surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_foreach);
+  surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_cluster);
 }
 
 static void *name_service(const char *name)
 }
 
 static void *name_service(const char *name)
diff --git a/src/surf/random_mgr.c b/src/surf/random_mgr.c
new file mode 100644 (file)
index 0000000..4c9cb5f
--- /dev/null
@@ -0,0 +1,49 @@
+
+#include "surf/random_mgr.h"
+#include "xbt/sysdep.h"
+
+static double custom_random(int generator){
+   switch(generator) {
+      case DRAND48: return drand48(); break;
+      case RAND: return (double)rand()/RAND_MAX; break;
+      default: return drand48();
+   }
+}
+
+/* Generate numbers between min and max with a given mean and standard deviation */
+float random_generate(random_data_t random){  
+  float x1, x2, w, y;
+  
+  if (random == NULL) return 0.0f;  
+
+  do {
+    /* Apply the polar form of the Box-Muller Transform to map the two uniform random numbers to a pair of numbers from a normal distribution.
+       It is good for speed because it does not call math functions many times. Another way would be to simply:
+         y1 = sqrt( - 2 * log(x1) ) * cos( 2 * pi * x2 )
+    */ 
+    do {
+      x1 = 2.0 * custom_random(random->generator) - 1.0;
+      x2 = 2.0 * custom_random(random->generator) - 1.0;
+      w = x1 * x1 + x2 * x2;
+    } while ( w >= 1.0 );
+
+    w = sqrt( (-2.0 * log( w ) ) / w );
+    y = x1 * w;
+
+    /* Multiply the Box-Muller value by the standard deviation and add the mean */
+    y = y * random->stdDeviation + random->mean;
+  } while (!(random->min <= y && y <= random->max));
+
+  return y;
+}
+
+random_data_t random_new(int generator, int min, int max, int mean, int stdDeviation){
+  random_data_t random = xbt_new0(s_random_data_t, 1);
+  random->generator = generator;
+  random->min = min;
+  random->max = max;
+  random->mean = mean;
+  random->stdDeviation = stdDeviation;
+  return random;
+}
+
index daa9be1..9a25508 100644 (file)
@@ -13,6 +13,7 @@
 #include "surf/trace_mgr.h"
 #include "xbt/log.h"
 #include "surf/surfxml_parse_private.h"
 #include "surf/trace_mgr.h"
 #include "xbt/log.h"
 #include "surf/surfxml_parse_private.h"
+#include "surf/random_mgr.h"
 
 #define NO_MAX_DURATION -1.0
 #define SG_TCP_CTE_GAMMA 20000.0
 
 #define NO_MAX_DURATION -1.0
 #define SG_TCP_CTE_GAMMA 20000.0
index 8f1479e..7ca1abb 100644 (file)
@@ -379,8 +379,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 207
-#define YY_END_OF_BUFFER 208
+#define YY_NUM_RULES 336
+#define YY_END_OF_BUFFER 337
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -388,7 +388,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[1159] =
+static yyconst flex_int16_t yy_accept[1941] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -399,124 +399,210 @@ static yyconst flex_int16_t yy_accept[1159] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  208,  206,
-
-       15,   10,   10,   15,   15,  186,   10,  186,    5,    6,
-        5,    8,    9,    8,  202,  194,  195,  203,  200,  203,
-      201,  205,  194,  195,  205,  206,   26,   10,   26,   26,
-       26,   24,   26,   26,   30,   10,   30,   30,  206,  206,
-       30,   37,   10,   37,   37,   37,   35,   37,   41,   10,
-       41,   68,   10,   68,   68,   68,   66,   68,   68,   68,
-       68,   68,   72,   10,   72,  206,   72,   81,   10,   81,
-       81,   81,   79,   81,   81,   85,   10,   85,   92,   10,
-       92,   92,   92,   90,   92,   96,   10,   96,  121,   10,
-      121,  121,  121,  119,  121,  121,  121,  121,  125,   10,
-
-      125,  125,  142,   10,  142,  142,  142,  140,  142,  142,
-      142,  146,   10,  146,  206,  146,  153,   10,  153,  153,
-      153,  151,  153,  157,   10,  157,  170,   10,  170,  170,
-      170,  168,  170,  170,  170,  170,  174,   10,  174,  206,
-      174,  181,   10,  181,  181,  181,  179,  181,  185,   10,
-      185,  203,  202,   10,    0,    2,    2,    0,    4,    7,
-      197,  196,    0,    0,    0,    0,    0,    0,    0,   25,
-       27,   27,   27,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   36,   38,   38,
-        0,   67,   69,   69,   69,   69,   69,   69,   69,    0,
-
-        0,   80,   82,   82,   82,    0,   91,   93,   93,    0,
-      120,  122,  122,  122,  122,  122,  122,    0,  141,  143,
-      143,  143,  143,    0,    0,  152,  154,  154,    0,  169,
-      171,  171,  171,  171,  171,    0,    0,  180,  182,  182,
-        0,    0,    0,    0,    0,    0,    0,    3,    0,    0,
-        0,    0,    0,    0,    0,  204,    0,   27,   27,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   38,    0,    0,   69,    0,
-        0,   69,   69,   69,   69,    0,    0,    0,    0,    0,
-       82,    0,    0,    0,    0,    0,    0,  122,    0,    0,
-
-      122,  122,  122,    0,    0,  143,  143,  143,    0,    0,
-        0,    0,    0,    0,    0,  171,  171,  171,  171,    0,
-        0,    0,  182,    0,    0,    0,  199,    0,   14,    1,
-        0,    0,  192,    0,    0,    0,  189,  188,    0,    0,
-       27,   27,    0,    0,   29,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  337,  335,   15,   10,   10,   15,   15,  315,
+       10,  315,    5,    6,    5,    8,    9,    8,  331,  323,
+      324,  332,  329,  332,  330,  334,  323,  324,  334,  335,
+       25,   10,   25,   25,   25,   23,   25,   25,   29,   10,
+       29,   29,  335,  335,   29,   35,   10,   35,   35,   35,
+       33,   35,   39,   10,   39,   49,   10,   49,   49,   49,
+
+       47,   49,   49,   49,  332,  331,   70,   10,   70,   70,
+       70,   68,   70,   70,   70,   70,   74,   10,   74,  335,
+       74,   94,   10,   94,   94,   94,   92,   94,   94,   94,
+       94,   98,   10,   98,  110,   10,  110,  110,  110,  108,
+      110,  110,  110,  110,  114,   10,  114,  120,   10,  120,
+      120,  120,  118,  120,  335,  335,  124,   10,  124,  150,
+       10,  150,  150,  150,  148,  150,  150,  150,  150,  150,
+      154,   10,  154,  154,  162,   10,  162,  162,  162,  160,
+      162,  162,  166,   10,  166,  188,   10,  188,  188,  188,
+      186,  188,  188,  188,  188,  188,  188,  192,   10,  192,
+
+      198,   10,  198,  198,  198,  196,  198,  202,   10,  202,
+      226,   10,  226,  226,  226,  224,  226,  226,  226,  226,
+      230,   10,  230,  230,  248,   10,  248,  248,  248,  246,
+      248,  248,  248,  335,  252,   10,  252,  252,  274,   10,
+      274,  274,  274,  272,  274,  274,  274,  274,  278,   10,
+      278,  278,  284,   10,  284,  284,  284,  282,  284,  288,
+       10,  288,  300,   10,  300,  300,  300,  298,  300,  300,
+      300,  300,  304,   10,  304,  335,  304,  310,   10,  310,
+      310,  310,  308,  310,  314,   10,  314,   10,    0,    2,
+        2,    0,    4,    7,  326,  325,    0,    0,    0,    0,
+
+        0,    0,    0,   24,   26,   26,   26,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       34,   36,   36,    0,   48,   50,   50,   50,   50,    0,
+        0,    0,   69,   71,   71,   71,   71,   71,   71,   71,
+        0,    0,   93,   95,   95,   95,   95,   95,    0,  109,
+      111,  111,  111,  111,  111,    0,  119,  121,  121,    0,
+      149,  151,  151,  151,  151,  151,  151,  151,    0,  161,
+      163,  163,  163,    0,  187,  189,  189,  189,  189,  189,
+      189,  189,  189,  189,    0,  197,  199,  199,    0,  225,
+      227,  227,  227,  227,  227,  227,    0,  247,  249,  249,
+
+      249,  249,  249,    0,    0,  273,  275,  275,  275,  275,
+      275,    0,  283,  285,  285,    0,  299,  301,  301,  301,
+      301,  301,    0,    0,  309,  311,  311,    0,    0,    0,
+        0,    0,    3,    0,    0,    0,    0,    0,    0,    0,
+      333,    0,   26,   26,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   36,
+        0,    0,   50,    0,    0,   50,    0,    0,    0,  328,
+       71,    0,    0,   71,   71,   71,   71,    0,    0,    0,
+       95,   95,   95,   95,    0,    0,    0,    0,  111,  111,
+      111,    0,    0,  121,    0,    0,  151,    0,    0,  151,
+
+      151,  151,  151,    0,    0,    0,    0,  163,    0,    0,
+      189,    0,    0,    0,    0,  189,  189,  189,  189,  189,
+        0,    0,    0,    0,    0,    0,  227,    0,    0,  227,
+      227,  227,    0,    0,  249,  249,  249,  249,    0,    0,
+        0,  275,  275,  275,  275,    0,    0,    0,    0,    0,
+        0,  301,  301,  301,  301,    0,    0,    0,  311,    0,
+        0,    0,   14,    1,    0,    0,  321,    0,    0,    0,
+      318,  317,    0,    0,   26,   26,    0,    0,   28,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   99,    0,
+        0,    0,    0,   36,    0,    0,   38,    0,   50,    0,
+
+       42,   41,   50,    0,    0,    0,   52,    0,   71,    0,
+       55,   54,    0,    0,   71,    0,    0,   71,    0,    0,
+       73,    0,    0,   95,   95,   95,   95,    0,    0,   97,
+        0,    0,  101,  100,  111,  111,  111,    0,    0,  113,
+        0,  121,    0,    0,  123,    0,  151,    0,  127,  126,
+      151,  151,  151,  151,    0,    0,  153,    0,    0,  157,
+      156,  163,    0,    0,  165,    0,  189,  189,    0,  179,
+      178,    0,  169,  168,    0,    0,  189,  189,  189,  189,
+        0,    0,  191,    0,    0,  195,  194,    0,    0,  201,
+        0,  227,    0,  205,  204,  227,  227,  227,    0,    0,
+
+      229,    0,  249,    0,    0,    0,    0,  249,    0,    0,
+        0,  251,    0,  275,    0,    0,  275,    0,    0,    0,
+        0,  277,    0,    0,  281,  280,    0,    0,  287,    0,
+      301,  301,  301,  301,    0,    0,  303,    0,    0,  311,
+        0,    0,  313,    0,    0,    0,  322,  316,    0,    0,
+        0,   26,   26,    0,    0,    0,  125,    0,  203,    0,
+        0,    0,   99,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   50,    0,    0,   71,    0,   59,   58,    0,
+        0,    0,   57,   56,   71,    0,  155,   95,   95,    0,
+        0,   95,    0,  111,  111,  111,    0,  121,    0,  151,
+
+      151,  151,  151,  151,    0,  163,    0,  189,  189,    0,
+      181,  180,  189,  189,  189,  189,    0,    0,  227,  227,
+      227,  227,    0,  249,    0,  235,  234,    0,  233,  232,
+      249,    0,    0,  275,    0,  257,  256,  275,    0,  255,
+      254,    0,    0,  301,    0,    0,  301,  301,    0,    0,
+      311,    0,    0,    0,    0,   12,    0,  319,  320,    0,
+       26,   26,    0,    0,    0,  125,    0,  203,    0,    0,
+      253,   40,  253,    0,    0,    0,   32,   31,    0,    0,
+       44,   43,   50,    0,    0,   71,    0,   61,   60,   71,
+        0,  155,   95,   95,    0,    0,    0,   95,    0,  111,
+
+      111,  111,    0,  112,  121,    0,  151,  151,  151,    0,
+        0,    0,    0,  151,    0,    0,    0,    0,    0,    0,
+      189,    0,    0,  189,  189,  189,    0,    0,  227,  227,
+      227,    0,    0,  227,    0,  249,  249,    0,    0,  275,
+      275,    0,    0,  301,    0,  291,  290,  301,  301,    0,
+        0,    0,    0,    0,    0,    0,    0,   11,    0,   26,
+       26,   26,    0,    0,    0,    0,    0,   53,  253,    0,
+      193,   40,    0,    0,   50,    0,    0,   71,   71,    0,
+       95,   95,    0,    0,    0,    0,    0,    0,    0,    0,
+       95,    0,    0,    0,  111,    0,    0,    0,    0,    0,
+
+      151,  151,  151,    0,  129,  128,    0,    0,    0,  151,
+        0,  152,    0,  159,  158,    0,  164,    0,  183,  182,
+        0,    0,    0,  177,  176,    0,    0,  189,    0,    0,
+        0,    0,  227,  227,  227,    0,    0,    0,  227,    0,
+      228,    0,    0,  249,    0,    0,    0,    0,  275,    0,
+        0,  301,  301,  301,    0,    0,    0,  307,  306,    0,
+        0,    0,    0,    0,    0,    0,   26,   26,    0,  167,
+      115,   30,  289,   53,    0,  193,    0,    0,   50,    0,
+        0,   51,   71,   71,    0,   95,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   95,    0,    0,  103,
+
+      102,    0,    0,    0,  105,  104,    0,  117,  116,    0,
+      151,  151,  151,    0,    0,  151,    0,  185,  184,    0,
+      171,  170,    0,    0,    0,  173,  172,    0,    0,  227,
+        0,    0,  227,  227,    0,    0,  227,    0,    0,    0,
+      249,    0,    0,    0,    0,    0,  275,    0,  276,    0,
+      301,  301,  301,    0,    0,    0,    0,    0,    0,   16,
+        0,   18,   17,   26,   26,    0,  167,  115,   30,  289,
+        0,    0,    0,   50,  327,   71,   71,    0,   72,   95,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  107,  106,    0,  151,  151,
+
+      151,    0,    0,    0,    0,  151,    0,  175,  174,    0,
+        0,  200,  227,    0,  211,  210,  227,  227,    0,    0,
+        0,    0,  227,    0,    0,    0,    0,  249,  279,    0,
+        0,    0,    0,    0,  275,    0,    0,    0,  301,  301,
+        0,  305,    0,    0,    0,    0,   16,   26,   26,    0,
+        0,    0,    0,   37,   50,    0,    0,   71,   95,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   85,   84,    0,    0,  122,  151,  151,  151,
+        0,  135,    0,  134,  151,    0,  190,    0,    0,  227,
+      227,  227,    0,  215,    0,  214,  227,    0,    0,    0,
+
+        0,    0,    0,    0,    0,  279,    0,    0,    0,    0,
+        0,    0,    0,  275,    0,    0,  293,  292,    0,    0,
+      301,    0,  302,  305,    0,    0,    0,    0,    0,    0,
+       26,    0,   27,    0,    0,   50,    0,    0,    0,   71,
+       95,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  151,  151,  151,  137,  136,    0,
+        0,    0,  207,  206,  227,  227,  227,  217,  216,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       38,    0,    0,   40,    0,   69,    0,   45,   44,   69,
-       69,   69,   69,    0,    0,   71,    0,    0,    0,   76,
-       75,   82,    0,    0,   84,    0,    0,   89,   88,    0,
-        0,   95,    0,  122,    0,  100,   99,  122,  122,  122,
-
-        0,    0,  124,    0,    0,    0,  143,    0,    0,    0,
-        0,  145,    0,    0,    0,  150,  149,    0,    0,  156,
-        0,  171,  171,  171,  171,    0,    0,  173,    0,    0,
-      182,    0,    0,  184,    0,    0,    0,    0,  193,  187,
-        0,    0,    0,   27,   27,    0,    0,   43,    0,   98,
-        0,    0,   73,    0,   42,   97,    0,    0,    0,    0,
-        0,    0,    0,    0,   69,   69,   69,   69,   69,    0,
-       74,   82,    0,    0,  122,  122,  122,  122,    0,    0,
-      131,  130,  143,    0,  129,  128,    0,   97,    0,  171,
-        0,    0,  171,  171,    0,    0,  182,    0,    0,    0,
-
-        0,    0,   12,    0,  190,  191,    0,   27,   27,    0,
-        0,   43,    0,   98,    0,    0,    0,   73,  127,   42,
-       97,  127,    0,  126,    0,  126,    0,   34,   33,    0,
-       69,   69,   69,    0,    0,    0,    0,   69,    0,   74,
-        0,    0,    0,    0,  122,  122,  122,    0,    0,  122,
-        0,  143,    0,    0,    0,  171,    0,  161,  160,  171,
-      171,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       11,    0,   27,   27,   27,    0,    0,    0,    0,    0,
-        0,  127,   87,   86,    0,  126,    0,    0,   69,   69,
-       69,    0,   47,   46,    0,    0,    0,   69,    0,   70,
-
-        0,   78,   77,    0,   83,    0,  122,  122,  122,    0,
-        0,    0,  122,    0,  123,  143,    0,    0,    0,  171,
-      171,  171,    0,    0,    0,  178,  177,    0,    0,    0,
-        0,    0,    0,    0,    0,   27,   27,    0,    0,   32,
-        0,    0,  159,   87,   86,  158,   31,    0,   69,   69,
-       69,    0,    0,   69,    0,  122,    0,    0,  122,  122,
-        0,    0,  122,  143,    0,  144,    0,    0,  171,  171,
-      171,    0,    0,    0,    0,    0,    0,    0,   17,    0,
-       19,   18,   27,   27,    0,  175,   32,  147,   16,  159,
-      158,   31,    0,   69,   69,   69,    0,    0,    0,    0,
-
-       69,    0,   94,  122,    0,  106,  105,  122,  122,    0,
-        0,    0,    0,  122,  143,  148,    0,    0,    0,  171,
-      171,    0,  176,    0,  198,    0,    0,    0,   17,   27,
-       27,    0,  175,  147,   16,    0,   39,   69,   69,   69,
-        0,   53,    0,   52,   69,    0,    0,  122,  122,  122,
-        0,  110,    0,  109,  122,  143,  148,    0,    0,  163,
-      162,    0,    0,  171,    0,  172,  176,    0,    0,    0,
-        0,    0,    0,   27,    0,   28,   69,   69,   69,   55,
-       54,    0,    0,    0,  102,  101,  122,  122,  122,  112,
-      111,    0,    0,  143,  143,    0,  155,    0,  167,  166,
-
-        0,    0,    0,  183,    0,    0,    0,    0,   21,   20,
-        0,    0,   69,   69,   69,    0,   57,   56,  122,  122,
-      122,    0,  114,  113,  143,  143,    0,  165,  164,    0,
-        0,    0,    0,   23,   22,    0,    0,   69,   69,   69,
-      122,    0,    0,  122,  143,  143,    0,    0,    0,    0,
-        0,   49,   48,   69,   69,   69,   69,  122,    0,  108,
-      107,  122,    0,    0,  143,    0,    0,  143,    0,    0,
-        0,    0,    0,    0,   69,   69,   69,   69,    0,    0,
-        0,    0,    0,  135,  134,  143,    0,  133,  132,  143,
-        0,    0,    0,    0,    0,    0,   69,   69,   69,   69,
-
-        0,  104,  103,    0,    0,    0,  143,  143,    0,    0,
-        0,   12,    0,   12,    0,   69,   69,   69,   69,    0,
-        0,    0,    0,  143,  143,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   69,    0,    0,    0,
-        0,    0,    0,  143,  143,    0,    0,    0,   51,   50,
-        0,   61,   60,    0,   59,   58,   69,    0,   65,   64,
-        0,    0,    0,    0,  143,  143,    0,   11,   69,    0,
-        0,    0,    0,  143,  143,    0,   69,    0,    0,    0,
-        0,  143,  143,    0,   69,    0,    0,    0,    0,  143,
-      143,    0,    0,    0,    0,  116,    0,  115,  143,  143,
-
-        0,    0,   63,   62,  118,  117,  143,  143,    0,  143,
-      143,    0,  143,  143,    0,    0,  143,  143,    0,    0,
-      143,  143,    0,    0,  143,  143,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  139,  138,    0,  137,  136,
+        0,    0,    0,    0,    0,    0,    0,  275,  275,    0,
+      286,    0,  297,  296,    0,    0,    0,  312,    0,    0,
+
+        0,    0,   20,   19,    0,    0,  231,    0,    0,    0,
+        0,    0,    0,    0,   71,   95,    0,    0,    0,    0,
+        0,    0,    0,   83,    0,    0,    0,   82,    0,  151,
+      151,  151,    0,  139,  138,  227,  227,  227,    0,  219,
+      218,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  275,  275,
+        0,  295,  294,    0,    0,    0,    0,   22,   21,  231,
+        0,    0,   46,   45,    0,    0,    0,    0,   71,    0,
         0,    0,    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,  151,  151,  151,  227,    0,    0,
+
+      227,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  275,  275,
+        0,    0,    0,    0,   75,    0,    0,    0,    0,    0,
+        0,    0,   91,   90,   87,   89,   86,   88,    0,    0,
+       81,    0,    0,   80,    0,    0,  131,  130,  151,  151,
+      151,  151,  227,    0,  213,  212,  227,    0,    0,    0,
+        0,    0,    0,  245,    0,  244,    0,    0,  250,    0,
+        0,    0,    0,    0,    0,    0,    0,  275,    0,    0,
+      275,    0,    0,    0,    0,    0,    0,   75,    0,    0,
+        0,    0,    0,   63,   62,    0,    0,    0,    0,    0,
+
+      151,  151,  151,  151,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  243,  242,    0,    0,    0,    0,
+        0,    0,    0,  261,  260,  275,    0,  259,  258,  275,
+        0,    0,    0,    0,    0,    0,    0,   67,    0,   66,
+        0,   79,    0,   78,    0,   96,  151,  151,  151,  151,
+        0,  209,  208,    0,    0,    0,    0,    0,  239,    0,
+        0,  238,    0,    0,  269,    0,    0,  268,  275,  275,
+        0,    0,    0,   12,    0,   12,    0,    0,    0,    0,
+        0,  151,  151,  151,  151,    0,    0,    0,    0,  241,
+      237,  240,  236,  271,  267,  270,  266,  275,  275,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  151,    0,    0,    0,    0,    0,
+        0,  275,  275,    0,    0,   65,   64,   77,   76,    0,
+      133,  132,    0,  143,  142,    0,  141,  140,  151,    0,
+      147,  146,    0,    0,    0,    0,  275,  275,    0,   11,
+      151,    0,    0,    0,    0,  275,  275,    0,  151,    0,
+        0,    0,    0,  275,  275,    0,  151,    0,    0,    0,
+        0,  275,  275,    0,    0,    0,    0,  221,    0,  220,
+      275,  275,    0,    0,  145,  144,  223,  222,  275,  275,
+        0,  275,  275,    0,  275,  275,    0,    0,  275,  275,
+
+        0,    0,  275,  275,    0,    0,  275,  275,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  265,  264,    0,
+      263,  262,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   13,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -526,15 +612,15 @@ static yyconst flex_int32_t yy_ec[256] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    5,    6,    7,    1,    1,    8,    9,    1,
         1,    1,    1,    1,   10,   11,   12,   13,   13,   13,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    5,    6,    7,    1,    1,    8,    9,    1,
         1,    1,    1,    1,   10,   11,   12,   13,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,   14,   15,   16,
-       17,   18,   19,    1,   20,   21,   22,   23,   24,   25,
-       26,   27,   28,   26,   26,   26,   29,   30,   31,   32,
-       26,   33,   34,   35,   26,   26,   26,   26,   36,   26,
-       37,    1,   38,    1,   39,    1,   40,   41,   42,   43,
-
-       44,   45,   46,   47,   48,   26,   49,   50,   51,   52,
-       53,   54,   55,   56,   57,   58,   59,   60,   61,   62,
-       63,   26,    1,    1,    1,    1,    1,    1,    1,    1,
+       13,   14,   13,   13,   13,   15,   13,   16,   17,   18,
+       19,   20,   21,    1,   22,   23,   24,   25,   26,   27,
+       28,   29,   30,   28,   31,   32,   33,   34,   35,   36,
+       28,   37,   38,   39,   28,   40,   41,   28,   42,   28,
+       43,    1,   44,    1,   45,    1,   46,   47,   48,   49,
+
+       50,   51,   52,   53,   54,   28,   55,   56,   57,   58,
+       59,   60,   61,   62,   63,   64,   65,   66,   67,   68,
+       69,   28,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -551,1111 +637,2107 @@ static yyconst flex_int32_t yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
         1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int32_t yy_meta[64] =
+static yyconst flex_int32_t yy_meta[70] =
     {   0,
         1,    2,    2,    2,    1,    1,    1,    1,    1,    3,
     {   0,
         1,    2,    2,    2,    1,    1,    1,    1,    1,    3,
-        3,    1,    4,    5,    1,    1,    1,    6,    1,    7,
-        7,    7,    7,    7,    7,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    1,    1,    5,    7,
-        7,    7,    7,    7,    7,    5,    5,    5,    5,    5,
+        3,    1,    4,    4,    4,    5,    6,    1,    7,    8,
+        1,    9,    9,    9,    9,    9,    9,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5
+        5,    5,    1,    1,    5,    9,    9,    9,    9,    9,
+        9,    5,    5,    5,    5,    5,    5,    5,    5,    5,
+        5,    5,    5,    5,    5,    5,    5,    5,    5
     } ;
 
     } ;
 
-static yyconst flex_int16_t yy_base[1227] =
+static yyconst flex_int16_t yy_base[2172] =
     {   0,
     {   0,
-        0,    0,    0,    3,    6,    9,   24,   27,   11,   14,
-       15,   17,   29,   38,   45,   52,   59,   61,   67,   70,
-       99,  161,   73,   76,  117,  122,  125,  128,  144,  179,
-      184,  187,  190,  206,  209,  212,  228,  273,  246,  251,
-      318,  375,  254,  291,  296,  299,  336,  341,  344,  347,
-      432,  492,  393,  398,  552,  600,  401,  404,  648,  705,
-      450,  455,  458,  461,  510,  515,  518,  521,  762,  819,
-      570,  575,  578,  581,  618,  623,  626,  629,  876,  924,
-      666,  671,  972, 1029,  674,  677,  723,  728,  731,  734,
-      780,  785, 1086, 1146,  788,  791,  836,  900, 2737, 3543,
-
-     3543,   91,  147,   47,   62, 3543,  150,   77, 3543, 3543,
-     2726, 3543, 3543, 2716, 3543, 2729, 2724,  805, 3543, 3543,
-     3543, 3543, 2720, 2720, 2683,  462, 3543,  153, 2702,    0,
-       79, 3543, 2674, 2662, 3543,  215,  946, 1003, 1060, 1120,
-     1161, 3543,  257, 2690,    0,  348, 3543, 2659, 3543,  302,
-      349, 3543,  480, 2687,    0,  354, 3543, 2637,    7, 2656,
-     2641, 2634, 3543,  483, 1173, 1184, 1195, 3543,  486, 2673,
-        0,  405, 3543, 2646, 2638, 3543,  539,  406, 3543,  542,
-     2659,    0,  411, 3543, 2632, 3543,  545,  683, 3543,  697,
-     2652,    0,  531, 3543, 2623, 2618, 2619,   76, 3543,  754,
-
-     1207, 1225, 3543,  757, 2640,    0,  678, 3543, 2593, 2596,
-     2590, 3543,  811, 1247, 1220, 1259, 3543,  814, 2626,    0,
-      735, 3543, 2596, 3543,  839,  842, 3543,  846, 2610,    0,
-      792, 3543, 2564, 2569, 2572, 2554, 3543,  861, 1272, 1277,
-     1299, 3543,  866, 2592,    0,  853, 3543, 2569, 3543,  894,
-      854, 2602, 2563,  897,   34, 2534, 3543, 2585, 2575, 3543,
-     3543, 3543,   26,   36, 2527, 2526, 2523, 2563, 2529, 3543,
-        0, 2518, 2523, 2517, 2514, 2515, 2511, 2510,   35, 2504,
-     2502, 2499, 2493,   89, 2491, 2491, 2488, 3543,    0, 2486,
-     2483, 3543,    0, 2490,  903, 2470, 2457, 2457, 2476, 2460,
-
-      146, 3543,    0,  942, 2456, 2450, 3543,    0,  946, 2443,
-     3543,    0, 2442,  950, 2435, 2451, 2443, 2432, 3543,    0,
-     2422, 2421, 2431, 2416, 2421, 3543,    0,  953, 2417, 3543,
-        0, 2401, 2394, 2399, 2408, 2371, 2367, 3543,    0, 2372,
-     2380, 2378, 2396, 2391, 2398,  104, 2355, 3543,  127,    0,
-     2341, 2341, 2372, 2371, 2331, 3543, 2340, 2319, 2314,  995,
-     1002, 2319, 2306, 2320, 2299, 2306, 2291, 2284, 2284, 2288,
-     2255, 2259, 2251, 2267, 2248, 2256, 1052, 1059, 2244, 1115,
-     1124, 2246, 2246, 2237, 2213, 1118, 1332, 2213, 1193, 1184,
-     2199, 1338, 1341, 1358, 1361, 1369, 1374, 2210, 1377, 1380,
-
-     2207, 2194, 2178, 1396, 1399, 1402, 2195, 1405, 1408, 1421,
-     2180, 1426, 1429, 1438, 1442, 2188, 2157, 2164, 2155, 1446,
-     1449, 2164, 2149, 1455, 1459, 2185, 3543, 2181, 3543, 3543,
-      179, 2141, 3543, 2174, 2171, 2127, 3543, 3543, 2122, 2103,
-     2096, 2083, 1466, 1476, 3543, 1479, 2079, 2076, 2082, 2082,
-     2065,  209, 2064, 2059, 2062, 2039,  210, 2038, 2043, 2034,
-     1483, 1489, 1499, 3543, 1506, 2036, 1519, 3543, 3543, 2021,
-     2019, 2015, 2021, 1509, 1527, 3543, 1531,  254, 1534, 3543,
-     3543, 2016, 1548, 1551, 3543, 1554, 1558, 3543, 3543, 1571,
-     1574, 3543, 1577, 1997, 1581, 3543, 3543, 2003, 2002, 2005,
-
-     1594, 1597, 3543, 1600, 1606, 1618, 2005, 1626, 1629, 1637,
-     1642, 3543, 1645, 1984, 1655, 3543, 3543, 1663, 1666, 3543,
-     1669, 1973, 1672, 1990, 1969, 1675, 1688, 3543, 1692, 1951,
-     1965, 1695, 1698, 3543, 1705, 1984,  140, 1715, 3543, 3543,
-     1990, 1989, 1957, 1948, 1985, 1722, 1936,  907, 1927, 1069,
-     1936, 1935,  915, 1931,  919, 1286, 1920, 1918, 1917, 1899,
-     1912, 1725, 1735, 1728, 1900, 1894, 1878, 1745, 1750, 1753,
-     1021, 1756, 1761, 1766, 1878, 1883, 1871, 1773, 1779, 1789,
-     3543, 3543, 1864, 1797, 3543, 3543, 1784, 1805, 1814, 1871,
-     1818, 1827, 1859, 1872, 1823, 1851, 1835, 1841, 1869,  206,
-
-     1866, 1844, 3543, 1864, 3543, 3543, 1828, 1827,  170, 1851,
-     1820, 1024, 1818, 1078, 1818, 1787, 1777, 1138, 1847, 1141,
-     1854, 1864, 1766, 1868, 1771, 1871, 1874, 3543, 3543, 1883,
-     1772, 1766, 1747, 1888, 1904, 1895, 1912, 1759, 1891, 1926,
-     1929, 1932, 1941, 1945, 1753, 1731, 1739, 1948, 1951, 1729,
-     1964, 1733, 1967, 1724, 1970, 1708, 1974, 3543, 3543, 1702,
-     1685, 1988, 1692, 1991, 1994, 2010, 1700, 1097,  346,  253,
-     3543, 1666, 2013, 1672, 1662, 2016, 1662, 1668, 1653, 1649,
-     1646, 2019, 2022, 2033, 1631, 2036, 1642, 2039, 1637, 1627,
-     1636, 2042, 3543, 3543, 2050, 1649, 1631, 1608, 2060, 3543,
-
-     2064, 3543, 3543, 2072, 3543, 2077, 1596, 2081, 1614, 2085,
-     1620, 1619, 1594, 2097, 3543, 1584, 2100, 1576, 2103, 1574,
-     1574, 1571, 2106, 1565, 2110, 3543, 3543, 2123, 1596,  347,
-      299,  314, 1563, 2126, 2133, 1561, 1552, 2144, 1548, 2147,
-     1553, 1543, 2150, 2153, 2156, 2162, 2166, 2169, 1543, 1547,
-     1533,  284,  397, 1532, 2172, 1524, 2175, 2179, 1525, 1514,
-      443,  502, 1515, 1511, 2191, 3543, 1507, 2194, 2199, 1503,
-     1495, 2202, 1486, 2215, 1505, 2219,  403,  371, 2222, 2225,
-     3543, 3543, 1492, 1481, 2236, 2239, 2242, 2245, 2253, 2258,
-     2261, 2266, 2270, 1484, 1474, 1472, 1493, 1510, 1489, 1497,
-
-     1460, 2273, 3543, 2276, 2280, 3543, 3543, 1451, 1445, 1471,
-     1489, 1464, 1479, 1432, 1436, 2292, 2295, 2299, 2302, 2315,
-     1428, 2318, 2321, 2324, 3543, 2327,  356,   95, 2331, 2335,
-     1427, 2346, 2351, 2354, 2357, 2365, 3543, 1408, 1423, 1403,
-     1448, 3543, 1428, 3543, 2368, 2371, 2387, 1391, 1384, 1371,
-     1414, 3543, 1409, 3543, 2375, 1134, 2395, 2398, 2401, 3543,
-     3543, 2409, 2415, 2425, 2428, 3543, 2431, 2434,  428,  458,
-      570, 2437, 2441, 2453, 2456, 3543, 1353, 1371, 1367, 3543,
-     3543, 2459, 2462, 2475, 3543, 3543, 1348, 1351, 1345, 3543,
-     3543, 2483, 2486, 1334, 1334, 2494, 3543, 2499, 3543, 3543,
-
-     2507, 2511, 2519, 3543,  167,  676,  733, 2523, 3543, 3543,
-     2531, 2536, 2547, 1349, 1335, 2550, 3543, 3543, 1319, 2558,
-     1326, 2563, 3543, 3543, 1308, 1316, 2574, 3543, 3543,  457,
-      520, 2585, 2588, 3543, 3543, 2596, 2602, 1312,  148, 1298,
-     1308, 2612, 2615, 1288, 2623, 2628,  569, 2631, 2634, 2651,
-     2662, 3543, 3543, 1300, 1294, 1293, 1292, 2639, 2670, 3543,
-     3543, 2678, 2681, 2684, 1269, 2697, 2700, 1268,  618, 2708,
-     2713, 2726, 2744, 2782, 1273, 1279, 1264, 1256, 2737, 2762,
-     2775, 2800, 2808, 3543, 3543, 1262, 2819, 3543, 3543, 1260,
-      606, 2827,   17,  626, 2845, 2883, 1261, 1242, 1255, 1249,
-
-     2835, 3543, 3543, 2863,  935,  967, 1234, 1228,  701,  413,
-      250, 1279,  994, 1274, 2875, 2901, 2905, 2908, 2911, 1260,
-     1242, 1242, 1231, 1209, 1206, 2927, 1244, 1229, 1237, 2930,
-     2933, 2937, 2949, 2952, 2960, 2966, 1185, 2976, 2979, 1201,
-     1213, 1193, 1202, 1177, 1166, 2987, 1186, 2992, 3543, 3543,
-     3000, 3543, 3543, 3008, 3543, 3543, 1158, 3016, 3543, 3543,
-     1167, 1165, 1162, 1149, 1122, 1116,  515, 3543, 1093, 1106,
-     1089, 1047, 1045, 1010, 1006,  558,  954,  963,  943,  932,
-      889,  855,  843,  437, 3024,  851,  865,  784,  794,  704,
-      701,  575, 3027, 3030,  686, 3543,  638, 3543,  590,  585,
-
-      510, 3043, 3543, 3543, 3543, 3543,  559,  556, 3051,  518,
-      423, 3054,  318,  298,  950, 1161,  264,  245,  254,  625,
-      184,  124,  673,  685, 3062, 3071,  731,  788, 3074, 3078,
-     3090, 3093,  473,  578, 3102, 3543, 3543, 3110, 3543, 3543,
-      998, 1120,  654,  897,  791,  835, 1042, 1066,  953, 1000,
-     1088, 1094,  780, 1163, 3118, 3121, 3543, 3543, 3139, 3146,
-     3153, 3160, 3167, 3174, 3181, 3188, 3195, 3202, 3209, 3216,
-     3223, 3230, 3237, 3244, 3251, 3258, 3265, 3272, 3279, 3286,
-     3293, 3300, 3307, 3314, 3321, 3328, 3333, 3338, 3343, 3348,
-     3353, 3358, 3363, 3368, 3373, 3378, 3385, 3388, 3391, 3394,
-
-     3397, 3400, 3403, 3406, 3409, 3412, 3415, 3422, 3426, 3432,
-     3438, 3444, 3450, 3456, 3462, 3468, 3474, 3480, 3486, 3493,
-     3500, 3507, 3514, 3521, 3528, 3535
+        0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
+       14,   17,   33,   36,   49,   55,   45,   61,   66,   72,
+      105,  173,   75,   78,   83,  125,  128,  132,  135,  138,
+      193,  196,  200,  203,  206,  224,  242,  293,  262,  265,
+      344,  404,  271,  273,  464,  527,  269,  316,  320,  323,
+      364,  367,  371,  374,  590,  654,  424,  427,  718,  781,
+      431,  434,  844,  907,  484,  487,  491,  494,  497,  547,
+      970, 1033,  550,  554,  557,  560,  610,  613,  617,  621,
+     1096, 1162,  674,  677, 1228,    0,  681,  685, 1297, 1351,
+      738,  741, 1405, 1468,  745,  748,  751,  801,  804,  808,
+
+      811,  814, 1531, 1594,  864,  867,  871,  874,  877,  927,
+      930,  934, 1657, 1720,  937,  940,  990,  993,  997, 1000,
+     1003, 1053, 1783, 1837, 1056, 1060, 1891, 1954, 1063, 1066,
+     1116, 1119, 1123, 1126, 1129, 1182, 2017, 2083, 1185, 1189,
+        0,    0, 4565, 7099, 7099,   95,  100,   29,   41, 7099,
+      155,   51, 7099, 7099, 4554, 7099, 7099, 4542, 7099, 4557,
+     4556,  580, 7099, 7099, 7099, 7099, 4550, 4550, 4497,  210,
+     7099,  158, 4520,    0,  142, 7099, 4485, 4477, 7099,  162,
+     2145, 1321, 1326, 1379,  208, 7099,  165, 4512,    0,  149,
+     7099, 4469, 7099,  230,  378, 7099,  233, 4502,    0,  217,
+
+     7099, 4466, 4470, 4467,  379, 4465, 7099,  326, 4482,    0,
+      311, 7099, 4451, 4450,  238, 4419, 7099,  377,  381,  562,
+      438, 7099,  458, 4459,    0,  435, 7099, 4418, 4420, 4420,
+     4404, 7099,  520,  498, 7099,  640, 4445,    0,  499, 7099,
+     4409, 4394, 4409, 4387, 7099,  644,  561, 7099,  647, 4417,
+        0,  564, 7099, 4386, 1381,  753, 7099,  703,  689, 7099,
+      709, 4414,    0,  632, 7099, 4360,   34, 4379, 4364, 4358,
+     7099,  712, 1130,  752, 7099,  773, 4399,    0,  665, 7099,
+     4368, 4367, 7099,  834,  818, 7099,  894, 4381,    0,  878,
+     7099,   24, 4351, 4352,   93, 4340, 4317, 7099,  898,  941,
+
+     7099,  901, 4360,    0,  885, 7099, 4326, 7099,  957,  942,
+     7099,  962, 4354,    0, 1004, 7099, 4323, 4319, 4320,   80,
+     7099,  965, 1316, 1005, 7099, 1150, 4341,    0, 1007, 7099,
+     4308, 4292,   26, 1068, 7099, 1153, 1317, 1070, 7099, 1156,
+     4333,    0, 1067, 7099, 4300, 4279, 4278, 4272, 7099, 1192,
+     1322, 1192, 7099, 1206, 4298,    0, 1140, 7099, 4267, 7099,
+     1215, 1318, 7099, 1218, 4291,    0, 1193, 7099, 4245, 4249,
+     4246, 4235, 7099, 1221, 1445, 1382, 1424, 7099, 1342, 4273,
+        0, 1194, 7099, 4245, 7099, 1346, 1426, 1389,   18, 4221,
+     7099, 4278, 4266, 7099, 7099, 7099, 1383,  282, 4214, 4207,
+
+     4205, 4248, 4198, 7099,    0, 4191, 4195, 4190, 4192, 4183,
+     4182, 4178, 4181, 4171,  166, 4182, 4167, 4169, 4155,  398,
+     7099,    0, 4157, 4157, 7099,    0, 4154, 1490, 4146,  410,
+     4135, 4177, 7099,    0, 4137, 1494, 4126, 4146, 4120, 4127,
+     4113, 4107, 7099,    0, 4110, 4116, 4097, 4102, 4083, 7099,
+        0, 1497, 4095, 4094, 4091, 4077, 7099,    0, 4068, 4067,
+     7099,    0, 4068, 1500, 4048, 4042, 4042, 4061, 4052, 7099,
+        0, 1504, 4048, 4028, 7099,    0, 4037, 1551, 1554, 4017,
+     4012, 4028, 4027, 4024, 4018, 7099,    0, 1557, 4003, 7099,
+        0, 3993, 1560, 3984, 3996, 3994, 3971, 7099,    0, 3948,
+
+     3947, 3961, 3951, 3951, 3942, 7099,    0, 3938, 3923, 3926,
+     3932, 3913, 7099,    0, 1563, 3918, 7099,    0, 3914, 3901,
+     3907, 3915, 3900, 3896, 7099,    0, 3896, 3900, 3924, 3931,
+      419, 3882, 7099, 1441,    0, 3865, 3865, 3898, 3893, 3849,
+     7099, 3861, 3842, 3846, 1614, 1624, 3831, 3833, 3824, 3836,
+     3820, 3809, 3804, 3792, 3792, 3793, 3773, 3790, 3760, 3774,
+     1619, 1627, 3772, 1679, 1581, 3763, 3791, 1684, 1687, 7099,
+     3764, 1690, 1646, 1693, 3754, 1740, 3765, 1748, 1753, 3750,
+     3734, 3733, 3736, 3736, 1758, 1803, 1806, 1773, 3731, 3719,
+     3720, 1809, 1812, 3721, 1815, 1857, 3711, 1864, 1867, 3709,
+
+     3709, 3703, 3687, 1911, 1917, 1920, 1923, 3681, 1975, 1979,
+      284, 1982, 1985, 2040, 2043, 2051, 3695, 3692, 3684, 3686,
+     2054, 2060, 2063, 2069, 2103, 2108, 3680, 2111, 2115, 3676,
+     3662, 3644, 2131, 2134, 3652, 2137, 2140, 3648, 3641, 2143,
+     2158, 3641, 2166, 3613, 2170, 2177, 2180, 2173, 2209, 2200,
+     2220, 3609, 3592, 3594, 3582, 2223, 2226, 3591, 3576, 2229,
+     2232, 3609, 7099, 7099,  199, 3571, 7099, 3608, 3607, 3559,
+     7099, 7099, 3545, 3544, 3538, 3528, 2251, 2255, 7099, 2258,
+     3518, 3529, 3510, 3517, 3516, 3512, 3509, 3493, 1460, 3507,
+     3489, 3504, 3486, 2261, 2264, 2279, 7099, 2283, 2287, 2305,
+
+     7099, 7099, 2293, 3511, 2298, 2313, 7099, 2317, 3473, 2320,
+     7099, 7099, 2332, 2336, 2345, 2351, 2356, 3484, 2364, 2369,
+     7099, 2372, 3472, 3480, 3479, 2375, 3477, 2378, 2383, 7099,
+     2393, 2398, 7099, 7099, 3461, 3466, 3458, 2406, 2412, 7099,
+     2415, 3450, 2418, 2421, 7099, 2425, 3447, 2440, 7099, 7099,
+     3439, 3437, 3433, 3443, 2448, 2451, 7099, 2454, 2457, 7099,
+     7099, 3442, 2473, 2478, 7099, 2481, 3423, 3439, 2486, 7099,
+     7099, 2500, 7099, 7099, 2508, 2512, 3422, 3424, 3429, 3417,
+     2521, 2526, 7099, 2529, 2533, 7099, 7099, 2541, 2548, 7099,
+     2551, 3399, 2554, 7099, 7099, 3407, 3409, 3404, 2562, 2570,
+
+     7099, 2573, 3393, 2576, 2582, 2594, 2597, 3398, 3391, 2605,
+     2608, 7099, 2615, 3386, 2618, 2630, 3387, 2638, 2641, 2649,
+     2652, 7099, 2656, 2659, 7099, 7099, 2671, 2675, 7099, 2679,
+     3370, 2682, 3387, 3360, 2685, 2690, 7099, 2694, 3358, 3371,
+     2700, 2704, 7099, 2709,  270, 2713, 7099, 7099, 3402, 3400,
+     3365, 3355, 3390, 2723, 3337, 3352, 1523, 3326, 1526, 3339,
+     3325, 3333, 1589, 3327, 3323, 3307, 3306, 2728, 2736, 2746,
+     2752, 2756, 3305, 3331, 2765, 3305, 2770, 7099, 7099, 2778,
+     2786, 2797, 7099, 7099, 3300, 2805, 1711, 3300, 3283, 2808,
+     2812, 3284, 2820, 3259, 3279, 3255, 2826, 3273, 2829, 3274,
+
+     3257, 3241, 2832, 2839, 2835, 2857, 2860, 2863, 2867, 2885,
+     7099, 7099, 2871, 2893, 2898, 2902, 2905, 2912, 3249, 3254,
+     3241, 2920, 2925, 3239, 2931, 7099, 7099, 2944, 7099, 7099,
+     3226, 3273, 2939, 3223, 2954, 7099, 7099, 3216, 2969, 7099,
+     7099, 2979, 2982, 3224, 2985, 2988, 3212, 3230, 3003, 3215,
+     3006, 3009,  301, 3251, 3012, 7099, 3249, 7099, 7099, 3208,
+     3208,    4, 3015, 3201, 3202, 1714, 3196, 1743, 3179, 3176,
+     3018, 1818, 2000, 3216, 3168, 3024, 7099, 7099, 3036, 3043,
+     7099, 7099, 3175, 3185, 3055, 3159, 3061, 7099, 7099, 3146,
+     3051, 1768, 3147, 3141, 3079, 1610, 1852, 3149, 3087, 3090,
+
+     3093, 3096, 3100, 7099, 3114, 3119, 3152, 3144, 3129, 3122,
+     3125, 3140, 3144, 3136, 3152, 3158, 3164, 3172, 3176, 3179,
+     3187, 3194, 3198, 3206, 3212, 3215, 3218, 3224, 3137, 3115,
+     3119, 3233, 3237, 3118, 3245, 3251, 3254, 3116, 3257, 3260,
+     3281, 3284, 3289, 3104, 3292, 7099, 7099, 3104, 3093, 3308,
+     3102, 3311, 3315, 3329, 1191,  131,  493, 7099, 3089, 3333,
+     3336, 3340, 3343, 3083, 3087, 3088, 3073, 1883, 1945, 3078,
+     1948, 2008, 3084, 3358, 3082, 3097, 3362, 3055, 3059, 3365,
+     3052, 3368, 3068, 3084, 3065, 3051, 3044, 3057, 3055, 3041,
+     3024, 3372, 3377, 3391, 3401, 3406, 3409, 3424, 3427, 3435,
+
+     3018, 3007, 3016, 3438, 7099, 7099, 3447, 3026, 3025, 2996,
+     3455, 7099, 3458, 7099, 7099, 3466, 7099, 3470, 7099, 7099,
+     3478, 3485, 3496, 7099, 7099, 3504, 3507, 3515, 3518, 3522,
+     3536, 3539, 2984, 3542, 2999, 3545, 3007, 3006, 2982, 3560,
+     7099, 3563, 3566, 3574, 2967, 3586, 3581, 3601, 3592, 3595,
+     3610, 2966, 2944, 2946, 3614, 2940, 3617, 7099, 7099, 3629,
+       74,  210,  220, 2939, 3633, 3636, 3644, 3651, 3658, 2011,
+     3662, 3665, 3669, 3672, 2930, 3678, 2934, 3681, 2925, 2934,
+     3684, 7099, 2912, 2923, 3687, 2905, 3690, 3694, 2944, 2930,
+     2923, 2914, 2932, 2918, 2912, 2908, 3708, 3715, 3719, 7099,
+
+     7099, 3711, 3730, 3738, 7099, 7099, 3746, 7099, 7099, 3754,
+     2882, 2886, 2871,  367,  369, 2870, 3758, 7099, 7099, 3766,
+     7099, 7099, 3774, 3777, 3785, 7099, 7099, 3793, 3796, 2866,
+     3799, 3802, 2867, 2853,  666,  733, 2855, 3817,  490,  541,
+     3825, 2852, 3828, 3831,  553,  594, 3839, 3843, 7099, 3847,
+     3850, 2853, 2841, 3857, 2829, 3868, 3862,  313,  443, 3872,
+     3877, 7099, 7099, 3887, 3890, 3896, 3899, 3910, 3915, 3919,
+     2836, 2827, 3925, 2819, 7099, 3928, 2817, 3931, 7099, 2833,
+     3934,  482,  736, 2847, 2847, 2831, 2830, 2823, 2827, 2824,
+     2822, 3946, 3953, 3964, 3967, 7099, 7099, 3975, 2793, 2787,
+
+     2790, 2799, 2814, 2792, 2808, 2755, 3979, 7099, 7099, 3987,
+     3990, 7099, 3994, 3997, 7099, 7099, 2750, 2739, 2769, 2788,
+     2766, 2782, 2736, 2744,  796, 2743,  805, 4012, 4015, 4018,
+     2738,  849, 2737,  856, 4022, 4026, 4030, 4041, 4033, 2725,
+     4051, 4054, 4057, 4060,  152,  426, 4066, 4070, 4083, 4088,
+     2706, 2706, 4091, 7099, 2694, 4094, 4097, 2703, 2698, 2716,
+     2716, 2709, 2711, 2704, 2694, 2694, 2686, 2690, 2678, 2684,
+     2672, 4113, 7099, 7099, 4121, 4124, 7099, 2636, 2642, 2613,
+     2664, 7099, 2658, 7099, 4127, 4132, 7099, 4135, 4147, 2615,
+     2608, 2593, 2642, 7099, 2637, 7099, 4155, 2612, 2592, 2603,
+
+     2601, 2588, 2598, 4158, 4161, 4169, 4178, 2597, 2577, 2588,
+     2579, 2566, 2576, 4181, 4184, 4187, 7099, 7099, 4199, 4203,
+     4212, 4217, 7099, 4220, 4223,  714,  598,  801, 4236, 4243,
+     4254, 4257, 7099, 2538, 2539, 4260, 4263,  549,  671, 2528,
+     2534, 2531, 2528, 2521, 2513, 2486, 2461, 2369,   17,    3,
+       91,  121,  269, 4272,  266,  310,  345, 7099, 7099, 4278,
+     4281, 4292, 7099, 7099,  378,  401,  438, 7099, 7099, 4300,
+     4303,  480,  516,  544,  569,  588,  646, 4311,  737,  786,
+     4319,  653,  652,  681,  709,  758,  791, 4322, 4325, 4329,
+     7099, 4334, 7099, 7099, 4343, 4348, 4356, 7099,  903,  814,
+
+     1003, 4361, 7099, 7099, 4369, 4375, 4387,  846, 4390, 4393,
+      898,  934,  920,  964,  940, 4401,  980,  989,  983,  998,
+     1008, 1007, 1007, 7099, 1057, 1058, 1043, 7099, 4404, 4408,
+     1041, 1047, 4412, 7099, 7099, 1038, 4426, 1047, 4429, 7099,
+     7099, 1075, 1100, 1112, 1106, 1110, 1122, 1114, 1152, 1166,
+     1176, 4437, 1175, 1190, 1287, 1282, 1284, 1298, 4440, 4444,
+     4458, 7099, 7099, 1401, 1315, 4466, 4469, 7099, 7099, 4447,
+     1261, 4478, 7099, 7099, 1310, 1302, 1377, 1367, 4486, 4491,
+     4494, 1398, 1421, 1421, 1423, 1405, 1401, 1438, 1416, 1414,
+     1451, 4504, 4509, 4512, 1416, 1455, 1422, 1440, 4523, 4527,
+
+     1426, 1480, 1488, 1486, 1491, 1521, 1534, 1563, 1533, 1563,
+     1540, 4535, 1551, 1560, 1554, 1559, 1584, 1585, 4541, 4544,
+     1600, 4547, 4554, 4573, 4566, 1590, 1600, 1601, 1611, 4581,
+     4588, 4599, 7099, 7099, 7099, 7099, 7099, 7099, 1609, 1616,
+     7099, 1621, 1625, 7099, 4607, 4610, 7099, 7099, 1602, 1623,
+     1629, 1638, 4618, 4622, 7099, 7099, 4630, 1674, 1668, 1680,
+     1683, 1676, 1694, 7099, 1730, 7099, 1739, 4636, 7099, 1728,
+     1720, 1733, 1740, 1733, 1755, 4639, 4642, 4650, 4657, 4661,
+     4670, 1804, 4675, 4678, 4698, 4737, 4781, 4688, 1756, 1822,
+     1805, 1822, 4706, 7099, 7099, 1803, 1830, 1823, 1855, 4727,
+
+     1816, 1830, 1821, 1818, 4717, 4757, 4731, 4765, 1863, 1865,
+     1901, 1891, 1893, 1919, 7099, 7099, 1904, 1908, 1930, 1912,
+     1915, 1932, 4801, 7099, 7099, 4773, 4809, 7099, 7099, 4817,
+     1986, 4826, 2102, 2030, 4871, 4915, 1929, 7099, 1931, 7099,
+     1914, 7099, 1931, 7099, 4835, 7099, 1930, 1924, 1943, 1943,
+     4838, 7099, 7099, 4847, 2013, 2041, 1990, 1994, 7099, 1999,
+     2024, 7099, 2063, 2070, 7099, 2068, 2072, 7099, 4862, 4865,
+     2133, 2231, 2111, 2093, 2100, 2116, 4883, 2114, 2133, 2110,
+     2113, 4891, 4894, 4935, 4938, 2136, 2135, 2143, 2142, 7099,
+     7099, 7099, 7099, 7099, 7099, 7099, 7099, 4941, 4944, 4905,
+
+     2180, 2166, 2182, 4948, 2188, 2186, 2200, 2201, 4962, 4967,
+     4980, 4983, 4998, 5001, 2152, 5009, 5012, 2177, 2197, 2182,
+     2216, 5020, 5023, 5028, 2221, 7099, 7099, 7099, 7099, 5031,
+     7099, 7099, 5041, 7099, 7099, 5049, 7099, 7099, 2192, 5058,
+     7099, 7099, 2208, 2208, 2211, 2211, 5067, 5070, 2230, 7099,
+     2208, 2239, 2244, 2243, 2250, 5073, 5076, 2272, 2211, 2243,
+     2268, 2262, 2280, 5079, 5097, 2293, 5100, 2299, 2321, 2302,
+     2321, 5103, 5106, 2324, 5109, 5132, 2335, 7099, 2334, 7099,
+     5140, 5143, 2336, 5161, 7099, 7099, 7099, 7099, 5169, 5172,
+     4975, 5175, 5178, 5181, 5196, 5204, 2368, 2370, 5207, 5216,
+
+     2326, 2341, 5225, 5228, 2337, 2385, 5239, 5247, 2414, 2416,
+     5253, 5267, 5258, 5276, 2428, 2452, 5284, 7099, 7099, 5293,
+     7099, 7099, 2442, 2450, 2417, 2444, 2458, 2502, 2363, 2391,
+     2474, 2506, 2485, 2499, 2561, 2477, 5301, 5304, 7099, 7099,
+     5324, 5333, 5342, 5351, 5360, 5369, 5378, 5387, 5396, 5405,
+     5414, 5423, 5432, 5441, 5450, 5459, 5468, 5477, 5486, 5495,
+     5504, 5513, 5522, 5531, 5540, 5549, 5558, 5567, 5576, 5585,
+     5594, 5603, 5612, 5621, 5630, 5639, 5648, 5657, 5666, 5673,
+     5680, 5687, 5694, 5701, 5708, 5715, 5722, 5729, 5736, 5743,
+     5750, 5757, 5764, 5771, 5778, 5785, 5794, 5799, 5804, 5809,
+
+     5814, 5819, 5824, 5829, 5834, 5839, 5844, 5849, 5856, 5861,
+     5868, 5873, 5880, 5885, 5892, 5897, 5904, 5909, 5916, 5921,
+     5930, 5936, 5943, 5951, 5958, 5966, 5973, 5981, 5988, 5996,
+     6003, 6011, 6018, 6026, 6033, 6041, 6048, 6056, 6063, 6071,
+     6078, 6086, 6094, 6101, 6109, 6116, 6124, 6131, 6139, 6147,
+     6154, 6162, 6169, 6177, 6186, 6192, 6199, 6207, 6215, 6223,
+     6231, 6239, 6246, 6254, 6261, 6269, 6276, 6284, 6291, 6299,
+     6306, 6314, 6321, 6329, 6336, 6344, 6352, 6359, 6367, 6374,
+     6382, 6389, 6397, 6405, 6412, 6420, 6427, 6435, 6444, 6453,
+     6460, 6468, 6476, 6483, 6491, 6498, 6506, 6513, 6521, 6528,
+
+     6536, 6543, 6551, 6558, 6566, 6574, 6582, 6590, 6598, 6606,
+     6613, 6621, 6628, 6636, 6643, 6651, 6659, 6666, 6674, 6682,
+     6690, 6699, 6708, 6715, 6723, 6731, 6738, 6746, 6753, 6761,
+     6768, 6776, 6784, 6792, 6800, 6807, 6815, 6823, 6831, 6839,
+     6847, 6854, 6862, 6870, 6878, 6886, 6894, 6902, 6909, 6917,
+     6925, 6934, 6943, 6951, 6959, 6967, 6974, 6982, 6989, 6997,
+     7004, 7012, 7020, 7028, 7035, 7044, 7053, 7062, 7071, 7080,
+     7089
     } ;
 
     } ;
 
-static yyconst flex_int16_t yy_def[1227] =
+static yyconst flex_int16_t yy_def[2172] =
     {   0,
     {   0,
-     1159, 1159, 1160, 1160, 1160, 1160, 1161, 1161, 1162, 1162,
-     1163, 1163, 1164, 1164, 1164, 1164, 1165, 1165, 1159, 1159,
-     1166, 1166, 1167, 1167, 1167, 1167, 1159, 1159, 1167, 1167,
-     1159, 1159, 1167, 1167, 1167, 1167, 1168, 1168, 1169, 1169,
-     1170, 1170, 1171, 1171, 1159, 1159, 1171, 1171, 1171, 1171,
-     1172, 1172, 1173, 1173, 1174, 1174, 1175, 1175, 1176, 1176,
-     1177, 1177, 1159, 1159, 1177, 1177, 1177, 1177, 1178, 1178,
-     1179, 1179, 1159, 1159, 1179, 1179, 1179, 1179, 1180, 1180,
-     1181, 1181, 1182, 1182, 1183, 1183, 1159, 1159, 1183, 1183,
-     1183, 1183, 1184, 1184, 1185, 1185, 1186, 1186, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1187,
-     1158, 1158, 1187, 1187, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1188, 1158, 1158, 1188, 1158, 1158,
-     1158, 1158, 1158, 1158, 1189, 1158, 1158, 1189, 1189, 1189,
-     1189, 1189, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1190, 1158, 1158, 1190, 1190, 1158, 1158, 1158, 1158, 1158,
-     1158, 1191, 1158, 1158, 1191, 1158, 1158, 1158, 1158, 1158,
-     1158, 1192, 1158, 1158, 1192, 1192, 1192, 1192, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1193, 1158, 1158, 1193, 1193,
-     1193, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1194,
-     1158, 1158, 1194, 1158, 1158, 1158, 1158, 1158, 1158, 1195,
-     1158, 1158, 1195, 1195, 1195, 1195, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1196, 1158, 1158, 1196, 1158, 1158,
-     1158, 1158, 1158, 1158, 1197, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1187, 1187, 1187, 1198, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1188, 1188,
-     1199, 1158, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1200,
-
-     1158, 1158, 1190, 1190, 1190, 1201, 1158, 1191, 1191, 1202,
-     1158, 1192, 1192, 1192, 1192, 1192, 1192, 1203, 1158, 1193,
-     1193, 1193, 1193, 1204, 1158, 1158, 1194, 1194, 1205, 1158,
-     1195, 1195, 1195, 1195, 1195, 1206, 1158, 1158, 1196, 1196,
-     1207, 1158, 1158, 1208, 1158, 1208, 1158, 1158, 1158, 1209,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1187, 1187, 1210,
-     1210, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1188, 1211, 1211, 1189, 1158,
-     1158, 1189, 1189, 1189, 1189, 1212, 1212, 1158, 1158, 1158,
-     1190, 1213, 1213, 1158, 1158, 1214, 1214, 1192, 1158, 1158,
-
-     1192, 1192, 1192, 1215, 1215, 1193, 1193, 1193, 1216, 1216,
-     1158, 1158, 1158, 1217, 1217, 1195, 1195, 1195, 1195, 1218,
-     1218, 1158, 1196, 1219, 1219, 1158, 1158, 1208, 1158, 1158,
-     1208, 1158, 1158, 1209, 1158, 1158, 1158, 1158, 1158, 1158,
-     1187, 1187, 1158, 1210, 1158, 1210, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1188, 1158, 1211, 1158, 1211, 1189, 1158, 1158, 1158, 1189,
-     1189, 1189, 1189, 1158, 1212, 1158, 1212, 1158, 1158, 1158,
-     1158, 1190, 1158, 1213, 1158, 1213, 1158, 1158, 1158, 1158,
-     1214, 1158, 1214, 1192, 1158, 1158, 1158, 1192, 1192, 1192,
-
-     1158, 1215, 1158, 1215, 1158, 1158, 1193, 1158, 1158, 1158,
-     1216, 1158, 1216, 1158, 1158, 1158, 1158, 1158, 1217, 1158,
-     1217, 1195, 1195, 1195, 1195, 1158, 1218, 1158, 1218, 1158,
-     1196, 1158, 1219, 1158, 1219, 1158, 1208, 1220, 1158, 1158,
-     1158, 1158, 1158, 1187, 1187, 1210, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1211, 1189, 1189, 1189, 1189, 1189, 1212,
-     1158, 1190, 1213, 1214, 1192, 1192, 1192, 1192, 1215, 1158,
-     1158, 1158, 1193, 1158, 1158, 1158, 1216, 1158, 1217, 1195,
-     1158, 1158, 1195, 1195, 1218, 1158, 1196, 1219, 1158, 1208,
-
-     1220, 1220, 1158, 1220, 1158, 1158, 1158, 1187, 1187, 1210,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1211,
-     1189, 1189, 1189, 1158, 1158, 1158, 1158, 1189, 1212, 1158,
-     1158, 1158, 1213, 1214, 1192, 1192, 1192, 1158, 1158, 1192,
-     1215, 1193, 1216, 1158, 1217, 1195, 1158, 1158, 1158, 1195,
-     1195, 1218, 1158, 1158, 1158, 1219, 1158, 1208, 1220, 1220,
-     1158, 1158, 1187, 1187, 1187, 1210, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1211, 1189, 1189,
-     1189, 1158, 1158, 1158, 1158, 1158, 1158, 1189, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1214, 1192, 1192, 1192, 1158,
-     1158, 1158, 1192, 1158, 1158, 1193, 1216, 1158, 1217, 1195,
-     1195, 1195, 1218, 1158, 1158, 1158, 1158, 1219, 1158, 1208,
-     1220, 1220, 1158, 1158, 1158, 1187, 1187, 1210, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1211, 1189, 1189,
-     1189, 1158, 1158, 1189, 1214, 1192, 1158, 1158, 1192, 1192,
-     1158, 1158, 1192, 1193, 1158, 1158, 1158, 1217, 1195, 1195,
-     1195, 1218, 1158, 1219, 1158, 1208, 1220, 1220, 1158, 1158,
-     1158, 1158, 1187, 1187, 1210, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1211, 1189, 1189, 1189, 1158, 1158, 1158, 1158,
-
-     1189, 1158, 1158, 1192, 1158, 1158, 1158, 1192, 1192, 1158,
-     1158, 1158, 1158, 1192, 1193, 1158, 1217, 1158, 1158, 1195,
-     1195, 1218, 1158, 1219, 1158, 1208, 1220, 1220, 1158, 1187,
-     1187, 1210, 1158, 1158, 1158, 1158, 1158, 1189, 1189, 1189,
-     1158, 1158, 1158, 1158, 1189, 1158, 1158, 1192, 1192, 1192,
-     1158, 1158, 1158, 1158, 1192, 1193, 1158, 1217, 1158, 1158,
-     1158, 1158, 1158, 1195, 1158, 1158, 1158, 1219, 1208, 1220,
-     1220, 1158, 1158, 1187, 1158, 1158, 1189, 1189, 1189, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1192, 1192, 1192, 1158,
-     1158, 1158, 1158, 1193, 1193, 1158, 1158, 1158, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1208, 1220, 1220, 1158, 1158, 1158,
-     1158, 1158, 1189, 1189, 1189, 1158, 1158, 1158, 1192, 1192,
-     1192, 1158, 1158, 1158, 1193, 1193, 1158, 1158, 1158, 1208,
-     1220, 1220, 1158, 1158, 1158, 1158, 1158, 1189, 1189, 1189,
-     1192, 1158, 1158, 1192, 1193, 1193, 1208, 1220, 1220, 1220,
-     1158, 1158, 1158, 1189, 1189, 1189, 1189, 1192, 1158, 1158,
-     1158, 1192, 1158, 1158, 1193, 1158, 1158, 1193, 1208, 1220,
-     1220, 1220, 1221, 1222, 1189, 1189, 1189, 1189, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1193, 1158, 1158, 1158, 1193,
-     1208, 1220, 1223, 1224, 1221, 1222, 1189, 1189, 1189, 1189,
-
-     1158, 1158, 1158, 1158, 1158, 1158, 1193, 1193, 1208, 1223,
-     1220, 1225, 1224, 1226, 1220, 1189, 1189, 1189, 1189, 1158,
-     1158, 1158, 1158, 1193, 1193, 1208, 1225, 1158, 1226, 1220,
-     1158, 1158, 1158, 1158, 1158, 1158, 1189, 1158, 1158, 1158,
-     1158, 1158, 1158, 1193, 1193, 1208, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1189, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1193, 1193, 1208, 1158, 1189, 1158,
-     1158, 1158, 1158, 1193, 1193, 1208, 1189, 1158, 1158, 1158,
-     1158, 1193, 1193, 1208, 1189, 1158, 1158, 1158, 1158, 1193,
-     1193, 1208, 1158, 1158, 1158, 1158, 1158, 1158, 1193, 1193,
-
-     1208, 1158, 1158, 1158, 1158, 1158, 1193, 1193, 1208, 1193,
-     1193, 1208, 1193, 1193, 1208, 1208, 1193, 1193, 1208, 1208,
-     1193, 1193, 1208, 1208, 1193, 1193, 1208, 1208, 1158, 1158,
-     1158, 1158, 1208, 1208, 1158, 1158, 1158, 1158, 1158, 1158,
-     1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208,
-     1208, 1208, 1208, 1208, 1208, 1208, 1158,    0, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158
+     1941, 1941, 1942, 1942, 1942, 1942, 1943, 1943, 1944, 1944,
+     1945, 1945, 1946, 1946, 1946, 1946, 1947, 1947, 1941, 1941,
+     1948, 1948, 1949, 1949, 1949, 1949, 1941, 1941, 1949, 1949,
+     1941, 1941, 1949, 1949, 1949, 1949, 1950, 1950, 1951, 1951,
+     1952, 1952, 1946, 1946, 1953, 1953, 1954, 1954, 1941, 1941,
+     1954, 1954, 1954, 1954, 1955, 1955, 1956, 1956, 1957, 1957,
+     1958, 1958, 1959, 1959, 1941, 1941, 1941, 1941, 1960, 1960,
+     1961, 1961, 1962, 1962, 1941, 1941, 1962, 1962, 1962, 1962,
+     1963, 1963, 1964, 1964, 1940,   85, 1965, 1965, 1966, 1966,
+     1967, 1967, 1968, 1968, 1969, 1969, 1941, 1941, 1969, 1969,
+
+     1969, 1969, 1970, 1970, 1941, 1941, 1941, 1941, 1971, 1971,
+     1971, 1971, 1972, 1972, 1973, 1973, 1941, 1941, 1973, 1973,
+     1973, 1973, 1974, 1974, 1975, 1975, 1976, 1976, 1977, 1977,
+     1941, 1941, 1977, 1977, 1977, 1977, 1978, 1978, 1979, 1979,
+     1941, 1941, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1980, 1940, 1940, 1980, 1980, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1981, 1940,
+     1940, 1981, 1940, 1940, 1940, 1940, 1940, 1940, 1982, 1940,
+
+     1940, 1982, 1982, 1982, 1940, 1940, 1940, 1940, 1940, 1983,
+     1940, 1940, 1983, 1983, 1983, 1983, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1984, 1940, 1940, 1984, 1984, 1984,
+     1984, 1940, 1940, 1940, 1940, 1940, 1940, 1985, 1940, 1940,
+     1985, 1985, 1985, 1985, 1940, 1940, 1940, 1940, 1940, 1940,
+     1986, 1940, 1940, 1986, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1987, 1940, 1940, 1987, 1987, 1987, 1987, 1987,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1988, 1940, 1940,
+     1988, 1988, 1940, 1940, 1940, 1940, 1940, 1940, 1989, 1940,
+     1940, 1989, 1989, 1989, 1989, 1989, 1989, 1940, 1940, 1940,
+
+     1940, 1940, 1940, 1990, 1940, 1940, 1990, 1940, 1940, 1940,
+     1940, 1940, 1940, 1991, 1940, 1940, 1991, 1991, 1991, 1991,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1992, 1940, 1940,
+     1992, 1992, 1992, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1993, 1940, 1940, 1993, 1993, 1993, 1993, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1994, 1940, 1940, 1994, 1940,
+     1940, 1940, 1940, 1940, 1940, 1995, 1940, 1940, 1995, 1995,
+     1995, 1995, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1996, 1940, 1940, 1996, 1940, 1940, 1940, 1940, 1997, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1980, 1980, 1980, 1998, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1981, 1981, 1999, 1940, 1982, 1982, 1982, 1982, 1940,
+     2000, 1940, 1940, 1983, 1983, 1983, 1983, 1983, 1983, 1983,
+     2001, 1940, 1940, 1984, 1984, 1984, 1984, 1984, 2002, 1940,
+     1985, 1985, 1985, 1985, 1985, 2003, 1940, 1986, 1986, 2004,
+     1940, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 2005, 1940,
+     1988, 1988, 1988, 2006, 1940, 1989, 1989, 1989, 1989, 1989,
+     1989, 1989, 1989, 1989, 2007, 1940, 1990, 1990, 2008, 1940,
+     2009, 2009, 2009, 2009, 2009, 2009, 2010, 1940, 2011, 2011,
+
+     2011, 2011, 2011, 1940, 2012, 1940, 2013, 2013, 2013, 2013,
+     2013, 2014, 1940, 2015, 2015, 2016, 1940, 2017, 2017, 2017,
+     2017, 2017, 2018, 1940, 1940, 2019, 2019, 2020, 2021, 1940,
+     2021, 1940, 1940, 1940, 2022, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 2023, 2023, 2024, 2024, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2025,
+     2026, 2026, 2027, 1940, 1940, 2027, 1940, 2028, 2028, 1940,
+     2029, 1940, 1940, 2029, 2029, 2029, 2029, 2030, 2030, 1940,
+     2031, 2031, 2031, 2031, 2032, 2032, 1940, 1940, 2033, 2033,
+     2033, 2034, 2034, 2035, 2036, 2036, 2037, 1940, 1940, 2037,
+
+     2037, 2037, 2037, 2038, 2038, 1940, 1940, 2039, 2040, 2040,
+     2041, 1940, 1940, 1940, 1940, 2041, 2041, 2041, 2041, 2041,
+     2042, 2042, 1940, 1940, 2043, 2043, 2044, 1940, 1940, 2044,
+     2044, 2044, 2045, 2045, 2046, 2046, 2046, 2046, 1940, 2047,
+     2047, 2048, 2048, 2048, 2048, 2049, 2049, 1940, 1940, 2050,
+     2050, 2051, 2051, 2051, 2051, 2052, 2052, 1940, 2053, 2054,
+     2054, 2055, 1940, 1940, 2055, 1940, 1940, 2056, 1940, 1940,
+     1940, 1940, 1940, 1940, 2057, 2057, 1940, 2058, 1940, 2058,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 2059, 1940, 2060, 1940, 2060, 2061, 1940,
+
+     1940, 1940, 2061, 1940, 1940, 2062, 1940, 2062, 2063, 1940,
+     1940, 1940, 1940, 1940, 2063, 1940, 1940, 2063, 1940, 2064,
+     1940, 2064, 1940, 2065, 2065, 2065, 2065, 1940, 2066, 1940,
+     2066, 1940, 1940, 1940, 2067, 2067, 2067, 1940, 2068, 1940,
+     2068, 2069, 1940, 2070, 1940, 2070, 2071, 1940, 1940, 1940,
+     2071, 2071, 2071, 2071, 1940, 2072, 1940, 2072, 1940, 1940,
+     1940, 2073, 1940, 2074, 1940, 2074, 2075, 2075, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 2075, 2075, 2075, 2075,
+     1940, 2076, 1940, 2076, 1940, 1940, 1940, 1940, 2077, 1940,
+     2077, 2078, 1940, 1940, 1940, 2078, 2078, 2078, 1940, 2079,
+
+     1940, 2079, 2080, 1940, 1940, 1940, 1940, 2080, 1940, 1940,
+     2081, 1940, 2081, 2082, 1940, 1940, 2082, 1940, 1940, 1940,
+     2083, 1940, 2083, 1940, 1940, 1940, 1940, 2084, 1940, 2084,
+     2085, 2085, 2085, 2085, 1940, 2086, 1940, 2086, 1940, 2087,
+     1940, 2088, 1940, 2088, 2089, 2090, 1940, 1940, 1940, 1940,
+     1940, 2091, 2091, 2092, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2093,
+     1940, 1940, 2094, 1940, 2095, 2096, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2096, 2097, 1940, 2098, 2098, 1940,
+     1940, 2098, 2099, 2100, 2100, 2100, 2101, 2102, 2103, 2104,
+
+     2104, 2104, 2104, 2104, 2105, 2106, 2107, 2108, 2108, 1940,
+     1940, 1940, 2108, 2108, 2108, 2108, 2109, 2110, 2111, 2111,
+     2111, 2111, 2112, 2113, 1940, 1940, 1940, 1940, 1940, 1940,
+     2113, 1940, 2114, 2115, 1940, 1940, 1940, 2115, 1940, 1940,
+     1940, 2116, 2117, 2118, 1940, 1940, 2118, 2118, 2119, 1940,
+     2120, 2121, 2122, 2123, 2123, 1940, 2123, 1940, 1940, 1940,
+     2124, 2124, 2125, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2126, 1940,
+     1940, 1940, 2127, 1940, 2128, 2129, 1940, 1940, 1940, 2129,
+     2130, 1940, 2131, 2131, 1940, 1940, 1940, 2131, 2132, 2133,
+
+     2133, 2133, 1940, 1940, 2134, 2135, 2136, 2136, 2136, 1940,
+     1940, 1940, 1940, 2136, 2137, 1940, 1940, 2138, 1940, 1940,
+     2139, 1940, 1940, 2139, 2139, 2139, 2140, 2141, 2142, 2142,
+     2142, 1940, 1940, 2142, 2143, 2144, 2144, 1940, 2145, 2146,
+     2146, 2147, 2148, 2149, 1940, 1940, 1940, 2149, 2149, 2150,
+     1940, 1940, 1940, 2151, 2152, 2153, 2153, 1940, 1940, 2154,
+     2154, 2154, 2155, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 2156, 2157, 1940, 2158, 2159, 2159, 2160,
+     2161, 2161, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     2161, 2162, 1940, 1940, 2163, 1940, 1940, 1940, 1940, 2164,
+
+     2165, 2165, 2165, 1940, 1940, 1940, 1940, 1940, 1940, 2165,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 2139, 1940, 1940,
+     2140, 2141, 2142, 2142, 2142, 1940, 1940, 1940, 2142, 1940,
+     1940, 1940, 1940, 2144, 1940, 2145, 1940, 1940, 2146, 2147,
+     2148, 2149, 2149, 2149, 2150, 1940, 1940, 1940, 1940, 2151,
+     2152, 2153, 2153, 1940, 1940, 1940, 2154, 2154, 2155, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 2156, 2157, 1940,
+     1940, 1940, 2159, 2159, 2160, 2161, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 2161, 2162, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2164,
+     2165, 2165, 2165, 1940, 1940, 2165, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 2140, 2141, 2142,
+     1940, 1940, 2142, 2142, 1940, 1940, 2142, 1940, 1940, 1940,
+     2144, 1940, 2145, 1940, 1940, 1940, 2146, 1940, 1940, 2148,
+     2149, 2149, 2149, 2150, 1940, 2151, 2152, 2153, 2153, 1940,
+     1940, 1940, 1940, 2154, 2154, 2155, 1940, 1940, 1940, 1940,
+     1940, 1940, 2156, 2157, 1940, 2159, 2159, 1940, 1940, 2161,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 2162, 1940, 1940, 1940, 2164, 2165, 2165,
+
+     2165, 1940, 1940, 1940, 1940, 2165, 1940, 1940, 1940, 2140,
+     1940, 1940, 2142, 1940, 1940, 1940, 2142, 2142, 1940, 1940,
+     1940, 1940, 2142, 1940, 1940, 1940, 1940, 2144, 1940, 2145,
+     1940, 1940, 1940, 1940, 2146, 2148, 1940, 1940, 2149, 2149,
+     2150, 1940, 2151, 2152, 2153, 2153, 1940, 2154, 2154, 2155,
+     1940, 1940, 1940, 1940, 2157, 1940, 1940, 2159, 2161, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2162, 1940, 1940, 2165, 2165, 2165,
+     1940, 1940, 1940, 1940, 2165, 1940, 1940, 1940, 1940, 2142,
+     2142, 2142, 1940, 1940, 1940, 1940, 2142, 1940, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 2145, 1940, 1940, 1940,
+     1940, 1940, 1940, 2146, 2148, 1940, 1940, 1940, 1940, 1940,
+     2149, 1940, 1940, 1940, 2151, 2152, 2153, 2153, 1940, 1940,
+     2154, 1940, 1940, 1940, 1940, 2157, 1940, 1940, 1940, 2159,
+     2161, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 2162, 2165, 2165, 2165, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2142, 2142, 2142, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     2145, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2152, 2153,
+
+     2153, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2159, 2161, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2162, 2165,
+     2165, 2165, 1940, 1940, 1940, 2142, 2142, 2142, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 2145, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146,
+     1940, 1940, 1940, 2152, 2153, 2153, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2159, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 2162, 1940, 1940, 2165, 2165, 2165, 2142, 1940, 1940,
+
+     2142, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 2145, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146,
+     2152, 2153, 2153, 2153, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2162, 1940, 1940, 1940, 2165, 2165,
+     2165, 2165, 2142, 1940, 1940, 1940, 2142, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 1940, 1940,
+     2146, 2152, 2153, 2153, 2153, 2166, 2167, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2162,
+
+     2165, 2165, 2165, 2165, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 2146, 1940, 1940, 1940, 2146,
+     2152, 2153, 2168, 2169, 2166, 2167, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 2165, 2165, 2165, 2165,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146,
+     2152, 2168, 2153, 2170, 2169, 2171, 2153, 1940, 1940, 1940,
+     1940, 2165, 2165, 2165, 2165, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146, 2152,
+
+     2170, 1940, 2171, 2153, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 2165, 1940, 1940, 1940, 1940, 1940,
+     1940, 2146, 2146, 2152, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 2165, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 2146, 2146, 2152, 1940,
+     2165, 1940, 1940, 1940, 1940, 2146, 2146, 2152, 2165, 1940,
+     1940, 1940, 1940, 2146, 2146, 2152, 2165, 1940, 1940, 1940,
+     1940, 2146, 2146, 2152, 1940, 1940, 1940, 1940, 1940, 1940,
+     2146, 2146, 2152, 1940, 1940, 1940, 1940, 1940, 2146, 2146,
+     2152, 2146, 2146, 2152, 2146, 2146, 2152, 2152, 2146, 2146,
+
+     2152, 2152, 2146, 2146, 2152, 2152, 2146, 2146, 2152, 2152,
+     1940, 1940, 1940, 1940, 2152, 2152, 1940, 1940, 1940, 1940,
+     1940, 1940, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
+     2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 1940,    0,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940
     } ;
 
     } ;
 
-static yyconst flex_int16_t yy_nxt[3607] =
+static yyconst flex_int16_t yy_nxt[7169] =
     {   0,
     {   0,
-     1158,  102,  103,  102,  102,  103,  102,  102,  103,  102,
-      102,  103,  102,  110, 1158,  104,  110,  113,  104,  113,
-      111,  105, 1011,  111,  105,  107,  103,  107,  107,  103,
-      107,  116,  117,  114, 1012,  114,  118,  119,  349,  108,
-      116,  117,  108,  345,  120,  118,  119,  116,  117,  295,
-      121,  255,  118,  120,  116,  117,  346,  121,  296,  118,
-      120,  123,  124,  123,  124,  256,  255,  120,  103,  103,
-      103,  103,  103,  103,  136,  103,  136,  136,  103,  136,
-      257,  258,  126,  258,  366,  126,  351,  350,  137,  352,
-      367,  137,  254,  254,  254,  257,  125,  257,  125,  127,
-
-      128,  103,  128,  127,  127,  127,  127,  127,  127,  127,
-      129,  127,  603,  127,  131,  127,  132,  127,  136,  103,
-      136,  429,  316,  136,  103,  136,  103,  103,  103,  103,
-      103,  103,  138,  317,  431,  127,  127,  138,  366,  349,
-      139,  433,  871,  139,  372,  136,  103,  136,  254,  254,
-      254,  254,  254,  254,  254,  254,  254,  429,  133,  137,
-      134,  127,  128,  103,  128,  127,  127,  127,  127,  127,
-      127,  127,  129,  127,  600,  127,  131,  127,  132,  127,
-      136,  103,  136, 1126,  429,  103,  103,  103,  103,  103,
-      103,  136,  103,  136,  137,  366,  429,  127,  127,  140,
-
-      537,  388,  140,  955,  956,  138,  930,  136,  103,  136,
-      136,  103,  136,  136,  103,  136,  254,  254,  254,  674,
-      133,  138,  134,  429,  141,  675, 1125,  141,  142,  143,
-      103,  143,  142,  142,  142,  142,  142,  142,  142,  144,
-      142,  668,  142,  146,  142,  147,  142,  150,  103,  150,
-      552,  558,  150,  103,  150,  164,  103,  164,  254,  254,
-      254,  151,  553,  553,  142,  142,  151,  603,  604,  165,
-      603,  429,  148,  142,  143,  103,  143,  142,  142,  142,
-      142,  142,  142,  142,  144,  142, 1122,  142,  146,  142,
-      147,  142,  164,  103,  164,  558,  732,  103,  103,  103,
-
-      103,  103,  103,  254,  254,  254,  165,  571,  797,  142,
-      142,  166, 1123,  798,  166, 1121,  603,  148,  152,  153,
-      103,  153,  152,  152,  152,  152,  152,  152,  152,  154,
-      152,  603,  152,  156,  152,  157,  152,  164,  103,  164,
-      777, 1118,  164,  103,  164,  164,  103,  164,  164,  103,
-      164,  165,  258,  258,  152,  152,  165,  158,  258,  167,
-      291, 1117,  167,  603,  429,  159,  257,  257,  160,  778,
-      776,  161,  257,  603,  162,  152,  153,  103,  153,  152,
-      152,  152,  152,  152,  152,  152,  154,  152,  603,  152,
-      156,  152,  157,  152,  177,  103,  177,  731,  870,  177,
-
-      103,  177,  187,  103,  187,  187,  103,  187,  178,  258,
-      258,  152,  152,  178,  158,  258,  188,  306, 1011,  188,
-      603,  799,  159,  257,  257,  160,  800,  828,  161,  257,
-     1012,  162,  168,  169,  103,  169,  168,  168,  168,  168,
-      168,  168,  168,  170,  168,  429,  168,  172,  168,  173,
-      168,  200,  103,  200,  429,  827,  200,  103,  200,  103,
-      103,  103,  103,  103,  103,  201,  258,  810,  168,  168,
-      201, 1092,  811,  166,  429,  603,  166,  905, 1114,  174,
-      257,  254,  254,  254,  254,  254,  254,  254,  254,  254,
-      429,  175,  168,  169,  103,  169,  168,  168,  168,  168,
-
-      168,  168,  168,  170,  168,  906,  168,  172,  168,  173,
-      168,  200,  103,  200,  947,  269,  200,  103,  200,  200,
-      103,  200,  200,  103,  200,  201,  812,  429,  168,  168,
-      201,  813,  429,  202, 1141,  258,  202,  603, 1109,  174,
-      254,  254,  254,  254,  254,  254,  254,  254,  254,  257,
-     1076,  175,  179,  180,  103,  180,  179,  179,  179,  179,
-      179,  179,  179,  181,  179,  948,  179,  183,  179,  184,
-      179,  213,  103,  213, 1113,  429,  213,  103,  213,  103,
-      103,  103,  103,  103,  103,  214,  429,  603,  179,  179,
-      214, 1084,  429,  215, 1111,  429,  215, 1110, 1101,  185,
-
-      179,  180,  103,  180,  179,  179,  179,  179,  179,  179,
-      179,  181,  179,  969,  179,  183,  179,  184,  179,  213,
-      103,  213,  907,  429,  213,  103,  213,  213,  103,  213,
-      213,  103,  213,  214, 1011,  429,  179,  179,  214, 1142,
-     1108,  216,  429, 1014,  216, 1107, 1106,  185,  189,  190,
-      103,  190,  189,  189,  189,  189,  189,  189,  189,  191,
-      189, 1009,  189,  193,  189,  194,  189,  225,  103,  225,
-      991,  429,  225,  103,  225,  238,  103,  238,  238,  103,
-      238,  226,  258, 1124,  189,  189,  226,  258,  195,  239,
-      429, 1105,  239,  603,  310,  196,  257,  197,  254,  254,
-
-      254,  257,  429, 1145,  198,  189,  190,  103,  190,  189,
-      189,  189,  189,  189,  189,  189,  191,  189,  429,  189,
-      193,  189,  194,  189,  103,  103,  103,  931, 1127,  103,
-      103,  103,  238,  103,  238,  238,  103,  238,  240,  258,
-     1128,  189,  189,  240, 1100,  195,  239, 1099,  429,  239,
-      603, 1026,  196,  257,  197,  254,  254,  254,  254,  254,
-      254,  198,  203,  204,  103,  204,  203,  203,  203,  203,
-      203,  203,  203,  205,  203, 1133,  203,  207,  203,  208,
-      203,  238,  103,  238,  932, 1155,  238,  103,  238,  250,
-      103,  250,  250,  103,  250,  241,  258,  429,  203,  203,
-
-      241, 1147, 1098,  251,  209,  429,  251, 1097,  429,  210,
-      257,  263,  254,  254,  254,  254,  254,  254,  211,  203,
-      204,  103,  204,  203,  203,  203,  203,  203,  203,  203,
-      205,  203, 1134,  203,  207,  203,  208,  203,  116,  117,
-      254,  254,  254,  118,  264, 1148,  258,  254,  254,  254,
-      265,  252,  429,  329,  266,  203,  203,  258,  258,  267,
-      257,  209,  254,  254,  254,  341,  210,  254,  254,  254,
-     1096,  257,  257,  253, 1095,  211,  217,  218,  103,  218,
-      217,  217,  217,  217,  217,  217,  217,  219,  217, 1091,
-      217,  221,  217,  222,  217,  254,  254,  254,  254,  254,
-
-      254, 1090,  116,  117,  380,  380,  380,  118,  612,  612,
-      612, 1089,  217,  217,  429,  252,  618,  618,  618,  381,
-      620,  620,  620,  223,  217,  218,  103,  218,  217,  217,
-      217,  217,  217,  217,  217,  219,  217,  253,  217,  221,
-      217,  222,  217,  389,  389,  389, 1146,  394,  394,  394,
-      258,  399,  399,  399,  412,  412,  412,  274,  390, 1020,
-      217,  217,  395, 1088,  257, 1087,  400,  429, 1021,  413,
-      429,  223,  227,  228,  103,  228,  227,  227,  227,  227,
-      227,  227,  227,  229,  227,  275,  227,  231,  227,  232,
-      227, 1022,  276,  277, 1086,  278,  443,  443,  443,  279,
-
-     1023,  280, 1011,  443,  443,  443, 1119,  258,  227,  227,
-     1151, 1014,  445, 1085,  274,  429,  233,  429,  234,  445,
-      235,  257,  640,  640,  640,  612,  612,  612,  236,  227,
-      228,  103,  228,  227,  227,  227,  227,  227,  227,  227,
-      229,  227,  275,  227,  231,  227,  232,  227, 1143,  281,
-      277,  446,  282,  462,  462,  462,  279, 1152,  283,  429,
-      462,  462,  462, 1083,  258,  227,  227, 1082, 1081,  464,
-      614,  614,  614,  233, 1080,  234,  464,  235,  257,  614,
-      614,  614,  615,  429, 1149,  236,  242,  243,  103,  243,
-      242,  242,  242,  242,  242,  242,  242,  244,  242,  275,
-
-      242,  246,  242,  247,  242,  429,  276,  277, 1150,  278,
-      465,  429, 1079,  284,  429,  285,  380,  380,  380,  474,
-      474,  474,  242,  242,  258,  467,  467,  467,  730,  468,
-     1153,  381,  469, 1078, 1077,  476, 1154,  429,  257,  618,
-      618,  618,  620,  620,  620,  248,  242,  243,  103,  243,
-      242,  242,  242,  242,  242,  242,  242,  244,  242,  275,
-      242,  246,  242,  247,  242,  258,  281,  277, 1075,  282,
-     1144, 1155,  274,  279, 1074,  283,  894,  258,  429,  257,
-      429, 1073,  242,  242,  300,  479,  479,  479,  258,  480,
-      895,  257,  481, 1072,  389,  389,  389, 1071, 1070,  258,
-
-      275, 1069,  257, 1068, 1066,  248,  300,  281,  286,  390,
-      282,  258,  275,  257,  284, 1065,  287, 1120,  318,  281,
-      286, 1064,  282,  275,  258,  257,  301, 1063,  287,  258,
-      281,  286, 1062,  282,  275, 1061,  318,  301,  257,  287,
-     1057,  281,  286,  257,  282, 1028,  275, 1047,  284, 1028,
-      287,  258, 1045,  281,  286, 1044,  282, 1043,  324,  275,
-      301, 1042,  287,  258,  275,  257,  281,  286, 1041,  325,
-      324,  281,  286,  284,  282,  287,  258,  257,  284, 1040,
-      287,  258, 1028,  336, 1028, 1025,  275,  621,  621,  621,
-      257, 1024, 1019,  281,  286,  257,  325, 1018,  275,  615,
-
-      284, 1017,  287,  258, 1016,  281,  286, 1008,  282, 1007,
-      336,  337,  284, 1000,  287,  999,  337,  257,  281,  286,
-      998,  282,  997,  281,  286,  301,  282,  287,  990,  986,
-      301,  978,  287,  474,  474,  474,  977,  976,  275,  483,
-      483,  483,  483,  483,  483,  281,  286,  975,  282,  476,
-      962,  958,  284,  957,  287,  485,  954,  946,  485,  394,
-      394,  394,  487,  487,  487,  945,  488,  944,  941,  489,
-      490,  490,  490,  940,  395,  490,  490,  490,  399,  399,
-      399,  495,  495,  495,  477,  496,  492,  939,  497,  926,
-      925,  492,  921,  400,  920,  919,  486,  501,  501,  501,
-
-      501,  501,  501,  505,  505,  505,  508,  508,  508,  510,
-      510,  510,  915,  503,  914,  913,  503,  891,  506,  890,
-      889,  509,  510,  510,  510,  512,  493,  412,  412,  412,
-      515,  515,  515,  888,  516,  887,  881,  517,  512,  518,
-      518,  518,  413,  518,  518,  518,  504,  526,  526,  526,
-      526,  526,  526,  880,  879,  520,  532,  532,  532,  520,
-      532,  532,  532,  528,  878,  877,  528,  443,  443,  443,
-      874,  864,  534,  513,  856,  855,  534,  443,  443,  443,
-      443,  443,  443,  445,  562,  562,  562,  854,  853,  521,
-      462,  462,  462,  445,  852,  851,  445,  850,  849,  563,
-
-      462,  462,  462,  845,  529,  844,  464,  462,  462,  462,
-      474,  474,  474,  843,  535,  842,  464,  841,  546,  840,
-      467,  467,  467,  464,  468,  839,  476,  469,  474,  474,
-      474,  838,  474,  474,  474,  479,  479,  479,  831,  480,
-      830,  825,  481,  823,  476,  821,  820,  564,  476,  483,
-      483,  483,  483,  483,  483,  483,  483,  483,  816,  487,
-      487,  487,  815,  488,  814,  485,  489,  809,  485,  808,
-      804,  485,  490,  490,  490,  490,  490,  490,  490,  490,
-      490,  801,  495,  495,  495,  796,  496,  570,  492,  497,
-      795,  492,  794,  789,  492,  501,  501,  501,  501,  501,
-
-      501,  501,  501,  501,  788,  786,  573,  505,  505,  505,
-      784,  503,  783,  779,  503,  775,  773,  503,  771,  580,
-      580,  580,  506,  581,  770,  769,  582,  508,  508,  508,
-      584,  584,  584,  767,  585,  574,  764,  586,  510,  510,
-      510,  763,  509,  510,  510,  510,  510,  510,  510,  762,
-      761,  579,  760,  756,  512,  754,  515,  515,  515,  512,
-      516,  753,  512,  517,  518,  518,  518,  518,  518,  518,
-      518,  518,  518,  591,  591,  591,  526,  526,  526,  752,
-      520,  751,  750,  520,  749,  747,  520,  746,  592,  526,
-      526,  526,  528,  526,  526,  526,  532,  532,  532,  532,
-
-      532,  532,  743,  587,  742,  528,  532,  532,  532,  528,
-      741,  740,  534,  739,  737,  534,  602,  602,  602,  736,
-      589,  733,  534,  443,  443,  443,  562,  562,  562,  462,
-      462,  462,  603,  604,  729,  724,  627,  627,  627,  445,
-      628,  563,  722,  629,  595,  464,  634,  634,  634,  721,
-      598,  636,  636,  636,  474,  474,  474,  641,  641,  641,
-      720,  635,  483,  483,  483,  718,  637,  490,  490,  490,
-      476,  716,  642,  713,  648,  648,  648,  630,  485,  610,
-      501,  501,  501,  492,  709,  510,  510,  510,  638,  649,
-      580,  580,  580,  708,  581,  707,  503,  582,  584,  584,
-
-      584,  512,  585,  698,  691,  586,  621,  621,  621,  690,
-      639,  650,  689,  687,  643,  518,  518,  518,  654,  591,
-      591,  591,  685,  644,  526,  526,  526,  651,  657,  657,
-      657,  520,  658,  681,  592,  659,  664,  664,  664,  680,
-      528,  653,  532,  532,  532,  602,  602,  602,  682,  682,
-      682,  665,  443,  443,  443,  621,  621,  621,  534,  679,
-      678,  603,  655,  677,  662,  682,  682,  682,  445,  686,
-      686,  686,  686,  686,  686,  627,  627,  627,  673,  628,
-      672,  671,  629,  603,  462,  462,  462,  669,  667,  634,
-      634,  634,  699,  699,  699,  676,  636,  636,  636,  666,
-
-      464,  663,  683,  670,  635,  692,  692,  692,  700,  693,
-      661,  637,  694,  695,  695,  695,  660,  696,  656,  684,
-      697,  652,  647,  683,  646,  645,  684,  640,  640,  640,
-      641,  641,  641,  701,  701,  701,  633,  702,  632,  631,
-      703,  688,  704,  704,  704,  642,  490,  490,  490,  648,
-      648,  648,  710,  710,  710,  626,  711,  625,  705,  712,
-      624,  623,  492,  622,  649,  714,  714,  714,  510,  510,
-      510,  518,  518,  518,  619,  657,  657,  657,  617,  658,
-      616,  715,  659,  719,  512,  613,  611,  520,  706,  526,
-      526,  526,  664,  664,  664,  725,  725,  725,  609,  726,
-
-      608,  607,  727,  606,  605,  528,  599,  665,  597,  596,
-      717,  532,  532,  532,  734,  734,  734,  443,  443,  443,
-      682,  682,  682,  744,  744,  744,  594,  534,  593,  735,
-      590,  723,  588,  445,  745,  745,  745,  686,  686,  686,
-      462,  462,  462,  692,  692,  692,  583,  693,  578,  577,
-      694,  695,  695,  695,  576,  696,  464,  575,  697,  572,
-      728,  699,  699,  699,  569,  701,  701,  701,  738,  702,
-      568,  567,  703,  704,  704,  704,  566,  700,  490,  490,
-      490,  748,  757,  757,  757,  565,  710,  710,  710,  705,
-      711,  561,  560,  712,  492,  559,  557,  758,  714,  714,
-
-      714,  765,  765,  765,  518,  518,  518,  526,  526,  526,
-      556,  725,  725,  725,  715,  726,  555,  766,  727,  759,
-      520,  554,  551,  528,  532,  532,  532,  734,  734,  734,
-      550,  549,  755,  548,  780,  780,  780,  547,  781,  545,
-      534,  782,  735,  544,  768,  443,  443,  443,  787,  787,
-      787,  790,  790,  790,  744,  744,  744,  745,  745,  745,
-      543,  445,  772,  791,  791,  791,  774,  792,  792,  792,
-      462,  462,  462,  802,  802,  802,  757,  757,  757,  542,
-      805,  805,  805,  541,  806,  540,  464,  807,  539,  803,
-      538,  758,  765,  765,  765,  518,  518,  518,  429,  785,
-
-      818,  818,  818,  526,  526,  526,  536,  531,  766,  530,
-      525,  520,  793,  524,  523,  819,  532,  532,  532,  528,
-      826,  826,  826,  829,  829,  829,  780,  780,  780,  522,
-      781,  514,  534,  782,  507,  500,  429,  443,  443,  443,
-      833,  833,  833,  787,  787,  787,  834,  834,  834,  499,
-      498,  817,  494,  445,  835,  835,  835,  482,  822,  790,
-      790,  790,  791,  791,  791,  478,  824,  792,  792,  792,
-      473,  836,  836,  836,  802,  802,  802,  846,  846,  846,
-      472,  805,  805,  805,  471,  806,  832,  837,  807,  470,
-      803,  466,  847,  857,  857,  857,  518,  518,  518,  461,
-
-      818,  818,  818,  859,  859,  859,  460,  860,  459,  458,
-      861,  457,  520,  456,  848,  819,  862,  862,  862,  865,
-      865,  865,  867,  867,  867,  532,  532,  532,  826,  826,
-      826,  863,  829,  829,  829,  866,  872,  872,  872,  455,
-      454,  534,  453,  452,  429,  451,  858,  875,  875,  875,
-      450,  873,  833,  833,  833,  834,  834,  834,  835,  835,
-      835,  449,  448,  876,  447,  442,  836,  836,  836,  882,
-      882,  882,  846,  846,  846,  441,  892,  892,  892,  440,
-      869,  868,  837,  439,  883,  438,  437,  847,  884,  884,
-      884,  893,  885,  436,  435,  886,  857,  857,  857,  896,
-
-      896,  896,  859,  859,  859,  432,  860,  430,  429,  861,
-      862,  862,  862,  427,  426,  897,  898,  898,  898,  425,
-      899,  423,  422,  900,  421,  863,  901,  901,  901,  865,
-      865,  865,  867,  867,  867,  903,  903,  903,  872,  872,
-      872,  902,  908,  908,  908,  866,  909,  419,  418,  910,
-      417,  904,  416,  873,  911,  911,  911,  875,  875,  875,
-      882,  882,  882,  916,  916,  916,  415,  917,  411,  912,
-      918,  410,  408,  876,  407,  883,  884,  884,  884,  406,
-      885,  405,  403,  886,  892,  892,  892,  922,  922,  922,
-      402,  923,  401,  398,  924,  896,  896,  896,  397,  893,
-
-      898,  898,  898,  393,  899,  391,  387,  900,  901,  901,
-      901,  897,  927,  927,  927,  385,  928,  384,  383,  929,
-      903,  903,  903,  902,  908,  908,  908,  382,  909,  379,
-      378,  910,  911,  911,  911,  376,  904,  933,  933,  933,
-      375,  934,  374,  373,  935,  371,  370,  912,  936,  936,
-      936,  916,  916,  916,  369,  917,  368,  365,  918,  942,
-      942,  942,  364,  937,  922,  922,  922,  363,  923,  362,
-      361,  924,  359,  358,  943,  927,  927,  927,  357,  928,
-      356,  355,  929,  354,  353,  938,  949,  949,  949,  933,
-      933,  933,  348,  934,  345,  347,  935,  936,  936,  936,
-
-      343,  950,  603,  951,  951,  951,  342,  952,  340,  338,
-      953,  335,  937,  942,  942,  942,  959,  959,  959,  334,
-      960,  333,  332,  961,  963,  963,  963,  330,  943,  966,
-      966,  966,  970,  970,  970,  949,  949,  949,  328,  964,
-      979,  979,  979,  326,  967,  323,  322,  971,  603,  321,
-      950,  603,  972,  972,  972,  980,  973,  319,  315,  974,
-      314,  965,  313,  951,  951,  951,  968,  952,  603,  311,
-      953,  959,  959,  959,  309,  960,  307,  305,  961,  981,
-      981,  981,  963,  963,  963,  983,  983,  983,  304,  984,
-      302,  299,  985,  298,  982,  297,  294,  964,  966,  966,
-
-      966,  987,  987,  987,  292,  988,  290,  288,  989,  970,
-      970,  970,  273,  967,  992,  992,  992,  272,  993,  270,
-      268,  994,  262,  261,  971,  603,  262,  972,  972,  972,
-      603,  973,  261,  260,  974,  259, 1158, 1158,  979,  979,
-      979, 1158, 1158,  603,  601,  601,  601,  601,  601,  601,
-      601,  601,  601,  980, 1158,  601, 1158, 1158,  601,  601,
-      601,  603,  601, 1001, 1001, 1001, 1158, 1002, 1158, 1158,
-     1003, 1158, 1158, 1158, 1158, 1158,  981,  981,  981, 1158,
-      601,  601,  601,  601,  601,  601,  601,  601,  601,  601,
-      601,  982, 1158,  601, 1158, 1158,  601,  601,  601,  603,
-
-      601, 1004, 1004, 1004, 1158, 1005, 1158, 1158, 1006,  983,
-      983,  983, 1158,  984, 1158, 1158,  985, 1158,  601,  601,
-      987,  987,  987, 1158,  988, 1158, 1158,  989,  992,  992,
-      992, 1158,  993, 1158, 1158,  994, 1001, 1001, 1001, 1158,
-     1002, 1158, 1158, 1003,  603,  601,  601,  601,  601,  601,
-     1015,  601,  601,  601, 1158, 1158,  601, 1158, 1158,  601,
-      601,  601,  603,  601, 1004, 1004, 1004, 1158, 1005, 1158,
-     1158, 1006, 1158, 1158, 1158, 1158, 1030, 1030, 1030, 1158,
-     1158,  601,  601,  601,  601,  601,  601,  601,  601,  601,
-      601, 1015,  603,  604,  601, 1158, 1158,  601,  601,  601,
-
-      603,  601, 1031, 1031, 1031, 1158, 1033, 1033, 1033, 1035,
-     1035, 1035, 1038, 1038, 1038, 1158, 1158, 1032, 1158,  601,
-      601, 1034, 1158, 1158, 1036, 1158, 1158, 1039, 1046, 1046,
-     1046, 1030, 1030, 1030, 1031, 1031, 1031, 1158, 1048, 1048,
-     1048, 1158, 1049, 1158,  429, 1050, 1037,  603, 1158, 1032,
-     1033, 1033, 1033, 1051, 1051, 1051, 1158, 1052, 1158, 1158,
-     1053, 1035, 1035, 1035, 1158, 1034, 1158, 1054, 1054, 1054,
-     1158, 1055, 1158,  669, 1056, 1158, 1036, 1038, 1038, 1038,
-     1058, 1058, 1058, 1158, 1059, 1158, 1158, 1060, 1046, 1046,
-     1046, 1158, 1039, 1048, 1048, 1048, 1158, 1049, 1158, 1158,
-
-     1050, 1051, 1051, 1051,  429, 1052, 1158, 1158, 1053, 1054,
-     1054, 1054, 1158, 1055, 1158, 1158, 1056, 1058, 1058, 1058,
-     1067, 1059, 1158, 1158, 1060, 1093, 1093, 1093, 1093, 1093,
-     1093, 1102, 1102, 1102, 1158, 1103, 1158, 1158, 1104, 1158,
-     1094, 1158, 1158, 1094, 1102, 1102, 1102, 1158, 1103, 1158,
-     1158, 1104, 1112, 1112, 1112, 1112, 1112, 1112, 1158, 1115,
-     1158, 1158, 1116, 1129, 1129, 1129, 1158, 1158,  429, 1158,
-     1158,  429, 1131, 1131, 1131, 1129, 1129, 1129, 1130, 1135,
-     1135, 1135, 1158, 1136, 1158, 1158, 1137, 1132, 1158, 1158,
-     1130, 1131, 1131, 1131, 1138, 1138, 1138, 1158, 1139, 1158,
-
-     1158, 1140, 1158, 1135, 1135, 1135, 1132, 1136, 1158, 1158,
-     1137, 1138, 1138, 1138, 1158, 1139, 1158, 1158, 1140, 1156,
-     1156, 1156, 1156, 1156, 1156, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1157, 1158, 1158, 1157,  100,
-      100,  100,  100,  100,  100,  100,  101,  101,  101,  101,
-      101,  101,  101,  106,  106,  106,  106,  106,  106,  106,
-      109,  109,  109,  109,  109,  109,  109,  112,  112,  112,
-      112,  112,  112,  112,  115,  115,  115,  115,  115,  115,
-      115,  122,  122,  122,  122,  122,  122,  122,  130,  130,
-      130,  130,  130,  130,  130,  135,  135,  135,  135,  135,
-
-      135,  135,  145,  145,  145,  145,  145,  145,  145,  149,
-      149,  149,  149,  149,  149,  149,  155,  155,  155,  155,
-      155,  155,  155,  163,  163,  163,  163,  163,  163,  163,
-      171,  171,  171,  171,  171,  171,  171,  176,  176,  176,
-      176,  176,  176,  176,  182,  182,  182,  182,  182,  182,
-      182,  186,  186,  186,  186,  186,  186,  186,  192,  192,
-      192,  192,  192,  192,  192,  199,  199,  199,  199,  199,
-      199,  199,  206,  206,  206,  206,  206,  206,  206,  212,
-      212,  212,  212,  212,  212,  212,  220,  220,  220,  220,
-      220,  220,  220,  224,  224,  224,  224,  224,  224,  224,
-
-      230,  230,  230,  230,  230,  230,  230,  237,  237,  237,
-      237,  237,  237,  237,  245,  245,  245,  245,  245,  245,
-      245,  249,  249,  249,  249,  249,  249,  249,  115,  115,
-      115,  115,  115,  115,  115,  271,  271,  271, 1158,  271,
-      289,  289,  289, 1158,  289,  293,  293,  293, 1158,  293,
-      303,  303,  303, 1158,  303,  308,  308,  308, 1158,  308,
-      312,  312,  312, 1158,  312,  320,  320,  320, 1158,  320,
-      327,  327,  327, 1158,  327,  331,  331,  331, 1158,  331,
-      339,  339,  339, 1158,  339,  344,  344,  344,  344,  344,
-     1158,  344,  360, 1158,  360,  377, 1158,  377,  386, 1158,
-
-      386,  392, 1158,  392,  396, 1158,  396,  404, 1158,  404,
-      409, 1158,  409,  414, 1158,  414,  420, 1158,  420,  424,
-     1158,  424,  428,  428,  428,  428,  428,  428,  428,  434,
-     1158, 1158,  434,  444,  444,  444,  444,  444,  444,  463,
-      463,  463,  463,  463,  463,  475,  475,  475,  475,  475,
-      475,  484,  484,  484,  484,  484,  484,  491,  491,  491,
-      491,  491,  491,  502,  502,  502,  502,  502,  502,  511,
-      511,  511,  511,  511,  511,  519,  519,  519,  519,  519,
-      519,  527,  527,  527,  527,  527,  527,  533,  533,  533,
-      533,  533,  533,  601,  601,  601,  601,  601,  601,  601,
-
-      995,  995,  995,  995,  995,  995,  995,  996,  996,  996,
-      996,  996,  996,  996, 1010, 1010, 1010, 1010, 1010, 1010,
-     1010, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1027, 1027,
-     1027, 1027, 1027, 1027, 1027, 1029, 1029, 1029, 1029, 1029,
-     1029, 1029,   99, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1158
+     1940,  146,  147,  146,  146,  147,  146,  146,  147,  146,
+      146,  147,  146,  151,  147,  151,  157,  148,  154,  157,
+      148,  154, 1524,  149, 1525,  155,  149,  530,  155,  152,
+      151,  147,  151,  389,  158,  160,  161,  158,  160,  161,
+      162,  163,  531,  162,  163,  389,  152,  167,  168,  390,
+      164,  160,  161,  164,  165,  392,  162,  160,  161, 1061,
+      165,  391,  162,  167,  168, 1062,  164,  147,  147,  147,
+      477,  391,  164,  147,  147,  147,  180,  147,  180,  180,
+      147,  180,  464,  170,  180,  147,  180,  502,  169,  170,
+      478,  465,  181,  663,  503,  181,  388,  388,  388, 1257,
+
+      182,  388,  388,  388,  169,  171,  172,  147,  172,  171,
+      171,  171,  171,  171,  171,  171,  173,  171,  171,  171,
+     1526,  171,  175,  171,  176,  171,  180,  147,  180,  147,
+      147,  147,  495,  147,  147,  147,  180,  147,  180,  180,
+      147,  180,  182,  496, 1527,  183,  392,  171,  171,  183,
+      956,  481,  181,  392,  482,  181,  388,  388,  388,  388,
+      388,  388,  391,  388,  388,  388,  388,  388,  388,  391,
+      177,  956,  178,  171,  172,  147,  172,  171,  171,  171,
+      171,  171,  171,  171,  173,  171,  171,  171, 1162,  171,
+      175,  171,  176,  171,  147,  147,  147,  147,  147,  147,
+
+     1427,  180,  147,  180,  180,  147,  180,  180,  147,  180,
+      184,  553,  392,  184,  392,  171,  171,  182,  663,  408,
+      182,  392,  845,  185,  554,  180,  147,  180,  391,  956,
+      391,  388,  388,  388,  388,  388,  388,  391,  177,  956,
+      178,  185,  186,  187,  147,  187,  186,  186,  186,  186,
+      186,  186,  186,  188,  186,  186,  186, 1258,  186,  190,
+      186,  191,  186,  194,  147,  194,  194,  147,  194,  403,
+      218,  147,  218,  160,  161,  160,  161, 1528,  162,  195,
+      162, 1259,  195,  437,  186,  186,  219,  438,  205,  663,
+      205,  439,  192,  186,  187,  147,  187,  186,  186,  186,
+
+      186,  186,  186,  186,  188,  186,  186,  186,  953,  186,
+      190,  186,  191,  186,  206,  392,  206,  218,  147,  218,
+      663,  147,  147,  147,  147,  147,  147,  388,  388,  388,
+      767,  391,  956,  219, 1530,  186,  186,  220,  536,  768,
+      220,  537, 1055,  192,  196,  197,  147,  197,  196,  196,
+      196,  196,  196,  196,  196,  198,  196,  196,  196, 1531,
+      196,  200,  196,  201,  196,  218,  147,  218,  218,  147,
+      218, 1345,  218,  147,  218,  218,  147,  218,  388,  388,
+      388,  219,  392,  430,  219,  392,  196,  196,  221,  424,
+      431,  221,  441, 1302,  202, 1304, 1532,  203,  391,  391,
+
+     1303,  391, 1305,  204,  196,  197,  147,  197,  196,  196,
+      196,  196,  196,  196,  196,  198,  196,  196,  196,  530,
+      196,  200,  196,  201,  196,  233,  147,  233,  233,  147,
+      233, 1536,  246,  147,  246,  246,  147,  246,  663,  392,
+      442,  234,  392,  553,  234,  956,  196,  196,  247,  441,
+     1537,  247,  567,  665,  202,  391,  559,  203,  391,  388,
+      388,  388,  956,  204,  207,  208,  147,  208,  207,  207,
+      207,  207,  207,  207,  207,  209,  207,  207,  207, 1428,
+      207,  211,  207,  212,  207,  147,  147,  147,  147,  147,
+      147, 1538,  147,  147,  147,  147,  147,  147,  258,  147,
+
+      258,  255,  392,  392,  255, 1346,  207,  207,  256,  449,
+     1360,  256,  956, 1361,  259,  213, 1542,  214,  391,  391,
+      215,  388,  388,  388, 1324, 1325,  216,  207,  208,  147,
+      208,  207,  207,  207,  207,  207,  207,  207,  209,  207,
+      207,  207, 1163,  207,  211,  207,  212,  207,  258,  147,
+      258,  272,  147,  272, 1543,  272,  147,  272,  147,  147,
+      147,  147,  147,  147,  259,  392,  392,  273,  392,  207,
+      207,  273,  456, 1511,  220, 1326, 1327,  220,  213, 1544,
+      214,  391,  391,  215,  391, 1512,  397, 1331, 1332,  216,
+      222,  223,  147,  223,  222,  222,  222,  222,  222,  222,
+
+      222,  224,  222,  222,  222, 1545,  222,  226,  222,  227,
+      222,  272,  147,  272,  272,  147,  272,  956,  272,  147,
+      272,  442,  272,  147,  272,  398, 1546,  273, 1333, 1334,
+      273,  399,  222,  222,  274,  400,  392,  228,  274,  229,
+      401,  388,  388,  388,  230,  388,  388,  388,  388,  388,
+      388, 1500,  391,  231,  222,  223,  147,  223,  222,  222,
+      222,  222,  222,  222,  222,  224,  222,  222,  222,  392,
+      222,  226,  222,  227,  222,  284,  147,  284,  284,  147,
+      284, 1547,  299,  147,  299,  391,  299,  147,  299, 1553,
+     1554,  285, 1319,  392,  285, 1513,  222,  222,  300, 1320,
+
+      460,  228,  300,  229,  388,  388,  388, 1514,  230,  391,
+      388,  388,  388,  388,  388,  388, 1555,  231,  235,  236,
+      147,  236,  235,  235,  235,  235,  235,  235,  235,  237,
+      235,  235,  235,  663,  235,  239,  235,  240,  235,  309,
+      147,  309,  309,  147,  309, 1556,  322,  147,  322,  322,
+      147,  322,  147,  147,  147,  310,  392,  392,  310, 1321,
+      235,  235,  323,  469, 1362,  323, 1322, 1363,  220, 1499,
+     1548,  241,  391,  391,  388,  388,  388,  242, 1549,  243,
+      244,  235,  236,  147,  236,  235,  235,  235,  235,  235,
+      235,  235,  237,  235,  235,  235, 1557,  235,  239,  235,
+
+      240,  235,  147,  147,  147,  322,  147,  322,  413,  322,
+      147,  322,  322,  147,  322,  322,  147,  322,  220, 1550,
+      956,  323,  392,  235,  235,  323, 1558, 1551,  324,  474,
+     1399,  324, 1400,  956,  241,  388,  388,  388,  391, 1402,
+      242, 1403,  243,  244,  248,  249,  147,  249,  248,  248,
+      248,  248,  248,  248,  248,  250,  248,  248,  248, 1501,
+      248,  252,  248,  253,  248,  147,  147,  147,  147,  147,
+      147, 1565,  147,  147,  147,  147,  147,  147,  336,  147,
+      336,  334,  392, 1409,  334, 1410,  248,  248,  334,  392,
+     1412,  334, 1413, 1571,  337,  388,  388,  388,  391,  388,
+
+      388,  388,  388,  388,  388,  391,  254,  248,  249,  147,
+      249,  248,  248,  248,  248,  248,  248,  248,  250,  248,
+      248,  248,  663,  248,  252,  248,  253,  248,  336,  147,
+      336,  336,  147,  336, 1575,  336,  147,  336,  350,  147,
+      350,  350,  147,  350,  337,  392,  392,  338, 1564,  248,
+      248,  338,  485,  489,  351, 1576, 1577,  351,  388,  388,
+      388,  391,  391,  388,  388,  388,  388,  388,  388,  254,
+      260,  261,  147,  261,  260,  260,  260,  260,  260,  260,
+      260,  262,  260,  260,  260, 1578,  260,  264,  260,  265,
+      260,  147,  147,  147,  147,  147,  147, 1579,  350,  147,
+
+      350,  350,  147,  350,  350,  147,  350,  334,  392,  392,
+      334,  392,  260,  260,  351,  266,  497,  351, 1582, 1583,
+      352, 1584,  956,  267,  391,  391,  268,  391, 1585,  269,
+     1586, 1587,  270,  260,  261,  147,  261,  260,  260,  260,
+      260,  260,  260,  260,  262,  260,  260,  260, 1588,  260,
+      264,  260,  265,  260,  350,  147,  350,  361,  147,  361,
+     1566,  361,  147,  361,  374,  147,  374,  374,  147,  374,
+      352,  392,  392,  362,  392,  260,  260,  362,  266, 1589,
+      375,  505, 1590,  375, 1591, 1596,  267,  391,  391,  268,
+      391, 1597,  269, 1598, 1601,  270,  275,  276,  147,  276,
+
+      275,  275,  275,  275,  275,  275,  275,  277,  275,  275,
+      275, 1602,  275,  279,  275,  280,  275,  147,  147,  147,
+      147,  147,  147,  504,  374,  147,  374,  374,  147,  374,
+      374,  147,  374,  376,  392, 1603,  376, 1604,  275,  275,
+      375,  469, 1605,  375,  392, 1606,  377, 1607, 1608,  281,
+      391,  388,  388,  388,  388,  388,  388,  388,  388,  388,
+      391,  282,  275,  276,  147,  276,  275,  275,  275,  275,
+      275,  275,  275,  277,  275,  275,  275, 1609,  275,  279,
+      275,  280,  275,  374,  147,  374,  386,  147,  386,  442,
+      386,  147,  386,  388,  388,  388,  392,  392,  392,  377,
+
+     1610, 1611,  387,  512,  275,  275,  387,  388,  388,  388,
+      663, 1613,  391,  391,  391,  281,  388,  388,  388,  388,
+      388,  388,  388,  388,  388, 1614, 1161,  282,  286,  287,
+      147,  287,  286,  286,  286,  286,  286,  286,  286,  288,
+      286,  286,  286,  289,  286,  290,  286,  291,  286,  289,
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      286,  286,  289,  289,  292,  289,  289,  289,  289,  289,
+      289,  293,  289,  294,  289,  289,  289,  295,  289,  296,
+      297,  289,  289,  289,  289,  289,  289,  301,  302,  147,
+
+      302,  301,  301,  301,  301,  301,  301,  301,  303,  301,
+      301,  301, 1615,  301,  305,  301,  306,  301, 1616, 1617,
+      392,  392,  392, 1618, 1625,  392,  392,  497,  505,  516,
+      392, 1626,  408,  512,  956, 1627,  391,  391,  391,  301,
+      301,  391,  391,  388,  388,  388,  391,  388,  388,  388,
+      307,  301,  302,  147,  302,  301,  301,  301,  301,  301,
+      301,  301,  303,  301,  301,  301, 1622,  301,  305,  301,
+      306,  301,  504,  409,  412,  442,  410,  504,  411,  412,
+      414,  413,  418,  392,  419,  392,  392,  420,  416,  417,
+      388,  388,  388,  301,  301,  534,  534,  534, 1628,  391,
+
+     1629,  391,  391, 1635,  307,  311,  312,  147,  312,  311,
+      311,  311,  311,  311,  311,  311,  313,  311,  311,  311,
+      663,  311,  315,  311,  316,  311, 1636,  524,  392, 1637,
+      392, 1638,  412,  411, 1639,  523,  413,  528,  414, 1640,
+      418,  442,  419, 1641,  391, 1642,  391,  311,  311,  392,
+      535,  317, 1643,  534,  534,  534,  523,  667,  318, 1644,
+      319,  863,  863,  863, 1621,  391, 1649,  320,  311,  312,
+      147,  312,  311,  311,  311,  311,  311,  311,  311,  313,
+      311,  311,  311, 1652,  311,  315,  311,  316,  311, 1653,
+      524,  564,  564,  564, 1657,  572,  572,  572,  587,  587,
+
+      587,  598,  598,  598,  442,  606,  606,  606,  565, 1658,
+      311,  311,  573, 1659,  317,  588, 1650, 1651,  599, 1660,
+     1661,  318,  607,  319,  966,  966,  966,  968,  968,  968,
+      320,  325,  326,  147,  326,  325,  325,  325,  325,  325,
+      325,  325,  327,  325,  325,  325, 1662,  325,  329,  325,
+      330,  325,  612,  612,  612,  614,  614,  614,  623,  623,
+      623,  628,  628,  628,  648,  648,  648, 1663, 1664,  613,
+     1665, 1666,  615,  325,  325,  624,  331, 1667,  629,  332,
+     1670,  649,  700,  700,  700, 1671,  701, 1672, 1673,  702,
+      863,  863,  863,  333,  325,  326,  147,  326,  325,  325,
+
+      325,  325,  325,  325,  325,  327,  325,  325,  325, 1674,
+      325,  329,  325,  330,  325,  677,  677,  677, 1675,  663,
+      695,  695,  695, 1689, 1690,  677,  677,  677,  695,  695,
+      695, 1083, 1084,  679, 1691, 1692,  325,  325,  697,  331,
+     1696, 1085,  332,  679, 1697, 1086,  697,  710,  710,  710,
+     1682,  711, 1698, 1699,  712, 1701,  333,  339,  340,  147,
+      340,  339,  339,  339,  339,  339,  339,  339,  341,  339,
+      339,  339, 1702,  339,  343,  339,  344,  339, 1703,  680,
+      564,  564,  564, 1704,  698,  705,  705,  705,  705,  705,
+      705,  572,  572,  572,  713,  713,  713,  565, 1709,  339,
+
+      339, 1710,  345,  707, 1711,  346,  707, 1712,  573, 1713,
+      347,  714,  992,  992,  992,  966,  966,  966, 1714,  348,
+      339,  340,  147,  340,  339,  339,  339,  339,  339,  339,
+      339,  341,  339,  339,  339, 1715,  339,  343,  339,  344,
+      339,  716,  716,  716,  968,  968,  968, 1716,  708,  719,
+      719,  719, 1717, 1718,  719,  719,  719, 1719,  717,  728,
+      728,  728,  339,  339, 1720,  345, 1721,  721,  346,  992,
+      992,  992,  721,  347,  732,  732,  732,  730,  733, 1722,
+     1737,  734,  348,  353,  354,  147,  354,  353,  353,  353,
+      353,  353,  353,  353,  355,  353,  353,  353,  722,  353,
+
+      357,  353,  358,  353,  728,  728,  728,  587,  587,  587,
+      738,  738,  738,  738,  738,  738,  743,  743,  743, 1072,
+     1072, 1072,  730,  663,  588,  353,  353, 1738,  740, 1739,
+     1740,  740, 1741, 1073,  745, 1742,  359,  353,  354,  147,
+      354,  353,  353,  353,  353,  353,  353,  353,  355,  353,
+      353,  353, 1743,  353,  357,  353,  358,  353,  743,  743,
+      743,  741, 1731, 1744,  731,  598,  598,  598,  748,  748,
+      748, 1747,  749, 1087, 1088,  750,  745, 1748, 1749,  353,
+      353, 1750,  599, 1089, 1174, 1174, 1174, 1090, 1757, 1758,
+      359,  363,  364,  147,  364,  363,  363,  363,  363,  363,
+
+      363,  363,  365,  363,  363,  363, 1759,  363,  367,  363,
+      368,  363,  755,  755,  755,  746, 1760, 1761,  755,  755,
+      755,  606,  606,  606,  759,  759,  759, 1762,  760, 1763,
+      757,  761, 1764,  363,  363, 1765,  757, 1766,  607, 1767,
+     1768,  369, 1778,  370, 1779,  371, 1069, 1069, 1069, 1176,
+     1176, 1176, 1780,  372,  363,  364,  147,  364,  363,  363,
+      363,  363,  363,  363,  363,  365,  363,  363,  363, 1781,
+      363,  367,  363,  368,  363,  758,  763,  763,  763, 1782,
+      763,  763,  763,  612,  612,  612,  769,  769,  769, 1783,
+      770, 1784, 1785,  771,  765, 1790,  363,  363,  765, 1791,
+
+      613, 1069, 1069, 1069,  369,  663,  370, 1792,  371, 1072,
+     1072, 1072, 1267, 1267, 1267, 1070,  372,  378,  379,  147,
+      379,  378,  378,  378,  378,  378,  378,  378,  380,  378,
+      378,  378, 1793,  378,  382,  378,  383,  378, 1773, 1786,
+      766,  614,  614,  614,  772,  772,  772, 1771,  773, 1776,
+     1787,  774,  775,  775,  775,  781,  781,  781,  615,  378,
+      378,  781,  781,  781,  623,  623,  623, 1788, 1794,  776,
+      785,  785,  785,  783,  786, 1795, 1796,  787, 1789,  783,
+     1797,  624,  384,  378,  379,  147,  379,  378,  378,  378,
+      378,  378,  378,  378,  380,  378,  378,  378, 1802,  378,
+
+      382,  378,  383,  378,  788,  788,  788, 1773, 1773,  788,
+      788,  788,  628,  628,  628,  784,  793,  793,  793, 1776,
+      794, 1774,  790,  795, 1802,  378,  378,  790, 1805,  629,
+      956,  957,  799,  799,  799,  799,  799,  799,  804,  804,
+      804,  806,  806,  806,  810,  810,  810, 1806,  384,  392,
+      801, 1807,  663,  801, 1808,  805,  408, 1818,  807,  810,
+      810,  810,  812, 1819, 1820,  391,  791,  815,  815,  815,
+     1821,  818,  818,  818,  648,  648,  648,  812,  820,  820,
+      820,  820,  820,  820,  816, 1802, 1825,  802,  819, 1800,
+     1802,  649,  409, 1826, 1827,  410,  822,  411,  412,  822,
+
+      413,  827,  827,  827,  414, 1828,  415,  416,  417, 1829,
+      824,  824,  824, 1839,  825, 1843,  813,  826, 1844,  829,
+     1845,  827,  827,  827,  835,  835,  835,  835,  835,  835,
+      841,  841,  841,  841,  841,  841, 1773, 1846,  823,  829,
+     1850, 1851,  837, 1852, 1853,  837, 1854, 1855,  843,  663,
+     1774,  843,  677,  677,  677, 1859,  677,  677,  677,  677,
+      677,  677,  868,  868,  868,  695,  695,  695, 1860, 1861,
+      679, 1858, 1862,  830,  679, 1863, 1867,  679, 1868,  869,
+      695,  695,  695,  697,  695,  695,  695,  838,  871,  871,
+      871,  663, 1869,  844, 1940, 1940, 1940, 1870,  697,  705,
+
+      705,  705,  697,  854, 1871,  872,  700,  700,  700, 1866,
+      701, 1940,  663,  702,  705,  705,  705,  707,  705,  705,
+      705,  710,  710,  710, 1877,  711, 1878, 1879,  712, 1880,
+      870, 1874,  707,  713,  713,  713,  707,  877,  877,  877,
+     1887,  878, 1888,  663,  879,  663,  880,  880,  880, 1883,
+      714,  873,  716,  716,  716,  663,  663,  882,  882,  882,
+      663,  883,  875,  881,  884,  719,  719,  719, 1891,  717,
+      719,  719,  719,  719,  719,  719,  890,  890,  890,  728,
+      728,  728,  663,  721,  728,  728,  728,  663,  721,  663,
+     1905,  721, 1523,  891,  728,  728,  728,  730, 1909,  732,
+
+      732,  732,  730,  733,  663, 1906,  734,  738,  738,  738,
+      663, 1931,  730,  738,  738,  738,  738,  738,  738,  743,
+      743,  743,  743,  743,  743,  740,  743,  743,  743,  886,
+     1901,  740, 1902,  663,  740,  663,  663,  745,  893, 1932,
+      745,  748,  748,  748,  745,  749, 1910,  663,  750,  755,
+      755,  755,  755,  755,  755,  755,  755,  755,  759,  759,
+      759,  663,  760,  663, 1915,  761, 1916,  757, 1929,  663,
+      757,  663, 1927,  757,  763,  763,  763,  663,  897,  763,
+      763,  763,  763,  763,  763, 1937,  899,  769,  769,  769,
+     1522,  770,  765,  663,  771, 1923,  663,  765, 1925, 1928,
+
+      765,  772,  772,  772,  663,  773, 1926, 1521,  774,  775,
+      775,  775, 1930,  910,  910,  910,  905,  911,  663, 1924,
+      912,  663,  781,  781,  781,  663,  776,  781,  781,  781,
+      781,  781,  781, 1935,  785,  785,  785, 1933,  786,  907,
+      783,  787,  788,  788,  788,  783, 1520, 1936,  783,  788,
+      788,  788,  788,  788,  788,  793,  793,  793, 1519,  794,
+      790, 1518,  795,  799,  799,  799, 1937,  790, 1517, 1934,
+      790,  799,  799,  799,  799,  799,  799,  804,  804,  804,
+      663,  801, 1516,  925,  925,  925, 1515,  926, 1508,  801,
+      927, 1507,  801,  917,  805,  806,  806,  806,  928,  928,
+
+      928, 1487,  929, 1486, 1485,  930,  810,  810,  810,  810,
+      810,  810,  807, 1484, 1483,  918,  810,  810,  810,  815,
+      815,  815, 1482, 1477,  812, 1476, 1475,  812, 1474, 1473,
+      923,  935,  935,  935,  812,  936,  816, 1472,  937,  818,
+      818,  818,  939,  939,  939, 1469,  940, 1468, 1467,  941,
+      820,  820,  820,  820,  820,  820,  819,  820,  820,  820,
+      824,  824,  824, 1466,  825, 1465, 1459,  826,  822, 1458,
+     1457,  822,  827,  827,  827,  822,  827,  827,  827,  933,
+      827,  827,  827,  945,  945,  945,  835,  835,  835, 1456,
+      829,  835,  835,  835,  829,  835,  835,  835,  829, 1455,
+
+      946,  841,  841,  841,  837,  841,  841,  841, 1453,  837,
+      841,  841,  841,  837,  955,  955,  955, 1452, 1451,  843,
+      942, 1450, 1449,  843,  677,  677,  677, 1448,  843,  868,
+      868,  868,  956,  957, 1447, 1446,  943,  976,  976,  976,
+     1445,  977,  679, 1444,  978, 1443,  869,  695,  695,  695,
+     1442, 1441,  949,  871,  871,  871, 1440,  980,  980,  980,
+      952,  981, 1436, 1435,  982,  697,  705,  705,  705, 1434,
+      872,  877,  877,  877, 1421,  878, 1411, 1408,  879,  880,
+      880,  880, 1401, 1398,  707, 1397,  963,  987,  987,  987,
+     1396,  988, 1395, 1394,  989, 1393,  881, 1392,  882,  882,
+
+      882,  979,  883, 1391, 1385,  884,  719,  719,  719,  890,
+      890,  890,  985,  995,  995,  995, 1384,  996, 1383, 1382,
+      997,  728,  728,  728,  721, 1381,  891, 1003, 1003, 1003,
+      743,  743,  743, 1010, 1010, 1010,  755,  755,  755,  730,
+     1012, 1012, 1012, 1380, 1379, 1004, 1378, 1371,  745, 1370,
+     1011, 1369, 1368,  991,  757, 1367, 1366, 1013, 1016, 1016,
+     1016,  763,  763,  763, 1019, 1019, 1019,  999, 1940, 1940,
+     1940, 1365, 1022, 1022, 1022, 1017, 1364, 1359, 1006,  765,
+     1358, 1020, 1355, 1014, 1352, 1940,  910,  910,  910, 1023,
+      911, 1351, 1342,  912, 1940, 1940, 1940, 1340, 1015, 1940,
+
+     1940, 1940, 1339, 1940, 1940, 1940,  781,  781,  781, 1329,
+     1323, 1940, 1318,  788,  788,  788, 1940, 1317, 1313, 1018,
+     1940, 1032, 1032, 1032,  783, 1306,  799,  799,  799, 1301,
+     1021,  790,  925,  925,  925, 1300,  926, 1299, 1033,  927,
+      810,  810,  810, 1025,  801,  928,  928,  928, 1291,  929,
+     1290, 1289,  930, 1288, 1287,  935,  935,  935,  812,  936,
+     1024, 1286,  937, 1285, 1034, 1284, 1280, 1027, 1277, 1026,
+      939,  939,  939, 1276,  940, 1028, 1275,  941, 1274, 1035,
+      820,  820,  820,  827,  827,  827,  945,  945,  945, 1045,
+     1045, 1045, 1272, 1046, 1271, 1260, 1047, 1255,  822, 1253,
+
+     1252,  829, 1039,  946,  835,  835,  835, 1052, 1052, 1052,
+      841,  841,  841,  955,  955,  955,  677,  677,  677, 1069,
+     1069, 1069,  837, 1251, 1053,  976,  976,  976,  843,  977,
+     1242,  956,  978, 1070,  679, 1237, 1043,  695,  695,  695,
+     1236, 1235, 1042, 1234,  980,  980,  980, 1230,  981, 1216,
+     1050,  982,  719,  719,  719,  697,  705,  705,  705, 1215,
+     1214, 1056,  987,  987,  987, 1063,  988, 1213, 1212,  989,
+      721, 1211, 1197, 1054,  707, 1196, 1195, 1057, 1194, 1071,
+      995,  995,  995, 1193,  996, 1192, 1191,  997,  728,  728,
+      728, 1093, 1093, 1093, 1940, 1940, 1940, 1096, 1096, 1096,
+
+     1074, 1003, 1003, 1003, 1077, 1190,  730, 1189, 1094, 1080,
+     1186, 1940, 1184, 1183, 1097, 1098, 1098, 1098, 1180, 1004,
+      743,  743,  743, 1010, 1010, 1010, 1104, 1104, 1104, 1179,
+     1105, 1177, 1099, 1106, 1175, 1173, 1092, 1172,  745, 1171,
+     1011, 1012, 1012, 1012, 1170, 1107, 1107, 1107, 1095, 1108,
+     1164, 1156, 1109, 1111, 1111, 1111, 1154, 1153, 1013, 1016,
+     1016, 1016, 1152, 1145, 1100, 1113, 1113, 1113, 1139, 1114,
+     1135, 1112, 1115, 1116, 1116, 1116, 1017, 1019, 1019, 1019,
+     1118, 1118, 1118, 1134, 1119, 1133, 1110, 1120, 1121, 1121,
+     1121, 1117, 1103, 1102, 1020, 1022, 1022, 1022, 1101, 1123,
+
+     1123, 1123, 1091, 1124, 1082, 1122, 1125, 1126, 1126, 1126,
+     1081, 1079, 1023, 1940, 1940, 1940, 1129, 1129, 1129,  781,
+      781,  781, 1078, 1076, 1127,  788,  788,  788, 1075, 1071,
+     1940, 1073, 1068, 1130, 1032, 1032, 1032,  783, 1136, 1136,
+     1136, 1067, 1137,  790, 1066, 1138, 1140, 1140, 1140, 1065,
+     1064, 1033, 1142, 1142, 1142, 1940, 1940, 1940,  810,  810,
+      810, 1147, 1147, 1147, 1141, 1060, 1059, 1128, 1058, 1143,
+      956, 1051, 1940, 1132, 1049, 1048,  812, 1044, 1148, 1041,
+     1040, 1131, 1940, 1940, 1940,  820,  820,  820, 1038, 1037,
+      827,  827,  827, 1045, 1045, 1045, 1036, 1046, 1031, 1940,
+
+     1047, 1030, 1029,  822, 1151, 1009, 1146, 1008,  829,  835,
+      835,  835, 1052, 1052, 1052, 1144, 1157, 1157, 1157, 1007,
+     1158, 1005, 1002, 1159, 1001, 1149, 1000,  837,  998, 1053,
+      841,  841,  841, 1150, 1165, 1165, 1165, 1940, 1940, 1940,
+      994, 1940, 1940, 1940,  677,  677,  677,  993,  843,  990,
+      986, 1166,  984,  983, 1940,  975,  974, 1155, 1940,  695,
+      695,  695,  679, 1181, 1181, 1181,  719,  719,  719, 1187,
+     1187, 1187,  973,  728,  728,  728,  972,  697, 1093, 1093,
+     1093, 1182,  971,  970,  721, 1160, 1188, 1198,  969, 1167,
+      967,  730, 1199, 1199, 1199, 1094, 1200,  965, 1168, 1201,
+
+      964, 1169, 1202, 1202, 1202,  962, 1178, 1096, 1096, 1096,
+     1204, 1204, 1204,  961, 1205,  960,  959, 1206,  958, 1203,
+      951, 1185,  950,  948, 1097, 1098, 1098, 1098, 1207, 1207,
+     1207,  947, 1208,  944,  938, 1209,  743,  743,  743, 1104,
+     1104, 1104, 1099, 1105,  934,  932, 1106,  931, 1107, 1107,
+     1107,  924, 1108,  922,  745, 1109, 1111, 1111, 1111, 1113,
+     1113, 1113,  921, 1114,  920,  919, 1115, 1116, 1116, 1116,
+      916, 1118, 1118, 1118, 1112, 1119,  915,  914, 1120, 1121,
+     1121, 1121, 1210,  913,  909, 1117, 1217, 1217, 1217,  908,
+     1218,  906,  904, 1219,  903,  902, 1122, 1123, 1123, 1123,
+
+      901, 1124,  900,  898, 1125, 1126, 1126, 1126, 1220, 1220,
+     1220,  896, 1221,  895,  894, 1222, 1223, 1223, 1223, 1129,
+     1129, 1129, 1127, 1225, 1225, 1225,  892, 1226,  889,  888,
+     1227,  887,  885, 1224,  876,  874, 1130,  781,  781,  781,
+      788,  788,  788, 1231, 1231, 1231, 1136, 1136, 1136,  867,
+     1137,  866,  865, 1138,  864,  783,  862,  861,  790,  860,
+     1232, 1140, 1140, 1140, 1142, 1142, 1142, 1238, 1238, 1238,
+      859, 1239,  858,  857, 1240, 1940, 1940, 1940,  856, 1141,
+      855, 1143, 1147, 1147, 1147, 1228, 1233,  810,  810,  810,
+      853,  852, 1940, 1940, 1940, 1940, 1248, 1248, 1248, 1148,
+
+     1229, 1243, 1244, 1244, 1244,  812, 1245,  851,  850, 1246,
+     1940,  827,  827,  827, 1249,  835,  835,  835, 1157, 1157,
+     1157,  849, 1158,  848,  847, 1159,  846, 1241,  663,  829,
+      841,  841,  841,  837, 1165, 1165, 1165, 1261, 1261, 1261,
+      840, 1262,  839,  834, 1263, 1940, 1940, 1940,  843,  833,
+     1247, 1166, 1940, 1940, 1940,  832,  831, 1250,  817,  677,
+      677,  677, 1940, 1268, 1268, 1268, 1269, 1269, 1269, 1940,
+     1270, 1270, 1270, 1174, 1174, 1174, 1254,  679, 1256, 1176,
+     1176, 1176,  695,  695,  695, 1181, 1181, 1181, 1278, 1278,
+     1278, 1187, 1187, 1187,  814, 1281, 1281, 1281,  809, 1282,
+
+      697, 1264, 1283, 1182,  808,  803, 1279,  798, 1188, 1292,
+     1292, 1292, 1202, 1202, 1202, 1265,  728,  728,  728, 1266,
+     1199, 1199, 1199,  797, 1200,  796, 1293, 1201,  792, 1203,
+     1273, 1295, 1295, 1295,  730, 1296,  780,  779, 1297, 1204,
+     1204, 1204,  778, 1205,  777,  762, 1206, 1207, 1207, 1207,
+      754, 1208,  753,  752, 1209,  743,  743,  743,  751, 1217,
+     1217, 1217, 1294, 1218,  747,  742, 1219, 1220, 1220, 1220,
+      737, 1221,  736,  745, 1222, 1223, 1223, 1223, 1307, 1307,
+     1307,  735, 1308,  727,  726, 1309, 1225, 1225, 1225,  725,
+     1226,  724, 1224, 1227,  781,  781,  781, 1311, 1311, 1311,
+
+     1231, 1231, 1231, 1314, 1314, 1314, 1298, 1315,  723,  718,
+     1316,  715,  783,  709,  704, 1312,  703, 1232, 1238, 1238,
+     1238,  699, 1239,  694,  693, 1240, 1940, 1940, 1940,  810,
+      810,  810, 1244, 1244, 1244,  692, 1245,  691,  690, 1246,
+     1940, 1940, 1940, 1940, 1248, 1248, 1248,  812,  827,  827,
+      827, 1337, 1337, 1337, 1310,  689,  688, 1940,  835,  835,
+      835,  687, 1249, 1344, 1344, 1344,  829,  686, 1338,  841,
+      841,  841, 1328, 1347, 1347, 1347,  837,  685, 1261, 1261,
+     1261,  663, 1262,  684, 1330, 1263,  683,  843, 1940, 1940,
+     1940, 1940, 1940, 1940,  682,  681, 1335,  677,  677,  677,
+
+     1267, 1267, 1267,  676,  675, 1940,  674,  673, 1940,  672,
+     1336, 1268, 1268, 1268,  671,  679, 1269, 1269, 1269, 1341,
+     1270, 1270, 1270,  670,  669, 1343, 1353, 1353, 1353, 1356,
+     1356, 1356, 1278, 1278, 1278, 1281, 1281, 1281,  666, 1282,
+      664, 1348, 1283,  663, 1354,  661, 1357, 1292, 1292, 1292,
+     1279,  659, 1350, 1349, 1372, 1372, 1372,  658, 1373,  657,
+      655, 1374,  654,  653, 1293,  728,  728,  728, 1295, 1295,
+     1295,  652, 1296,  651,  647, 1297, 1376, 1376, 1376,  645,
+     1307, 1307, 1307,  730, 1308,  644,  643, 1309, 1386, 1386,
+     1386, 1311, 1311, 1311, 1377, 1388, 1388, 1388, 1314, 1314,
+
+     1314,  642, 1315,  641,  639, 1316, 1387,  638,  637, 1312,
+      636,  635, 1389, 1404, 1404, 1404, 1406, 1406, 1406,  810,
+      810,  810, 1375, 1940, 1940, 1940,  634,  827,  827,  827,
+     1405, 1337, 1337, 1337, 1419, 1419, 1419,  812, 1390,  632,
+     1940,  631, 1416, 1416, 1416,  829, 1417,  630, 1338, 1418,
+      627, 1420, 1422, 1422, 1422, 1424, 1424, 1424,  841,  841,
+      841, 1344, 1344, 1344,  626,  622, 1414, 1347, 1347, 1347,
+     1423, 1429, 1429, 1429,  620,  619,  843,  618,  617,  663,
+      616,  611, 1407, 1415, 1940, 1940, 1940,  610, 1430, 1432,
+     1432, 1432, 1353, 1353, 1353, 1356, 1356, 1356, 1437, 1437,
+
+     1437, 1940, 1438,  608,  605, 1439,  603, 1433,  602,  601,
+     1354,  600, 1357,  597, 1372, 1372, 1372,  596, 1373, 1426,
+     1425, 1374,  728,  728,  728, 1376, 1376, 1376, 1460, 1460,
+     1460,  594, 1431, 1386, 1386, 1386, 1388, 1388, 1388,  593,
+      730,  591,  590, 1377,  589, 1461,  586,  584, 1462, 1462,
+     1462, 1387, 1463, 1389,  583, 1464, 1470, 1470, 1470, 1404,
+     1404, 1404, 1478, 1478, 1478,  582, 1479,  581,  580, 1480,
+     1406, 1406, 1406, 1471,  579,  577, 1405,  576, 1454,  810,
+      810,  810, 1940, 1940, 1940, 1490, 1490, 1490, 1416, 1416,
+     1416,  575, 1417,  574,  571, 1418,  570,  812,  569, 1940,
+
+     1419, 1419, 1419, 1491, 1492, 1492, 1492,  566, 1493,  563,
+      562, 1494,  560, 1495, 1495, 1495,  558, 1420, 1422, 1422,
+     1422, 1424, 1424, 1424, 1497, 1497, 1497,  557,  556, 1488,
+     1496,  555,  552, 1481,  551,  550, 1423, 1429, 1429, 1429,
+      549,  548, 1498, 1489, 1502, 1502, 1502,  547, 1503,  546,
+      544, 1504,  543,  542, 1430, 1505, 1505, 1505, 1432, 1432,
+     1432, 1509, 1509, 1509, 1437, 1437, 1437,  541, 1438,  540,
+      539, 1439, 1506,  728,  728,  728, 1433,  538, 1510, 1460,
+     1460, 1460, 1533, 1533, 1533,  533, 1534,  530,  532, 1535,
+      527,  730,  525, 1462, 1462, 1462, 1461, 1463,  522,  521,
+
+     1464, 1470, 1470, 1470, 1539, 1539, 1539,  520, 1540,  519,
+      517, 1541, 1478, 1478, 1478,  515, 1479,  513, 1471, 1480,
+      810,  810,  810, 1940, 1940, 1940, 1940, 1940, 1940, 1529,
+     1490, 1490, 1490,  511,  510, 1492, 1492, 1492,  812, 1493,
+     1940,  509, 1494, 1940, 1495, 1495, 1495,  508, 1491, 1561,
+     1561, 1561,  506, 1562,  501,  500, 1563, 1497, 1497, 1497,
+      498, 1496, 1502, 1502, 1502,  494, 1503,  493,  492, 1504,
+     1505, 1505, 1505,  490,  488, 1498, 1567, 1567, 1567,  486,
+     1568,  484, 1552, 1569, 1559,  483, 1560, 1506, 1570, 1570,
+     1570, 1509, 1509, 1509, 1572, 1572, 1572,  480, 1573,  479,
+
+      475, 1574, 1580, 1580, 1580,  728,  728,  728, 1510, 1593,
+     1593, 1593,  473, 1533, 1533, 1533,  472, 1534,  470, 1581,
+     1535,  468,  467,  730,  466,  463, 1594, 1599, 1599, 1599,
+     1539, 1539, 1539,  461, 1540,  459,  457, 1541,  810,  810,
+      810, 1940, 1940, 1940, 1600, 1940, 1940, 1940, 1570, 1570,
+     1570,  455, 1595, 1592,  454,  453,  812,  452, 1940, 1561,
+     1561, 1561, 1940, 1562,  450,  448, 1563, 1623, 1623, 1623,
+     1567, 1567, 1567,  447, 1568,  446,  445, 1569,  443, 1572,
+     1572, 1572,  440, 1573, 1624,  956, 1574, 1630, 1630, 1630,
+     1612, 1620, 1580, 1580, 1580, 1632, 1632, 1632,  436, 1633,
+
+      435,  433, 1634, 1619, 1631,  728,  728,  728,  432, 1581,
+     1593, 1593, 1593, 1646, 1646, 1646,  429, 1647,  428,  427,
+     1648,  425,  423,  730, 1599, 1599, 1599, 1594, 1654, 1654,
+     1654,  421, 1655,  407,  406, 1656, 1668, 1668, 1668,  404,
+      402, 1600, 1676, 1676, 1676, 1679, 1679, 1679, 1683, 1683,
+     1683, 1645,  396,  395, 1669, 1623, 1623, 1623,  396, 1677,
+      395,  394, 1680,  393, 1940, 1684,  956, 1688, 1688, 1688,
+     1940, 1940, 1624,  956, 1685, 1685, 1685, 1940, 1686, 1940,
+     1940, 1687, 1630, 1630, 1630, 1678, 1940, 1940, 1681, 1693,
+     1693, 1693,  956, 1694, 1940, 1940, 1695, 1940, 1940, 1631,
+
+     1632, 1632, 1632, 1940, 1633, 1940, 1940, 1634,  728,  728,
+      728, 1646, 1646, 1646, 1940, 1647, 1940, 1940, 1648, 1705,
+     1705, 1705, 1940, 1654, 1654, 1654,  730, 1655, 1940, 1940,
+     1656, 1707, 1707, 1707, 1940, 1940, 1706, 1668, 1668, 1668,
+     1676, 1676, 1676, 1723, 1723, 1723, 1940, 1724, 1708, 1940,
+     1725, 1940, 1940, 1940, 1940, 1669, 1940, 1677, 1679, 1679,
+     1679, 1940, 1727, 1727, 1727, 1940, 1728, 1940, 1940, 1729,
+     1700, 1940, 1940, 1940, 1940, 1680, 1683, 1683, 1683, 1732,
+     1732, 1732, 1940, 1733, 1940, 1940, 1734, 1940, 1940, 1688,
+     1688, 1688, 1940, 1684,  956, 1940, 1940,  956, 1940, 1685,
+
+     1685, 1685, 1940, 1686, 1940, 1940, 1687, 1693, 1693, 1693,
+     1940, 1694, 1940, 1940, 1695, 1940, 1726,  956, 1705, 1705,
+     1705, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1745, 1745,
+     1745, 1940, 1707, 1707, 1707, 1706, 1730,  954,  954,  954,
+      954,  954,  954,  954,  954,  954, 1746, 1940,  954, 1708,
+     1940, 1940, 1940,  954,  954,  954,  956,  954, 1751, 1751,
+     1751, 1940, 1752, 1940, 1940, 1753, 1754, 1754, 1754, 1940,
+     1755, 1940, 1940, 1756, 1940, 1940, 1940, 1940, 1940,  954,
+      954,  954,  954,  954,  954,  954,  954,  954,  954,  954,
+     1940, 1940,  954, 1940, 1940, 1940, 1940,  954,  954,  954,
+
+      956,  954, 1723, 1723, 1723, 1940, 1724, 1940, 1940, 1725,
+     1727, 1727, 1727, 1940, 1728, 1940, 1940, 1729, 1940, 1940,
+     1940, 1940, 1940,  954,  954, 1940, 1769, 1732, 1732, 1732,
+     1940, 1733, 1940, 1940, 1734, 1940, 1745, 1745, 1745, 1751,
+     1751, 1751, 1940, 1752, 1940,  956, 1753, 1940, 1754, 1754,
+     1754, 1940, 1755, 1940, 1746, 1756, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1770,  954,  954,  954,  954,  954, 1777,  954,  954,  954,
+     1940, 1940,  954, 1940, 1804, 1804, 1804,  954,  954,  954,
+      956,  954, 1809, 1809, 1809, 1811, 1811, 1811, 1940, 1940,
+
+     1940, 1940,  956,  957, 1940, 1940, 1824, 1824, 1824, 1810,
+     1940, 1940, 1812,  954,  954,  954,  954,  954,  954,  954,
+      954,  954,  954, 1777,  663, 1798,  954, 1940, 1799, 1940,
+     1940,  954,  954,  954,  956,  954, 1813, 1813, 1813, 1816,
+     1816, 1816, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1804,
+     1804, 1804, 1940, 1814, 1940, 1940, 1817,  954,  954, 1940,
+     1940, 1940, 1940, 1809, 1809, 1809, 1940,  956, 1830, 1830,
+     1830, 1940, 1831, 1940, 1940, 1832, 1894, 1894, 1894, 1815,
+     1810, 1811, 1811, 1811, 1833, 1833, 1833, 1940, 1834, 1940,
+     1940, 1835, 1940, 1822,  663, 1940, 1823, 1056, 1812, 1813,
+
+     1813, 1813, 1836, 1836, 1836, 1940, 1837, 1940, 1940, 1838,
+     1816, 1816, 1816, 1840, 1840, 1840, 1814, 1841, 1940, 1940,
+     1842, 1940, 1940, 1940, 1940, 1940, 1940, 1817, 1940, 1824,
+     1824, 1824, 1830, 1830, 1830, 1940, 1831, 1940, 1940, 1832,
+     1940, 1940, 1833, 1833, 1833, 1940, 1834,  663, 1940, 1835,
+     1836, 1836, 1836, 1940, 1837, 1940, 1940, 1838, 1940, 1840,
+     1840, 1840, 1940, 1841, 1847, 1849, 1842, 1848, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+
+     1940, 1875, 1875, 1875, 1940, 1940, 1940, 1940, 1940, 1940,
+     1875, 1875, 1875, 1940, 1940, 1940, 1940, 1940, 1876, 1940,
+     1940, 1940, 1940, 1940, 1940, 1856, 1940, 1876, 1857, 1940,
+     1940, 1872, 1940, 1884, 1884, 1884, 1864, 1885, 1940, 1865,
+     1886, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1873,
+     1940, 1940, 1881, 1940, 1940, 1882, 1940, 1940, 1940, 1940,
+     1940, 1940, 1884, 1884, 1884, 1940, 1885, 1940, 1940, 1886,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1894, 1894, 1894, 1940, 1897, 1940, 1940, 1898,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+
+      663, 1889, 1940, 1940, 1890, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1892, 1940, 1940, 1893, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1895, 1940, 1896,
+     1911, 1911, 1911, 1940, 1940, 1899, 1940, 1940, 1913, 1913,
+     1913, 1940, 1940, 1900, 1911, 1911, 1911, 1912, 1940, 1913,
+     1913, 1913, 1940, 1904, 1903, 1914, 1940, 1940, 1917, 1917,
+     1917, 1912, 1918, 1907, 1940, 1919, 1914, 1920, 1920, 1920,
+     1940, 1921, 1940, 1940, 1922, 1917, 1917, 1917, 1940, 1918,
+     1940, 1940, 1919, 1908, 1920, 1920, 1920, 1940, 1921, 1940,
+
+     1940, 1922, 1938, 1938, 1938, 1938, 1938, 1938, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1939, 1940, 1940, 1939,  144,  144,  144,  144,  144,  144,
+      144,  144,  144,  145,  145,  145,  145,  145,  145,  145,
+      145,  145,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  153,  153,  153,  153,  153,  153,  153,  153,  153,
+      156,  156,  156,  156,  156,  156,  156,  156,  156,  159,
+      159,  159,  159,  159,  159,  159,  159,  159,  166,  166,
+      166,  166,  166,  166,  166,  166,  166,  174,  174,  174,
+      174,  174,  174,  174,  174,  174,  179,  179,  179,  179,
+
+      179,  179,  179,  179,  179,  189,  189,  189,  189,  189,
+      189,  189,  189,  189,  193,  193,  193,  193,  193,  193,
+      193,  193,  193,  199,  199,  199,  199,  199,  199,  199,
+      199,  199,  210,  210,  210,  210,  210,  210,  210,  210,
+      210,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      225,  225,  225,  225,  225,  225,  225,  225,  225,  232,
+      232,  232,  232,  232,  232,  232,  232,  232,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  245,  245,  245,
+      245,  245,  245,  245,  245,  245,  251,  251,  251,  251,
+      251,  251,  251,  251,  251,  257,  257,  257,  257,  257,
+
+      257,  257,  257,  257,  263,  263,  263,  263,  263,  263,
+      263,  263,  263,  271,  271,  271,  271,  271,  271,  271,
+      271,  271,  278,  278,  278,  278,  278,  278,  278,  278,
+      278,  283,  283,  283,  283,  283,  283,  283,  283,  283,
+      298,  298,  298,  298,  298,  298,  298,  298,  298,  304,
+      304,  304,  304,  304,  304,  304,  304,  304,  308,  308,
+      308,  308,  308,  308,  308,  308,  308,  314,  314,  314,
+      314,  314,  314,  314,  314,  314,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  328,  328,  328,  328,  328,
+      328,  328,  328,  328,  335,  335,  335,  335,  335,  335,
+
+      335,  335,  335,  342,  342,  342,  342,  342,  342,  342,
+      342,  342,  349,  349,  349,  349,  349,  349,  349,  349,
+      349,  356,  356,  356,  356,  356,  356,  356,  356,  356,
+      360,  360,  360,  360,  360,  360,  360,  360,  360,  366,
+      366,  366,  366,  366,  366,  366,  366,  366,  373,  373,
+      373,  373,  373,  373,  373,  373,  373,  381,  381,  381,
+      381,  381,  381,  381,  381,  381,  385,  385,  385,  385,
+      385,  385,  385,  385,  385,  405,  405,  405, 1940, 1940,
+     1940,  405,  422,  422,  422, 1940, 1940, 1940,  422,  426,
+      426,  426, 1940, 1940, 1940,  426,  434,  434,  434, 1940,
+
+     1940, 1940,  434,  444,  444,  444, 1940, 1940, 1940,  444,
+      451,  451,  451, 1940, 1940, 1940,  451,  458,  458,  458,
+     1940, 1940, 1940,  458,  462,  462,  462, 1940, 1940, 1940,
+      462,  471,  471,  471, 1940, 1940, 1940,  471,  476,  476,
+      476, 1940, 1940, 1940,  476,  487,  487,  487, 1940, 1940,
+     1940,  487,  491,  491,  491, 1940, 1940, 1940,  491,  499,
+      499,  499, 1940, 1940, 1940,  499,  507,  507,  507, 1940,
+     1940, 1940,  507,  514,  514,  514, 1940, 1940, 1940,  514,
+      518,  518,  518, 1940, 1940, 1940,  518,  526,  526,  526,
+     1940, 1940, 1940,  526,  529,  529,  529,  529,  529,  529,
+
+      529, 1940,  529,  545, 1940, 1940, 1940,  545,  561, 1940,
+     1940, 1940,  561,  568, 1940, 1940, 1940,  568,  578, 1940,
+     1940, 1940,  578,  585, 1940, 1940, 1940,  585,  592, 1940,
+     1940, 1940,  592,  595, 1940, 1940, 1940,  595,  604, 1940,
+     1940, 1940,  604,  609, 1940, 1940, 1940,  609,  621, 1940,
+     1940, 1940,  621,  625, 1940, 1940, 1940,  625,  491,  491,
+      491, 1940, 1940, 1940,  491,  633, 1940, 1940, 1940,  633,
+      499,  499,  499, 1940, 1940, 1940,  499,  640, 1940, 1940,
+     1940,  640,  507,  507,  507, 1940, 1940, 1940,  507,  646,
+     1940, 1940, 1940,  646,  514,  514,  514, 1940, 1940, 1940,
+
+      514,  650, 1940, 1940, 1940,  650,  518,  518,  518, 1940,
+     1940, 1940,  518,  656, 1940, 1940, 1940,  656,  526,  526,
+      526, 1940, 1940, 1940,  526,  660, 1940, 1940, 1940,  660,
+      662,  662,  662,  662,  662,  662,  662,  662,  662,  668,
+     1940, 1940, 1940, 1940,  668,  405,  405,  405, 1940, 1940,
+     1940,  405,  678,  678,  678,  678, 1940, 1940,  678,  678,
+      422,  422,  422, 1940, 1940, 1940,  422,  696,  696,  696,
+      696, 1940, 1940,  696,  696,  426,  426,  426, 1940, 1940,
+     1940,  426,  706,  706,  706,  706, 1940, 1940,  706,  706,
+      434,  434,  434, 1940, 1940, 1940,  434,  720,  720,  720,
+
+      720, 1940, 1940,  720,  720,  444,  444,  444, 1940, 1940,
+     1940,  444,  729,  729,  729,  729, 1940, 1940,  729,  729,
+      451,  451,  451, 1940, 1940, 1940,  451,  739,  739,  739,
+      739, 1940, 1940,  739,  739,  458,  458,  458, 1940, 1940,
+     1940,  458,  744,  744,  744,  744, 1940, 1940,  744,  744,
+      462,  462,  462, 1940, 1940, 1940,  462,  756,  756,  756,
+      756, 1940, 1940,  756,  756,  471,  471,  471, 1940, 1940,
+     1940,  471,  764,  764,  764,  764, 1940, 1940,  764,  764,
+      476,  476,  476, 1940, 1940, 1940,  476,  782,  782,  782,
+      782, 1940, 1940,  782,  782,  789,  789,  789,  789, 1940,
+
+     1940,  789,  789,  491,  491,  491, 1940, 1940, 1940,  491,
+      800,  800,  800,  800, 1940, 1940,  800,  800,  499,  499,
+      499, 1940, 1940, 1940,  499,  811,  811,  811,  811, 1940,
+     1940,  811,  811,  507,  507,  507, 1940, 1940, 1940,  507,
+      821,  821,  821,  821, 1940, 1940,  821,  821,  828,  828,
+      828,  828, 1940, 1940,  828,  828,  518,  518,  518, 1940,
+     1940, 1940,  518,  836,  836,  836,  836, 1940, 1940,  836,
+      836,  526,  526,  526, 1940, 1940, 1940,  526,  842,  842,
+      842,  842, 1940, 1940,  842,  842,  662,  662,  662,  662,
+      662,  662,  662,  662,  662,  668, 1940,  668, 1940, 1940,
+
+      668,  405,  405,  405, 1940, 1940, 1940,  405,  678,  678,
+      678,  678, 1940, 1940,  678,  678,  422,  422,  422,  422,
+     1940,  422, 1940,  422,  696,  696,  696,  696, 1940, 1940,
+      696,  696,  426,  426,  426,  426, 1940,  426, 1940,  426,
+      706,  706,  706,  706, 1940, 1940,  706,  706,  434,  434,
+      434, 1940, 1940, 1940,  434,  720,  720,  720,  720, 1940,
+     1940,  720,  720,  444,  444,  444, 1940, 1940, 1940,  444,
+      729,  729,  729,  729, 1940, 1940,  729,  729,  451,  451,
+      451, 1940, 1940, 1940,  451,  739,  739,  739,  739, 1940,
+     1940,  739,  739,  458,  458,  458, 1940, 1940, 1940,  458,
+
+      744,  744,  744,  744, 1940, 1940,  744,  744,  462,  462,
+      462, 1940, 1940, 1940,  462,  756,  756,  756,  756, 1940,
+     1940,  756,  756,  471,  471,  471, 1940, 1940, 1940,  471,
+      764,  764,  764,  764, 1940, 1940,  764,  764,  476,  476,
+      476, 1940, 1940, 1940,  476,  782,  782,  782,  782, 1940,
+     1940,  782,  782,  789,  789,  789,  789, 1940, 1940,  789,
+      789,  491,  491,  491, 1940, 1940, 1940,  491,  800,  800,
+      800,  800, 1940, 1940,  800,  800,  499,  499,  499, 1940,
+     1940, 1940,  499,  811,  811,  811,  811, 1940, 1940,  811,
+      811,  507,  507,  507, 1940, 1940, 1940,  507,  821,  821,
+
+      821,  821, 1940, 1940,  821,  821,  828,  828,  828,  828,
+     1940, 1940,  828,  828,  518,  518,  518, 1940, 1940, 1940,
+      518,  836,  836,  836,  836, 1940, 1940,  836,  836,  526,
+      526,  526, 1940, 1940, 1940,  526,  842,  842,  842,  842,
+     1940, 1940,  842,  842,  662,  662,  662,  662,  662,  662,
+      662,  662,  662,  954,  954,  954,  954,  954,  954,  954,
+      954,  954,  405,  405,  405, 1940, 1940, 1940,  405,  678,
+      678,  678,  678, 1940, 1940,  678,  678,  696,  696,  696,
+      696, 1940, 1940,  696,  696,  426,  426,  426, 1940, 1940,
+     1940,  426,  706,  706,  706,  706, 1940, 1940,  706,  706,
+
+      434,  434,  434, 1940, 1940, 1940,  434,  720,  720,  720,
+      720, 1940, 1940,  720,  720,  444,  444,  444, 1940, 1940,
+     1940,  444,  729,  729,  729,  729, 1940, 1940,  729,  729,
+      451,  451,  451, 1940, 1940, 1940,  451,  739,  739,  739,
+      739, 1940, 1940,  739,  739,  458,  458,  458, 1940, 1940,
+     1940,  458,  744,  744,  744,  744, 1940, 1940,  744,  744,
+      462,  462,  462, 1940, 1940, 1940,  462,  756,  756,  756,
+      756, 1940, 1940,  756,  756,  471,  471,  471,  471, 1940,
+      471, 1940,  471,  764,  764,  764,  764, 1940, 1940,  764,
+      764,  476,  476,  476,  476, 1940,  476, 1940,  476,  782,
+
+      782,  782,  782, 1940, 1940,  782,  782,  789,  789,  789,
+      789, 1940, 1940,  789,  789,  491,  491,  491, 1940, 1940,
+     1940,  491,  800,  800,  800,  800, 1940, 1940,  800,  800,
+      499,  499,  499, 1940, 1940, 1940,  499,  811,  811,  811,
+      811, 1940, 1940,  811,  811,  507,  507,  507, 1940, 1940,
+     1940,  507,  821,  821,  821,  821, 1940, 1940,  821,  821,
+      828,  828,  828,  828, 1940, 1940,  828,  828,  518,  518,
+      518, 1940, 1940, 1940,  518,  836,  836,  836,  836, 1940,
+     1940,  836,  836,  526,  526,  526,  526, 1940,  526, 1940,
+      526,  842,  842,  842,  842, 1940, 1940,  842,  842,  662,
+
+      662,  662,  662,  662,  662,  662,  662,  662,  954,  954,
+      954,  954,  954,  954,  954,  954,  954,  405,  405,  405,
+     1940, 1940, 1940,  405,  678,  678,  678,  678, 1940, 1940,
+      678,  678,  696,  696,  696,  696, 1940, 1940,  696,  696,
+      426,  426,  426, 1940, 1940, 1940,  426,  706,  706,  706,
+      706, 1940, 1940,  706,  706,  434,  434,  434, 1940, 1940,
+     1940,  434,  720,  720,  720,  720, 1940, 1940,  720,  720,
+      444,  444,  444, 1940, 1940, 1940,  444,  729,  729,  729,
+      729, 1940, 1940,  729,  729,  451,  451,  451,  451, 1940,
+      451, 1940,  451,  458,  458,  458,  458, 1940,  458, 1940,
+
+      458,  744,  744,  744,  744, 1940, 1940,  744,  744,  462,
+      462,  462, 1940, 1940, 1940,  462,  756,  756,  756,  756,
+     1940, 1940,  756,  756,  764,  764,  764,  764, 1940, 1940,
+      764,  764,  476,  476,  476,  476, 1940,  476, 1940,  476,
+      782,  782,  782,  782, 1940, 1940,  782,  782,  789,  789,
+      789,  789, 1940, 1940,  789,  789,  491,  491,  491, 1940,
+     1940, 1940,  491,  800,  800,  800,  800, 1940, 1940,  800,
+      800,  499,  499,  499,  499, 1940,  499, 1940,  499,  811,
+      811,  811,  811, 1940, 1940,  811,  811,  507,  507,  507,
+      507, 1940,  507, 1940,  507,  821,  821,  821,  821, 1940,
+
+     1940,  821,  821,  828,  828,  828,  828, 1940, 1940,  828,
+      828,  518,  518,  518, 1940, 1940, 1940,  518,  836,  836,
+      836,  836, 1940, 1940,  836,  836,  842,  842,  842,  842,
+     1940, 1940,  842,  842,  662,  662,  662,  662,  662,  662,
+      662,  662,  662,  954,  954,  954,  954,  954,  954,  954,
+      954,  954,  405,  405,  405,  405, 1940,  405, 1940,  405,
+      678,  678,  678,  678, 1940, 1940,  678,  678,  696,  696,
+      696,  696, 1940, 1940,  696,  696,  426,  426,  426, 1940,
+     1940, 1940,  426,  706,  706,  706,  706, 1940, 1940,  706,
+      706,  434,  434,  434, 1940, 1940, 1940,  434,  720,  720,
+
+      720,  720, 1940, 1940,  720,  720,  444,  444,  444, 1940,
+     1940, 1940,  444,  729,  729,  729,  729, 1940, 1940,  729,
+      729,  451,  451,  451,  451, 1940,  451, 1940,  451,  744,
+      744,  744,  744, 1940, 1940,  744,  744,  462,  462,  462,
+     1940, 1940, 1940,  462, 1735, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+     1736, 1736, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772,
+     1772, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775,
+     1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1803,
+     1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803,  143, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940
     } ;
 
     } ;
 
-static yyconst flex_int16_t yy_chk[3607] =
+static yyconst flex_int16_t yy_chk[7169] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
-        6,    6,    6,    9,    0,    3,   10,   11,    4,   12,
-        9,    5,  993,   10,    6,    7,    7,    7,    8,    8,
-        8,   13,   13,   11,  993,   12,   13,   13,  263,    7,
-       14,   14,    8,  255,   13,   14,   14,   15,   15,  159,
-       15,  104,   15,   14,   16,   16,  255,   16,  159,   16,
-       15,   17,   17,   18,   18,  104,  105,   16,   19,   19,
-       19,   20,   20,   20,   23,   23,   23,   24,   24,   24,
-      105,  108,   19,  131,  279,   20,  264,  263,   23,  264,
-      279,   24,  102,  102,  102,  108,   17,  131,   18,   21,
-
+        6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
+        4,   10, 1449,    5, 1450,    9,    6,  389,   10,    7,
+        8,    8,    8,  148,   11,   13,   13,   12,   14,   14,
+       13,   13,  389,   14,   14,  149,    8,   17,   17,  148,
+       13,   15,   15,   14,   15,  152,   15,   16,   16,  962,
+       16,  149,   16,   18,   18,  962,   15,   19,   19,   19,
+      292,  152,   16,   20,   20,   20,   23,   23,   23,   24,
+       24,   24,  267,   19,   25,   25,   25,  333,   17,   20,
+      292,  267,   23, 1161,  333,   24,  146,  146,  146, 1161,
+
+       25,  147,  147,  147,   18,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,  828,   21,   21,   21,   21,   21,   25,   25,
-       25,  346,  198,   26,   26,   26,   27,   27,   27,   28,
-       28,   28,   25,  198,  346,   21,   21,   26,  284,  349,
-       27,  349,  828,   28,  284,   29,   29,   29,  103,  103,
-      103,  107,  107,  107,  128,  128,  128,  537,   21,   29,
-       21,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22,   22,  537,   22,   22,   22,   22,   22,
-       30,   30,   30, 1122,  905,   31,   31,   31,   32,   32,
-       32,   33,   33,   33,   30,  301,  431,   22,   22,   31,
-
-      431,  301,   32,  939,  939,   33,  905,   34,   34,   34,
-       35,   35,   35,   36,   36,   36,  136,  136,  136,  609,
-       22,   34,   22,  600,   35,  609, 1121,   36,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,  600,   37,   37,   37,   37,   37,   39,   39,   39,
-      452,  457,   40,   40,   40,   43,   43,   43,  143,  143,
-      143,   39,  452,  457,   37,   37,   40, 1011, 1011,   43,
-      670, 1119,   37,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,   38,   38,   38,   38, 1118,   38,   38,   38,
-       38,   38,   44,   44,   44,  478,  670,   45,   45,   45,
-
-       46,   46,   46,  150,  150,  150,   44,  478,  752,   38,
-       38,   45, 1119,  752,   46, 1117,  731,   38,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,  732,   41,   41,   41,   41,   41,   47,   47,   47,
-      731, 1114,   48,   48,   48,   49,   49,   49,   50,   50,
-       50,   47,  146,  151,   41,   41,   48,   41,  156,   49,
-      151, 1113,   50,  669,  730,   41,  146,  151,   41,  732,
-      730,   41,  156,  827,   41,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,   42,   42,   42,   42,  778,   42,
-       42,   42,   42,   42,   53,   53,   53,  669,  827,   54,
-
-       54,   54,   57,   57,   57,   58,   58,   58,   53,  172,
-      178,   42,   42,   54,   42,  183,   57,  178, 1010,   58,
-      777,  753,   42,  172,  178,   42,  753,  778,   42,  183,
-     1010,   42,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,  869,   51,   51,   51,   51,
-       51,   61,   61,   61, 1084,  777,   62,   62,   62,   63,
-       63,   63,   64,   64,   64,   61,  126,  761,   51,   51,
-       62, 1084,  761,   63,  930,  870,   64,  869, 1111,   51,
-      126,  153,  153,  153,  164,  164,  164,  169,  169,  169,
-     1133,   51,   52,   52,   52,   52,   52,   52,   52,   52,
-
-       52,   52,   52,   52,   52,  870,   52,   52,   52,   52,
-       52,   65,   65,   65,  930,  126,   66,   66,   66,   67,
-       67,   67,   68,   68,   68,   65,  762, 1101,   52,   52,
-       66,  762, 1067,   67, 1133,  193,   68,  931, 1101,   52,
-      177,  177,  177,  180,  180,  180,  187,  187,  187,  193,
-     1067,   52,   55,   55,   55,   55,   55,   55,   55,   55,
-       55,   55,   55,   55,   55,  931,   55,   55,   55,   55,
-       55,   71,   71,   71, 1110, 1076,   72,   72,   72,   73,
-       73,   73,   74,   74,   74,   71,  947,  871,   55,   55,
-       72, 1076, 1092,   73, 1108, 1134,   74, 1107, 1092,   55,
-
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  947,   56,   56,   56,   56,   56,   75,
-       75,   75,  871,  991,   76,   76,   76,   77,   77,   77,
-       78,   78,   78,   75,  994,  969,   56,   56,   76, 1134,
-     1100,   77, 1120,  994,   78, 1099, 1097,   56,   59,   59,
+     1451,   21,   21,   21,   21,   21,   26,   26,   26,   27,
+       27,   27,  320,   28,   28,   28,   29,   29,   29,   30,
+       30,   30,   26,  320, 1452,   27,  175,   21,   21,   28,
+     1056,  295,   29,  190,  295,   30,  151,  151,  151,  172,
+      172,  172,  175,  180,  180,  180,  187,  187,  187,  190,
+       21, 1345,   21,   22,   22,   22,   22,   22,   22,   22,
+       22,   22,   22,   22,   22,   22,   22,   22, 1056,   22,
+       22,   22,   22,   22,   31,   31,   31,   32,   32,   32,
+
+     1345,   33,   33,   33,   34,   34,   34,   35,   35,   35,
+       31,  415,  185,   32,  170,   22,   22,   33,  665,  185,
+       34,  200,  665,   35,  415,   36,   36,   36,  185, 1162,
+      170,  194,  194,  194,  197,  197,  197,  200,   22, 1163,
+       22,   36,   37,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   37, 1162,   37,   37,
+       37,   37,   37,   39,   39,   39,   40,   40,   40,  170,
+       47,   47,   47,   43,   43,   44,   44, 1453,   43,   39,
+       44, 1163,   40,  215,   37,   37,   47,  215,   43,  845,
+       44,  215,   37,   38,   38,   38,   38,   38,   38,   38,
+
+       38,   38,   38,   38,   38,   38,   38,   38,  845,   38,
+       38,   38,   38,   38,   43,  211,   44,   48,   48,   48,
+      953,   49,   49,   49,   50,   50,   50,  208,  208,  208,
+      611,  211, 1258,   48, 1455,   38,   38,   49,  398,  611,
+       50,  398,  953,   38,   41,   41,   41,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,   41,   41,   41, 1456,
+       41,   41,   41,   41,   41,   51,   51,   51,   52,   52,
+       52, 1258,   53,   53,   53,   54,   54,   54,  218,  218,
+      218,   51,  195,  205,   52,  219,   41,   41,   53,  195,
+      205,   54,  219, 1214,   41, 1215, 1457,   41,  195,  205,
+
+     1214,  219, 1215,   41,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42,   42,   42,  430,
+       42,   42,   42,   42,   42,   57,   57,   57,   58,   58,
+       58, 1465,   61,   61,   61,   62,   62,   62,  531,  226,
+      219,   57,  221,  420,   58, 1346,   42,   42,   61,  221,
+     1466,   62,  430,  531,   42,  226,  420,   42,  221,  223,
+      223,  223, 1259,   42,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1346,
+       45,   45,   45,   45,   45,   65,   65,   65,   66,   66,
+       66, 1467,   67,   67,   67,   68,   68,   68,   69,   69,
+
+       69,   65,  234,  239,   66, 1259,   45,   45,   67,  234,
+     1282,   68, 1057, 1282,   69,   45, 1472,   45,  234,  239,
+       45,  233,  233,  233, 1239, 1239,   45,   46,   46,   46,
+       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
+       46,   46, 1057,   46,   46,   46,   46,   46,   70,   70,
+       70,   73,   73,   73, 1473,   74,   74,   74,   75,   75,
+       75,   76,   76,   76,   70,  247,  220,   73,  252,   46,
+       46,   74,  247, 1438,   75, 1240, 1240,   76,   46, 1474,
+       46,  247,  220,   46,  252, 1438,  162, 1245, 1245,   46,
+       55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
+
+       55,   55,   55,   55,   55, 1475,   55,   55,   55,   55,
+       55,   77,   77,   77,   78,   78,   78, 1427,   79,   79,
+       79,  220,   80,   80,   80,  162, 1476,   77, 1246, 1246,
+       78,  162,   55,   55,   79,  162,  264,   55,   80,   55,
+      162,  236,  236,  236,   55,  246,  246,  246,  249,  249,
+      249, 1427,  264,   55,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,  279,
+       56,   56,   56,   56,   56,   83,   83,   83,   84,   84,
+       84, 1477,   87,   87,   87,  279,   88,   88,   88, 1482,
+     1483,   83, 1235,  259,   84, 1439,   56,   56,   87, 1235,
+
+      259,   56,   88,   56,  258,  258,  258, 1439,   56,  259,
+      261,  261,  261,  272,  272,  272, 1484,   56,   59,   59,
        59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
        59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,  991,   59,   59,   59,   59,   59,   81,   81,   81,
-      969, 1143,   82,   82,   82,   85,   85,   85,   86,   86,
-       86,   81,  207, 1120,   59,   59,   82,  188,   59,   85,
-     1123, 1095,   86,  906,  188,   59,  207,   59,  190,  190,
-
-      190,  188, 1124, 1143,   59,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   60,   60,   60, 1009,   60,
-       60,   60,   60,   60,   87,   87,   87,  906, 1123,   88,
-       88,   88,   89,   89,   89,   90,   90,   90,   87,  221,
-     1124,   60,   60,   88, 1091,   60,   89, 1090, 1127,   90,
-      907, 1009,   60,  221,   60,  200,  200,  200,  204,  204,
-      204,   60,   69,   69,   69,   69,   69,   69,   69,   69,
-       69,   69,   69,   69,   69, 1127,   69,   69,   69,   69,
-       69,   91,   91,   91,  907, 1153,   92,   92,   92,   95,
-       95,   95,   96,   96,   96,   91,  231, 1153,   69,   69,
-
-       92, 1145, 1089,   95,   69, 1128,   96, 1088, 1145,   69,
-      231,  118,  213,  213,  213,  218,  218,  218,   69,   70,
-       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
-       70,   70, 1128,   70,   70,   70,   70,   70,   97,   97,
-      225,  225,  225,   97,  118, 1146,  226,  228,  228,  228,
-      118,   97, 1146,  226,  118,   70,   70,  246,  251,  118,
-      226,   70,  238,  238,  238,  251,   70,  243,  243,  243,
-     1087,  246,  251,   97, 1086,   70,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,   79, 1083,
-       79,   79,   79,   79,   79,  250,  250,  250,  254,  254,
-
-      254, 1082,   98,   98,  295,  295,  295,   98,  548,  548,
-      548, 1081,   79,   79, 1144,   98,  553,  553,  553,  295,
-      555,  555,  555,   79,   80,   80,   80,   80,   80,   80,
-       80,   80,   80,   80,   80,   80,   80,   98,   80,   80,
-       80,   80,   80,  304,  304,  304, 1144,  309,  309,  309,
-      137,  314,  314,  314,  328,  328,  328,  137,  304, 1005,
-       80,   80,  309, 1080,  137, 1079,  314, 1115, 1005,  328,
-     1149,   80,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,  137,   83,   83,   83,   83,
-       83, 1006,  137,  137, 1078,  137,  360,  360,  360,  137,
-
-     1006,  137, 1013,  361,  361,  361, 1115,  138,   83,   83,
-     1149, 1013,  360, 1077,  138, 1141,   83, 1150,   83,  361,
-       83,  138,  571,  571,  571,  612,  612,  612,   83,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,  138,   84,   84,   84,   84,   84, 1141,  138,
-      138,  361,  138,  377,  377,  377,  138, 1150,  138, 1147,
-      378,  378,  378, 1075,  139,   84,   84, 1074, 1073,  377,
-      550,  550,  550,   84, 1072,   84,  378,   84,  139,  614,
-      614,  614,  550, 1148, 1147,   84,   93,   93,   93,   93,
-       93,   93,   93,   93,   93,   93,   93,   93,   93,  139,
-
-       93,   93,   93,   93,   93, 1151,  139,  139, 1148,  139,
-      378, 1152, 1071,  139,  668,  139,  380,  380,  380,  386,
-      386,  386,   93,   93,  140,  381,  381,  381,  668,  381,
-     1151,  380,  381, 1070, 1069,  386, 1152, 1142,  140,  618,
-      618,  618,  620,  620,  620,   93,   94,   94,   94,   94,
-       94,   94,   94,   94,   94,   94,   94,   94,   94,  140,
-       94,   94,   94,   94,   94,  141,  140,  140, 1066,  140,
-     1142, 1154,  141,  140, 1065,  140,  856,  165, 1116,  141,
-     1154, 1064,   94,   94,  165,  390,  390,  390,  166,  390,
-      856,  165,  390, 1063,  389,  389,  389, 1062, 1061,  167,
-
-      141, 1057,  166, 1047, 1045,   94,  167,  141,  141,  389,
-      141,  201,  165,  167,  141, 1044,  141, 1116,  201,  165,
-      165, 1043,  165,  166,  215,  201,  165, 1042,  165,  202,
-      166,  166, 1041,  166,  167, 1040,  202,  166,  215,  166,
-     1037,  167,  167,  202,  167, 1029,  201, 1028,  167, 1027,
-      167,  214, 1025,  201,  201, 1024,  201, 1023,  214,  215,
-      201, 1022,  201,  216,  202,  214,  215,  215, 1021,  215,
-      216,  202,  202,  215,  202,  215,  239,  216,  202, 1020,
-      202,  240, 1014,  239, 1012, 1008,  214,  556,  556,  556,
-      239, 1007, 1000,  214,  214,  240,  214,  999,  216,  556,
-
-      214,  998,  214,  241,  997,  216,  216,  990,  216,  986,
-      241,  239,  216,  978,  216,  977,  240,  241,  239,  239,
-      976,  239,  975,  240,  240,  239,  240,  239,  968,  965,
-      240,  957,  240,  387,  387,  387,  956,  955,  241,  392,
-      392,  392,  393,  393,  393,  241,  241,  954,  241,  387,
-      944,  941,  241,  940,  241,  392,  938,  926,  393,  394,
-      394,  394,  395,  395,  395,  925,  395,  921,  919,  395,
-      396,  396,  396,  915,  394,  397,  397,  397,  399,  399,
-      399,  400,  400,  400,  387,  400,  396,  914,  400,  895,
-      894,  397,  889,  399,  888,  887,  393,  404,  404,  404,
-
-      405,  405,  405,  406,  406,  406,  408,  408,  408,  409,
-      409,  409,  879,  404,  878,  877,  405,  853,  406,  851,
-      850,  408,  410,  410,  410,  409,  397,  412,  412,  412,
-      413,  413,  413,  849,  413,  848,  843,  413,  410,  414,
-      414,  414,  412,  415,  415,  415,  405,  420,  420,  420,
-      421,  421,  421,  841,  840,  414,  424,  424,  424,  415,
-      425,  425,  425,  420,  839,  838,  421,  443,  443,  443,
-      831,  821,  424,  410,  815,  814,  425,  444,  444,  444,
-      446,  446,  446,  443,  461,  461,  461,  813,  812,  415,
-      462,  462,  462,  444,  811,  810,  446,  809,  808,  461,
-
-      463,  463,  463,  801,  421,  800,  462,  465,  465,  465,
-      474,  474,  474,  799,  425,  798,  463,  797,  446,  796,
-      467,  467,  467,  465,  467,  795,  474,  467,  475,  475,
-      475,  794,  477,  477,  477,  479,  479,  479,  784,  479,
-      783,  775,  479,  773,  475,  771,  770,  465,  477,  483,
-      483,  483,  484,  484,  484,  486,  486,  486,  767,  487,
-      487,  487,  764,  487,  763,  483,  487,  760,  484,  759,
-      756,  486,  490,  490,  490,  491,  491,  491,  493,  493,
-      493,  754,  495,  495,  495,  751,  495,  477,  490,  495,
-      750,  491,  749,  742,  493,  501,  501,  501,  502,  502,
-
-      502,  504,  504,  504,  741,  739,  486,  505,  505,  505,
-      737,  501,  736,  733,  502,  729,  724,  504,  722,  506,
-      506,  506,  505,  506,  721,  720,  506,  508,  508,  508,
-      509,  509,  509,  718,  509,  493,  716,  509,  510,  510,
-      510,  713,  508,  511,  511,  511,  513,  513,  513,  712,
-      711,  504,  709,  707,  510,  698,  515,  515,  515,  511,
-      515,  697,  513,  515,  518,  518,  518,  519,  519,  519,
-      521,  521,  521,  523,  523,  523,  526,  526,  526,  696,
-      518,  691,  690,  519,  689,  687,  521,  685,  523,  527,
-      527,  527,  526,  529,  529,  529,  532,  532,  532,  533,
-
-      533,  533,  681,  513,  680,  527,  535,  535,  535,  529,
-      679,  678,  532,  677,  675,  533,  538,  538,  538,  674,
-      521,  672,  535,  546,  546,  546,  562,  562,  562,  564,
-      564,  564,  538,  538,  667,  663,  563,  563,  563,  546,
-      563,  562,  661,  563,  529,  564,  568,  568,  568,  660,
-      535,  569,  569,  569,  570,  570,  570,  572,  572,  572,
-      656,  568,  573,  573,  573,  654,  569,  574,  574,  574,
-      570,  652,  572,  650,  578,  578,  578,  564,  573,  546,
-      579,  579,  579,  574,  647,  587,  587,  587,  569,  578,
-      580,  580,  580,  646,  580,  645,  579,  580,  584,  584,
-
-      584,  587,  584,  638,  633,  584,  588,  588,  588,  632,
-      570,  578,  631,  625,  573,  589,  589,  589,  588,  591,
-      591,  591,  623,  574,  595,  595,  595,  579,  592,  592,
-      592,  589,  592,  617,  591,  592,  597,  597,  597,  616,
-      595,  587,  598,  598,  598,  602,  602,  602,  619,  619,
-      619,  597,  610,  610,  610,  621,  621,  621,  598,  615,
-      613,  602,  589,  611,  595,  622,  622,  622,  610,  624,
-      624,  624,  626,  626,  626,  627,  627,  627,  608,  627,
-      607,  604,  627,  601,  630,  630,  630,  602,  599,  634,
-      634,  634,  639,  639,  639,  610,  636,  636,  636,  598,
-
-      630,  596,  619,  602,  634,  635,  635,  635,  639,  635,
-      594,  636,  635,  637,  637,  637,  593,  637,  590,  622,
-      637,  583,  577,  624,  576,  575,  626,  640,  640,  640,
-      641,  641,  641,  642,  642,  642,  567,  642,  566,  565,
-      642,  630,  643,  643,  643,  641,  644,  644,  644,  648,
-      648,  648,  649,  649,  649,  561,  649,  560,  643,  649,
-      559,  558,  644,  557,  648,  651,  651,  651,  653,  653,
-      653,  655,  655,  655,  554,  657,  657,  657,  552,  657,
-      551,  651,  657,  655,  653,  549,  547,  655,  644,  662,
-      662,  662,  664,  664,  664,  665,  665,  665,  545,  665,
-
-      544,  543,  665,  542,  541,  662,  536,  664,  531,  530,
-      653,  666,  666,  666,  673,  673,  673,  676,  676,  676,
-      682,  682,  682,  683,  683,  683,  525,  666,  524,  673,
-      522,  662,  514,  676,  684,  684,  684,  686,  686,  686,
-      688,  688,  688,  692,  692,  692,  507,  692,  500,  499,
-      692,  695,  695,  695,  498,  695,  688,  494,  695,  482,
-      666,  699,  699,  699,  473,  701,  701,  701,  676,  701,
-      472,  471,  701,  704,  704,  704,  470,  699,  706,  706,
-      706,  688,  708,  708,  708,  466,  710,  710,  710,  704,
-      710,  460,  459,  710,  706,  458,  456,  708,  714,  714,
-
-      714,  717,  717,  717,  719,  719,  719,  723,  723,  723,
-      455,  725,  725,  725,  714,  725,  454,  717,  725,  708,
-      719,  453,  451,  723,  728,  728,  728,  734,  734,  734,
-      450,  449,  706,  448,  735,  735,  735,  447,  735,  442,
-      728,  735,  734,  441,  719,  738,  738,  738,  740,  740,
-      740,  743,  743,  743,  744,  744,  744,  745,  745,  745,
-      440,  738,  723,  746,  746,  746,  728,  747,  747,  747,
-      748,  748,  748,  755,  755,  755,  757,  757,  757,  439,
-      758,  758,  758,  436,  758,  435,  748,  758,  434,  755,
-      432,  757,  765,  765,  765,  768,  768,  768,  428,  738,
-
-      769,  769,  769,  772,  772,  772,  426,  423,  765,  422,
-      419,  768,  748,  418,  417,  769,  774,  774,  774,  772,
-      776,  776,  776,  779,  779,  779,  780,  780,  780,  416,
-      780,  411,  774,  780,  407,  403,  776,  785,  785,  785,
-      786,  786,  786,  787,  787,  787,  788,  788,  788,  402,
-      401,  768,  398,  785,  789,  789,  789,  391,  772,  790,
-      790,  790,  791,  791,  791,  388,  774,  792,  792,  792,
-      385,  793,  793,  793,  802,  802,  802,  804,  804,  804,
-      384,  805,  805,  805,  383,  805,  785,  793,  805,  382,
-      802,  379,  804,  816,  816,  816,  817,  817,  817,  376,
-
-      818,  818,  818,  819,  819,  819,  375,  819,  374,  373,
-      819,  372,  817,  371,  804,  818,  820,  820,  820,  822,
-      822,  822,  823,  823,  823,  824,  824,  824,  826,  826,
-      826,  820,  829,  829,  829,  822,  830,  830,  830,  370,
-      369,  824,  368,  367,  826,  366,  817,  832,  832,  832,
-      365,  830,  833,  833,  833,  834,  834,  834,  835,  835,
-      835,  364,  363,  832,  362,  359,  836,  836,  836,  845,
-      845,  845,  846,  846,  846,  358,  855,  855,  855,  357,
-      826,  824,  836,  355,  845,  354,  353,  846,  847,  847,
-      847,  855,  847,  352,  351,  847,  857,  857,  857,  858,
-
-      858,  858,  859,  859,  859,  347,  859,  345,  344,  859,
-      862,  862,  862,  343,  342,  858,  863,  863,  863,  341,
-      863,  340,  337,  863,  336,  862,  864,  864,  864,  865,
-      865,  865,  867,  867,  867,  868,  868,  868,  872,  872,
-      872,  864,  873,  873,  873,  865,  873,  335,  334,  873,
-      333,  868,  332,  872,  874,  874,  874,  875,  875,  875,
-      882,  882,  882,  883,  883,  883,  329,  883,  325,  874,
-      883,  324,  323,  875,  322,  882,  884,  884,  884,  321,
-      884,  318,  317,  884,  892,  892,  892,  893,  893,  893,
-      316,  893,  315,  313,  893,  896,  896,  896,  310,  892,
-
-      898,  898,  898,  306,  898,  305,  300,  898,  901,  901,
-      901,  896,  902,  902,  902,  299,  902,  298,  297,  902,
-      903,  903,  903,  901,  908,  908,  908,  296,  908,  294,
-      291,  908,  911,  911,  911,  290,  903,  912,  912,  912,
-      287,  912,  286,  285,  912,  283,  282,  911,  913,  913,
-      913,  916,  916,  916,  281,  916,  280,  278,  916,  920,
-      920,  920,  277,  913,  922,  922,  922,  276,  922,  275,
-      274,  922,  273,  272,  920,  927,  927,  927,  269,  927,
-      268,  267,  927,  266,  265,  913,  932,  932,  932,  933,
-      933,  933,  259,  933,  258,  256,  933,  936,  936,  936,
-
-      253,  932,  932,  937,  937,  937,  252,  937,  248,  244,
-      937,  236,  936,  942,  942,  942,  943,  943,  943,  235,
-      943,  234,  233,  943,  945,  945,  945,  229,  942,  946,
-      946,  946,  948,  948,  948,  949,  949,  949,  223,  945,
-      958,  958,  958,  219,  946,  211,  210,  948,  948,  209,
-      949,  949,  950,  950,  950,  958,  950,  205,  197,  950,
-      196,  945,  195,  951,  951,  951,  946,  951,  950,  191,
-      951,  959,  959,  959,  185,  959,  181,  175,  959,  962,
-      962,  962,  963,  963,  963,  964,  964,  964,  174,  964,
-      170,  162,  964,  161,  962,  160,  158,  963,  966,  966,
-
-      966,  967,  967,  967,  154,  967,  148,  144,  967,  970,
-      970,  970,  134,  966,  971,  971,  971,  133,  971,  129,
-      125,  971,  124,  123,  970,  970,  117,  972,  972,  972,
-      971,  972,  116,  114,  972,  111,   99,    0,  979,  979,
-      979,    0,    0,  972,  973,  973,  973,  973,  973,  973,
-      973,  973,  973,  979,    0,  973,    0,    0,  973,  973,
-      973,  973,  973,  980,  980,  980,    0,  980,    0,    0,
-      980,    0,    0,    0,    0,    0,  981,  981,  981,    0,
-      973,  973,  974,  974,  974,  974,  974,  974,  974,  974,
-      974,  981,    0,  974,    0,    0,  974,  974,  974,  974,
-
-      974,  982,  982,  982,    0,  982,    0,    0,  982,  983,
-      983,  983,    0,  983,    0,    0,  983,    0,  974,  974,
-      987,  987,  987,    0,  987,    0,    0,  987,  992,  992,
-      992,    0,  992,    0,    0,  992, 1001, 1001, 1001,    0,
-     1001,    0,    0, 1001,  992,  995,  995,  995,  995,  995,
-      995,  995,  995,  995,    0,    0,  995,    0,    0,  995,
-      995,  995,  995,  995, 1004, 1004, 1004,    0, 1004,    0,
-        0, 1004,    0,    0,    0,    0, 1015, 1015, 1015,    0,
-        0,  995,  995,  996,  996,  996,  996,  996,  996,  996,
-      996,  996, 1015, 1015,  996,    0,    0,  996,  996,  996,
-
-      996,  996, 1016, 1016, 1016,    0, 1017, 1017, 1017, 1018,
-     1018, 1018, 1019, 1019, 1019,    0,    0, 1016,    0,  996,
-      996, 1017,    0,    0, 1018,    0,    0, 1019, 1026, 1026,
-     1026, 1030, 1030, 1030, 1031, 1031, 1031,    0, 1032, 1032,
-     1032,    0, 1032,    0, 1026, 1032, 1018, 1030,    0, 1031,
-     1033, 1033, 1033, 1034, 1034, 1034,    0, 1034,    0,    0,
-     1034, 1035, 1035, 1035,    0, 1033,    0, 1036, 1036, 1036,
-        0, 1036,    0, 1030, 1036,    0, 1035, 1038, 1038, 1038,
-     1039, 1039, 1039,    0, 1039,    0,    0, 1039, 1046, 1046,
-     1046,    0, 1038, 1048, 1048, 1048,    0, 1048,    0,    0,
-
-     1048, 1051, 1051, 1051, 1046, 1051,    0,    0, 1051, 1054,
-     1054, 1054,    0, 1054,    0,    0, 1054, 1058, 1058, 1058,
-     1046, 1058,    0,    0, 1058, 1085, 1085, 1085, 1093, 1093,
-     1093, 1094, 1094, 1094,    0, 1094,    0,    0, 1094,    0,
-     1085,    0,    0, 1093, 1102, 1102, 1102,    0, 1102,    0,
-        0, 1102, 1109, 1109, 1109, 1112, 1112, 1112,    0, 1112,
-        0,    0, 1112, 1125, 1125, 1125,    0,    0, 1109,    0,
-        0, 1112, 1126, 1126, 1126, 1129, 1129, 1129, 1125, 1130,
-     1130, 1130,    0, 1130,    0,    0, 1130, 1126,    0,    0,
-     1129, 1131, 1131, 1131, 1132, 1132, 1132,    0, 1132,    0,
-
-        0, 1132,    0, 1135, 1135, 1135, 1131, 1135,    0,    0,
-     1135, 1138, 1138, 1138,    0, 1138,    0,    0, 1138, 1155,
-     1155, 1155, 1156, 1156, 1156,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0, 1155,    0,    0, 1156, 1159,
-     1159, 1159, 1159, 1159, 1159, 1159, 1160, 1160, 1160, 1160,
-     1160, 1160, 1160, 1161, 1161, 1161, 1161, 1161, 1161, 1161,
-     1162, 1162, 1162, 1162, 1162, 1162, 1162, 1163, 1163, 1163,
-     1163, 1163, 1163, 1163, 1164, 1164, 1164, 1164, 1164, 1164,
-     1164, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1166, 1166,
-     1166, 1166, 1166, 1166, 1166, 1167, 1167, 1167, 1167, 1167,
-
-     1167, 1167, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1169,
-     1169, 1169, 1169, 1169, 1169, 1169, 1170, 1170, 1170, 1170,
-     1170, 1170, 1170, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
-     1172, 1172, 1172, 1172, 1172, 1172, 1172, 1173, 1173, 1173,
-     1173, 1173, 1173, 1173, 1174, 1174, 1174, 1174, 1174, 1174,
-     1174, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1176, 1176,
-     1176, 1176, 1176, 1176, 1176, 1177, 1177, 1177, 1177, 1177,
-     1177, 1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1179,
-     1179, 1179, 1179, 1179, 1179, 1179, 1180, 1180, 1180, 1180,
-     1180, 1180, 1180, 1181, 1181, 1181, 1181, 1181, 1181, 1181,
-
-     1182, 1182, 1182, 1182, 1182, 1182, 1182, 1183, 1183, 1183,
-     1183, 1183, 1183, 1183, 1184, 1184, 1184, 1184, 1184, 1184,
-     1184, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1186, 1186,
-     1186, 1186, 1186, 1186, 1186, 1187, 1187, 1187,    0, 1187,
-     1188, 1188, 1188,    0, 1188, 1189, 1189, 1189,    0, 1189,
-     1190, 1190, 1190,    0, 1190, 1191, 1191, 1191,    0, 1191,
-     1192, 1192, 1192,    0, 1192, 1193, 1193, 1193,    0, 1193,
-     1194, 1194, 1194,    0, 1194, 1195, 1195, 1195,    0, 1195,
-     1196, 1196, 1196,    0, 1196, 1197, 1197, 1197, 1197, 1197,
-        0, 1197, 1198,    0, 1198, 1199,    0, 1199, 1200,    0,
-
-     1200, 1201,    0, 1201, 1202,    0, 1202, 1203,    0, 1203,
-     1204,    0, 1204, 1205,    0, 1205, 1206,    0, 1206, 1207,
-        0, 1207, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1209,
-        0,    0, 1209, 1210, 1210, 1210, 1210, 1210, 1210, 1211,
-     1211, 1211, 1211, 1211, 1211, 1212, 1212, 1212, 1212, 1212,
-     1212, 1213, 1213, 1213, 1213, 1213, 1213, 1214, 1214, 1214,
-     1214, 1214, 1214, 1215, 1215, 1215, 1215, 1215, 1215, 1216,
-     1216, 1216, 1216, 1216, 1216, 1217, 1217, 1217, 1217, 1217,
-     1217, 1218, 1218, 1218, 1218, 1218, 1218, 1219, 1219, 1219,
-     1219, 1219, 1219, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
-
-     1221, 1221, 1221, 1221, 1221, 1221, 1221, 1222, 1222, 1222,
-     1222, 1222, 1222, 1222, 1223, 1223, 1223, 1223, 1223, 1223,
-     1223, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 1225,
-     1225, 1225, 1225, 1225, 1225, 1226, 1226, 1226, 1226, 1226,
-     1226, 1226, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
-
-     1158, 1158, 1158, 1158, 1158, 1158
+       59,   59,   59, 1426,   59,   59,   59,   59,   59,   91,
+       91,   91,   92,   92,   92, 1485,   95,   95,   95,   96,
+       96,   96,   97,   97,   97,   91,  274,  256,   92, 1236,
+       59,   59,   95,  274, 1283,   96, 1236, 1283,   97, 1426,
+     1479,   59,  274,  256,  276,  276,  276,   59, 1479,   59,
+       59,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60, 1486,   60,   60,   60,
+
+       60,   60,   98,   98,   98,   99,   99,   99,  256,  100,
+      100,  100,  101,  101,  101,  102,  102,  102,   98, 1480,
+     1428,   99,  285,   60,   60,  100, 1487, 1480,  101,  285,
+     1325,  102, 1325, 1500,   60,  284,  284,  284,  285, 1327,
+       60, 1327,   60,   60,   63,   63,   63,   63,   63,   63,
+       63,   63,   63,   63,   63,   63,   63,   63,   63, 1428,
+       63,   63,   63,   63,   63,  105,  105,  105,  106,  106,
+      106, 1500,  107,  107,  107,  108,  108,  108,  109,  109,
+      109,  105,  290, 1332,  106, 1332,   63,   63,  107,  305,
+     1334,  108, 1334, 1508,  109,  287,  287,  287,  290,  299,
+
+      299,  299,  302,  302,  302,  305,   63,   64,   64,   64,
+       64,   64,   64,   64,   64,   64,   64,   64,   64,   64,
+       64,   64, 1499,   64,   64,   64,   64,   64,  110,  110,
+      110,  111,  111,  111, 1511,  112,  112,  112,  115,  115,
+      115,  116,  116,  116,  110,  300,  310,  111, 1499,   64,
+       64,  112,  300,  310,  115, 1512, 1513,  116,  309,  309,
+      309,  300,  310,  312,  312,  312,  322,  322,  322,   64,
+       71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
+       71,   71,   71,   71,   71, 1514,   71,   71,   71,   71,
+       71,  117,  117,  117,  118,  118,  118, 1515,  119,  119,
+
+      119,  120,  120,  120,  121,  121,  121,  117,  315,  324,
+      118,  329,   71,   71,  119,   71,  324,  120, 1517, 1518,
+      121, 1519, 1501,   71,  315,  324,   71,  329, 1520,   71,
+     1521, 1522,   71,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72, 1523,   72,
+       72,   72,   72,   72,  122,  122,  122,  125,  125,  125,
+     1501,  126,  126,  126,  129,  129,  129,  130,  130,  130,
+      122,  343,  334,  125,  338,   72,   72,  126,   72, 1525,
+      129,  338, 1526,  130, 1527, 1531,   72,  343,  334,   72,
+      338, 1532,   72, 1536, 1538,   72,   81,   81,   81,   81,
+
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81, 1542,   81,   81,   81,   81,   81,  131,  131,  131,
+      132,  132,  132,  334,  133,  133,  133,  134,  134,  134,
+      135,  135,  135,  131,  273, 1543,  132, 1544,   81,   81,
+      133,  273, 1545,  134,  357, 1546,  135, 1547, 1548,   81,
+      273,  326,  326,  326,  336,  336,  336,  340,  340,  340,
+      357,   81,   82,   82,   82,   82,   82,   82,   82,   82,
+       82,   82,   82,   82,   82,   82,   82, 1549,   82,   82,
+       82,   82,   82,  136,  136,  136,  139,  139,  139,  273,
+      140,  140,  140,  350,  350,  350,  352,  367,  382,  136,
+
+     1550, 1551,  139,  352,   82,   82,  140,  354,  354,  354,
+     1055, 1553,  352,  367,  382,   82,  361,  361,  361,  364,
+      364,  364,  374,  374,  374, 1554, 1055,   82,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89, 1555,   89,   89,   89,   89,   89, 1556, 1557,
+      323,  337,  362, 1558, 1571,  182,  351,  323,  337,  362,
+      183, 1575,  182,  351, 1565, 1576,  323,  337,  362,   89,
+       89,  182,  351,  379,  379,  379,  183,  386,  386,  386,
+       89,   90,   90,   90,   90,   90,   90,   90,   90,   90,
+       90,   90,   90,   90,   90,   90, 1565,   90,   90,   90,
+       90,   90,  337,  183,  182,  323,  183,  351,  183,  183,
+      182,  183,  182,  184,  182,  255,  376,  183,  183,  183,
+      388,  388,  388,   90,   90,  397,  397,  397, 1577,  184,
+
+     1578,  255,  376, 1582,   90,   93,   93,   93,   93,   93,
+       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
+     1564,   93,   93,   93,   93,   93, 1583,  376,  377, 1584,
+      387, 1585,  184,  255, 1586,  377,  255,  387,  184, 1587,
+      184,  376,  184, 1588,  377, 1589,  387,   93,   93,  375,
+      397,   93, 1590,  534,  534,  534,  375,  534,   93, 1591,
+       93,  689,  689,  689, 1564,  375, 1595,   93,   94,   94,
+       94,   94,   94,   94,   94,   94,   94,   94,   94,   94,
+       94,   94,   94, 1597,   94,   94,   94,   94,   94, 1598,
+      375,  428,  428,  428, 1601,  436,  436,  436,  452,  452,
+
+      452,  464,  464,  464,  375,  472,  472,  472,  428, 1602,
+       94,   94,  436, 1603,   94,  452, 1596, 1596,  464, 1604,
+     1605,   94,  472,   94,  857,  857,  857,  859,  859,  859,
+       94,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103, 1606,  103,  103,  103,
+      103,  103,  478,  478,  478,  479,  479,  479,  488,  488,
+      488,  493,  493,  493,  515,  515,  515, 1607, 1608,  478,
+     1609, 1610,  479,  103,  103,  488,  103, 1611,  493,  103,
+     1613,  515,  565,  565,  565, 1614,  565, 1615, 1616,  565,
+      863,  863,  863,  103,  104,  104,  104,  104,  104,  104,
+
+      104,  104,  104,  104,  104,  104,  104,  104,  104, 1617,
+      104,  104,  104,  104,  104,  545,  545,  545, 1618, 1621,
+      561,  561,  561, 1626, 1627,  546,  546,  546,  562,  562,
+      562,  996,  996,  545, 1628, 1629,  104,  104,  561,  104,
+     1639,  996,  104,  546, 1640,  996,  562,  573,  573,  573,
+     1621,  573, 1642, 1643,  573, 1649,  104,  113,  113,  113,
+      113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
+      113,  113, 1650,  113,  113,  113,  113,  113, 1651,  546,
+      564,  564,  564, 1652,  562,  568,  568,  568,  569,  569,
+      569,  572,  572,  572,  574,  574,  574,  564, 1658,  113,
+
+      113, 1659,  113,  568, 1660,  113,  569, 1661,  572, 1662,
+      113,  574,  887,  887,  887,  966,  966,  966, 1663,  113,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114, 1665,  114,  114,  114,  114,
+      114,  576,  576,  576,  968,  968,  968, 1667,  569,  578,
+      578,  578, 1670, 1671,  579,  579,  579, 1672,  576,  585,
+      585,  585,  114,  114, 1673,  114, 1674,  578,  114,  992,
+      992,  992,  579,  114,  588,  588,  588,  585,  588, 1675,
+     1689,  588,  114,  123,  123,  123,  123,  123,  123,  123,
+      123,  123,  123,  123,  123,  123,  123,  123,  579,  123,
+
+      123,  123,  123,  123,  586,  586,  586,  587,  587,  587,
+      592,  592,  592,  593,  593,  593,  595,  595,  595,  972,
+      972,  972,  586, 1682,  587,  123,  123, 1690,  592, 1691,
+     1692,  593, 1696,  972,  595, 1697,  123,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124,  124,  124,
+      124,  124, 1698,  124,  124,  124,  124,  124,  596,  596,
+      596,  593, 1682, 1699,  586,  598,  598,  598,  599,  599,
+      599, 1701,  599,  997,  997,  599,  596, 1702, 1703,  124,
+      124, 1704,  598,  997, 1068, 1068, 1068,  997, 1709, 1710,
+      124,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+
+      127,  127,  127,  127,  127,  127, 1711,  127,  127,  127,
+      127,  127,  604,  604,  604,  596, 1712, 1713,  605,  605,
+      605,  606,  606,  606,  607,  607,  607, 1714,  607, 1717,
+      604,  607, 1718,  127,  127, 1719,  605, 1720,  606, 1721,
+     1722,  127, 1737,  127, 1739,  127, 1069, 1069, 1069, 1071,
+     1071, 1071, 1741,  127,  128,  128,  128,  128,  128,  128,
+      128,  128,  128,  128,  128,  128,  128,  128,  128, 1743,
+      128,  128,  128,  128,  128,  605,  609,  609,  609, 1747,
+      610,  610,  610,  612,  612,  612,  613,  613,  613, 1748,
+      613, 1749, 1750,  613,  609, 1757,  128,  128,  610, 1758,
+
+      612,  973,  973,  973,  128, 1731,  128, 1760,  128, 1072,
+     1072, 1072, 1170, 1170, 1170,  973,  128,  137,  137,  137,
+      137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
+      137,  137, 1761,  137,  137,  137,  137,  137, 1734, 1755,
+      610,  614,  614,  614,  615,  615,  615, 1731,  615, 1734,
+     1755,  615,  616,  616,  616,  621,  621,  621,  614,  137,
+      137,  622,  622,  622,  623,  623,  623, 1756, 1763,  616,
+      624,  624,  624,  621,  624, 1764, 1766,  624, 1756,  622,
+     1767,  623,  137,  138,  138,  138,  138,  138,  138,  138,
+      138,  138,  138,  138,  138,  138,  138,  138, 1774,  138,
+
+      138,  138,  138,  138,  625,  625,  625, 1733, 1775,  626,
+      626,  626,  628,  628,  628,  622,  629,  629,  629, 1775,
+      629, 1733,  625,  629, 1776,  138,  138,  626, 1778,  628,
+     1773, 1773,  633,  633,  633,  634,  634,  634,  636,  636,
+      636,  637,  637,  637,  640,  640,  640, 1779,  138,  181,
+      633, 1780, 1771,  634, 1781,  636,  181, 1786,  637,  641,
+      641,  641,  640, 1787, 1788,  181,  626,  643,  643,  643,
+     1789,  645,  645,  645,  648,  648,  648,  641,  646,  646,
+      646,  647,  647,  647,  643, 1801, 1802,  634,  645, 1771,
+     1803,  648,  181, 1805, 1806,  181,  646,  181,  181,  647,
+
+      181,  650,  650,  650,  181, 1807,  181,  181,  181, 1808,
+      649,  649,  649, 1815,  649, 1818,  641,  649, 1819,  650,
+     1820,  651,  651,  651,  656,  656,  656,  657,  657,  657,
+      660,  660,  660,  661,  661,  661, 1772, 1821,  647,  651,
+     1825, 1839,  656, 1843, 1844,  657, 1845, 1846,  660, 1849,
+     1772,  661,  677,  677,  677, 1851,  678,  678,  678,  680,
+      680,  680,  694,  694,  694,  695,  695,  695, 1852, 1853,
+      677, 1849, 1854,  651,  678, 1855, 1859,  680, 1860,  694,
+      696,  696,  696,  695,  698,  698,  698,  657,  699,  699,
+      699, 1858, 1861,  661,  703,  703,  703, 1862,  696,  705,
+
+      705,  705,  698,  680, 1863,  699,  700,  700,  700, 1858,
+      700,  703, 1866,  700,  706,  706,  706,  705,  708,  708,
+      708,  710,  710,  710, 1868,  710, 1869, 1870,  710, 1871,
+      698, 1866,  706,  713,  713,  713,  708,  714,  714,  714,
+     1877,  714, 1879, 1874,  714, 1901,  715,  715,  715, 1874,
+      713,  703,  716,  716,  716, 1883, 1905,  717,  717,  717,
+     1902,  717,  708,  715,  717,  719,  719,  719, 1883,  716,
+      720,  720,  720,  722,  722,  722,  726,  726,  726,  728,
+      728,  728, 1929,  719,  729,  729,  729, 1897,  720, 1898,
+     1901,  722, 1448,  726,  731,  731,  731,  728, 1905,  732,
+
+      732,  732,  729,  732, 1906, 1902,  732,  738,  738,  738,
+     1930, 1929,  731,  739,  739,  739,  741,  741,  741,  743,
+      743,  743,  744,  744,  744,  738,  746,  746,  746,  722,
+     1897,  739, 1898, 1909,  741, 1910, 1925,  743,  731, 1930,
+      744,  748,  748,  748,  746,  748, 1906, 1915,  748,  755,
+      755,  755,  756,  756,  756,  758,  758,  758,  759,  759,
+      759, 1923,  759, 1926, 1909,  759, 1910,  755, 1927, 1924,
+      756, 1916, 1925,  758,  763,  763,  763, 1927,  741,  764,
+      764,  764,  766,  766,  766, 1936,  746,  769,  769,  769,
+     1447,  769,  763, 1931,  769, 1915, 1936,  764, 1923, 1926,
+
+      766,  772,  772,  772, 1933,  772, 1924, 1446,  772,  775,
+      775,  775, 1928,  776,  776,  776,  758,  776, 1934, 1916,
+      776, 1928,  781,  781,  781, 1932,  775,  782,  782,  782,
+      784,  784,  784, 1933,  785,  785,  785, 1931,  785,  766,
+      781,  785,  788,  788,  788,  782, 1445, 1934,  784,  789,
+      789,  789,  791,  791,  791,  793,  793,  793, 1444,  793,
+      788, 1443,  793,  799,  799,  799, 1935,  789, 1442, 1932,
+      791,  800,  800,  800,  802,  802,  802,  804,  804,  804,
+     1935,  799, 1441,  805,  805,  805, 1440,  805, 1435,  800,
+      805, 1434,  802,  784,  804,  806,  806,  806,  807,  807,
+
+      807, 1413,  807, 1412, 1411,  807,  810,  810,  810,  811,
+      811,  811,  806, 1410, 1409,  791,  813,  813,  813,  815,
+      815,  815, 1408, 1403,  810, 1402, 1401,  811, 1400, 1399,
+      802,  816,  816,  816,  813,  816,  815, 1398,  816,  818,
+      818,  818,  819,  819,  819, 1395,  819, 1393, 1392,  819,
+      820,  820,  820,  821,  821,  821,  818,  823,  823,  823,
+      824,  824,  824, 1391,  824, 1390, 1383,  824,  820, 1381,
+     1380,  821,  827,  827,  827,  823,  828,  828,  828,  813,
+      830,  830,  830,  832,  832,  832,  835,  835,  835, 1379,
+      827,  836,  836,  836,  828,  838,  838,  838,  830, 1378,
+
+      832,  841,  841,  841,  835,  842,  842,  842, 1371,  836,
+      844,  844,  844,  838,  846,  846,  846, 1370, 1369,  841,
+      823, 1368, 1367,  842,  854,  854,  854, 1366,  844,  868,
+      868,  868,  846,  846, 1365, 1364,  830,  869,  869,  869,
+     1363,  869,  854, 1362,  869, 1361,  868,  870,  870,  870,
+     1360, 1359,  838,  871,  871,  871, 1358,  872,  872,  872,
+      844,  872, 1355, 1352,  872,  870,  875,  875,  875, 1351,
+      871,  877,  877,  877, 1340,  877, 1333, 1331,  877,  880,
+      880,  880, 1326, 1324,  875, 1323,  854,  881,  881,  881,
+     1322,  881, 1321, 1320,  881, 1319,  880, 1318,  882,  882,
+
+      882,  870,  882, 1317, 1306,  882,  886,  886,  886,  890,
+      890,  890,  875,  891,  891,  891, 1305,  891, 1304, 1303,
+      891,  893,  893,  893,  886, 1302,  890,  897,  897,  897,
+      899,  899,  899,  903,  903,  903,  905,  905,  905,  893,
+      904,  904,  904, 1301, 1300,  897, 1299, 1291,  899, 1290,
+      903, 1289, 1288,  886,  905, 1287, 1286,  904,  906,  906,
+      906,  907,  907,  907,  908,  908,  908,  893,  909,  909,
+      909, 1285,  913,  913,  913,  906, 1284, 1280,  899,  907,
+     1277,  908, 1274,  904, 1272,  909,  910,  910,  910,  913,
+      910, 1271, 1255,  910,  914,  914,  914, 1253,  905,  915,
+
+      915,  915, 1252,  916,  916,  916,  917,  917,  917, 1242,
+     1237,  914, 1234,  918,  918,  918,  915, 1233, 1230,  907,
+      916,  922,  922,  922,  917, 1216,  923,  923,  923, 1213,
+      909,  918,  925,  925,  925, 1212,  925, 1211,  922,  925,
+      933,  933,  933,  915,  923,  928,  928,  928, 1196,  928,
+     1195, 1194,  928, 1193, 1192,  935,  935,  935,  933,  935,
+      914, 1191,  935, 1190,  922, 1189, 1186,  917, 1184,  916,
+      939,  939,  939, 1183,  939,  918, 1180,  939, 1179,  923,
+      942,  942,  942,  943,  943,  943,  945,  945,  945,  946,
+      946,  946, 1177,  946, 1175, 1164,  946, 1156,  942, 1154,
+
+     1153,  943,  933,  945,  949,  949,  949,  951,  951,  951,
+      952,  952,  952,  955,  955,  955,  963,  963,  963,  971,
+      971,  971,  949, 1152,  951,  976,  976,  976,  952,  976,
+     1145,  955,  976,  971,  963, 1139,  943,  979,  979,  979,
+     1138, 1137,  942, 1135,  980,  980,  980, 1133,  980, 1110,
+      949,  980,  991,  991,  991,  979,  985,  985,  985, 1109,
+     1108,  955,  987,  987,  987,  963,  987, 1103, 1102,  987,
+      991, 1101, 1091,  952,  985, 1090, 1089,  955, 1088,  971,
+      995,  995,  995, 1087,  995, 1086, 1085,  995,  999,  999,
+      999, 1000, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1002,
+
+      979, 1003, 1003, 1003,  985, 1084,  999, 1083, 1000,  991,
+     1081, 1001, 1079, 1078, 1002, 1005, 1005, 1005, 1076, 1003,
+     1006, 1006, 1006, 1010, 1010, 1010, 1011, 1011, 1011, 1075,
+     1011, 1073, 1005, 1011, 1070, 1067,  999, 1066, 1006, 1065,
+     1010, 1012, 1012, 1012, 1064, 1013, 1013, 1013, 1001, 1013,
+     1059, 1051, 1013, 1015, 1015, 1015, 1049, 1048, 1012, 1016,
+     1016, 1016, 1044, 1038, 1006, 1017, 1017, 1017, 1034, 1017,
+     1031, 1015, 1017, 1018, 1018, 1018, 1016, 1019, 1019, 1019,
+     1020, 1020, 1020, 1030, 1020, 1029, 1014, 1020, 1021, 1021,
+     1021, 1018, 1009, 1008, 1019, 1022, 1022, 1022, 1007, 1023,
+
+     1023, 1023,  998, 1023,  994, 1021, 1023, 1024, 1024, 1024,
+      993,  990, 1022, 1025, 1025, 1025, 1026, 1026, 1026, 1027,
+     1027, 1027,  986,  984, 1024, 1028, 1028, 1028,  983,  975,
+     1025,  974,  970, 1026, 1032, 1032, 1032, 1027, 1033, 1033,
+     1033,  969, 1033, 1028,  967, 1033, 1035, 1035, 1035,  965,
+      964, 1032, 1036, 1036, 1036, 1037, 1037, 1037, 1039, 1039,
+     1039, 1040, 1040, 1040, 1035,  961,  960, 1025,  957, 1036,
+      954,  950, 1037, 1028,  948,  947, 1039,  944, 1040,  938,
+      934, 1027, 1041, 1041, 1041, 1042, 1042, 1042,  932,  931,
+     1043, 1043, 1043, 1045, 1045, 1045,  924, 1045,  921, 1041,
+
+     1045,  920,  919, 1042, 1043,  902, 1039,  901, 1043, 1050,
+     1050, 1050, 1052, 1052, 1052, 1037, 1053, 1053, 1053,  900,
+     1053,  898,  896, 1053,  895, 1041,  894, 1050,  892, 1052,
+     1054, 1054, 1054, 1042, 1060, 1060, 1060, 1061, 1061, 1061,
+      889, 1062, 1062, 1062, 1063, 1063, 1063,  888, 1054,  885,
+      876, 1060,  874,  873, 1061,  867,  866, 1050, 1062, 1074,
+     1074, 1074, 1063, 1077, 1077, 1077, 1080, 1080, 1080, 1082,
+     1082, 1082,  865, 1092, 1092, 1092,  864, 1074, 1093, 1093,
+     1093, 1077,  862,  861, 1080, 1054, 1082, 1092,  860, 1061,
+      858, 1092, 1094, 1094, 1094, 1093, 1094,  856, 1062, 1094,
+
+      855, 1063, 1095, 1095, 1095,  853, 1074, 1096, 1096, 1096,
+     1097, 1097, 1097,  852, 1097,  851,  850, 1097,  849, 1095,
+      840, 1080,  839,  834, 1096, 1098, 1098, 1098, 1099, 1099,
+     1099,  833, 1099,  831,  817, 1099, 1100, 1100, 1100, 1104,
+     1104, 1104, 1098, 1104,  814,  809, 1104,  808, 1107, 1107,
+     1107,  803, 1107,  798, 1100, 1107, 1111, 1111, 1111, 1113,
+     1113, 1113,  797, 1113,  796,  792, 1113, 1116, 1116, 1116,
+      780, 1118, 1118, 1118, 1111, 1118,  779,  778, 1118, 1121,
+     1121, 1121, 1100,  777,  768, 1116, 1122, 1122, 1122,  767,
+     1122,  762,  754, 1122,  753,  752, 1121, 1123, 1123, 1123,
+
+      751, 1123,  747,  742, 1123, 1126, 1126, 1126, 1127, 1127,
+     1127,  737, 1127,  736,  735, 1127, 1128, 1128, 1128, 1129,
+     1129, 1129, 1126, 1130, 1130, 1130,  727, 1130,  725,  724,
+     1130,  723,  718, 1128,  709,  704, 1129, 1131, 1131, 1131,
+     1132, 1132, 1132, 1134, 1134, 1134, 1136, 1136, 1136,  693,
+     1136,  692,  691, 1136,  690, 1131,  688,  687, 1132,  686,
+     1134, 1140, 1140, 1140, 1142, 1142, 1142, 1143, 1143, 1143,
+      685, 1143,  684,  683, 1143, 1144, 1144, 1144,  682, 1140,
+      681, 1142, 1147, 1147, 1147, 1131, 1134, 1146, 1146, 1146,
+      676,  675, 1144, 1149, 1149, 1149, 1150, 1150, 1150, 1147,
+
+     1132, 1146, 1148, 1148, 1148, 1146, 1148,  674,  673, 1148,
+     1149, 1151, 1151, 1151, 1150, 1155, 1155, 1155, 1157, 1157,
+     1157,  670, 1157,  669,  668, 1157,  666, 1144,  662, 1151,
+     1160, 1160, 1160, 1155, 1165, 1165, 1165, 1166, 1166, 1166,
+      659, 1166,  658,  655, 1166, 1167, 1167, 1167, 1160,  654,
+     1149, 1165, 1168, 1168, 1168,  653,  652, 1151,  644, 1169,
+     1169, 1169, 1167, 1171, 1171, 1171, 1172, 1172, 1172, 1168,
+     1173, 1173, 1173, 1174, 1174, 1174, 1155, 1169, 1160, 1176,
+     1176, 1176, 1178, 1178, 1178, 1181, 1181, 1181, 1185, 1185,
+     1185, 1187, 1187, 1187,  642, 1188, 1188, 1188,  639, 1188,
+
+     1178, 1167, 1188, 1181,  638,  635, 1185,  632, 1187, 1197,
+     1197, 1197, 1202, 1202, 1202, 1168, 1198, 1198, 1198, 1169,
+     1199, 1199, 1199,  631, 1199,  630, 1197, 1199,  627, 1202,
+     1178, 1203, 1203, 1203, 1198, 1203,  620,  619, 1203, 1204,
+     1204, 1204,  618, 1204,  617,  608, 1204, 1207, 1207, 1207,
+      603, 1207,  602,  601, 1207, 1210, 1210, 1210,  600, 1217,
+     1217, 1217, 1198, 1217,  597,  594, 1217, 1220, 1220, 1220,
+      591, 1220,  590, 1210, 1220, 1223, 1223, 1223, 1224, 1224,
+     1224,  589, 1224,  584,  583, 1224, 1225, 1225, 1225,  582,
+     1225,  581, 1223, 1225, 1228, 1228, 1228, 1229, 1229, 1229,
+
+     1231, 1231, 1231, 1232, 1232, 1232, 1210, 1232,  580,  577,
+     1232,  575, 1228,  571,  567, 1229,  566, 1231, 1238, 1238,
+     1238,  563, 1238,  560,  559, 1238, 1241, 1241, 1241, 1243,
+     1243, 1243, 1244, 1244, 1244,  558, 1244,  557,  556, 1244,
+     1247, 1247, 1247, 1241, 1248, 1248, 1248, 1243, 1250, 1250,
+     1250, 1251, 1251, 1251, 1228,  555,  554, 1247, 1254, 1254,
+     1254,  553, 1248, 1257, 1257, 1257, 1250,  552, 1251, 1256,
+     1256, 1256, 1241, 1260, 1260, 1260, 1254,  551, 1261, 1261,
+     1261, 1257, 1261,  550, 1243, 1261,  549, 1256, 1264, 1264,
+     1264, 1265, 1265, 1265,  548,  547, 1247, 1266, 1266, 1266,
+
+     1267, 1267, 1267,  544,  543, 1264,  542,  540, 1265,  539,
+     1250, 1268, 1268, 1268,  538, 1266, 1269, 1269, 1269, 1254,
+     1270, 1270, 1270,  537,  536, 1256, 1273, 1273, 1273, 1276,
+     1276, 1276, 1278, 1278, 1278, 1281, 1281, 1281,  532, 1281,
+      530, 1264, 1281,  529, 1273,  528, 1276, 1292, 1292, 1292,
+     1278,  527, 1266, 1265, 1293, 1293, 1293,  524, 1293,  523,
+      522, 1293,  521,  520, 1292, 1294, 1294, 1294, 1295, 1295,
+     1295,  519, 1295,  516,  512, 1295, 1298, 1298, 1298,  511,
+     1307, 1307, 1307, 1294, 1307,  510,  509, 1307, 1310, 1310,
+     1310, 1311, 1311, 1311, 1298, 1313, 1313, 1313, 1314, 1314,
+
+     1314,  508, 1314,  505,  504, 1314, 1310,  503,  502, 1311,
+      501,  500, 1313, 1328, 1328, 1328, 1329, 1329, 1329, 1330,
+     1330, 1330, 1294, 1335, 1335, 1335,  497, 1336, 1336, 1336,
+     1328, 1337, 1337, 1337, 1339, 1339, 1339, 1330, 1313,  496,
+     1335,  495, 1338, 1338, 1338, 1336, 1338,  494, 1337, 1338,
+      492, 1339, 1341, 1341, 1341, 1342, 1342, 1342, 1343, 1343,
+     1343, 1344, 1344, 1344,  489,  485, 1335, 1347, 1347, 1347,
+     1341, 1348, 1348, 1348,  484,  483, 1343,  482,  481, 1344,
+      480,  477, 1330, 1336, 1349, 1349, 1349,  474, 1348, 1350,
+     1350, 1350, 1353, 1353, 1353, 1356, 1356, 1356, 1357, 1357,
+
+     1357, 1349, 1357,  473,  469, 1357,  468, 1350,  467,  466,
+     1353,  465, 1356,  463, 1372, 1372, 1372,  460, 1372, 1344,
+     1343, 1372, 1375, 1375, 1375, 1376, 1376, 1376, 1385, 1385,
+     1385,  459, 1349, 1386, 1386, 1386, 1388, 1388, 1388,  456,
+     1375,  455,  454, 1376,  453, 1385,  449,  448, 1389, 1389,
+     1389, 1386, 1389, 1388,  447, 1389, 1397, 1397, 1397, 1404,
+     1404, 1404, 1405, 1405, 1405,  446, 1405,  445,  442, 1405,
+     1406, 1406, 1406, 1397,  441,  440, 1404,  439, 1375, 1407,
+     1407, 1407, 1414, 1414, 1414, 1415, 1415, 1415, 1416, 1416,
+     1416,  438, 1416,  437,  435, 1416,  432, 1407,  431, 1414,
+
+     1419, 1419, 1419, 1415, 1420, 1420, 1420,  429, 1420,  427,
+      424, 1420,  423, 1421, 1421, 1421,  419, 1419, 1422, 1422,
+     1422, 1424, 1424, 1424, 1425, 1425, 1425,  418,  417, 1414,
+     1421,  416,  414, 1407,  413,  412, 1422, 1429, 1429, 1429,
+      411,  410, 1425, 1414, 1430, 1430, 1430,  409, 1430,  408,
+      407, 1430,  406,  403, 1429, 1431, 1431, 1431, 1432, 1432,
+     1432, 1436, 1436, 1436, 1437, 1437, 1437,  402, 1437,  401,
+      400, 1437, 1431, 1454, 1454, 1454, 1432,  399, 1436, 1460,
+     1460, 1460, 1461, 1461, 1461,  393, 1461,  392,  390, 1461,
+      384, 1454,  380, 1462, 1462, 1462, 1460, 1462,  372,  371,
+
+     1462, 1470, 1470, 1470, 1471, 1471, 1471,  370, 1471,  369,
+      365, 1471, 1478, 1478, 1478,  359, 1478,  355, 1470, 1478,
+     1481, 1481, 1481, 1488, 1488, 1488, 1489, 1489, 1489, 1454,
+     1490, 1490, 1490,  348,  347, 1492, 1492, 1492, 1481, 1492,
+     1488,  346, 1492, 1489, 1495, 1495, 1495,  345, 1490, 1496,
+     1496, 1496,  341, 1496,  332,  331, 1496, 1497, 1497, 1497,
+      327, 1495, 1502, 1502, 1502,  319, 1502,  318,  317, 1502,
+     1505, 1505, 1505,  313,  307, 1497, 1506, 1506, 1506,  303,
+     1506,  297, 1481, 1506, 1488,  296, 1489, 1505, 1507, 1507,
+     1507, 1509, 1509, 1509, 1510, 1510, 1510,  294, 1510,  293,
+
+      288, 1510, 1516, 1516, 1516, 1529, 1529, 1529, 1509, 1530,
+     1530, 1530,  282, 1533, 1533, 1533,  281, 1533,  277, 1516,
+     1533,  270,  269, 1529,  268,  266, 1530, 1537, 1537, 1537,
+     1539, 1539, 1539,  262, 1539,  254,  250, 1539, 1552, 1552,
+     1552, 1559, 1559, 1559, 1537, 1560, 1560, 1560, 1570, 1570,
+     1570,  244, 1530, 1529,  243,  242, 1552,  241, 1559, 1561,
+     1561, 1561, 1560, 1561,  237,  231, 1561, 1566, 1566, 1566,
+     1567, 1567, 1567,  230, 1567,  229,  228, 1567,  224, 1572,
+     1572, 1572,  216, 1572, 1566, 1566, 1572, 1579, 1579, 1579,
+     1552, 1560, 1580, 1580, 1580, 1581, 1581, 1581,  214, 1581,
+
+      213,  209, 1581, 1559, 1579, 1592, 1592, 1592,  206, 1580,
+     1593, 1593, 1593, 1594, 1594, 1594,  204, 1594,  203,  202,
+     1594,  198,  192, 1592, 1599, 1599, 1599, 1593, 1600, 1600,
+     1600,  188, 1600,  178,  177, 1600, 1612, 1612, 1612,  173,
+      169, 1599, 1619, 1619, 1619, 1620, 1620, 1620, 1622, 1622,
+     1622, 1592,  168,  167, 1612, 1623, 1623, 1623,  161, 1619,
+      160,  158, 1620,  155,  143, 1622, 1622, 1625, 1625, 1625,
+        0,    0, 1623, 1623, 1624, 1624, 1624,    0, 1624,    0,
+        0, 1624, 1630, 1630, 1630, 1619,    0,    0, 1620, 1631,
+     1631, 1631, 1624, 1631,    0,    0, 1631,    0,    0, 1630,
+
+     1632, 1632, 1632,    0, 1632,    0,    0, 1632, 1645, 1645,
+     1645, 1646, 1646, 1646,    0, 1646,    0,    0, 1646, 1653,
+     1653, 1653,    0, 1654, 1654, 1654, 1645, 1654,    0,    0,
+     1654, 1657, 1657, 1657,    0,    0, 1653, 1668, 1668, 1668,
+     1676, 1676, 1676, 1677, 1677, 1677,    0, 1677, 1657,    0,
+     1677, 1678, 1678, 1678,    0, 1668,    0, 1676, 1679, 1679,
+     1679,    0, 1680, 1680, 1680,    0, 1680,    0, 1678, 1680,
+     1645, 1681, 1681, 1681,    0, 1679, 1683, 1683, 1683, 1684,
+     1684, 1684,    0, 1684,    0,    0, 1684,    0, 1681, 1688,
+     1688, 1688,    0, 1683, 1683,    0,    0, 1684,    0, 1685,
+
+     1685, 1685,    0, 1685,    0,    0, 1685, 1693, 1693, 1693,
+        0, 1693,    0,    0, 1693,    0, 1678, 1685, 1705, 1705,
+     1705,    0,    0,    0,    0,    0,    0,    0, 1700, 1700,
+     1700,    0, 1707, 1707, 1707, 1705, 1681, 1686, 1686, 1686,
+     1686, 1686, 1686, 1686, 1686, 1686, 1700,    0, 1686, 1707,
+        0,    0,    0, 1686, 1686, 1686, 1686, 1686, 1706, 1706,
+     1706,    0, 1706,    0,    0, 1706, 1708, 1708, 1708,    0,
+     1708,    0,    0, 1708, 1726, 1726, 1726,    0,    0, 1686,
+     1686, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
+        0, 1726, 1687,    0,    0,    0,    0, 1687, 1687, 1687,
+
+     1687, 1687, 1723, 1723, 1723,    0, 1723,    0,    0, 1723,
+     1727, 1727, 1727,    0, 1727,    0,    0, 1727, 1730, 1730,
+     1730,    0,    0, 1687, 1687,    0, 1726, 1732, 1732, 1732,
+        0, 1732,    0,    0, 1732, 1730, 1745, 1745, 1745, 1751,
+     1751, 1751,    0, 1751,    0, 1732, 1751,    0, 1754, 1754,
+     1754,    0, 1754,    0, 1745, 1754,    0,    0,    0,    0,
+        0,    0,    0, 1769, 1769, 1769, 1770, 1770, 1770,    0,
+     1730, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,
+     1769,    0, 1735, 1770, 1777, 1777, 1777, 1735, 1735, 1735,
+     1735, 1735, 1782, 1782, 1782, 1783, 1783, 1783,    0,    0,
+
+        0,    0, 1777, 1777,    0,    0, 1800, 1800, 1800, 1782,
+        0,    0, 1783, 1735, 1735, 1736, 1736, 1736, 1736, 1736,
+     1736, 1736, 1736, 1736, 1800, 1769, 1736,    0, 1770,    0,
+        0, 1736, 1736, 1736, 1736, 1736, 1784, 1784, 1784, 1785,
+     1785, 1785, 1798, 1798, 1798, 1799, 1799, 1799,    0, 1804,
+     1804, 1804,    0, 1784,    0,    0, 1785, 1736, 1736, 1798,
+        0,    0, 1799, 1809, 1809, 1809,    0, 1804, 1810, 1810,
+     1810,    0, 1810,    0,    0, 1810, 1891, 1891, 1891, 1784,
+     1809, 1811, 1811, 1811, 1812, 1812, 1812,    0, 1812,    0,
+        0, 1812,    0, 1798, 1891,    0, 1799, 1804, 1811, 1813,
+
+     1813, 1813, 1814, 1814, 1814,    0, 1814,    0,    0, 1814,
+     1816, 1816, 1816, 1817, 1817, 1817, 1813, 1817,    0,    0,
+     1817, 1822, 1822, 1822, 1823, 1823, 1823, 1816,    0, 1824,
+     1824, 1824, 1830, 1830, 1830,    0, 1830,    0, 1822, 1830,
+        0, 1823, 1833, 1833, 1833,    0, 1833, 1824,    0, 1833,
+     1836, 1836, 1836,    0, 1836,    0,    0, 1836,    0, 1840,
+     1840, 1840,    0, 1840, 1822, 1824, 1840, 1823, 1847, 1847,
+     1847, 1848, 1848, 1848, 1856, 1856, 1856, 1857, 1857, 1857,
+     1864, 1864, 1864,    0,    0, 1847,    0,    0, 1848,    0,
+        0, 1856,    0,    0, 1857,    0,    0, 1864, 1865, 1865,
+
+     1865, 1867, 1867, 1867, 1872, 1872, 1872, 1873, 1873, 1873,
+     1875, 1875, 1875,    0,    0, 1865,    0,    0, 1867,    0,
+        0, 1872,    0,    0, 1873, 1847,    0, 1875, 1848,    0,
+        0, 1864,    0, 1876, 1876, 1876, 1856, 1876,    0, 1857,
+     1876, 1881, 1881, 1881, 1882, 1882, 1882,    0,    0, 1865,
+        0,    0, 1872,    0,    0, 1873,    0,    0, 1881,    0,
+        0, 1882, 1884, 1884, 1884,    0, 1884,    0,    0, 1884,
+     1889, 1889, 1889, 1890, 1890, 1890, 1892, 1892, 1892, 1893,
+     1893, 1893, 1894, 1894, 1894,    0, 1894, 1889,    0, 1894,
+     1890,    0,    0, 1892,    0,    0, 1893, 1895, 1895, 1895,
+
+     1894, 1881,    0,    0, 1882, 1896, 1896, 1896, 1899, 1899,
+     1899,    0,    0, 1889, 1895,    0, 1890, 1900, 1900, 1900,
+        0,    0, 1896,    0,    0, 1899, 1903, 1903, 1903, 1904,
+     1904, 1904,    0,    0, 1900,    0,    0, 1892,    0, 1893,
+     1907, 1907, 1907, 1903,    0, 1895, 1904,    0, 1908, 1908,
+     1908,    0,    0, 1896, 1911, 1911, 1911, 1907,    0, 1913,
+     1913, 1913,    0, 1900, 1899, 1908,    0,    0, 1912, 1912,
+     1912, 1911, 1912, 1903,    0, 1912, 1913, 1914, 1914, 1914,
+        0, 1914,    0,    0, 1914, 1917, 1917, 1917,    0, 1917,
+        0,    0, 1917, 1904, 1920, 1920, 1920,    0, 1920,    0,
+
+        0, 1920, 1937, 1937, 1937, 1938, 1938, 1938,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+     1937,    0,    0, 1938, 1941, 1941, 1941, 1941, 1941, 1941,
+     1941, 1941, 1941, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+     1942, 1942, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943,
+     1943, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944,
+     1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1946,
+     1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1947, 1947,
+     1947, 1947, 1947, 1947, 1947, 1947, 1947, 1948, 1948, 1948,
+     1948, 1948, 1948, 1948, 1948, 1948, 1949, 1949, 1949, 1949,
+
+     1949, 1949, 1949, 1949, 1949, 1950, 1950, 1950, 1950, 1950,
+     1950, 1950, 1950, 1950, 1951, 1951, 1951, 1951, 1951, 1951,
+     1951, 1951, 1951, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+     1952, 1952, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
+     1953, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954,
+     1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1956,
+     1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1957, 1957,
+     1957, 1957, 1957, 1957, 1957, 1957, 1957, 1958, 1958, 1958,
+     1958, 1958, 1958, 1958, 1958, 1958, 1959, 1959, 1959, 1959,
+     1959, 1959, 1959, 1959, 1959, 1960, 1960, 1960, 1960, 1960,
+
+     1960, 1960, 1960, 1960, 1961, 1961, 1961, 1961, 1961, 1961,
+     1961, 1961, 1961, 1962, 1962, 1962, 1962, 1962, 1962, 1962,
+     1962, 1962, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963,
+     1963, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964,
+     1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1966,
+     1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1967, 1967,
+     1967, 1967, 1967, 1967, 1967, 1967, 1967, 1968, 1968, 1968,
+     1968, 1968, 1968, 1968, 1968, 1968, 1969, 1969, 1969, 1969,
+     1969, 1969, 1969, 1969, 1969, 1970, 1970, 1970, 1970, 1970,
+     1970, 1970, 1970, 1970, 1971, 1971, 1971, 1971, 1971, 1971,
+
+     1971, 1971, 1971, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
+     1972, 1972, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+     1973, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
+     1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1976,
+     1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1977, 1977,
+     1977, 1977, 1977, 1977, 1977, 1977, 1977, 1978, 1978, 1978,
+     1978, 1978, 1978, 1978, 1978, 1978, 1979, 1979, 1979, 1979,
+     1979, 1979, 1979, 1979, 1979, 1980, 1980, 1980,    0,    0,
+        0, 1980, 1981, 1981, 1981,    0,    0,    0, 1981, 1982,
+     1982, 1982,    0,    0,    0, 1982, 1983, 1983, 1983,    0,
+
+        0,    0, 1983, 1984, 1984, 1984,    0,    0,    0, 1984,
+     1985, 1985, 1985,    0,    0,    0, 1985, 1986, 1986, 1986,
+        0,    0,    0, 1986, 1987, 1987, 1987,    0,    0,    0,
+     1987, 1988, 1988, 1988,    0,    0,    0, 1988, 1989, 1989,
+     1989,    0,    0,    0, 1989, 1990, 1990, 1990,    0,    0,
+        0, 1990, 1991, 1991, 1991,    0,    0,    0, 1991, 1992,
+     1992, 1992,    0,    0,    0, 1992, 1993, 1993, 1993,    0,
+        0,    0, 1993, 1994, 1994, 1994,    0,    0,    0, 1994,
+     1995, 1995, 1995,    0,    0,    0, 1995, 1996, 1996, 1996,
+        0,    0,    0, 1996, 1997, 1997, 1997, 1997, 1997, 1997,
+
+     1997,    0, 1997, 1998,    0,    0,    0, 1998, 1999,    0,
+        0,    0, 1999, 2000,    0,    0,    0, 2000, 2001,    0,
+        0,    0, 2001, 2002,    0,    0,    0, 2002, 2003,    0,
+        0,    0, 2003, 2004,    0,    0,    0, 2004, 2005,    0,
+        0,    0, 2005, 2006,    0,    0,    0, 2006, 2007,    0,
+        0,    0, 2007, 2008,    0,    0,    0, 2008, 2009, 2009,
+     2009,    0,    0,    0, 2009, 2010,    0,    0,    0, 2010,
+     2011, 2011, 2011,    0,    0,    0, 2011, 2012,    0,    0,
+        0, 2012, 2013, 2013, 2013,    0,    0,    0, 2013, 2014,
+        0,    0,    0, 2014, 2015, 2015, 2015,    0,    0,    0,
+
+     2015, 2016,    0,    0,    0, 2016, 2017, 2017, 2017,    0,
+        0,    0, 2017, 2018,    0,    0,    0, 2018, 2019, 2019,
+     2019,    0,    0,    0, 2019, 2020,    0,    0,    0, 2020,
+     2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2022,
+        0,    0,    0,    0, 2022, 2023, 2023, 2023,    0,    0,
+        0, 2023, 2024, 2024, 2024, 2024,    0,    0, 2024, 2024,
+     2025, 2025, 2025,    0,    0,    0, 2025, 2026, 2026, 2026,
+     2026,    0,    0, 2026, 2026, 2027, 2027, 2027,    0,    0,
+        0, 2027, 2028, 2028, 2028, 2028,    0,    0, 2028, 2028,
+     2029, 2029, 2029,    0,    0,    0, 2029, 2030, 2030, 2030,
+
+     2030,    0,    0, 2030, 2030, 2031, 2031, 2031,    0,    0,
+        0, 2031, 2032, 2032, 2032, 2032,    0,    0, 2032, 2032,
+     2033, 2033, 2033,    0,    0,    0, 2033, 2034, 2034, 2034,
+     2034,    0,    0, 2034, 2034, 2035, 2035, 2035,    0,    0,
+        0, 2035, 2036, 2036, 2036, 2036,    0,    0, 2036, 2036,
+     2037, 2037, 2037,    0,    0,    0, 2037, 2038, 2038, 2038,
+     2038,    0,    0, 2038, 2038, 2039, 2039, 2039,    0,    0,
+        0, 2039, 2040, 2040, 2040, 2040,    0,    0, 2040, 2040,
+     2041, 2041, 2041,    0,    0,    0, 2041, 2042, 2042, 2042,
+     2042,    0,    0, 2042, 2042, 2043, 2043, 2043, 2043,    0,
+
+        0, 2043, 2043, 2044, 2044, 2044,    0,    0,    0, 2044,
+     2045, 2045, 2045, 2045,    0,    0, 2045, 2045, 2046, 2046,
+     2046,    0,    0,    0, 2046, 2047, 2047, 2047, 2047,    0,
+        0, 2047, 2047, 2048, 2048, 2048,    0,    0,    0, 2048,
+     2049, 2049, 2049, 2049,    0,    0, 2049, 2049, 2050, 2050,
+     2050, 2050,    0,    0, 2050, 2050, 2051, 2051, 2051,    0,
+        0,    0, 2051, 2052, 2052, 2052, 2052,    0,    0, 2052,
+     2052, 2053, 2053, 2053,    0,    0,    0, 2053, 2054, 2054,
+     2054, 2054,    0,    0, 2054, 2054, 2055, 2055, 2055, 2055,
+     2055, 2055, 2055, 2055, 2055, 2056,    0, 2056,    0,    0,
+
+     2056, 2057, 2057, 2057,    0,    0,    0, 2057, 2058, 2058,
+     2058, 2058,    0,    0, 2058, 2058, 2059, 2059, 2059, 2059,
+        0, 2059,    0, 2059, 2060, 2060, 2060, 2060,    0,    0,
+     2060, 2060, 2061, 2061, 2061, 2061,    0, 2061,    0, 2061,
+     2062, 2062, 2062, 2062,    0,    0, 2062, 2062, 2063, 2063,
+     2063,    0,    0,    0, 2063, 2064, 2064, 2064, 2064,    0,
+        0, 2064, 2064, 2065, 2065, 2065,    0,    0,    0, 2065,
+     2066, 2066, 2066, 2066,    0,    0, 2066, 2066, 2067, 2067,
+     2067,    0,    0,    0, 2067, 2068, 2068, 2068, 2068,    0,
+        0, 2068, 2068, 2069, 2069, 2069,    0,    0,    0, 2069,
+
+     2070, 2070, 2070, 2070,    0,    0, 2070, 2070, 2071, 2071,
+     2071,    0,    0,    0, 2071, 2072, 2072, 2072, 2072,    0,
+        0, 2072, 2072, 2073, 2073, 2073,    0,    0,    0, 2073,
+     2074, 2074, 2074, 2074,    0,    0, 2074, 2074, 2075, 2075,
+     2075,    0,    0,    0, 2075, 2076, 2076, 2076, 2076,    0,
+        0, 2076, 2076, 2077, 2077, 2077, 2077,    0,    0, 2077,
+     2077, 2078, 2078, 2078,    0,    0,    0, 2078, 2079, 2079,
+     2079, 2079,    0,    0, 2079, 2079, 2080, 2080, 2080,    0,
+        0,    0, 2080, 2081, 2081, 2081, 2081,    0,    0, 2081,
+     2081, 2082, 2082, 2082,    0,    0,    0, 2082, 2083, 2083,
+
+     2083, 2083,    0,    0, 2083, 2083, 2084, 2084, 2084, 2084,
+        0,    0, 2084, 2084, 2085, 2085, 2085,    0,    0,    0,
+     2085, 2086, 2086, 2086, 2086,    0,    0, 2086, 2086, 2087,
+     2087, 2087,    0,    0,    0, 2087, 2088, 2088, 2088, 2088,
+        0,    0, 2088, 2088, 2089, 2089, 2089, 2089, 2089, 2089,
+     2089, 2089, 2089, 2090, 2090, 2090, 2090, 2090, 2090, 2090,
+     2090, 2090, 2091, 2091, 2091,    0,    0,    0, 2091, 2092,
+     2092, 2092, 2092,    0,    0, 2092, 2092, 2093, 2093, 2093,
+     2093,    0,    0, 2093, 2093, 2094, 2094, 2094,    0,    0,
+        0, 2094, 2095, 2095, 2095, 2095,    0,    0, 2095, 2095,
+
+     2096, 2096, 2096,    0,    0,    0, 2096, 2097, 2097, 2097,
+     2097,    0,    0, 2097, 2097, 2098, 2098, 2098,    0,    0,
+        0, 2098, 2099, 2099, 2099, 2099,    0,    0, 2099, 2099,
+     2100, 2100, 2100,    0,    0,    0, 2100, 2101, 2101, 2101,
+     2101,    0,    0, 2101, 2101, 2102, 2102, 2102,    0,    0,
+        0, 2102, 2103, 2103, 2103, 2103,    0,    0, 2103, 2103,
+     2104, 2104, 2104,    0,    0,    0, 2104, 2105, 2105, 2105,
+     2105,    0,    0, 2105, 2105, 2106, 2106, 2106, 2106,    0,
+     2106,    0, 2106, 2107, 2107, 2107, 2107,    0,    0, 2107,
+     2107, 2108, 2108, 2108, 2108,    0, 2108,    0, 2108, 2109,
+
+     2109, 2109, 2109,    0,    0, 2109, 2109, 2110, 2110, 2110,
+     2110,    0,    0, 2110, 2110, 2111, 2111, 2111,    0,    0,
+        0, 2111, 2112, 2112, 2112, 2112,    0,    0, 2112, 2112,
+     2113, 2113, 2113,    0,    0,    0, 2113, 2114, 2114, 2114,
+     2114,    0,    0, 2114, 2114, 2115, 2115, 2115,    0,    0,
+        0, 2115, 2116, 2116, 2116, 2116,    0,    0, 2116, 2116,
+     2117, 2117, 2117, 2117,    0,    0, 2117, 2117, 2118, 2118,
+     2118,    0,    0,    0, 2118, 2119, 2119, 2119, 2119,    0,
+        0, 2119, 2119, 2120, 2120, 2120, 2120,    0, 2120,    0,
+     2120, 2121, 2121, 2121, 2121,    0,    0, 2121, 2121, 2122,
+
+     2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2123, 2123,
+     2123, 2123, 2123, 2123, 2123, 2123, 2123, 2124, 2124, 2124,
+        0,    0,    0, 2124, 2125, 2125, 2125, 2125,    0,    0,
+     2125, 2125, 2126, 2126, 2126, 2126,    0,    0, 2126, 2126,
+     2127, 2127, 2127,    0,    0,    0, 2127, 2128, 2128, 2128,
+     2128,    0,    0, 2128, 2128, 2129, 2129, 2129,    0,    0,
+        0, 2129, 2130, 2130, 2130, 2130,    0,    0, 2130, 2130,
+     2131, 2131, 2131,    0,    0,    0, 2131, 2132, 2132, 2132,
+     2132,    0,    0, 2132, 2132, 2133, 2133, 2133, 2133,    0,
+     2133,    0, 2133, 2134, 2134, 2134, 2134,    0, 2134,    0,
+
+     2134, 2135, 2135, 2135, 2135,    0,    0, 2135, 2135, 2136,
+     2136, 2136,    0,    0,    0, 2136, 2137, 2137, 2137, 2137,
+        0,    0, 2137, 2137, 2138, 2138, 2138, 2138,    0,    0,
+     2138, 2138, 2139, 2139, 2139, 2139,    0, 2139,    0, 2139,
+     2140, 2140, 2140, 2140,    0,    0, 2140, 2140, 2141, 2141,
+     2141, 2141,    0,    0, 2141, 2141, 2142, 2142, 2142,    0,
+        0,    0, 2142, 2143, 2143, 2143, 2143,    0,    0, 2143,
+     2143, 2144, 2144, 2144, 2144,    0, 2144,    0, 2144, 2145,
+     2145, 2145, 2145,    0,    0, 2145, 2145, 2146, 2146, 2146,
+     2146,    0, 2146,    0, 2146, 2147, 2147, 2147, 2147,    0,
+
+        0, 2147, 2147, 2148, 2148, 2148, 2148,    0,    0, 2148,
+     2148, 2149, 2149, 2149,    0,    0,    0, 2149, 2150, 2150,
+     2150, 2150,    0,    0, 2150, 2150, 2151, 2151, 2151, 2151,
+        0,    0, 2151, 2151, 2152, 2152, 2152, 2152, 2152, 2152,
+     2152, 2152, 2152, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+     2153, 2153, 2154, 2154, 2154, 2154,    0, 2154,    0, 2154,
+     2155, 2155, 2155, 2155,    0,    0, 2155, 2155, 2156, 2156,
+     2156, 2156,    0,    0, 2156, 2156, 2157, 2157, 2157,    0,
+        0,    0, 2157, 2158, 2158, 2158, 2158,    0,    0, 2158,
+     2158, 2159, 2159, 2159,    0,    0,    0, 2159, 2160, 2160,
+
+     2160, 2160,    0,    0, 2160, 2160, 2161, 2161, 2161,    0,
+        0,    0, 2161, 2162, 2162, 2162, 2162,    0,    0, 2162,
+     2162, 2163, 2163, 2163, 2163,    0, 2163,    0, 2163, 2164,
+     2164, 2164, 2164,    0,    0, 2164, 2164, 2165, 2165, 2165,
+        0,    0,    0, 2165, 2166, 2166, 2166, 2166, 2166, 2166,
+     2166, 2166, 2166, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
+     2167, 2167, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
+     2168, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
+     2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2171,
+     2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 1940, 1940,
+
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940,
+     1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940
     } ;
 
 /* Table of booleans, true if rule could match eol. */
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[208] =
+static yyconst flex_int32_t yy_rule_can_match_eol[337] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 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, 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, 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, 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, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 
-    0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 
-    0, 0, 1, 0, 0, 0, 1, 0,     };
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
+    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, 0, 0, 0, 0, 1, 1, 0, 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, 0, 0, 0, 0, 1, 1, 0, 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, 0, 0, 0, 0, 1, 1, 0, 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, 0, 0, 0, 0, 1, 1, 0, 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, 0, 0, 0, 0, 1, 1, 0, 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, 0, 0, 0, 0, 1, 1, 0, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
+    0, 0, 1, 1, 0, 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;
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -1672,12 +2754,12 @@ int surf_parse__flex_debug = 0;
 #define YY_RESTORE_YY_MORE_OFFSET
 char *surf_parse_text;
 /* Validating XML processor for surf/surfxml.dtd.
 #define YY_RESTORE_YY_MORE_OFFSET
 char *surf_parse_text;
 /* Validating XML processor for surf/surfxml.dtd.
- * Generated 2007/11/08 11:56:22.
+ * Generated 2007/11/29 14:32:38.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
- * (Id: flexml.pl,v 1.63 2007/10/11 14:46:08 mquinson Exp).
+ * (Id: flexml.pl,v 1.61 2006/09/13 16:34:33 wdowling Exp).
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
@@ -1720,27 +2802,25 @@ char *surf_parse_text;
 
 /* Version strings. */
 const char rcs_surfxml_flexml_skeleton[] =
 
 /* Version strings. */
 const char rcs_surfxml_flexml_skeleton[] =
- "$" "Id: skel,v 1.40 2007/10/11 09:57:24 mquinson Exp $";
+ "$" "Id: skel,v 1.38 2006/09/12 18:05:45 wdowling Exp $";
 const char rcs_surfxml_flexml[] =
 const char rcs_surfxml_flexml[] =
- "$" "Id: flexml.pl,v 1.63 2007/10/11 14:46:08 mquinson Exp $";
+ "$" "Id: flexml.pl,v 1.61 2006/09/13 16:34:33 wdowling Exp $";
 
 /* ANSI headers. */
 
 /* ANSI headers. */
-#include <stdlib.h> /* for realloc() -- needed here when using flex 2.5.4 */
+#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__)
+#  ifndef __STRICT_ANSI__
+#    include <io.h>
+#    include <process.h>
+#  endif
+#else
+#  include <unistd.h>
+#endif
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ctype.h>
-     
-#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__)
-# ifndef __STRICT_ANSI__
-#  include <io.h>
-#  include <process.h>
-# endif
-#else
-# include <unistd.h>
-#endif
-     
+
 #ifndef FLEXML_INDEXSTACKSIZE
 #define FLEXML_INDEXSTACKSIZE 1000
 #endif
 #ifndef FLEXML_INDEXSTACKSIZE
 #define FLEXML_INDEXSTACKSIZE 1000
 #endif
@@ -1757,78 +2837,142 @@ const char rcs_surfxml_flexml[] =
 int surfxml_pcdata_ix;
 extern char *surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
 int surfxml_pcdata_ix;
 extern char *surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
-AT_surfxml_link_id AX_surfxml_link_id;
-#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+AT_surfxml_random_generator AX_surfxml_random_generator;
+#define A_surfxml_random_generator AX_surfxml_random_generator
 AT_surfxml_prop_id AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 AT_surfxml_host_interference_recv AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 AT_surfxml_host_id AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
 AT_surfxml_prop_id AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 AT_surfxml_host_interference_recv AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 AT_surfxml_host_id AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
+AT_surfxml_set_id AX_surfxml_set_id;
+#define A_surfxml_set_id (surfxml_bufferstack + AX_surfxml_set_id)
 AT_surfxml_link_latency_file AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
 AT_surfxml_link_latency_file AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
-AT_surfxml_process_host AX_surfxml_process_host;
-#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
-AT_surfxml_host_availability_file AX_surfxml_host_availability_file;
-#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
 AT_surfxml_host_state AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 AT_surfxml_host_interference_send_recv AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
 AT_surfxml_host_state AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 AT_surfxml_host_interference_send_recv AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
-AT_surfxml_route_impact_on_dst_with_other_send AX_surfxml_route_impact_on_dst_with_other_send;
-#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
 AT_surfxml_host_interference_send AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
 AT_surfxml_host_interference_send AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
+AT_surfxml_set_suffix AX_surfxml_set_suffix;
+#define A_surfxml_set_suffix (surfxml_bufferstack + AX_surfxml_set_suffix)
 AT_surfxml_route_impact_on_dst AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
 AT_surfxml_route_impact_on_dst AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
-AT_surfxml_prop_value AX_surfxml_prop_value;
-#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
-AT_surfxml_route_impact_on_src_with_other_recv AX_surfxml_route_impact_on_src_with_other_recv;
-#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
 AT_surfxml_host_power AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
 AT_surfxml_host_power AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
-AT_surfxml_link_state_file AX_surfxml_link_state_file;
-#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
 AT_surfxml_router_id AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 AT_surfxml_process_start_time AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
 AT_surfxml_router_id AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 AT_surfxml_process_start_time AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
+AT_surfxml_cluster_suffix AX_surfxml_cluster_suffix;
+#define A_surfxml_cluster_suffix (surfxml_bufferstack + AX_surfxml_cluster_suffix)
 AT_surfxml_platform_xmlns_c_route AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
 AT_surfxml_platform_xmlns_c_route AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
-AT_surfxml_process_function AX_surfxml_process_function;
-#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
-AT_surfxml_host_max_outgoing_rate AX_surfxml_host_max_outgoing_rate;
-#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+AT_surfxml_cluster_prefix AX_surfxml_cluster_prefix;
+#define A_surfxml_cluster_prefix (surfxml_bufferstack + AX_surfxml_cluster_prefix)
+AT_surfxml_trace_file AX_surfxml_trace_file;
+#define A_surfxml_trace_file (surfxml_bufferstack + AX_surfxml_trace_file)
+AT_surfxml_route_action AX_surfxml_route_action;
+#define A_surfxml_route_action AX_surfxml_route_action
 AT_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
 AT_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
-AT_surfxml_link_c_ctn_id AX_surfxml_link_c_ctn_id;
-#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+AT_surfxml_random_min AX_surfxml_random_min;
+#define A_surfxml_random_min (surfxml_bufferstack + AX_surfxml_random_min)
 AT_surfxml_process_kill_time AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
 AT_surfxml_process_kill_time AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
-AT_surfxml_host_availability AX_surfxml_host_availability;
-#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+AT_surfxml_cluster_bb_bw AX_surfxml_cluster_bb_bw;
+#define A_surfxml_cluster_bb_bw (surfxml_bufferstack + AX_surfxml_cluster_bb_bw)
+AT_surfxml_trace_c_connect_element AX_surfxml_trace_c_connect_element;
+#define A_surfxml_trace_c_connect_element AX_surfxml_trace_c_connect_element
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 AT_surfxml_link_state AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 AT_surfxml_link_state AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
-AT_surfxml_route_src AX_surfxml_route_src;
-#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
 AT_surfxml_route_impact_on_src AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 AT_surfxml_link_bandwidth AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
 AT_surfxml_route_impact_on_src AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 AT_surfxml_link_bandwidth AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
+AT_surfxml_cluster_id AX_surfxml_cluster_id;
+#define A_surfxml_cluster_id (surfxml_bufferstack + AX_surfxml_cluster_id)
+AT_surfxml_random_mean AX_surfxml_random_mean;
+#define A_surfxml_random_mean (surfxml_bufferstack + AX_surfxml_random_mean)
+AT_surfxml_cluster_bb_lat AX_surfxml_cluster_bb_lat;
+#define A_surfxml_cluster_bb_lat (surfxml_bufferstack + AX_surfxml_cluster_bb_lat)
 AT_surfxml_link_latency AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
 AT_surfxml_link_latency AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
+AT_surfxml_trace_c_connect_trace_id AX_surfxml_trace_c_connect_trace_id;
+#define A_surfxml_trace_c_connect_trace_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_trace_id)
 AT_surfxml_platform_xmlns_c_link AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
 AT_surfxml_platform_xmlns_c_link AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
-AT_surfxml_include_file AX_surfxml_include_file;
-#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
 AT_surfxml_link_bandwidth_file AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
 AT_surfxml_link_bandwidth_file AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
+AT_surfxml_random_id AX_surfxml_random_id;
+#define A_surfxml_random_id (surfxml_bufferstack + AX_surfxml_random_id)
+AT_surfxml_set_radical AX_surfxml_set_radical;
+#define A_surfxml_set_radical (surfxml_bufferstack + AX_surfxml_set_radical)
+AT_surfxml_random_max AX_surfxml_random_max;
+#define A_surfxml_random_max (surfxml_bufferstack + AX_surfxml_random_max)
+AT_surfxml_link_id AX_surfxml_link_id;
+#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+AT_surfxml_process_host AX_surfxml_process_host;
+#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
+AT_surfxml_host_availability_file AX_surfxml_host_availability_file;
+#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
+AT_surfxml_cluster_lat AX_surfxml_cluster_lat;
+#define A_surfxml_cluster_lat (surfxml_bufferstack + AX_surfxml_cluster_lat)
+AT_surfxml_trace_periodicity AX_surfxml_trace_periodicity;
+#define A_surfxml_trace_periodicity (surfxml_bufferstack + AX_surfxml_trace_periodicity)
+AT_surfxml_foreach_set_id AX_surfxml_foreach_set_id;
+#define A_surfxml_foreach_set_id (surfxml_bufferstack + AX_surfxml_foreach_set_id)
+AT_surfxml_route_impact_on_dst_with_other_send AX_surfxml_route_impact_on_dst_with_other_send;
+#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
+AT_surfxml_prop_value AX_surfxml_prop_value;
+#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
+AT_surfxml_route_impact_on_src_with_other_recv AX_surfxml_route_impact_on_src_with_other_recv;
+#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
+AT_surfxml_link_state_file AX_surfxml_link_state_file;
+#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
+AT_surfxml_set_prefix AX_surfxml_set_prefix;
+#define A_surfxml_set_prefix (surfxml_bufferstack + AX_surfxml_set_prefix)
+AT_surfxml_cluster_power AX_surfxml_cluster_power;
+#define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
+AT_surfxml_process_function AX_surfxml_process_function;
+#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
+AT_surfxml_host_max_outgoing_rate AX_surfxml_host_max_outgoing_rate;
+#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+AT_surfxml_link_c_ctn_id AX_surfxml_link_c_ctn_id;
+#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+AT_surfxml_host_availability AX_surfxml_host_availability;
+#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+AT_surfxml_route_src AX_surfxml_route_src;
+#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
+AT_surfxml_route_c_multi_src AX_surfxml_route_c_multi_src;
+#define A_surfxml_route_c_multi_src (surfxml_bufferstack + AX_surfxml_route_c_multi_src)
+AT_surfxml_route_c_multi_action AX_surfxml_route_c_multi_action;
+#define A_surfxml_route_c_multi_action AX_surfxml_route_c_multi_action
+AT_surfxml_trace_id AX_surfxml_trace_id;
+#define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id)
+AT_surfxml_cluster_radical AX_surfxml_cluster_radical;
+#define A_surfxml_cluster_radical (surfxml_bufferstack + AX_surfxml_cluster_radical)
+AT_surfxml_include_file AX_surfxml_include_file;
+#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
+AT_surfxml_random_std_deviation AX_surfxml_random_std_deviation;
+#define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation)
+AT_surfxml_trace_c_connect_kind AX_surfxml_trace_c_connect_kind;
+#define A_surfxml_trace_c_connect_kind AX_surfxml_trace_c_connect_kind
+AT_surfxml_trace_c_connect_connector_id AX_surfxml_trace_c_connect_connector_id;
+#define A_surfxml_trace_c_connect_connector_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_connector_id)
+AT_surfxml_route_c_multi_dst AX_surfxml_route_c_multi_dst;
+#define A_surfxml_route_c_multi_dst (surfxml_bufferstack + AX_surfxml_route_c_multi_dst)
 AT_surfxml_host_state_file AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
 AT_surfxml_host_state_file AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
+AT_surfxml_route_c_multi_symmetric AX_surfxml_route_c_multi_symmetric;
+#define A_surfxml_route_c_multi_symmetric AX_surfxml_route_c_multi_symmetric
 AT_surfxml_route_dst AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
 AT_surfxml_route_dst AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
+AT_surfxml_cluster_bw AX_surfxml_cluster_bw;
+#define A_surfxml_cluster_bw (surfxml_bufferstack + AX_surfxml_cluster_bw)
 AT_surfxml_platform_version AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
 AT_surfxml_platform_version AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
@@ -1989,35 +3133,57 @@ const char* *surfxml_statenames=NULL;
 #define E_surfxml_platform 17
 #define AL_surfxml_include 18
 #define E_surfxml_include 19
 #define E_surfxml_platform 17
 #define AL_surfxml_include 18
 #define E_surfxml_include 19
-#define AL_surfxml_host 20
-#define S_surfxml_host 21
-#define S_surfxml_host_1 22
-#define S_surfxml_host_2 23
-#define E_surfxml_host 24
-#define AL_surfxml_prop 25
-#define E_surfxml_prop 26
-#define AL_surfxml_router 27
-#define E_surfxml_router 28
-#define AL_surfxml_link 29
-#define S_surfxml_link 30
-#define S_surfxml_link_1 31
-#define S_surfxml_link_2 32
-#define E_surfxml_link 33
-#define AL_surfxml_route 34
-#define S_surfxml_route 35
-#define S_surfxml_route_1 36
-#define S_surfxml_route_2 37
-#define E_surfxml_route 38
-#define AL_surfxml_link_c_ctn 39
-#define E_surfxml_link_c_ctn 40
-#define AL_surfxml_process 41
-#define S_surfxml_process 42
-#define S_surfxml_process_1 43
-#define S_surfxml_process_2 44
-#define E_surfxml_process 45
-#define AL_surfxml_argument 46
-#define E_surfxml_argument 47
-#define IMPOSSIBLE 48
+#define AL_surfxml_trace 20
+#define IN_trace 21
+#define AL_surfxml_random 22
+#define S_surfxml_random 23
+#define S_surfxml_random_1 24
+#define S_surfxml_random_2 25
+#define E_surfxml_random 26
+#define AL_surfxml_trace_c_connect 27
+#define E_surfxml_trace_c_connect 28
+#define AL_surfxml_set 29
+#define E_surfxml_set 30
+#define AL_surfxml_foreach 31
+#define S_surfxml_foreach 32
+#define S_surfxml_foreach_1 33
+#define E_surfxml_foreach 34
+#define AL_surfxml_host 35
+#define S_surfxml_host 36
+#define S_surfxml_host_1 37
+#define S_surfxml_host_2 38
+#define E_surfxml_host 39
+#define AL_surfxml_prop 40
+#define E_surfxml_prop 41
+#define AL_surfxml_cluster 42
+#define E_surfxml_cluster 43
+#define AL_surfxml_router 44
+#define E_surfxml_router 45
+#define AL_surfxml_link 46
+#define S_surfxml_link 47
+#define S_surfxml_link_1 48
+#define S_surfxml_link_2 49
+#define E_surfxml_link 50
+#define AL_surfxml_route_c_multi 51
+#define S_surfxml_route_c_multi 52
+#define S_surfxml_route_c_multi_1 53
+#define S_surfxml_route_c_multi_2 54
+#define E_surfxml_route_c_multi 55
+#define AL_surfxml_route 56
+#define S_surfxml_route 57
+#define S_surfxml_route_1 58
+#define S_surfxml_route_2 59
+#define E_surfxml_route 60
+#define AL_surfxml_link_c_ctn 61
+#define E_surfxml_link_c_ctn 62
+#define AL_surfxml_process 63
+#define S_surfxml_process 64
+#define S_surfxml_process_1 65
+#define S_surfxml_process_2 66
+#define E_surfxml_process 67
+#define AL_surfxml_argument 68
+#define E_surfxml_argument 69
+#define IMPOSSIBLE 70
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -2236,6 +3402,21 @@ YY_DECL
   surfxml_statenames[E_surfxml_platform] = "platform";
   surfxml_statenames[AL_surfxml_include] = NULL;
   surfxml_statenames[E_surfxml_include] = "include";
   surfxml_statenames[E_surfxml_platform] = "platform";
   surfxml_statenames[AL_surfxml_include] = NULL;
   surfxml_statenames[E_surfxml_include] = "include";
+  surfxml_statenames[AL_surfxml_trace] = NULL;
+  surfxml_statenames[IN_trace] = "trace";
+  surfxml_statenames[AL_surfxml_random] = NULL;
+  surfxml_statenames[S_surfxml_random] = "random";
+  surfxml_statenames[S_surfxml_random_1] = "random";
+  surfxml_statenames[S_surfxml_random_2] = "random";
+  surfxml_statenames[E_surfxml_random] = "random";
+  surfxml_statenames[AL_surfxml_trace_c_connect] = NULL;
+  surfxml_statenames[E_surfxml_trace_c_connect] = "trace:connect";
+  surfxml_statenames[AL_surfxml_set] = NULL;
+  surfxml_statenames[E_surfxml_set] = "set";
+  surfxml_statenames[AL_surfxml_foreach] = NULL;
+  surfxml_statenames[S_surfxml_foreach] = "foreach";
+  surfxml_statenames[S_surfxml_foreach_1] = "foreach";
+  surfxml_statenames[E_surfxml_foreach] = "foreach";
   surfxml_statenames[AL_surfxml_host] = NULL;
   surfxml_statenames[S_surfxml_host] = "host";
   surfxml_statenames[S_surfxml_host_1] = "host";
   surfxml_statenames[AL_surfxml_host] = NULL;
   surfxml_statenames[S_surfxml_host] = "host";
   surfxml_statenames[S_surfxml_host_1] = "host";
@@ -2243,6 +3424,8 @@ YY_DECL
   surfxml_statenames[E_surfxml_host] = "host";
   surfxml_statenames[AL_surfxml_prop] = NULL;
   surfxml_statenames[E_surfxml_prop] = "prop";
   surfxml_statenames[E_surfxml_host] = "host";
   surfxml_statenames[AL_surfxml_prop] = NULL;
   surfxml_statenames[E_surfxml_prop] = "prop";
+  surfxml_statenames[AL_surfxml_cluster] = NULL;
+  surfxml_statenames[E_surfxml_cluster] = "cluster";
   surfxml_statenames[AL_surfxml_router] = NULL;
   surfxml_statenames[E_surfxml_router] = "router";
   surfxml_statenames[AL_surfxml_link] = NULL;
   surfxml_statenames[AL_surfxml_router] = NULL;
   surfxml_statenames[E_surfxml_router] = "router";
   surfxml_statenames[AL_surfxml_link] = NULL;
@@ -2250,6 +3433,11 @@ YY_DECL
   surfxml_statenames[S_surfxml_link_1] = "link";
   surfxml_statenames[S_surfxml_link_2] = "link";
   surfxml_statenames[E_surfxml_link] = "link";
   surfxml_statenames[S_surfxml_link_1] = "link";
   surfxml_statenames[S_surfxml_link_2] = "link";
   surfxml_statenames[E_surfxml_link] = "link";
+  surfxml_statenames[AL_surfxml_route_c_multi] = NULL;
+  surfxml_statenames[S_surfxml_route_c_multi] = "route:multi";
+  surfxml_statenames[S_surfxml_route_c_multi_1] = "route:multi";
+  surfxml_statenames[S_surfxml_route_c_multi_2] = "route:multi";
+  surfxml_statenames[E_surfxml_route_c_multi] = "route:multi";
   surfxml_statenames[AL_surfxml_route] = NULL;
   surfxml_statenames[S_surfxml_route] = "route";
   surfxml_statenames[S_surfxml_route_1] = "route";
   surfxml_statenames[AL_surfxml_route] = NULL;
   surfxml_statenames[S_surfxml_route] = "route";
   surfxml_statenames[S_surfxml_route_1] = "route";
@@ -2319,13 +3507,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];
                        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 >= 1159 )
+                               if ( yy_current_state >= 1941 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 3543 );
+               while ( yy_base[yy_current_state] != 7099 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2440,11 +3628,6 @@ FAIL("EOF in prolog.");
 case 16:
 /* rule 16 can match eol */
 YY_RULE_SETUP
 case 16:
 /* rule 16 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <platform> is not allowed here.");
-       YY_BREAK
-case 17:
-/* rule 17 can match eol */
-YY_RULE_SETUP
 {
   AX_surfxml_platform_version = 1;
   AX_surfxml_platform_xmlns_c_link = 5;
 {
   AX_surfxml_platform_version = 1;
   AX_surfxml_platform_xmlns_c_link = 5;
@@ -2453,43 +3636,43 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version);
+       YY_BREAK
 case 18:
 /* rule 18 can match eol */
 YY_RULE_SETUP
 case 18:
 /* rule 18 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version);
        YY_BREAK
 case 19:
 /* rule 19 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 19:
 /* rule 19 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_xmlns_c_link);
        YY_BREAK
 case 20:
 /* rule 20 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 20:
 /* rule 20 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_xmlns_c_link);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_xmlns_c_link);
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_xmlns_c_link);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_xmlns_c_route);
        YY_BREAK
 case 22:
 /* rule 22 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 22:
 /* rule 22 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_xmlns_c_route);
-       YY_BREAK
-case 23:
-/* rule 23 can match eol */
-YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_xmlns_c_route);
        YY_BREAK
 ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_xmlns_c_route);
        YY_BREAK
-case 24:
+case 23:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform);
  }
        YY_BREAK
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform);
  }
        YY_BREAK
-case 25:
+case 24:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */
@@ -2498,11 +3681,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 26:
+case 25:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]);
        YY_BREAK
-case 27:
+case 26:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text);
        YY_BREAK
@@ -2510,8 +3693,8 @@ case YY_STATE_EOF(AL_surfxml_platform):
 FAIL("EOF in attribute list of `platform' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `platform' element.");
        YY_BREAK
 
-case 28:
-/* rule 28 can match eol */
+case 27:
+/* rule 27 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -2522,12 +3705,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 29:
-/* rule 29 can match eol */
+case 28:
+/* rule 28 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</platform>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</platform>' expected.",surf_parse_text);
        YY_BREAK
-case 30:
+case 29:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</platform>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</platform>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -2539,13 +3722,8 @@ case YY_STATE_EOF(E_surfxml_platform):
 FAIL("Premature EOF: `</platform>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</platform>' expected.");
        YY_BREAK
 
-case 31:
-/* rule 31 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <include> is not allowed here.");
-       YY_BREAK
-case 32:
-/* rule 32 can match eol */
+case 30:
+/* rule 30 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_include_file = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_include_file = 0;
@@ -2553,24 +3731,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 33:
-/* rule 33 can match eol */
+case 31:
+/* rule 31 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 34:
-/* rule 34 can match eol */
+case 32:
+/* rule 32 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 35:
+case 33:
 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(E_surfxml_include);
  }
        YY_BREAK
 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(E_surfxml_include);
  }
        YY_BREAK
-case 36:
+case 34:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
@@ -2581,11 +3759,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 37:
+case 35:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]);
        YY_BREAK
-case 38:
+case 36:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text);
        YY_BREAK
@@ -2593,8 +3771,8 @@ case YY_STATE_EOF(AL_surfxml_include):
 FAIL("EOF in attribute list of `include' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `include' element.");
        YY_BREAK
 
-case 39:
-/* rule 39 can match eol */
+case 37:
+/* rule 37 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -2606,12 +3784,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 40:
-/* rule 40 can match eol */
+case 38:
+/* rule 38 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</include>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</include>' expected.",surf_parse_text);
        YY_BREAK
-case 41:
+case 39:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</include>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</include>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -2619,227 +3797,767 @@ case YY_STATE_EOF(E_surfxml_include):
 FAIL("Premature EOF: `</include>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</include>' expected.");
        YY_BREAK
 
+case 40:
+/* rule 40 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_trace_id = 0;
+  AX_surfxml_trace_file = 0;
+  AX_surfxml_trace_periodicity = 0;
+  ENTER(AL_surfxml_trace); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 41:
+/* rule 41 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id);
+       YY_BREAK
 case 42:
 /* rule 42 can match eol */
 YY_RULE_SETUP
 case 42:
 /* rule 42 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <host> is not allowed here.");
+ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id);
        YY_BREAK
 case 43:
 /* rule 43 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 43:
 /* rule 43 can match eol */
 YY_RULE_SETUP
-{
-  AX_surfxml_host_id = 0;
-  AX_surfxml_host_power = 0;
-  AX_surfxml_host_availability = 69;
-  AX_surfxml_host_availability_file = 0;
-  AX_surfxml_host_state = A_surfxml_host_state_ON;
-  AX_surfxml_host_state_file = 0;
-  AX_surfxml_host_interference_send = 73;
-  AX_surfxml_host_interference_recv = 77;
-  AX_surfxml_host_interference_send_recv = 81;
-  AX_surfxml_host_max_outgoing_rate = 85;
-  ENTER(AL_surfxml_host); pushbuffer(0);
-  }
+ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
        YY_BREAK
-
 case 44:
 /* rule 44 can match eol */
 YY_RULE_SETUP
 case 44:
 /* rule 44 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
 case 45:
 /* rule 45 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 45:
 /* rule 45 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
 case 46:
 /* rule 46 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 46:
 /* rule 46 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
 case 47:
        YY_BREAK
 case 47:
-/* rule 47 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
+{
+  if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
+  if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element.");
+  LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace);
+ }
        YY_BREAK
 case 48:
        YY_BREAK
 case 48:
-/* rule 48 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
+{
+  if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
+  if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element.");
+  LEAVE; STag_surfxml_trace(); surfxml_pcdata_ix = 0; ETag_surfxml_trace(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
        YY_BREAK
 case 49:
        YY_BREAK
 case 49:
-/* rule 49 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
+FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]);
        YY_BREAK
 case 50:
        YY_BREAK
 case 50:
-/* rule 50 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability_file);
+FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_trace):
+FAIL("EOF in attribute list of `trace' element.");
        YY_BREAK
        YY_BREAK
+
 case 51:
 /* rule 51 can match eol */
 YY_RULE_SETUP
 case 51:
 /* rule 51 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability_file);
+{
+  LEAVE;
+  BUFFERDONE;
+  ETag_surfxml_trace();
+  surfxml_pcdata_ix = popbuffer();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
        YY_BREAK
 case 52:
 /* rule 52 can match eol */
        YY_BREAK
 case 52:
 /* rule 52 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</trace>' expected.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(IN_trace):
+FAIL("Premature EOF: `</trace>' expected.");
+       YY_BREAK
+
 case 53:
 /* rule 53 can match eol */
 YY_RULE_SETUP
 case 53:
 /* rule 53 can match eol */
 YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_ON;
+{
+  AX_surfxml_random_id = 0;
+  AX_surfxml_random_min = 0;
+  AX_surfxml_random_max = 0;
+  AX_surfxml_random_mean = 0;
+  AX_surfxml_random_std_deviation = 0;
+  AX_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
+  ENTER(AL_surfxml_random); pushbuffer(0);
+  }
        YY_BREAK
        YY_BREAK
+
 case 54:
 /* rule 54 can match eol */
 case 54:
 /* rule 54 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id);
+       YY_BREAK
 case 55:
 /* rule 55 can match eol */
 YY_RULE_SETUP
 case 55:
 /* rule 55 can match eol */
 YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_OFF;
+ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id);
        YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state_file);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
 case 57:
 /* rule 57 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 57:
 /* rule 57 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state_file);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
 case 58:
 /* rule 58 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 58:
 /* rule 58 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_send);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_send);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
 case 60:
 /* rule 60 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 60:
 /* rule 60 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_recv);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
 case 61:
 /* rule 61 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 61:
 /* rule 61 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_recv);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
 case 62:
 /* rule 62 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 62:
 /* rule 62 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_send_recv);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std_deviation);
        YY_BREAK
 case 63:
 /* rule 63 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 case 63:
 /* rule 63 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_send_recv);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std_deviation);
        YY_BREAK
 case 64:
 /* rule 64 can match eol */
        YY_BREAK
 case 64:
 /* rule 64 can match eol */
-YY_RULE_SETUP
-ENTER(VALUE1); BUFFERSET(AX_surfxml_host_max_outgoing_rate);
-       YY_BREAK
 case 65:
 /* rule 65 can match eol */
 YY_RULE_SETUP
 case 65:
 /* rule 65 can match eol */
 YY_RULE_SETUP
-ENTER(VALUE2); BUFFERSET(AX_surfxml_host_max_outgoing_rate);
+A_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
        YY_BREAK
 case 66:
        YY_BREAK
 case 66:
+/* rule 66 can match eol */
+case 67:
+/* rule 67 can match eol */
+YY_RULE_SETUP
+A_surfxml_random_generator = A_surfxml_random_generator_RAND;
+       YY_BREAK
+case 68:
 YY_RULE_SETUP
 {
 YY_RULE_SETUP
 {
-  if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
-  if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element.");
-  LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
+  if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
+  if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element.");
+  if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element.");
+  if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element.");
+  if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element.");
+  LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(S_surfxml_random);
  }
        YY_BREAK
  }
        YY_BREAK
-case 67:
+case 69:
 YY_RULE_SETUP
 {
 YY_RULE_SETUP
 {
-  if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
-  if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element.");
-  LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
+  if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
+  if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element.");
+  if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element.");
+  if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element.");
+  if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element.");
+  LEAVE; STag_surfxml_random(); surfxml_pcdata_ix = 0; ETag_surfxml_random(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
-case 68:
+case 70:
 YY_RULE_SETUP
 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 random element.", surf_parse_text[0]);
        YY_BREAK
        YY_BREAK
-case 69:
+case 71:
 YY_RULE_SETUP
 YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
+FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text);
        YY_BREAK
        YY_BREAK
-case YY_STATE_EOF(AL_surfxml_host):
-FAIL("EOF in attribute list of `host' element.");
+case YY_STATE_EOF(AL_surfxml_random):
+FAIL("EOF in attribute list of `random' element.");
        YY_BREAK
 
        YY_BREAK
 
-case 70:
-/* rule 70 can match eol */
+case 72:
+/* rule 72 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
-  ETag_surfxml_host();
+  ETag_surfxml_random();
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
-case 71:
-/* rule 71 can match eol */
-YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
-       YY_BREAK
-case 72:
-YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
-       YY_BREAK
-case YY_STATE_EOF(S_surfxml_host):
-case YY_STATE_EOF(E_surfxml_host):
-case YY_STATE_EOF(S_surfxml_host_2):
-FAIL("Premature EOF: `</host>' expected.");
-       YY_BREAK
-
 case 73:
 /* rule 73 can match eol */
 YY_RULE_SETUP
 case 73:
 /* rule 73 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <prop> is not allowed here.");
+FAIL("Unexpected end-tag `%s': `</random>' expected.",surf_parse_text);
        YY_BREAK
 case 74:
        YY_BREAK
 case 74:
-/* rule 74 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-{
-  AX_surfxml_prop_id = 0;
-  AX_surfxml_prop_value = 0;
-  ENTER(AL_surfxml_prop); pushbuffer(0);
-  }
+FAIL("Unexpected character `%c': `</random>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(S_surfxml_random_2):
+case YY_STATE_EOF(S_surfxml_random):
+case YY_STATE_EOF(E_surfxml_random):
+FAIL("Premature EOF: `</random>' expected.");
        YY_BREAK
 
 case 75:
 /* rule 75 can match eol */
 YY_RULE_SETUP
        YY_BREAK
 
 case 75:
 /* rule 75 can match eol */
 YY_RULE_SETUP
+{
+  AX_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_AVAILABILITY;
+  AX_surfxml_trace_c_connect_trace_id = 0;
+  AX_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_HOST;
+  AX_surfxml_trace_c_connect_connector_id = 0;
+  ENTER(AL_surfxml_trace_c_connect); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 76:
+/* rule 76 can match eol */
+case 77:
+/* rule 77 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_AVAILABILITY;
+       YY_BREAK
+case 78:
+/* rule 78 can match eol */
+case 79:
+/* rule 79 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_BANDWIDTH;
+       YY_BREAK
+case 80:
+/* rule 80 can match eol */
+case 81:
+/* rule 81 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_LATENCY;
+       YY_BREAK
+case 82:
+/* rule 82 can match eol */
+case 83:
+/* rule 83 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_POWER;
+       YY_BREAK
+case 84:
+/* rule 84 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_c_connect_trace_id);
+       YY_BREAK
+case 85:
+/* rule 85 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_c_connect_trace_id);
+       YY_BREAK
+case 86:
+/* rule 86 can match eol */
+case 87:
+/* rule 87 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_HOST;
+       YY_BREAK
+case 88:
+/* rule 88 can match eol */
+case 89:
+/* rule 89 can match eol */
+YY_RULE_SETUP
+A_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_LINK;
+       YY_BREAK
+case 90:
+/* rule 90 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_c_connect_connector_id);
+       YY_BREAK
+case 91:
+/* rule 91 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_c_connect_connector_id);
+       YY_BREAK
+case 92:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_trace_c_connect_trace_id) FAIL("Required attribute `trace_id' not set for `trace:connect' element.");
+  if (!AX_surfxml_trace_c_connect_connector_id) FAIL("Required attribute `connector_id' not set for `trace:connect' element.");
+  LEAVE; STag_surfxml_trace_c_connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace_c_connect);
+ }
+       YY_BREAK
+case 93:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_trace_c_connect_trace_id) FAIL("Required attribute `trace_id' not set for `trace:connect' element.");
+  if (!AX_surfxml_trace_c_connect_connector_id) FAIL("Required attribute `connector_id' not set for `trace:connect' element.");
+  LEAVE; STag_surfxml_trace_c_connect(); surfxml_pcdata_ix = 0; ETag_surfxml_trace_c_connect(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+   case S_surfxml_platform_2: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 94:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of trace:connect element.", surf_parse_text[0]);
+       YY_BREAK
+case 95:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `trace:connect' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_trace_c_connect):
+FAIL("EOF in attribute list of `trace:connect' element.");
+       YY_BREAK
+
+case 96:
+/* rule 96 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_trace_c_connect();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+   case S_surfxml_platform_2: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 97:
+/* rule 97 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</trace:connect>' expected.",surf_parse_text);
+       YY_BREAK
+case 98:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</trace:connect>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_trace_c_connect):
+FAIL("Premature EOF: `</trace:connect>' expected.");
+       YY_BREAK
+
+case 99:
+/* rule 99 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_set_id = 0;
+  AX_surfxml_set_prefix = 0;
+  AX_surfxml_set_suffix = 0;
+  AX_surfxml_set_radical = 0;
+  ENTER(AL_surfxml_set); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 100:
+/* rule 100 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_set_id);
+       YY_BREAK
+case 101:
+/* rule 101 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_set_id);
+       YY_BREAK
+case 102:
+/* rule 102 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_set_prefix);
+       YY_BREAK
+case 103:
+/* rule 103 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_set_prefix);
+       YY_BREAK
+case 104:
+/* rule 104 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_set_suffix);
+       YY_BREAK
+case 105:
+/* rule 105 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_set_suffix);
+       YY_BREAK
+case 106:
+/* rule 106 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_set_radical);
+       YY_BREAK
+case 107:
+/* rule 107 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_set_radical);
+       YY_BREAK
+case 108:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_set_id) FAIL("Required attribute `id' not set for `set' element.");
+  if (!AX_surfxml_set_prefix) FAIL("Required attribute `prefix' not set for `set' element.");
+  if (!AX_surfxml_set_suffix) FAIL("Required attribute `suffix' not set for `set' element.");
+  if (!AX_surfxml_set_radical) FAIL("Required attribute `radical' not set for `set' element.");
+  LEAVE; STag_surfxml_set();surfxml_pcdata_ix = 0; ENTER(E_surfxml_set);
+ }
+       YY_BREAK
+case 109:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_set_id) FAIL("Required attribute `id' not set for `set' element.");
+  if (!AX_surfxml_set_prefix) FAIL("Required attribute `prefix' not set for `set' element.");
+  if (!AX_surfxml_set_suffix) FAIL("Required attribute `suffix' not set for `set' element.");
+  if (!AX_surfxml_set_radical) FAIL("Required attribute `radical' not set for `set' element.");
+  LEAVE; STag_surfxml_set(); surfxml_pcdata_ix = 0; ETag_surfxml_set(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 110:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of set element.", surf_parse_text[0]);
+       YY_BREAK
+case 111:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `set' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_set):
+FAIL("EOF in attribute list of `set' element.");
+       YY_BREAK
+
+case 112:
+/* rule 112 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_set();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 113:
+/* rule 113 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</set>' expected.",surf_parse_text);
+       YY_BREAK
+case 114:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</set>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_set):
+FAIL("Premature EOF: `</set>' expected.");
+       YY_BREAK
+
+case 115:
+/* rule 115 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_foreach_set_id = 0;
+  ENTER(AL_surfxml_foreach); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 116:
+/* rule 116 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_foreach_set_id);
+       YY_BREAK
+case 117:
+/* rule 117 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_foreach_set_id);
+       YY_BREAK
+case 118:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_foreach_set_id) FAIL("Required attribute `set_id' not set for `foreach' element.");
+  LEAVE; STag_surfxml_foreach();surfxml_pcdata_ix = 0; ENTER(S_surfxml_foreach);
+ }
+       YY_BREAK
+case 119:
+YY_RULE_SETUP
+FAIL("`foreach' element cannot be empty.");
+       YY_BREAK
+case 120:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of foreach element.", surf_parse_text[0]);
+       YY_BREAK
+case 121:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `foreach' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_foreach):
+FAIL("EOF in attribute list of `foreach' element.");
+       YY_BREAK
+
+case 122:
+/* rule 122 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_foreach();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 123:
+/* rule 123 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</foreach>' expected.",surf_parse_text);
+       YY_BREAK
+case 124:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</foreach>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_foreach):
+FAIL("Premature EOF: `</foreach>' expected.");
+       YY_BREAK
+
+case 125:
+/* rule 125 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_host_id = 0;
+  AX_surfxml_host_power = 0;
+  AX_surfxml_host_availability = 69;
+  AX_surfxml_host_availability_file = 0;
+  AX_surfxml_host_state = A_surfxml_host_state_ON;
+  AX_surfxml_host_state_file = 0;
+  AX_surfxml_host_interference_send = 73;
+  AX_surfxml_host_interference_recv = 77;
+  AX_surfxml_host_interference_send_recv = 81;
+  AX_surfxml_host_max_outgoing_rate = 85;
+  ENTER(AL_surfxml_host); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 126:
+/* rule 126 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
+       YY_BREAK
+case 127:
+/* rule 127 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
+       YY_BREAK
+case 128:
+/* rule 128 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
+       YY_BREAK
+case 129:
+/* rule 129 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
+       YY_BREAK
+case 130:
+/* rule 130 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
+       YY_BREAK
+case 131:
+/* rule 131 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
+       YY_BREAK
+case 132:
+/* rule 132 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability_file);
+       YY_BREAK
+case 133:
+/* rule 133 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability_file);
+       YY_BREAK
+case 134:
+/* rule 134 can match eol */
+case 135:
+/* rule 135 can match eol */
+YY_RULE_SETUP
+A_surfxml_host_state = A_surfxml_host_state_ON;
+       YY_BREAK
+case 136:
+/* rule 136 can match eol */
+case 137:
+/* rule 137 can match eol */
+YY_RULE_SETUP
+A_surfxml_host_state = A_surfxml_host_state_OFF;
+       YY_BREAK
+case 138:
+/* rule 138 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state_file);
+       YY_BREAK
+case 139:
+/* rule 139 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state_file);
+       YY_BREAK
+case 140:
+/* rule 140 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_send);
+       YY_BREAK
+case 141:
+/* rule 141 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_send);
+       YY_BREAK
+case 142:
+/* rule 142 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_recv);
+       YY_BREAK
+case 143:
+/* rule 143 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_recv);
+       YY_BREAK
+case 144:
+/* rule 144 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_interference_send_recv);
+       YY_BREAK
+case 145:
+/* rule 145 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_interference_send_recv);
+       YY_BREAK
+case 146:
+/* rule 146 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_host_max_outgoing_rate);
+       YY_BREAK
+case 147:
+/* rule 147 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_host_max_outgoing_rate);
+       YY_BREAK
+case 148:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
+  if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element.");
+  LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
+ }
+       YY_BREAK
+case 149:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
+  if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element.");
+  LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+   case S_surfxml_foreach: SET(S_surfxml_foreach_1); break;
+  }
+ }
+       YY_BREAK
+case 150:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
+       YY_BREAK
+case 151:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_host):
+FAIL("EOF in attribute list of `host' element.");
+       YY_BREAK
+
+case 152:
+/* rule 152 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_host();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+   case S_surfxml_foreach: SET(S_surfxml_foreach_1); break;
+  }
+ }
+       YY_BREAK
+case 153:
+/* rule 153 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
+       YY_BREAK
+case 154:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(S_surfxml_host):
+case YY_STATE_EOF(E_surfxml_host):
+case YY_STATE_EOF(S_surfxml_host_2):
+FAIL("Premature EOF: `</host>' expected.");
+       YY_BREAK
+
+case 155:
+/* rule 155 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_prop_id = 0;
+  AX_surfxml_prop_value = 0;
+  ENTER(AL_surfxml_prop); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 156:
+/* rule 156 can match eol */
+YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
 ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 76:
-/* rule 76 can match eol */
+case 157:
+/* rule 157 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 77:
-/* rule 77 can match eol */
+case 158:
+/* rule 158 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 78:
-/* rule 78 can match eol */
+case 159:
+/* rule 159 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 79:
+case 160:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -2847,24 +4565,25 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 80:
+case 161:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
   if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element.");
   LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */
   switch (YY_START) {
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
   if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element.");
   LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
   }
  }
        YY_BREAK
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
   }
  }
        YY_BREAK
-case 81:
+case 162:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
-case 82:
+case 163:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -2872,26 +4591,27 @@ case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 83:
-/* rule 83 can match eol */
+case 164:
+/* rule 164 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_prop();
   popbuffer(); /* attribute */
   switch (YY_START) {
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_prop();
   popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
   }
  }
        YY_BREAK
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
   }
  }
        YY_BREAK
-case 84:
-/* rule 84 can match eol */
+case 165:
+/* rule 165 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
-case 85:
+case 166:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -2899,13 +4619,185 @@ case YY_STATE_EOF(E_surfxml_prop):
 FAIL("Premature EOF: `</prop>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</prop>' expected.");
        YY_BREAK
 
-case 86:
-/* rule 86 can match eol */
+case 167:
+/* rule 167 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_cluster_id = 0;
+  AX_surfxml_cluster_prefix = 0;
+  AX_surfxml_cluster_suffix = 0;
+  AX_surfxml_cluster_radical = 0;
+  AX_surfxml_cluster_power = 0;
+  AX_surfxml_cluster_bw = 0;
+  AX_surfxml_cluster_lat = 0;
+  AX_surfxml_cluster_bb_bw = 0;
+  AX_surfxml_cluster_bb_lat = 0;
+  ENTER(AL_surfxml_cluster); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 168:
+/* rule 168 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+       YY_BREAK
+case 169:
+/* rule 169 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+       YY_BREAK
+case 170:
+/* rule 170 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+       YY_BREAK
+case 171:
+/* rule 171 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+       YY_BREAK
+case 172:
+/* rule 172 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+       YY_BREAK
+case 173:
+/* rule 173 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+       YY_BREAK
+case 174:
+/* rule 174 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+       YY_BREAK
+case 175:
+/* rule 175 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+       YY_BREAK
+case 176:
+/* rule 176 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+       YY_BREAK
+case 177:
+/* rule 177 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+       YY_BREAK
+case 178:
+/* rule 178 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+       YY_BREAK
+case 179:
+/* rule 179 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+       YY_BREAK
+case 180:
+/* rule 180 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+       YY_BREAK
+case 181:
+/* rule 181 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+       YY_BREAK
+case 182:
+/* rule 182 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw);
+       YY_BREAK
+case 183:
+/* rule 183 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw);
+       YY_BREAK
+case 184:
+/* rule 184 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat);
+       YY_BREAK
+case 185:
+/* rule 185 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat);
+       YY_BREAK
+case 186:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element.");
+  LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster);
+ }
+       YY_BREAK
+case 187:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element.");
+  LEAVE; STag_surfxml_cluster(); surfxml_pcdata_ix = 0; ETag_surfxml_cluster(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 188:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
+       YY_BREAK
+case 189:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_cluster):
+FAIL("EOF in attribute list of `cluster' element.");
+       YY_BREAK
+
+case 190:
+/* rule 190 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_cluster();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
+  }
+ }
+       YY_BREAK
+case 191:
+/* rule 191 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-FAIL("Starting tag <router> is not allowed here.");
+FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
+       YY_BREAK
+case 192:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_cluster):
+FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
        YY_BREAK
-case 87:
-/* rule 87 can match eol */
+
+case 193:
+/* rule 193 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_id = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_router_id = 0;
@@ -2913,24 +4805,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 88:
-/* rule 88 can match eol */
+case 194:
+/* rule 194 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 89:
-/* rule 89 can match eol */
+case 195:
+/* rule 195 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 90:
+case 196:
 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
 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 91:
+case 197:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
@@ -2940,11 +4832,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 92:
+case 198:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
-case 93:
+case 199:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
@@ -2952,8 +4844,8 @@ case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 94:
-/* rule 94 can match eol */
+case 200:
+/* rule 200 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -2964,12 +4856,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 95:
-/* rule 95 can match eol */
+case 201:
+/* rule 201 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
-case 96:
+case 202:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -2977,13 +4869,8 @@ case YY_STATE_EOF(E_surfxml_router):
 FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 97:
-/* rule 97 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <link> is not allowed here.");
-       YY_BREAK
-case 98:
-/* rule 98 can match eol */
+case 203:
+/* rule 203 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_id = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_link_id = 0;
@@ -2998,95 +4885,95 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 99:
-/* rule 99 can match eol */
+case 204:
+/* rule 204 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 100:
-/* rule 100 can match eol */
+case 205:
+/* rule 205 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 101:
-/* rule 101 can match eol */
+case 206:
+/* rule 206 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 102:
-/* rule 102 can match eol */
+case 207:
+/* rule 207 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 103:
-/* rule 103 can match eol */
+case 208:
+/* rule 208 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth_file);
        YY_BREAK
-case 104:
-/* rule 104 can match eol */
+case 209:
+/* rule 209 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth_file);
        YY_BREAK
-case 105:
-/* rule 105 can match eol */
+case 210:
+/* rule 210 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 106:
-/* rule 106 can match eol */
+case 211:
+/* rule 211 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 107:
-/* rule 107 can match eol */
+case 212:
+/* rule 212 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency_file);
        YY_BREAK
-case 108:
-/* rule 108 can match eol */
+case 213:
+/* rule 213 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file);
        YY_BREAK
-case 109:
-/* rule 109 can match eol */
-case 110:
-/* rule 110 can match eol */
+case 214:
+/* rule 214 can match eol */
+case 215:
+/* rule 215 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_ON;
        YY_BREAK
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_ON;
        YY_BREAK
-case 111:
-/* rule 111 can match eol */
-case 112:
-/* rule 112 can match eol */
+case 216:
+/* rule 216 can match eol */
+case 217:
+/* rule 217 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_OFF;
        YY_BREAK
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_OFF;
        YY_BREAK
-case 113:
-/* rule 113 can match eol */
+case 218:
+/* rule 218 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state_file);
        YY_BREAK
-case 114:
-/* rule 114 can match eol */
+case 219:
+/* rule 219 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state_file);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state_file);
        YY_BREAK
-case 115:
-/* rule 115 can match eol */
-case 116:
-/* rule 116 can match eol */
+case 220:
+/* rule 220 can match eol */
+case 221:
+/* rule 221 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
        YY_BREAK
 YY_RULE_SETUP
 A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
        YY_BREAK
-case 117:
-/* rule 117 can match eol */
-case 118:
-/* rule 118 can match eol */
+case 222:
+/* rule 222 can match eol */
+case 223:
+/* rule 223 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;
        YY_BREAK
 YY_RULE_SETUP
 A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;
        YY_BREAK
-case 119:
+case 224:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -3094,22 +4981,23 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 120:
+case 225:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_foreach: case S_surfxml_foreach_1: SET(E_surfxml_foreach); break;
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
-case 121:
+case 226:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
-case 122:
+case 227:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -3117,24 +5005,25 @@ case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 123:
-/* rule 123 can match eol */
+case 228:
+/* rule 228 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_link();
   popbuffer(); /* attribute */
   switch (YY_START) {
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_link();
   popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_foreach: case S_surfxml_foreach_1: SET(E_surfxml_foreach); break;
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
        YY_BREAK
-case 124:
-/* rule 124 can match eol */
+case 229:
+/* rule 229 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
-case 125:
+case 230:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -3144,13 +5033,125 @@ case YY_STATE_EOF(S_surfxml_link):
 FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 126:
-/* rule 126 can match eol */
+case 231:
+/* rule 231 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-FAIL("Starting tag <route> is not allowed here.");
+{
+  AX_surfxml_route_c_multi_src = 0;
+  AX_surfxml_route_c_multi_dst = 0;
+  AX_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_POSTPEND;
+  AX_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_YES;
+  ENTER(AL_surfxml_route_c_multi); pushbuffer(0);
+  }
        YY_BREAK
        YY_BREAK
-case 127:
-/* rule 127 can match eol */
+
+case 232:
+/* rule 232 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_route_c_multi_src);
+       YY_BREAK
+case 233:
+/* rule 233 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_route_c_multi_src);
+       YY_BREAK
+case 234:
+/* rule 234 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE1); BUFFERSET(AX_surfxml_route_c_multi_dst);
+       YY_BREAK
+case 235:
+/* rule 235 can match eol */
+YY_RULE_SETUP
+ENTER(VALUE2); BUFFERSET(AX_surfxml_route_c_multi_dst);
+       YY_BREAK
+case 236:
+/* rule 236 can match eol */
+case 237:
+/* rule 237 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_POSTPEND;
+       YY_BREAK
+case 238:
+/* rule 238 can match eol */
+case 239:
+/* rule 239 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_PREPEND;
+       YY_BREAK
+case 240:
+/* rule 240 can match eol */
+case 241:
+/* rule 241 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_OVERRIDE;
+       YY_BREAK
+case 242:
+/* rule 242 can match eol */
+case 243:
+/* rule 243 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_YES;
+       YY_BREAK
+case 244:
+/* rule 244 can match eol */
+case 245:
+/* rule 245 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_NO;
+       YY_BREAK
+case 246:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_route_c_multi_src) FAIL("Required attribute `src' not set for `route:multi' element.");
+  if (!AX_surfxml_route_c_multi_dst) FAIL("Required attribute `dst' not set for `route:multi' element.");
+  LEAVE; STag_surfxml_route_c_multi();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route_c_multi);
+ }
+       YY_BREAK
+case 247:
+YY_RULE_SETUP
+FAIL("`route:multi' element cannot be empty.");
+       YY_BREAK
+case 248:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of route:multi element.", surf_parse_text[0]);
+       YY_BREAK
+case 249:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `route:multi' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_route_c_multi):
+FAIL("EOF in attribute list of `route:multi' element.");
+       YY_BREAK
+
+case 250:
+/* rule 250 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_route_c_multi();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+  }
+ }
+       YY_BREAK
+case 251:
+/* rule 251 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</route:multi>' expected.",surf_parse_text);
+       YY_BREAK
+case 252:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</route:multi>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(S_surfxml_route_c_multi_2):
+case YY_STATE_EOF(E_surfxml_route_c_multi):
+FAIL("Premature EOF: `</route:multi>' expected.");
+       YY_BREAK
+
+case 253:
+/* rule 253 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_src = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_route_src = 0;
@@ -3159,71 +5160,93 @@ YY_RULE_SETUP
   AX_surfxml_route_impact_on_dst = 98;
   AX_surfxml_route_impact_on_src_with_other_recv = 102;
   AX_surfxml_route_impact_on_dst_with_other_send = 106;
   AX_surfxml_route_impact_on_dst = 98;
   AX_surfxml_route_impact_on_src_with_other_recv = 102;
   AX_surfxml_route_impact_on_dst_with_other_send = 106;
+  AX_surfxml_route_action = A_surfxml_route_action_POSTPEND;
   ENTER(AL_surfxml_route); pushbuffer(0);
   }
        YY_BREAK
 
   ENTER(AL_surfxml_route); pushbuffer(0);
   }
        YY_BREAK
 
-case 128:
-/* rule 128 can match eol */
+case 254:
+/* rule 254 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 129:
-/* rule 129 can match eol */
+case 255:
+/* rule 255 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 130:
-/* rule 130 can match eol */
+case 256:
+/* rule 256 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 131:
-/* rule 131 can match eol */
+case 257:
+/* rule 257 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 132:
-/* rule 132 can match eol */
+case 258:
+/* rule 258 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_src);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_src);
        YY_BREAK
-case 133:
-/* rule 133 can match eol */
+case 259:
+/* rule 259 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_src);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_src);
        YY_BREAK
-case 134:
-/* rule 134 can match eol */
+case 260:
+/* rule 260 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst);
        YY_BREAK
-case 135:
-/* rule 135 can match eol */
+case 261:
+/* rule 261 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst);
        YY_BREAK
-case 136:
-/* rule 136 can match eol */
+case 262:
+/* rule 262 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_src_with_other_recv);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_src_with_other_recv);
        YY_BREAK
-case 137:
-/* rule 137 can match eol */
+case 263:
+/* rule 263 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_src_with_other_recv);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_src_with_other_recv);
        YY_BREAK
-case 138:
-/* rule 138 can match eol */
+case 264:
+/* rule 264 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
        YY_BREAK
-case 139:
-/* rule 139 can match eol */
+case 265:
+/* rule 265 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
        YY_BREAK
-case 140:
+case 266:
+/* rule 266 can match eol */
+case 267:
+/* rule 267 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_action = A_surfxml_route_action_POSTPEND;
+       YY_BREAK
+case 268:
+/* rule 268 can match eol */
+case 269:
+/* rule 269 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_action = A_surfxml_route_action_PREPEND;
+       YY_BREAK
+case 270:
+/* rule 270 can match eol */
+case 271:
+/* rule 271 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_action = A_surfxml_route_action_OVERRIDE;
+       YY_BREAK
+case 272:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -3231,7 +5254,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 141:
+case 273:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -3242,11 +5265,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 142:
+case 274:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
-case 143:
+case 275:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
@@ -3254,8 +5277,8 @@ case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 144:
-/* rule 144 can match eol */
+case 276:
+/* rule 276 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -3266,12 +5289,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 145:
-/* rule 145 can match eol */
+case 277:
+/* rule 277 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
-case 146:
+case 278:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -3281,13 +5304,8 @@ case YY_STATE_EOF(E_surfxml_route):
 FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 147:
-/* rule 147 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <link:ctn> is not allowed here.");
-       YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 279:
+/* rule 279 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_c_ctn_id = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_link_c_ctn_id = 0;
@@ -3295,38 +5313,39 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 149:
-/* rule 149 can match eol */
+case 280:
+/* rule 280 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_c_ctn_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_link_c_ctn_id);
        YY_BREAK
-case 150:
-/* rule 150 can match eol */
+case 281:
+/* rule 281 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_c_ctn_id);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_link_c_ctn_id);
        YY_BREAK
-case 151:
+case 282:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_c_ctn_id) FAIL("Required attribute `id' not set for `link:ctn' element.");
   LEAVE; STag_surfxml_link_c_ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link_c_ctn);
  }
        YY_BREAK
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_c_ctn_id) FAIL("Required attribute `id' not set for `link:ctn' element.");
   LEAVE; STag_surfxml_link_c_ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link_c_ctn);
  }
        YY_BREAK
-case 152:
+case 283:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_c_ctn_id) FAIL("Required attribute `id' not set for `link:ctn' element.");
   LEAVE; STag_surfxml_link_c_ctn(); surfxml_pcdata_ix = 0; ETag_surfxml_link_c_ctn(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_c_ctn_id) FAIL("Required attribute `id' not set for `link:ctn' element.");
   LEAVE; STag_surfxml_link_c_ctn(); surfxml_pcdata_ix = 0; ETag_surfxml_link_c_ctn(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_route_c_multi_2: case S_surfxml_route_c_multi_1: case S_surfxml_route_c_multi: SET(S_surfxml_route_c_multi_2); break;
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 153:
+case 284:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link:ctn element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link:ctn element.", surf_parse_text[0]);
        YY_BREAK
-case 154:
+case 285:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link:ctn' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link:ctn' element start tag.",surf_parse_text);
        YY_BREAK
@@ -3334,8 +5353,8 @@ case YY_STATE_EOF(AL_surfxml_link_c_ctn):
 FAIL("EOF in attribute list of `link:ctn' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `link:ctn' element.");
        YY_BREAK
 
-case 155:
-/* rule 155 can match eol */
+case 286:
+/* rule 286 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -3343,15 +5362,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_route_c_multi_2: case S_surfxml_route_c_multi_1: case S_surfxml_route_c_multi: SET(S_surfxml_route_c_multi_2); break;
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 156:
-/* rule 156 can match eol */
+case 287:
+/* rule 287 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link:ctn>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link:ctn>' expected.",surf_parse_text);
        YY_BREAK
-case 157:
+case 288:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link:ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link:ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -3359,13 +5379,8 @@ case YY_STATE_EOF(E_surfxml_link_c_ctn):
 FAIL("Premature EOF: `</link:ctn>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</link:ctn>' expected.");
        YY_BREAK
 
-case 158:
-/* rule 158 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <process> is not allowed here.");
-       YY_BREAK
-case 159:
-/* rule 159 can match eol */
+case 289:
+/* rule 289 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_host = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_process_host = 0;
@@ -3376,47 +5391,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 160:
-/* rule 160 can match eol */
+case 290:
+/* rule 290 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 161:
-/* rule 161 can match eol */
+case 291:
+/* rule 291 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 162:
-/* rule 162 can match eol */
+case 292:
+/* rule 292 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 163:
-/* rule 163 can match eol */
+case 293:
+/* rule 293 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 164:
-/* rule 164 can match eol */
+case 294:
+/* rule 294 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start_time);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start_time);
        YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 295:
+/* rule 295 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start_time);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start_time);
        YY_BREAK
-case 166:
-/* rule 166 can match eol */
+case 296:
+/* rule 296 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill_time);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill_time);
        YY_BREAK
-case 167:
-/* rule 167 can match eol */
+case 297:
+/* rule 297 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill_time);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill_time);
        YY_BREAK
-case 168:
+case 298:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -3424,7 +5439,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 169:
+case 299:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -3435,11 +5450,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 170:
+case 300:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
-case 171:
+case 301:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
@@ -3447,8 +5462,8 @@ case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 172:
-/* rule 172 can match eol */
+case 302:
+/* rule 302 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -3459,12 +5474,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 173:
-/* rule 173 can match eol */
+case 303:
+/* rule 303 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
-case 174:
+case 304:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -3474,13 +5489,8 @@ case YY_STATE_EOF(S_surfxml_process_2):
 FAIL("Premature EOF: `</process>' expected.");
        YY_BREAK
 
 FAIL("Premature EOF: `</process>' expected.");
        YY_BREAK
 
-case 175:
-/* rule 175 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <argument> is not allowed here.");
-       YY_BREAK
-case 176:
-/* rule 176 can match eol */
+case 305:
+/* rule 305 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
@@ -3488,24 +5498,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
   }
        YY_BREAK
 
-case 177:
-/* rule 177 can match eol */
+case 306:
+/* rule 306 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 178:
-/* rule 178 can match eol */
+case 307:
+/* rule 307 can match eol */
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 179:
+case 308:
 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
 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 180:
+case 309:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
@@ -3515,11 +5525,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 181:
+case 310:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
-case 182:
+case 311:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
@@ -3527,8 +5537,8 @@ case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 183:
-/* rule 183 can match eol */
+case 312:
+/* rule 312 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
 YY_RULE_SETUP
 {
   LEAVE;
@@ -3539,12 +5549,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
   }
  }
        YY_BREAK
-case 184:
-/* rule 184 can match eol */
+case 313:
+/* rule 313 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
-case 185:
+case 314:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -3554,7 +5564,7 @@ FAIL("Premature EOF: `</argument>' expected.");
 
 /* EPILOG: after the root element. */
 
 
 /* EPILOG: after the root element. */
 
-case 186:
+case 315:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -3565,58 +5575,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 187:
+case 316:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 188:
+case 317:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 189:
+case 318:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 190:
+case 319:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 191:
+case 320:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 192:
+case 321:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
-case 193:
+case 322:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
-case 194:
-/* rule 194 can match eol */
-case 195:
-/* rule 195 can match eol */
-case 196:
-/* rule 196 can match eol */
-case 197:
-/* rule 197 can match eol */
+case 323:
+/* rule 323 can match eol */
+case 324:
+/* rule 324 can match eol */
+case 325:
+/* rule 325 can match eol */
+case 326:
+/* rule 326 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 198:
+case 327:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 199:
+case 328:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 200:
+case 329:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -3624,7 +5634,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 201:
+case 330:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -3632,22 +5642,22 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 202:
-/* rule 202 can match eol */
+case 331:
+/* rule 331 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
-case 203:
+case 332:
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
-case 204:
+case 333:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 205:
+case 334:
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
@@ -3659,13 +5669,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. */
 
 /* Ideally, this should be replaced by code in flexml.pl that
     generates just the states not covered by other rules. */
 
-case 206:
-/* rule 206 can match eol */
+case 335:
+/* rule 335 can match eol */
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
-case 207:
+case 336:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -3673,8 +5683,13 @@ case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(ROOT_surfxml_platform):
 case YY_STATE_EOF(S_surfxml_platform_2):
 case YY_STATE_EOF(S_surfxml_platform_4):
 case YY_STATE_EOF(ROOT_surfxml_platform):
 case YY_STATE_EOF(S_surfxml_platform_2):
 case YY_STATE_EOF(S_surfxml_platform_4):
+case YY_STATE_EOF(S_surfxml_random_1):
+case YY_STATE_EOF(S_surfxml_foreach):
+case YY_STATE_EOF(S_surfxml_foreach_1):
 case YY_STATE_EOF(S_surfxml_host_1):
 case YY_STATE_EOF(S_surfxml_link_1):
 case YY_STATE_EOF(S_surfxml_host_1):
 case YY_STATE_EOF(S_surfxml_link_1):
+case YY_STATE_EOF(S_surfxml_route_c_multi):
+case YY_STATE_EOF(S_surfxml_route_c_multi_1):
 case YY_STATE_EOF(S_surfxml_route_1):
 case YY_STATE_EOF(S_surfxml_process_1):
 case YY_STATE_EOF(IMPOSSIBLE):
 case YY_STATE_EOF(S_surfxml_route_1):
 case YY_STATE_EOF(S_surfxml_process_1):
 case YY_STATE_EOF(IMPOSSIBLE):
@@ -3960,7 +5975,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
                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 >= 1159 )
+                       if ( yy_current_state >= 1941 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3988,11 +6003,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];
        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 >= 1159 )
+               if ( yy_current_state >= 1941 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 1158);
+       yy_is_jam = (yy_current_state == 1940);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
 
        return yy_is_jam ? 0 : yy_current_state;
 }
index f2e79d9..42b3eda 100644 (file)
@@ -1,5 +1,5 @@
 <!-- Small DTD for SURF based tools. -->
 <!-- Small DTD for SURF based tools. -->
-<!ELEMENT platform ((include|host|router|link)*,(include|route|process)*)>
+<!ELEMENT platform ((include|trace|random|cluster|set|foreach|host|router|link|trace:connect)*,(include|route:multi|route|trace:connect|process)*)>
 <!ATTLIST platform version CDATA "0.0">
 <!ATTLIST platform xmlns:link CDATA "http://simgrid.gforge.inria.fr/">
 <!ATTLIST platform xmlns:route CDATA "http://simgrid.gforge.inria.fr/">
 <!ATTLIST platform version CDATA "0.0">
 <!ATTLIST platform xmlns:link CDATA "http://simgrid.gforge.inria.fr/">
 <!ATTLIST platform xmlns:route CDATA "http://simgrid.gforge.inria.fr/">
@@ -7,6 +7,34 @@
 <!ELEMENT include EMPTY>
 <!ATTLIST include file CDATA #REQUIRED>
 
 <!ELEMENT include EMPTY>
 <!ATTLIST include file CDATA #REQUIRED>
 
+<!ELEMENT trace (#PCDATA)>
+<!ATTLIST trace id CDATA #REQUIRED>
+<!ATTLIST trace file CDATA "">
+<!ATTLIST trace periodicity CDATA #REQUIRED>
+
+<!ELEMENT random (prop*)>
+<!ATTLIST random id CDATA #REQUIRED>
+<!ATTLIST random min CDATA #REQUIRED>
+<!ATTLIST random max CDATA #REQUIRED>
+<!ATTLIST random mean CDATA #REQUIRED>
+<!ATTLIST random std_deviation CDATA #REQUIRED>
+<!ATTLIST random generator (DRAND48|RAND) "DRAND48">
+
+<!ELEMENT trace:connect EMPTY>
+<!ATTLIST trace:connect kind (AVAILABILITY|BANDWIDTH|LATENCY|POWER) "AVAILABILITY">
+<!ATTLIST trace:connect trace_id CDATA #REQUIRED>
+<!ATTLIST trace:connect element (HOST|LINK) "HOST">
+<!ATTLIST trace:connect connector_id CDATA #REQUIRED>
+
+<!ELEMENT set EMPTY>
+<!ATTLIST set id CDATA #REQUIRED>
+<!ATTLIST set prefix CDATA #REQUIRED>
+<!ATTLIST set suffix CDATA #REQUIRED>
+<!ATTLIST set radical CDATA #REQUIRED>
+
+<!ELEMENT foreach (host|(host,link)|link)>
+<!ATTLIST foreach set_id CDATA #REQUIRED>
+
 <!ELEMENT host (prop*)>
 <!ATTLIST host id CDATA #REQUIRED>
 <!ATTLIST host power CDATA #REQUIRED>
 <!ELEMENT host (prop*)>
 <!ATTLIST host id CDATA #REQUIRED>
 <!ATTLIST host power CDATA #REQUIRED>
 <!ATTLIST prop id CDATA #REQUIRED>
 <!ATTLIST prop value CDATA #REQUIRED>
 
 <!ATTLIST prop id CDATA #REQUIRED>
 <!ATTLIST prop value CDATA #REQUIRED>
 
+<!ELEMENT cluster EMPTY>
+<!ATTLIST cluster id CDATA #REQUIRED>
+<!ATTLIST cluster prefix CDATA #REQUIRED>
+<!ATTLIST cluster suffix CDATA #REQUIRED>
+<!ATTLIST cluster radical CDATA #REQUIRED>
+<!ATTLIST cluster power CDATA #REQUIRED>
+<!ATTLIST cluster bw CDATA #REQUIRED>
+<!ATTLIST cluster lat CDATA #REQUIRED>
+<!ATTLIST cluster bb_bw CDATA #REQUIRED>
+<!ATTLIST cluster bb_lat CDATA #REQUIRED>
+
 <!ELEMENT router EMPTY>
 <!ATTLIST router id CDATA #REQUIRED>
 
 <!ELEMENT router EMPTY>
 <!ATTLIST router id CDATA #REQUIRED>
 
 <!ATTLIST link state_file CDATA "">
 <!ATTLIST link sharing_policy (SHARED|FATPIPE) "SHARED">
 
 <!ATTLIST link state_file CDATA "">
 <!ATTLIST link sharing_policy (SHARED|FATPIPE) "SHARED">
 
+<!ELEMENT route:multi (link:ctn+)>
+<!ATTLIST route:multi src CDATA #REQUIRED>
+<!ATTLIST route:multi dst CDATA #REQUIRED>
+<!ATTLIST route:multi action (POSTPEND|PREPEND|OVERRIDE) "POSTPEND">
+<!ATTLIST route:multi symmetric (YES|NO) "YES">
+
 <!ELEMENT route (link:ctn*)>
 <!ATTLIST route src CDATA #REQUIRED>
 <!ATTLIST route dst CDATA #REQUIRED>
 <!ELEMENT route (link:ctn*)>
 <!ATTLIST route src CDATA #REQUIRED>
 <!ATTLIST route dst CDATA #REQUIRED>
@@ -43,6 +88,7 @@
 <!ATTLIST route impact_on_dst CDATA "0.0">
 <!ATTLIST route impact_on_src_with_other_recv CDATA "0.0">
 <!ATTLIST route impact_on_dst_with_other_send CDATA "0.0">
 <!ATTLIST route impact_on_dst CDATA "0.0">
 <!ATTLIST route impact_on_src_with_other_recv CDATA "0.0">
 <!ATTLIST route impact_on_dst_with_other_send CDATA "0.0">
+<!ATTLIST route action (POSTPEND|PREPEND|OVERRIDE) "POSTPEND">
 
 <!ELEMENT link:ctn EMPTY>
 <!ATTLIST link:ctn id CDATA #REQUIRED>
 
 <!ELEMENT link:ctn EMPTY>
 <!ATTLIST link:ctn id CDATA #REQUIRED>
index d9bd8c8..10676a7 100644 (file)
@@ -1,10 +1,10 @@
 /* Validating XML processor for surf/surfxml.dtd.
 /* Validating XML processor for surf/surfxml.dtd.
- * Generated 2007/11/08 11:56:22.
+ * Generated 2007/11/29 14:32:38.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
  *
  * This program was generated with the FleXML XML processor generator.
  * FleXML is Copyright (C) 1999-2005 Kristoffer Rose.  All rights reserved.
  * FleXML is Copyright (C) 2003-2006 Martin Quinson.  All rights reserved.
- * (Id: flexml.pl,v 1.63 2007/10/11 14:46:08 mquinson Exp).
+ * (Id: flexml.pl,v 1.61 2006/09/13 16:34:33 wdowling Exp).
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
  * 
  * There are two, intertwined parts to this program, part A and part B.
  *
 
 /* Version strings. */
 const char rcs_surfxml_flexml_skeleton[] =
 
 /* Version strings. */
 const char rcs_surfxml_flexml_skeleton[] =
- "$" "Id: skel,v 1.40 2007/10/11 09:57:24 mquinson Exp $";
+ "$" "Id: skel,v 1.38 2006/09/12 18:05:45 wdowling Exp $";
 const char rcs_surfxml_flexml[] =
 const char rcs_surfxml_flexml[] =
- "$" "Id: flexml.pl,v 1.63 2007/10/11 14:46:08 mquinson Exp $";
+ "$" "Id: flexml.pl,v 1.61 2006/09/13 16:34:33 wdowling Exp $";
 
 /* ANSI headers. */
 
 /* ANSI headers. */
-#include <stdlib.h> /* for realloc() -- needed here when using flex 2.5.4 */
+#include <unistd.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ctype.h>
-     
-#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__)
-# ifndef __STRICT_ANSI__
-#  include <io.h>
-#  include <process.h>
-# endif
-#else
-# include <unistd.h>
-#endif
-     
+
 #ifndef FLEXML_INDEXSTACKSIZE
 #define FLEXML_INDEXSTACKSIZE 1000
 #endif
 #ifndef FLEXML_INDEXSTACKSIZE
 #define FLEXML_INDEXSTACKSIZE 1000
 #endif
@@ -86,78 +77,142 @@ const char rcs_surfxml_flexml[] =
 int surfxml_pcdata_ix;
 extern char *surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
 int surfxml_pcdata_ix;
 extern char *surfxml_bufferstack;
 #define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix)
-AT_surfxml_link_id AX_surfxml_link_id;
-#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+AT_surfxml_random_generator AX_surfxml_random_generator;
+#define A_surfxml_random_generator AX_surfxml_random_generator
 AT_surfxml_prop_id AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 AT_surfxml_host_interference_recv AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 AT_surfxml_host_id AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
 AT_surfxml_prop_id AX_surfxml_prop_id;
 #define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id)
 AT_surfxml_host_interference_recv AX_surfxml_host_interference_recv;
 #define A_surfxml_host_interference_recv (surfxml_bufferstack + AX_surfxml_host_interference_recv)
 AT_surfxml_host_id AX_surfxml_host_id;
 #define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id)
+AT_surfxml_set_id AX_surfxml_set_id;
+#define A_surfxml_set_id (surfxml_bufferstack + AX_surfxml_set_id)
 AT_surfxml_link_latency_file AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
 AT_surfxml_link_latency_file AX_surfxml_link_latency_file;
 #define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file)
-AT_surfxml_process_host AX_surfxml_process_host;
-#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
-AT_surfxml_host_availability_file AX_surfxml_host_availability_file;
-#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
 AT_surfxml_host_state AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 AT_surfxml_host_interference_send_recv AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
 AT_surfxml_host_state AX_surfxml_host_state;
 #define A_surfxml_host_state AX_surfxml_host_state
 AT_surfxml_host_interference_send_recv AX_surfxml_host_interference_send_recv;
 #define A_surfxml_host_interference_send_recv (surfxml_bufferstack + AX_surfxml_host_interference_send_recv)
-AT_surfxml_route_impact_on_dst_with_other_send AX_surfxml_route_impact_on_dst_with_other_send;
-#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
 AT_surfxml_host_interference_send AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
 AT_surfxml_host_interference_send AX_surfxml_host_interference_send;
 #define A_surfxml_host_interference_send (surfxml_bufferstack + AX_surfxml_host_interference_send)
+AT_surfxml_set_suffix AX_surfxml_set_suffix;
+#define A_surfxml_set_suffix (surfxml_bufferstack + AX_surfxml_set_suffix)
 AT_surfxml_route_impact_on_dst AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
 AT_surfxml_route_impact_on_dst AX_surfxml_route_impact_on_dst;
 #define A_surfxml_route_impact_on_dst (surfxml_bufferstack + AX_surfxml_route_impact_on_dst)
-AT_surfxml_prop_value AX_surfxml_prop_value;
-#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
-AT_surfxml_route_impact_on_src_with_other_recv AX_surfxml_route_impact_on_src_with_other_recv;
-#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
 AT_surfxml_host_power AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
 AT_surfxml_host_power AX_surfxml_host_power;
 #define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power)
-AT_surfxml_link_state_file AX_surfxml_link_state_file;
-#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
 AT_surfxml_router_id AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 AT_surfxml_process_start_time AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
 AT_surfxml_router_id AX_surfxml_router_id;
 #define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id)
 AT_surfxml_process_start_time AX_surfxml_process_start_time;
 #define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time)
+AT_surfxml_cluster_suffix AX_surfxml_cluster_suffix;
+#define A_surfxml_cluster_suffix (surfxml_bufferstack + AX_surfxml_cluster_suffix)
 AT_surfxml_platform_xmlns_c_route AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
 AT_surfxml_platform_xmlns_c_route AX_surfxml_platform_xmlns_c_route;
 #define A_surfxml_platform_xmlns_c_route (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_route)
-AT_surfxml_process_function AX_surfxml_process_function;
-#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
-AT_surfxml_host_max_outgoing_rate AX_surfxml_host_max_outgoing_rate;
-#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+AT_surfxml_cluster_prefix AX_surfxml_cluster_prefix;
+#define A_surfxml_cluster_prefix (surfxml_bufferstack + AX_surfxml_cluster_prefix)
+AT_surfxml_trace_file AX_surfxml_trace_file;
+#define A_surfxml_trace_file (surfxml_bufferstack + AX_surfxml_trace_file)
+AT_surfxml_route_action AX_surfxml_route_action;
+#define A_surfxml_route_action AX_surfxml_route_action
 AT_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
 AT_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy;
 #define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy
-AT_surfxml_link_c_ctn_id AX_surfxml_link_c_ctn_id;
-#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+AT_surfxml_random_min AX_surfxml_random_min;
+#define A_surfxml_random_min (surfxml_bufferstack + AX_surfxml_random_min)
 AT_surfxml_process_kill_time AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
 AT_surfxml_process_kill_time AX_surfxml_process_kill_time;
 #define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time)
-AT_surfxml_host_availability AX_surfxml_host_availability;
-#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+AT_surfxml_cluster_bb_bw AX_surfxml_cluster_bb_bw;
+#define A_surfxml_cluster_bb_bw (surfxml_bufferstack + AX_surfxml_cluster_bb_bw)
+AT_surfxml_trace_c_connect_element AX_surfxml_trace_c_connect_element;
+#define A_surfxml_trace_c_connect_element AX_surfxml_trace_c_connect_element
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 AT_surfxml_link_state AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 AT_surfxml_link_state AX_surfxml_link_state;
 #define A_surfxml_link_state AX_surfxml_link_state
-AT_surfxml_route_src AX_surfxml_route_src;
-#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
 AT_surfxml_route_impact_on_src AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 AT_surfxml_link_bandwidth AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
 AT_surfxml_route_impact_on_src AX_surfxml_route_impact_on_src;
 #define A_surfxml_route_impact_on_src (surfxml_bufferstack + AX_surfxml_route_impact_on_src)
 AT_surfxml_link_bandwidth AX_surfxml_link_bandwidth;
 #define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth)
+AT_surfxml_cluster_id AX_surfxml_cluster_id;
+#define A_surfxml_cluster_id (surfxml_bufferstack + AX_surfxml_cluster_id)
+AT_surfxml_random_mean AX_surfxml_random_mean;
+#define A_surfxml_random_mean (surfxml_bufferstack + AX_surfxml_random_mean)
+AT_surfxml_cluster_bb_lat AX_surfxml_cluster_bb_lat;
+#define A_surfxml_cluster_bb_lat (surfxml_bufferstack + AX_surfxml_cluster_bb_lat)
 AT_surfxml_link_latency AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
 AT_surfxml_link_latency AX_surfxml_link_latency;
 #define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency)
+AT_surfxml_trace_c_connect_trace_id AX_surfxml_trace_c_connect_trace_id;
+#define A_surfxml_trace_c_connect_trace_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_trace_id)
 AT_surfxml_platform_xmlns_c_link AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
 AT_surfxml_platform_xmlns_c_link AX_surfxml_platform_xmlns_c_link;
 #define A_surfxml_platform_xmlns_c_link (surfxml_bufferstack + AX_surfxml_platform_xmlns_c_link)
-AT_surfxml_include_file AX_surfxml_include_file;
-#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
 AT_surfxml_link_bandwidth_file AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
 AT_surfxml_link_bandwidth_file AX_surfxml_link_bandwidth_file;
 #define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file)
+AT_surfxml_random_id AX_surfxml_random_id;
+#define A_surfxml_random_id (surfxml_bufferstack + AX_surfxml_random_id)
+AT_surfxml_set_radical AX_surfxml_set_radical;
+#define A_surfxml_set_radical (surfxml_bufferstack + AX_surfxml_set_radical)
+AT_surfxml_random_max AX_surfxml_random_max;
+#define A_surfxml_random_max (surfxml_bufferstack + AX_surfxml_random_max)
+AT_surfxml_link_id AX_surfxml_link_id;
+#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
+AT_surfxml_process_host AX_surfxml_process_host;
+#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
+AT_surfxml_host_availability_file AX_surfxml_host_availability_file;
+#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file)
+AT_surfxml_cluster_lat AX_surfxml_cluster_lat;
+#define A_surfxml_cluster_lat (surfxml_bufferstack + AX_surfxml_cluster_lat)
+AT_surfxml_trace_periodicity AX_surfxml_trace_periodicity;
+#define A_surfxml_trace_periodicity (surfxml_bufferstack + AX_surfxml_trace_periodicity)
+AT_surfxml_foreach_set_id AX_surfxml_foreach_set_id;
+#define A_surfxml_foreach_set_id (surfxml_bufferstack + AX_surfxml_foreach_set_id)
+AT_surfxml_route_impact_on_dst_with_other_send AX_surfxml_route_impact_on_dst_with_other_send;
+#define A_surfxml_route_impact_on_dst_with_other_send (surfxml_bufferstack + AX_surfxml_route_impact_on_dst_with_other_send)
+AT_surfxml_prop_value AX_surfxml_prop_value;
+#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value)
+AT_surfxml_route_impact_on_src_with_other_recv AX_surfxml_route_impact_on_src_with_other_recv;
+#define A_surfxml_route_impact_on_src_with_other_recv (surfxml_bufferstack + AX_surfxml_route_impact_on_src_with_other_recv)
+AT_surfxml_link_state_file AX_surfxml_link_state_file;
+#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file)
+AT_surfxml_set_prefix AX_surfxml_set_prefix;
+#define A_surfxml_set_prefix (surfxml_bufferstack + AX_surfxml_set_prefix)
+AT_surfxml_cluster_power AX_surfxml_cluster_power;
+#define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
+AT_surfxml_process_function AX_surfxml_process_function;
+#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
+AT_surfxml_host_max_outgoing_rate AX_surfxml_host_max_outgoing_rate;
+#define A_surfxml_host_max_outgoing_rate (surfxml_bufferstack + AX_surfxml_host_max_outgoing_rate)
+AT_surfxml_link_c_ctn_id AX_surfxml_link_c_ctn_id;
+#define A_surfxml_link_c_ctn_id (surfxml_bufferstack + AX_surfxml_link_c_ctn_id)
+AT_surfxml_host_availability AX_surfxml_host_availability;
+#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
+AT_surfxml_route_src AX_surfxml_route_src;
+#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src)
+AT_surfxml_route_c_multi_src AX_surfxml_route_c_multi_src;
+#define A_surfxml_route_c_multi_src (surfxml_bufferstack + AX_surfxml_route_c_multi_src)
+AT_surfxml_route_c_multi_action AX_surfxml_route_c_multi_action;
+#define A_surfxml_route_c_multi_action AX_surfxml_route_c_multi_action
+AT_surfxml_trace_id AX_surfxml_trace_id;
+#define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id)
+AT_surfxml_cluster_radical AX_surfxml_cluster_radical;
+#define A_surfxml_cluster_radical (surfxml_bufferstack + AX_surfxml_cluster_radical)
+AT_surfxml_include_file AX_surfxml_include_file;
+#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file)
+AT_surfxml_random_std_deviation AX_surfxml_random_std_deviation;
+#define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation)
+AT_surfxml_trace_c_connect_kind AX_surfxml_trace_c_connect_kind;
+#define A_surfxml_trace_c_connect_kind AX_surfxml_trace_c_connect_kind
+AT_surfxml_trace_c_connect_connector_id AX_surfxml_trace_c_connect_connector_id;
+#define A_surfxml_trace_c_connect_connector_id (surfxml_bufferstack + AX_surfxml_trace_c_connect_connector_id)
+AT_surfxml_route_c_multi_dst AX_surfxml_route_c_multi_dst;
+#define A_surfxml_route_c_multi_dst (surfxml_bufferstack + AX_surfxml_route_c_multi_dst)
 AT_surfxml_host_state_file AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
 AT_surfxml_host_state_file AX_surfxml_host_state_file;
 #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file)
+AT_surfxml_route_c_multi_symmetric AX_surfxml_route_c_multi_symmetric;
+#define A_surfxml_route_c_multi_symmetric AX_surfxml_route_c_multi_symmetric
 AT_surfxml_route_dst AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
 AT_surfxml_route_dst AX_surfxml_route_dst;
 #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst)
+AT_surfxml_cluster_bw AX_surfxml_cluster_bw;
+#define A_surfxml_cluster_bw (surfxml_bufferstack + AX_surfxml_cluster_bw)
 AT_surfxml_platform_version AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
 AT_surfxml_platform_version AX_surfxml_platform_version;
 #define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version)
 
@@ -323,10 +378,17 @@ Literal           \'[^'']*\'|\"[^""]*\"
 %x PROLOG DOCTYPE EPILOG INCOMMENT INPI VALUE1 VALUE2 CDATA
 %x ROOT_surfxml_platform AL_surfxml_platform S_surfxml_platform S_surfxml_platform_1 S_surfxml_platform_2 S_surfxml_platform_3 S_surfxml_platform_4 S_surfxml_platform_5 E_surfxml_platform
 %x AL_surfxml_include E_surfxml_include
 %x PROLOG DOCTYPE EPILOG INCOMMENT INPI VALUE1 VALUE2 CDATA
 %x ROOT_surfxml_platform AL_surfxml_platform S_surfxml_platform S_surfxml_platform_1 S_surfxml_platform_2 S_surfxml_platform_3 S_surfxml_platform_4 S_surfxml_platform_5 E_surfxml_platform
 %x AL_surfxml_include E_surfxml_include
+%x AL_surfxml_trace IN_trace
+%x AL_surfxml_random S_surfxml_random S_surfxml_random_1 S_surfxml_random_2 E_surfxml_random
+%x AL_surfxml_trace_c_connect E_surfxml_trace_c_connect
+%x AL_surfxml_set E_surfxml_set
+%x AL_surfxml_foreach S_surfxml_foreach S_surfxml_foreach_1 E_surfxml_foreach
 %x AL_surfxml_host S_surfxml_host S_surfxml_host_1 S_surfxml_host_2 E_surfxml_host
 %x AL_surfxml_prop E_surfxml_prop
 %x AL_surfxml_host S_surfxml_host S_surfxml_host_1 S_surfxml_host_2 E_surfxml_host
 %x AL_surfxml_prop E_surfxml_prop
+%x AL_surfxml_cluster E_surfxml_cluster
 %x AL_surfxml_router E_surfxml_router
 %x AL_surfxml_link S_surfxml_link S_surfxml_link_1 S_surfxml_link_2 E_surfxml_link
 %x AL_surfxml_router E_surfxml_router
 %x AL_surfxml_link S_surfxml_link S_surfxml_link_1 S_surfxml_link_2 E_surfxml_link
+%x AL_surfxml_route_c_multi S_surfxml_route_c_multi S_surfxml_route_c_multi_1 S_surfxml_route_c_multi_2 E_surfxml_route_c_multi
 %x AL_surfxml_route S_surfxml_route S_surfxml_route_1 S_surfxml_route_2 E_surfxml_route
 %x AL_surfxml_link_c_ctn E_surfxml_link_c_ctn
 %x AL_surfxml_process S_surfxml_process S_surfxml_process_1 S_surfxml_process_2 E_surfxml_process
 %x AL_surfxml_route S_surfxml_route S_surfxml_route_1 S_surfxml_route_2 E_surfxml_route
 %x AL_surfxml_link_c_ctn E_surfxml_link_c_ctn
 %x AL_surfxml_process S_surfxml_process S_surfxml_process_1 S_surfxml_process_2 E_surfxml_process
@@ -395,6 +457,21 @@ const char* *surfxml_statenames=NULL;
   surfxml_statenames[E_surfxml_platform] = "platform";
   surfxml_statenames[AL_surfxml_include] = NULL;
   surfxml_statenames[E_surfxml_include] = "include";
   surfxml_statenames[E_surfxml_platform] = "platform";
   surfxml_statenames[AL_surfxml_include] = NULL;
   surfxml_statenames[E_surfxml_include] = "include";
+  surfxml_statenames[AL_surfxml_trace] = NULL;
+  surfxml_statenames[IN_trace] = "trace";
+  surfxml_statenames[AL_surfxml_random] = NULL;
+  surfxml_statenames[S_surfxml_random] = "random";
+  surfxml_statenames[S_surfxml_random_1] = "random";
+  surfxml_statenames[S_surfxml_random_2] = "random";
+  surfxml_statenames[E_surfxml_random] = "random";
+  surfxml_statenames[AL_surfxml_trace_c_connect] = NULL;
+  surfxml_statenames[E_surfxml_trace_c_connect] = "trace:connect";
+  surfxml_statenames[AL_surfxml_set] = NULL;
+  surfxml_statenames[E_surfxml_set] = "set";
+  surfxml_statenames[AL_surfxml_foreach] = NULL;
+  surfxml_statenames[S_surfxml_foreach] = "foreach";
+  surfxml_statenames[S_surfxml_foreach_1] = "foreach";
+  surfxml_statenames[E_surfxml_foreach] = "foreach";
   surfxml_statenames[AL_surfxml_host] = NULL;
   surfxml_statenames[S_surfxml_host] = "host";
   surfxml_statenames[S_surfxml_host_1] = "host";
   surfxml_statenames[AL_surfxml_host] = NULL;
   surfxml_statenames[S_surfxml_host] = "host";
   surfxml_statenames[S_surfxml_host_1] = "host";
@@ -402,6 +479,8 @@ const char* *surfxml_statenames=NULL;
   surfxml_statenames[E_surfxml_host] = "host";
   surfxml_statenames[AL_surfxml_prop] = NULL;
   surfxml_statenames[E_surfxml_prop] = "prop";
   surfxml_statenames[E_surfxml_host] = "host";
   surfxml_statenames[AL_surfxml_prop] = NULL;
   surfxml_statenames[E_surfxml_prop] = "prop";
+  surfxml_statenames[AL_surfxml_cluster] = NULL;
+  surfxml_statenames[E_surfxml_cluster] = "cluster";
   surfxml_statenames[AL_surfxml_router] = NULL;
   surfxml_statenames[E_surfxml_router] = "router";
   surfxml_statenames[AL_surfxml_link] = NULL;
   surfxml_statenames[AL_surfxml_router] = NULL;
   surfxml_statenames[E_surfxml_router] = "router";
   surfxml_statenames[AL_surfxml_link] = NULL;
@@ -409,6 +488,11 @@ const char* *surfxml_statenames=NULL;
   surfxml_statenames[S_surfxml_link_1] = "link";
   surfxml_statenames[S_surfxml_link_2] = "link";
   surfxml_statenames[E_surfxml_link] = "link";
   surfxml_statenames[S_surfxml_link_1] = "link";
   surfxml_statenames[S_surfxml_link_2] = "link";
   surfxml_statenames[E_surfxml_link] = "link";
+  surfxml_statenames[AL_surfxml_route_c_multi] = NULL;
+  surfxml_statenames[S_surfxml_route_c_multi] = "route:multi";
+  surfxml_statenames[S_surfxml_route_c_multi_1] = "route:multi";
+  surfxml_statenames[S_surfxml_route_c_multi_2] = "route:multi";
+  surfxml_statenames[E_surfxml_route_c_multi] = "route:multi";
   surfxml_statenames[AL_surfxml_route] = NULL;
   surfxml_statenames[S_surfxml_route] = "route";
   surfxml_statenames[S_surfxml_route_1] = "route";
   surfxml_statenames[AL_surfxml_route] = NULL;
   surfxml_statenames[S_surfxml_route] = "route";
   surfxml_statenames[S_surfxml_route_1] = "route";
@@ -427,7 +511,7 @@ const char* *surfxml_statenames=NULL;
 
  /* COMMENTS and PIs: handled uniformly for efficiency. */
 
 
  /* COMMENTS and PIs: handled uniformly for efficiency. */
 
-<ROOT_surfxml_platform,AL_surfxml_platform,S_surfxml_platform,S_surfxml_platform_1,S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_platform_5,E_surfxml_platform,AL_surfxml_include,E_surfxml_include,AL_surfxml_host,S_surfxml_host,S_surfxml_host_1,S_surfxml_host_2,E_surfxml_host,AL_surfxml_prop,E_surfxml_prop,AL_surfxml_router,E_surfxml_router,AL_surfxml_link,S_surfxml_link,S_surfxml_link_1,S_surfxml_link_2,E_surfxml_link,AL_surfxml_route,S_surfxml_route,S_surfxml_route_1,S_surfxml_route_2,E_surfxml_route,AL_surfxml_link_c_ctn,E_surfxml_link_c_ctn,AL_surfxml_process,S_surfxml_process,S_surfxml_process_1,S_surfxml_process_2,E_surfxml_process,AL_surfxml_argument,E_surfxml_argument,PROLOG,DOCTYPE,EPILOG>{
+<ROOT_surfxml_platform,AL_surfxml_platform,S_surfxml_platform,S_surfxml_platform_1,S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_platform_5,E_surfxml_platform,AL_surfxml_include,E_surfxml_include,AL_surfxml_trace,IN_trace,AL_surfxml_random,S_surfxml_random,S_surfxml_random_1,S_surfxml_random_2,E_surfxml_random,AL_surfxml_trace_c_connect,E_surfxml_trace_c_connect,AL_surfxml_set,E_surfxml_set,AL_surfxml_foreach,S_surfxml_foreach,S_surfxml_foreach_1,E_surfxml_foreach,AL_surfxml_host,S_surfxml_host,S_surfxml_host_1,S_surfxml_host_2,E_surfxml_host,AL_surfxml_prop,E_surfxml_prop,AL_surfxml_cluster,E_surfxml_cluster,AL_surfxml_router,E_surfxml_router,AL_surfxml_link,S_surfxml_link,S_surfxml_link_1,S_surfxml_link_2,E_surfxml_link,AL_surfxml_route_c_multi,S_surfxml_route_c_multi,S_surfxml_route_c_multi_1,S_surfxml_route_c_multi_2,E_surfxml_route_c_multi,AL_surfxml_route,S_surfxml_route,S_surfxml_route_1,S_surfxml_route_2,E_surfxml_route,AL_surfxml_link_c_ctn,E_surfxml_link_c_ctn,AL_surfxml_process,S_surfxml_process,S_surfxml_process_1,S_surfxml_process_2,E_surfxml_process,AL_surfxml_argument,E_surfxml_argument,PROLOG,DOCTYPE,EPILOG>{
  "<!--" ENTER(INCOMMENT);
  "<?" ENTER(INPI);
 }
  "<!--" ENTER(INCOMMENT);
  "<?" ENTER(INPI);
 }
@@ -447,7 +531,7 @@ const char* *surfxml_statenames=NULL;
 
  /* SPACES: skipped uniformly */
 
 
  /* SPACES: skipped uniformly */
 
-<ROOT_surfxml_platform,AL_surfxml_platform,S_surfxml_platform,S_surfxml_platform_1,S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_platform_5,E_surfxml_platform,AL_surfxml_include,E_surfxml_include,AL_surfxml_host,S_surfxml_host,S_surfxml_host_1,S_surfxml_host_2,E_surfxml_host,AL_surfxml_prop,E_surfxml_prop,AL_surfxml_router,E_surfxml_router,AL_surfxml_link,S_surfxml_link,S_surfxml_link_1,S_surfxml_link_2,E_surfxml_link,AL_surfxml_route,S_surfxml_route,S_surfxml_route_1,S_surfxml_route_2,E_surfxml_route,AL_surfxml_link_c_ctn,E_surfxml_link_c_ctn,AL_surfxml_process,S_surfxml_process,S_surfxml_process_1,S_surfxml_process_2,E_surfxml_process,AL_surfxml_argument,E_surfxml_argument,PROLOG,DOCTYPE,EPILOG>{S} SKIP;
+<ROOT_surfxml_platform,AL_surfxml_platform,S_surfxml_platform,S_surfxml_platform_1,S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_platform_5,E_surfxml_platform,AL_surfxml_include,E_surfxml_include,AL_surfxml_trace,AL_surfxml_random,S_surfxml_random,S_surfxml_random_1,S_surfxml_random_2,E_surfxml_random,AL_surfxml_trace_c_connect,E_surfxml_trace_c_connect,AL_surfxml_set,E_surfxml_set,AL_surfxml_foreach,S_surfxml_foreach,S_surfxml_foreach_1,E_surfxml_foreach,AL_surfxml_host,S_surfxml_host,S_surfxml_host_1,S_surfxml_host_2,E_surfxml_host,AL_surfxml_prop,E_surfxml_prop,AL_surfxml_cluster,E_surfxml_cluster,AL_surfxml_router,E_surfxml_router,AL_surfxml_link,S_surfxml_link,S_surfxml_link_1,S_surfxml_link_2,E_surfxml_link,AL_surfxml_route_c_multi,S_surfxml_route_c_multi,S_surfxml_route_c_multi_1,S_surfxml_route_c_multi_2,E_surfxml_route_c_multi,AL_surfxml_route,S_surfxml_route,S_surfxml_route_1,S_surfxml_route_2,E_surfxml_route,AL_surfxml_link_c_ctn,E_surfxml_link_c_ctn,AL_surfxml_process,S_surfxml_process,S_surfxml_process_1,S_surfxml_process_2,E_surfxml_process,AL_surfxml_argument,E_surfxml_argument,PROLOG,DOCTYPE,EPILOG>{S} SKIP;
 
  /* PROLOG: determine root element and process it. */
 
 
  /* PROLOG: determine root element and process it. */
 
@@ -467,8 +551,6 @@ const char* *surfxml_statenames=NULL;
 
  /* <!-- Small DTD for SURF based tools. -->  */
 
 
  /* <!-- Small DTD for SURF based tools. -->  */
 
-<E_surfxml_link,S_surfxml_platform,S_surfxml_platform_1,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_route_1,S_surfxml_link_1,E_surfxml_host,S_surfxml_link,S_surfxml_platform_2,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_process_2,S_surfxml_route>"<platform"{s} FAIL("Starting tag <platform> is not allowed here.");
-
 <ROOT_surfxml_platform>"<platform"{s} {
   AX_surfxml_platform_version = 1;
   AX_surfxml_platform_xmlns_c_link = 5;
 <ROOT_surfxml_platform>"<platform"{s} {
   AX_surfxml_platform_version = 1;
   AX_surfxml_platform_xmlns_c_link = 5;
@@ -514,8 +596,6 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</platform>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</platform>' expected.");
 }
 
-<E_surfxml_link,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_process_2,S_surfxml_route>"<include"{s} FAIL("Starting tag <include> is not allowed here.");
-
 <S_surfxml_platform_5,S_surfxml_platform_2,S_surfxml_platform_1,S_surfxml_platform_3,S_surfxml_platform,S_surfxml_platform_4>"<include"{s} {
   AX_surfxml_include_file = 0;
   ENTER(AL_surfxml_include); pushbuffer(0);
 <S_surfxml_platform_5,S_surfxml_platform_2,S_surfxml_platform_1,S_surfxml_platform_3,S_surfxml_platform,S_surfxml_platform_4>"<include"{s} {
   AX_surfxml_include_file = 0;
   ENTER(AL_surfxml_include); pushbuffer(0);
@@ -557,9 +637,279 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</include>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</include>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform_1,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_4,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_process_2,S_surfxml_route>"<host"{s} FAIL("Starting tag <host> is not allowed here.");
+<S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<trace"{s} {
+  AX_surfxml_trace_id = 0;
+  AX_surfxml_trace_file = 0;
+  AX_surfxml_trace_periodicity = 0;
+  ENTER(AL_surfxml_trace); pushbuffer(0);
+  }
+
+<AL_surfxml_trace>{
+ "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id);
+ "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id);
+
+ "file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file);
+ "file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file);
+
+ "periodicity"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity);
+ "periodicity"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity);
+
+ ">" {
+  if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
+  if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element.");
+  LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace);
+ }
+ "/>" {
+  if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
+  if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element.");
+  LEAVE; STag_surfxml_trace(); surfxml_pcdata_ix = 0; ETag_surfxml_trace(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ .       FAIL("Unexpected character `%c' in attribute list of trace element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `trace' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `trace' element.");
+}
+
+<IN_trace>{
+ "</trace"{s}">" {
+  LEAVE;
+  BUFFERDONE;
+  ETag_surfxml_trace();
+  surfxml_pcdata_ix = popbuffer();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</trace>' expected.",yytext);
+ <<EOF>> FAIL("Premature EOF: `</trace>' expected.");
+}
+
+<S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<random"{s} {
+  AX_surfxml_random_id = 0;
+  AX_surfxml_random_min = 0;
+  AX_surfxml_random_max = 0;
+  AX_surfxml_random_mean = 0;
+  AX_surfxml_random_std_deviation = 0;
+  AX_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
+  ENTER(AL_surfxml_random); pushbuffer(0);
+  }
+
+<AL_surfxml_random>{
+ "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id);
+ "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id);
+
+ "min"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min);
+ "min"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min);
+
+ "max"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max);
+ "max"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max);
+
+ "mean"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean);
+ "mean"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean);
+
+ "std_deviation"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std_deviation);
+ "std_deviation"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std_deviation);
+
+ "generator"{Eq}"'DRAND48'" |
+ "generator"{Eq}"\"DRAND48\"" A_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
+ "generator"{Eq}"'RAND'" |
+ "generator"{Eq}"\"RAND\"" A_surfxml_random_generator = A_surfxml_random_generator_RAND;
+
+ ">" {
+  if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
+  if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element.");
+  if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element.");
+  if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element.");
+  if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element.");
+  LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(S_surfxml_random);
+ }
+ "/>" {
+  if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
+  if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element.");
+  if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element.");
+  if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element.");
+  if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element.");
+  LEAVE; STag_surfxml_random(); surfxml_pcdata_ix = 0; ETag_surfxml_random(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ .       FAIL("Unexpected character `%c' in attribute list of random element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `random' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `random' element.");
+}
+
+<S_surfxml_random_2,S_surfxml_random,E_surfxml_random>{
+ "</random"{s}">" {
+  LEAVE;
+  ETag_surfxml_random();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</random>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</random>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</random>' expected.");
+}
+
+<S_surfxml_platform_5,S_surfxml_platform_2,S_surfxml_platform_1,S_surfxml_platform_3,S_surfxml_platform,S_surfxml_platform_4>"<trace:connect"{s} {
+  AX_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_AVAILABILITY;
+  AX_surfxml_trace_c_connect_trace_id = 0;
+  AX_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_HOST;
+  AX_surfxml_trace_c_connect_connector_id = 0;
+  ENTER(AL_surfxml_trace_c_connect); pushbuffer(0);
+  }
+
+<AL_surfxml_trace_c_connect>{
+ "kind"{Eq}"'AVAILABILITY'" |
+ "kind"{Eq}"\"AVAILABILITY\"" A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_AVAILABILITY;
+ "kind"{Eq}"'BANDWIDTH'" |
+ "kind"{Eq}"\"BANDWIDTH\"" A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_BANDWIDTH;
+ "kind"{Eq}"'LATENCY'" |
+ "kind"{Eq}"\"LATENCY\"" A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_LATENCY;
+ "kind"{Eq}"'POWER'" |
+ "kind"{Eq}"\"POWER\"" A_surfxml_trace_c_connect_kind = A_surfxml_trace_c_connect_kind_POWER;
+
+ "trace_id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_c_connect_trace_id);
+ "trace_id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_c_connect_trace_id);
+
+ "element"{Eq}"'HOST'" |
+ "element"{Eq}"\"HOST\"" A_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_HOST;
+ "element"{Eq}"'LINK'" |
+ "element"{Eq}"\"LINK\"" A_surfxml_trace_c_connect_element = A_surfxml_trace_c_connect_element_LINK;
 
 
-<S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<host"{s} {
+ "connector_id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_c_connect_connector_id);
+ "connector_id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_c_connect_connector_id);
+
+ ">" {
+  if (!AX_surfxml_trace_c_connect_trace_id) FAIL("Required attribute `trace_id' not set for `trace:connect' element.");
+  if (!AX_surfxml_trace_c_connect_connector_id) FAIL("Required attribute `connector_id' not set for `trace:connect' element.");
+  LEAVE; STag_surfxml_trace_c_connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace_c_connect);
+ }
+ "/>" {
+  if (!AX_surfxml_trace_c_connect_trace_id) FAIL("Required attribute `trace_id' not set for `trace:connect' element.");
+  if (!AX_surfxml_trace_c_connect_connector_id) FAIL("Required attribute `connector_id' not set for `trace:connect' element.");
+  LEAVE; STag_surfxml_trace_c_connect(); surfxml_pcdata_ix = 0; ETag_surfxml_trace_c_connect(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+   case S_surfxml_platform_2: SET(S_surfxml_platform_3); break;
+  }
+ }
+ .       FAIL("Unexpected character `%c' in attribute list of trace:connect element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `trace:connect' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `trace:connect' element.");
+}
+
+<E_surfxml_trace_c_connect>{
+ "</trace:connect"{s}">" {
+  LEAVE;
+  ETag_surfxml_trace_c_connect();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+   case S_surfxml_platform_2: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</trace:connect>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</trace:connect>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</trace:connect>' expected.");
+}
+
+<S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<set"{s} {
+  AX_surfxml_set_id = 0;
+  AX_surfxml_set_prefix = 0;
+  AX_surfxml_set_suffix = 0;
+  AX_surfxml_set_radical = 0;
+  ENTER(AL_surfxml_set); pushbuffer(0);
+  }
+
+<AL_surfxml_set>{
+ "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_set_id);
+ "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_set_id);
+
+ "prefix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_set_prefix);
+ "prefix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_set_prefix);
+
+ "suffix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_set_suffix);
+ "suffix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_set_suffix);
+
+ "radical"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_set_radical);
+ "radical"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_set_radical);
+
+ ">" {
+  if (!AX_surfxml_set_id) FAIL("Required attribute `id' not set for `set' element.");
+  if (!AX_surfxml_set_prefix) FAIL("Required attribute `prefix' not set for `set' element.");
+  if (!AX_surfxml_set_suffix) FAIL("Required attribute `suffix' not set for `set' element.");
+  if (!AX_surfxml_set_radical) FAIL("Required attribute `radical' not set for `set' element.");
+  LEAVE; STag_surfxml_set();surfxml_pcdata_ix = 0; ENTER(E_surfxml_set);
+ }
+ "/>" {
+  if (!AX_surfxml_set_id) FAIL("Required attribute `id' not set for `set' element.");
+  if (!AX_surfxml_set_prefix) FAIL("Required attribute `prefix' not set for `set' element.");
+  if (!AX_surfxml_set_suffix) FAIL("Required attribute `suffix' not set for `set' element.");
+  if (!AX_surfxml_set_radical) FAIL("Required attribute `radical' not set for `set' element.");
+  LEAVE; STag_surfxml_set(); surfxml_pcdata_ix = 0; ETag_surfxml_set(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ .       FAIL("Unexpected character `%c' in attribute list of set element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `set' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `set' element.");
+}
+
+<E_surfxml_set>{
+ "</set"{s}">" {
+  LEAVE;
+  ETag_surfxml_set();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</set>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</set>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</set>' expected.");
+}
+
+<S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<foreach"{s} {
+  AX_surfxml_foreach_set_id = 0;
+  ENTER(AL_surfxml_foreach); pushbuffer(0);
+  }
+
+<AL_surfxml_foreach>{
+ "set_id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_foreach_set_id);
+ "set_id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_foreach_set_id);
+
+ ">" {
+  if (!AX_surfxml_foreach_set_id) FAIL("Required attribute `set_id' not set for `foreach' element.");
+  LEAVE; STag_surfxml_foreach();surfxml_pcdata_ix = 0; ENTER(S_surfxml_foreach);
+ }
+ "/>" FAIL("`foreach' element cannot be empty.");
+ .       FAIL("Unexpected character `%c' in attribute list of foreach element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `foreach' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `foreach' element.");
+}
+
+<E_surfxml_foreach>{
+ "</foreach"{s}">" {
+  LEAVE;
+  ETag_surfxml_foreach();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</foreach>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</foreach>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</foreach>' expected.");
+}
+
+<S_surfxml_foreach,S_surfxml_platform_2,S_surfxml_platform_3,S_surfxml_platform>"<host"{s} {
   AX_surfxml_host_id = 0;
   AX_surfxml_host_power = 0;
   AX_surfxml_host_availability = 69;
   AX_surfxml_host_id = 0;
   AX_surfxml_host_power = 0;
   AX_surfxml_host_availability = 69;
@@ -617,6 +967,7 @@ const char* *surfxml_statenames=NULL;
   LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+   case S_surfxml_foreach: SET(S_surfxml_foreach_1); break;
   }
  }
  .       FAIL("Unexpected character `%c' in attribute list of host element.", yytext[0]);
   }
  }
  .       FAIL("Unexpected character `%c' in attribute list of host element.", yytext[0]);
@@ -631,6 +982,7 @@ const char* *surfxml_statenames=NULL;
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_platform_2: case S_surfxml_platform_3: case S_surfxml_platform: SET(S_surfxml_platform_3); break;
+   case S_surfxml_foreach: SET(S_surfxml_foreach_1); break;
   }
  }
  "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</host>' expected.",yytext);
   }
  }
  "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</host>' expected.",yytext);
@@ -638,9 +990,7 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</host>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</host>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform,S_surfxml_platform_1,E_surfxml_process,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_route_1,E_surfxml_host,S_surfxml_platform_2,S_surfxml_platform_5,S_surfxml_route>"<prop"{s} FAIL("Starting tag <prop> is not allowed here.");
-
-<S_surfxml_host,S_surfxml_link_1,S_surfxml_link_2,S_surfxml_host_1,S_surfxml_link,S_surfxml_process_1,S_surfxml_process,S_surfxml_process_2,S_surfxml_host_2>"<prop"{s} {
+<S_surfxml_host,S_surfxml_link_1,S_surfxml_link_2,S_surfxml_random,S_surfxml_random_2,S_surfxml_link,S_surfxml_host_1,S_surfxml_random_1,S_surfxml_process_1,S_surfxml_process,S_surfxml_process_2,S_surfxml_host_2>"<prop"{s} {
   AX_surfxml_prop_id = 0;
   AX_surfxml_prop_value = 0;
   ENTER(AL_surfxml_prop); pushbuffer(0);
   AX_surfxml_prop_id = 0;
   AX_surfxml_prop_value = 0;
   ENTER(AL_surfxml_prop); pushbuffer(0);
@@ -663,6 +1013,7 @@ const char* *surfxml_statenames=NULL;
   if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element.");
   LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */
   switch (YY_START) {
   if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element.");
   LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
@@ -679,6 +1030,7 @@ const char* *surfxml_statenames=NULL;
   ETag_surfxml_prop();
   popbuffer(); /* attribute */
   switch (YY_START) {
   ETag_surfxml_prop();
   popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
    case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
    case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break;
@@ -689,7 +1041,92 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</prop>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</prop>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform_1,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_4,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_process_2,S_surfxml_route>"<router"{s} FAIL("Starting tag <router> is not allowed here.");
+<S_surfxml_platform_2,S_surfxml_platform,S_surfxml_platform_3>"<cluster"{s} {
+  AX_surfxml_cluster_id = 0;
+  AX_surfxml_cluster_prefix = 0;
+  AX_surfxml_cluster_suffix = 0;
+  AX_surfxml_cluster_radical = 0;
+  AX_surfxml_cluster_power = 0;
+  AX_surfxml_cluster_bw = 0;
+  AX_surfxml_cluster_lat = 0;
+  AX_surfxml_cluster_bb_bw = 0;
+  AX_surfxml_cluster_bb_lat = 0;
+  ENTER(AL_surfxml_cluster); pushbuffer(0);
+  }
+
+<AL_surfxml_cluster>{
+ "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+ "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+
+ "prefix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+ "prefix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+
+ "suffix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+ "suffix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+
+ "radical"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+ "radical"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+
+ "power"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+ "power"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+
+ "bw"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+ "bw"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+
+ "lat"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+ "lat"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+
+ "bb_bw"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw);
+ "bb_bw"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw);
+
+ "bb_lat"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat);
+ "bb_lat"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat);
+
+ ">" {
+  if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element.");
+  LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster);
+ }
+ "/>" {
+  if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element.");
+  if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element.");
+  LEAVE; STag_surfxml_cluster(); surfxml_pcdata_ix = 0; ETag_surfxml_cluster(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
+  }
+ }
+ .       FAIL("Unexpected character `%c' in attribute list of cluster element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `cluster' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `cluster' element.");
+}
+
+<E_surfxml_cluster>{
+ "</cluster"{s}">" {
+  LEAVE;
+  ETag_surfxml_cluster();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</cluster>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</cluster>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</cluster>' expected.");
+}
 
 <S_surfxml_platform_2,S_surfxml_platform,S_surfxml_platform_3>"<router"{s} {
   AX_surfxml_router_id = 0;
 
 <S_surfxml_platform_2,S_surfxml_platform,S_surfxml_platform_3>"<router"{s} {
   AX_surfxml_router_id = 0;
@@ -730,9 +1167,7 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</router>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</router>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform_1,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_4,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_process_2,S_surfxml_route>"<link"{s} FAIL("Starting tag <link> is not allowed here.");
-
-<S_surfxml_platform_2,S_surfxml_platform,S_surfxml_platform_3>"<link"{s} {
+<S_surfxml_foreach,S_surfxml_platform_2,S_surfxml_platform,S_surfxml_foreach_1,S_surfxml_platform_3>"<link"{s} {
   AX_surfxml_link_id = 0;
   AX_surfxml_link_bandwidth = 0;
   AX_surfxml_link_bandwidth_file = 0;
   AX_surfxml_link_id = 0;
   AX_surfxml_link_bandwidth = 0;
   AX_surfxml_link_bandwidth_file = 0;
@@ -783,6 +1218,7 @@ const char* *surfxml_statenames=NULL;
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_foreach: case S_surfxml_foreach_1: SET(E_surfxml_foreach); break;
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
@@ -797,6 +1233,7 @@ const char* *surfxml_statenames=NULL;
   ETag_surfxml_link();
   popbuffer(); /* attribute */
   switch (YY_START) {
   ETag_surfxml_link();
   popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_foreach: case S_surfxml_foreach_1: SET(E_surfxml_foreach); break;
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
    case S_surfxml_platform_2: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_3); break;
   }
  }
@@ -805,7 +1242,57 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</link>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</link>' expected.");
 }
 
-<E_surfxml_link,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_platform_2,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_process_2,S_surfxml_route>"<route"{s} FAIL("Starting tag <route> is not allowed here.");
+<S_surfxml_platform_5,S_surfxml_platform_1,S_surfxml_platform,S_surfxml_platform_3,S_surfxml_platform_4>"<route:multi"{s} {
+  AX_surfxml_route_c_multi_src = 0;
+  AX_surfxml_route_c_multi_dst = 0;
+  AX_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_POSTPEND;
+  AX_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_YES;
+  ENTER(AL_surfxml_route_c_multi); pushbuffer(0);
+  }
+
+<AL_surfxml_route_c_multi>{
+ "src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_c_multi_src);
+ "src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_c_multi_src);
+
+ "dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_c_multi_dst);
+ "dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_c_multi_dst);
+
+ "action"{Eq}"'POSTPEND'" |
+ "action"{Eq}"\"POSTPEND\"" A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_POSTPEND;
+ "action"{Eq}"'PREPEND'" |
+ "action"{Eq}"\"PREPEND\"" A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_PREPEND;
+ "action"{Eq}"'OVERRIDE'" |
+ "action"{Eq}"\"OVERRIDE\"" A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_OVERRIDE;
+
+ "symmetric"{Eq}"'YES'" |
+ "symmetric"{Eq}"\"YES\"" A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_YES;
+ "symmetric"{Eq}"'NO'" |
+ "symmetric"{Eq}"\"NO\"" A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_NO;
+
+ ">" {
+  if (!AX_surfxml_route_c_multi_src) FAIL("Required attribute `src' not set for `route:multi' element.");
+  if (!AX_surfxml_route_c_multi_dst) FAIL("Required attribute `dst' not set for `route:multi' element.");
+  LEAVE; STag_surfxml_route_c_multi();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route_c_multi);
+ }
+ "/>" FAIL("`route:multi' element cannot be empty.");
+ .       FAIL("Unexpected character `%c' in attribute list of route:multi element.", yytext[0]);
+ {Name} FAIL("Bad attribute `%s' in `route:multi' element start tag.",yytext);
+ <<EOF>> FAIL("EOF in attribute list of `route:multi' element.");
+}
+
+<S_surfxml_route_c_multi_2,E_surfxml_route_c_multi>{
+ "</route:multi"{s}">" {
+  LEAVE;
+  ETag_surfxml_route_c_multi();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform_5: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: case S_surfxml_platform_4: SET(S_surfxml_platform_5); break;
+  }
+ }
+ "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</route:multi>' expected.",yytext);
+ .       FAIL("Unexpected character `%c': `</route:multi>' expected.",yytext[0]);
+ <<EOF>> FAIL("Premature EOF: `</route:multi>' expected.");
+}
 
 <S_surfxml_platform_5,S_surfxml_platform_1,S_surfxml_platform,S_surfxml_platform_3,S_surfxml_platform_4>"<route"{s} {
   AX_surfxml_route_src = 0;
 
 <S_surfxml_platform_5,S_surfxml_platform_1,S_surfxml_platform,S_surfxml_platform_3,S_surfxml_platform_4>"<route"{s} {
   AX_surfxml_route_src = 0;
@@ -814,6 +1301,7 @@ const char* *surfxml_statenames=NULL;
   AX_surfxml_route_impact_on_dst = 98;
   AX_surfxml_route_impact_on_src_with_other_recv = 102;
   AX_surfxml_route_impact_on_dst_with_other_send = 106;
   AX_surfxml_route_impact_on_dst = 98;
   AX_surfxml_route_impact_on_src_with_other_recv = 102;
   AX_surfxml_route_impact_on_dst_with_other_send = 106;
+  AX_surfxml_route_action = A_surfxml_route_action_POSTPEND;
   ENTER(AL_surfxml_route); pushbuffer(0);
   }
 
   ENTER(AL_surfxml_route); pushbuffer(0);
   }
 
@@ -836,6 +1324,13 @@ const char* *surfxml_statenames=NULL;
  "impact_on_dst_with_other_send"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
  "impact_on_dst_with_other_send"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
 
  "impact_on_dst_with_other_send"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
  "impact_on_dst_with_other_send"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_impact_on_dst_with_other_send);
 
+ "action"{Eq}"'POSTPEND'" |
+ "action"{Eq}"\"POSTPEND\"" A_surfxml_route_action = A_surfxml_route_action_POSTPEND;
+ "action"{Eq}"'PREPEND'" |
+ "action"{Eq}"\"PREPEND\"" A_surfxml_route_action = A_surfxml_route_action_PREPEND;
+ "action"{Eq}"'OVERRIDE'" |
+ "action"{Eq}"\"OVERRIDE\"" A_surfxml_route_action = A_surfxml_route_action_OVERRIDE;
+
  ">" {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
  ">" {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
@@ -868,9 +1363,7 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</route>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</route>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform,S_surfxml_platform_1,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,E_surfxml_route,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_platform_2,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_process_2>"<link:ctn"{s} FAIL("Starting tag <link:ctn> is not allowed here.");
-
-<S_surfxml_route_1,S_surfxml_route,S_surfxml_route_2>"<link:ctn"{s} {
+<S_surfxml_route_1,S_surfxml_route,S_surfxml_route_2,S_surfxml_route_c_multi_2,S_surfxml_route_c_multi_1,S_surfxml_route_c_multi>"<link:ctn"{s} {
   AX_surfxml_link_c_ctn_id = 0;
   ENTER(AL_surfxml_link_c_ctn); pushbuffer(0);
   }
   AX_surfxml_link_c_ctn_id = 0;
   ENTER(AL_surfxml_link_c_ctn); pushbuffer(0);
   }
@@ -888,6 +1381,7 @@ const char* *surfxml_statenames=NULL;
   LEAVE; STag_surfxml_link_c_ctn(); surfxml_pcdata_ix = 0; ETag_surfxml_link_c_ctn(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
   LEAVE; STag_surfxml_link_c_ctn(); surfxml_pcdata_ix = 0; ETag_surfxml_link_c_ctn(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_route_c_multi_2: case S_surfxml_route_c_multi_1: case S_surfxml_route_c_multi: SET(S_surfxml_route_c_multi_2); break;
   }
  }
  .       FAIL("Unexpected character `%c' in attribute list of link:ctn element.", yytext[0]);
   }
  }
  .       FAIL("Unexpected character `%c' in attribute list of link:ctn element.", yytext[0]);
@@ -902,6 +1396,7 @@ const char* *surfxml_statenames=NULL;
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_route_c_multi_2: case S_surfxml_route_c_multi_1: case S_surfxml_route_c_multi: SET(S_surfxml_route_c_multi_2); break;
   }
  }
  "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</link:ctn>' expected.",yytext);
   }
  }
  "</"{Name}{s}">" FAIL("Unexpected end-tag `%s': `</link:ctn>' expected.",yytext);
@@ -909,8 +1404,6 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</link:ctn>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</link:ctn>' expected.");
 }
 
-<E_surfxml_link,E_surfxml_process,S_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_platform_2,S_surfxml_host,S_surfxml_process_1,S_surfxml_host_2,S_surfxml_process_2,S_surfxml_route>"<process"{s} FAIL("Starting tag <process> is not allowed here.");
-
 <S_surfxml_platform_5,S_surfxml_platform_1,S_surfxml_platform,S_surfxml_platform_3,S_surfxml_platform_4>"<process"{s} {
   AX_surfxml_process_host = 0;
   AX_surfxml_process_function = 0;
 <S_surfxml_platform_5,S_surfxml_platform_1,S_surfxml_platform,S_surfxml_platform_3,S_surfxml_platform_4>"<process"{s} {
   AX_surfxml_process_host = 0;
   AX_surfxml_process_function = 0;
@@ -964,8 +1457,6 @@ const char* *surfxml_statenames=NULL;
  <<EOF>> FAIL("Premature EOF: `</process>' expected.");
 }
 
  <<EOF>> FAIL("Premature EOF: `</process>' expected.");
 }
 
-<E_surfxml_link,S_surfxml_platform,S_surfxml_platform_1,E_surfxml_process,S_surfxml_link_2,S_surfxml_host_1,E_surfxml_platform,S_surfxml_route_2,E_surfxml_route,S_surfxml_platform_3,S_surfxml_platform_4,S_surfxml_route_1,S_surfxml_link_1,S_surfxml_link,E_surfxml_host,S_surfxml_platform_2,S_surfxml_host,S_surfxml_host_2,S_surfxml_platform_5,S_surfxml_route>"<argument"{s} FAIL("Starting tag <argument> is not allowed here.");
-
 <S_surfxml_process_1,S_surfxml_process,S_surfxml_process_2>"<argument"{s} {
   AX_surfxml_argument_value = 0;
   ENTER(AL_surfxml_argument); pushbuffer(0);
 <S_surfxml_process_1,S_surfxml_process,S_surfxml_process_2>"<argument"{s} {
   AX_surfxml_argument_value = 0;
   ENTER(AL_surfxml_argument); pushbuffer(0);
@@ -1014,7 +1505,7 @@ const char* *surfxml_statenames=NULL;
 
  /* CHARACTER DATA. */
 
 
  /* CHARACTER DATA. */
 
-<IMPOSSIBLE,VALUE1,VALUE2>{
+<IN_trace,VALUE1,VALUE2>{
  /* Non-defined standard entities... */
 "&amp;"  BUFFERPUTC('&');
 "&lt;"   BUFFERPUTC('<');
  /* Non-defined standard entities... */
 "&amp;"  BUFFERPUTC('&');
 "&lt;"   BUFFERPUTC('<');
@@ -1027,14 +1518,14 @@ const char* *surfxml_statenames=NULL;
  "&#x"[[:xdigit:]]+";" BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16));
 }
 
  "&#x"[[:xdigit:]]+";" BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16));
 }
 
-<IMPOSSIBLE,VALUE1,VALUE2,CDATA>{
+<IN_trace,VALUE1,VALUE2,CDATA>{
  "\n"          |
  "\r"          |
  "\r\n"                |
  "\n\r"                BUFFERPUTC('\n');
 }
 
  "\n"          |
  "\r"          |
  "\r\n"                |
  "\n\r"                BUFFERPUTC('\n');
 }
 
-<IMPOSSIBLE>{
+<IN_trace>{
  "<![CDATA["   ENTER(CDATA);
  "]""]>"               FAIL("Unexpected `]""]>' in character data.");
 }
  "<![CDATA["   ENTER(CDATA);
  "]""]>"               FAIL("Unexpected `]""]>' in character data.");
 }
@@ -1049,7 +1540,7 @@ const char* *surfxml_statenames=NULL;
  <<EOF>>       FAIL("EOF in literal (`\"' expected).");
 }
 
  <<EOF>>       FAIL("EOF in literal (`\"' expected).");
 }
 
-<IMPOSSIBLE,VALUE1,VALUE2>{
+<IN_trace,VALUE1,VALUE2>{
  [^<&]         BUFFERPUTC(yytext[0]);
  [<&]          FAIL("Spurious `%c' in character data.",yytext[0]);
 }
  [^<&]         BUFFERPUTC(yytext[0]);
  [<&]          FAIL("Spurious `%c' in character data.",yytext[0]);
 }
index b0803d5..8e85a23 100644 (file)
 #include "xbt/dict.h"
 #include "surf/surfxml_parse_private.h"
 #include "surf/surf_private.h"
 #include "xbt/dict.h"
 #include "surf/surfxml_parse_private.h"
 #include "surf/surf_private.h"
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf,
                                "Logging specific to the SURF parsing module");
 
 #undef CLEANUP
 #include "surfxml.c"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf,
                                "Logging specific to the SURF parsing module");
 
 #undef CLEANUP
 #include "surfxml.c"
 
+/* This buffer is used to store the original buffer before substituing it by out own buffer. Usefull for the foreach tag */
+char* old_buff;
+/* Stores the set name reffered to by the foreach tag */
+static const char* foreach_set_name;
+static xbt_dynar_t main_STag_surfxml_host_cb_list = NULL;
+static xbt_dynar_t main_ETag_surfxml_host_cb_list = NULL;
+static xbt_dynar_t main_STag_surfxml_link_cb_list = NULL;
+static xbt_dynar_t main_ETag_surfxml_link_cb_list = NULL;
+
 /* make sure these symbols are defined as strong ones in this file so that the linked can resolve them */
 xbt_dynar_t STag_surfxml_platform_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_platform_cb_list = NULL;
 /* make sure these symbols are defined as strong ones in this file so that the linked can resolve them */
 xbt_dynar_t STag_surfxml_platform_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_platform_cb_list = NULL;
@@ -35,14 +45,36 @@ xbt_dynar_t STag_surfxml_argument_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_argument_cb_list = NULL;
 xbt_dynar_t STag_surfxml_prop_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_prop_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_argument_cb_list = NULL;
 xbt_dynar_t STag_surfxml_prop_cb_list = NULL;
 xbt_dynar_t ETag_surfxml_prop_cb_list = NULL;
+xbt_dynar_t STag_surfxml_set_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_set_cb_list = NULL;
+xbt_dynar_t STag_surfxml_foreach_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_foreach_cb_list = NULL;
+xbt_dynar_t STag_surfxml_route_c_multi_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_route_c_multi_cb_list = NULL;
+xbt_dynar_t STag_surfxml_cluster_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_cluster_cb_list = NULL;
+xbt_dynar_t STag_surfxml_trace_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_trace_cb_list = NULL;
+xbt_dynar_t STag_surfxml_trace_c_connect_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_trace_c_connect_cb_list = NULL;
+xbt_dynar_t STag_surfxml_random_cb_list = NULL;
+xbt_dynar_t ETag_surfxml_random_cb_list = NULL;
+
+/* Stores the sets defined in the XML */
+xbt_dict_t set_list = NULL;
 
 xbt_dict_t current_property_set = NULL;
 
 
 xbt_dict_t current_property_set = NULL;
 
+/* For the route:multi tag */
 xbt_dict_t route_table = NULL;
 xbt_dict_t route_table = NULL;
+xbt_dict_t route_multi_table = NULL;
+xbt_dynar_t route_multi_elements = NULL;
 xbt_dynar_t route_link_list = NULL;
 xbt_dynar_t links = NULL;
 xbt_dynar_t keys = NULL;
 
 xbt_dynar_t route_link_list = NULL;
 xbt_dynar_t links = NULL;
 xbt_dynar_t keys = NULL;
 
+xbt_dict_t random_data_list = NULL;
+
 static xbt_dynar_t surf_input_buffer_stack = NULL;
 static xbt_dynar_t surf_file_to_parse_stack = NULL;
 
 static xbt_dynar_t surf_input_buffer_stack = NULL;
 static xbt_dynar_t surf_file_to_parse_stack = NULL;
 
@@ -51,22 +83,7 @@ static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t);
 YY_BUFFER_STATE surf_input_buffer;
 FILE *surf_file_to_parse = NULL;
 
 YY_BUFFER_STATE surf_input_buffer;
 FILE *surf_file_to_parse = NULL;
 
-void make_route_table(void)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key,*data;
-  const char *sep = "##";
-
-   xbt_dict_foreach(route_table, cursor, key, data) {
-     links = (xbt_dynar_t)data;
-     keys = xbt_str_split_str(key, sep);
-     surfxml_call_cb_functions(ETag_surfxml_platform_cb_list);
-   }
-
-   xbt_dict_free(&route_table);
-   xbt_dynar_free(&links);
-
-}
+static void convert_route_multi_to_routes(void);
 
 void surf_parse_free_callbacks(void)
 {
 
 void surf_parse_free_callbacks(void)
 {
@@ -88,6 +105,20 @@ void surf_parse_free_callbacks(void)
   xbt_dynar_free(&ETag_surfxml_argument_cb_list);
   xbt_dynar_free(&STag_surfxml_prop_cb_list);
   xbt_dynar_free(&ETag_surfxml_prop_cb_list);
   xbt_dynar_free(&ETag_surfxml_argument_cb_list);
   xbt_dynar_free(&STag_surfxml_prop_cb_list);
   xbt_dynar_free(&ETag_surfxml_prop_cb_list);
+  xbt_dynar_free(&STag_surfxml_set_cb_list);
+  xbt_dynar_free(&ETag_surfxml_set_cb_list);
+  xbt_dynar_free(&STag_surfxml_foreach_cb_list);
+  xbt_dynar_free(&ETag_surfxml_foreach_cb_list);
+  xbt_dynar_free(&STag_surfxml_route_c_multi_cb_list);
+  xbt_dynar_free(&ETag_surfxml_route_c_multi_cb_list);
+  xbt_dynar_free(&STag_surfxml_cluster_cb_list);
+  xbt_dynar_free(&ETag_surfxml_cluster_cb_list);
+  xbt_dynar_free(&STag_surfxml_trace_cb_list);
+  xbt_dynar_free(&ETag_surfxml_trace_cb_list);
+  xbt_dynar_free(&STag_surfxml_trace_c_connect_cb_list);
+  xbt_dynar_free(&ETag_surfxml_trace_c_connect_cb_list);
+  xbt_dynar_free(&STag_surfxml_random_cb_list);
+  xbt_dynar_free(&ETag_surfxml_random_cb_list);
 }
 
 void surf_parse_reset_parser(void)
 }
 
 void surf_parse_reset_parser(void)
@@ -111,7 +142,20 @@ void surf_parse_reset_parser(void)
   ETag_surfxml_argument_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
   STag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
   ETag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
   ETag_surfxml_argument_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
   STag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
   ETag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
-
+  STag_surfxml_set_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_set_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_foreach_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_foreach_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_route_c_multi_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_route_c_multi_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_cluster_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_cluster_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_trace_c_connect_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_trace_c_connect_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
 }
 
 void STag_surfxml_include(void)
 }
 
 void STag_surfxml_include(void)
@@ -162,12 +206,21 @@ void STag_surfxml_platform(void)
              "is available in the contrib/platform_generation directory "
              "of the simgrid repository.");
 
              "is available in the contrib/platform_generation directory "
              "of the simgrid repository.");
 
+  if (set_list == NULL) set_list = xbt_dict_new(); 
+
   surfxml_call_cb_functions(STag_surfxml_platform_cb_list);
   surfxml_call_cb_functions(STag_surfxml_platform_cb_list);
+
 }
 
 void ETag_surfxml_platform(void)
 {
 }
 
 void ETag_surfxml_platform(void)
 {
-  if (route_table != NULL) make_route_table();
+  convert_route_multi_to_routes();
+
+  surfxml_call_cb_functions(ETag_surfxml_platform_cb_list);
+
+  xbt_dict_free(&random_data_list);
+  xbt_dict_free(&set_list);
+
 }
 
 void STag_surfxml_host(void)
 }
 
 void STag_surfxml_host(void)
@@ -249,6 +302,92 @@ void ETag_surfxml_prop(void)
   surfxml_call_cb_functions(ETag_surfxml_prop_cb_list);
 }
 
   surfxml_call_cb_functions(ETag_surfxml_prop_cb_list);
 }
 
+void STag_surfxml_set(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_set_cb_list);
+}
+
+void ETag_surfxml_set(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_set_cb_list);
+}
+
+void STag_surfxml_foreach(void)
+{
+  /* Save the current buffer */
+  old_buff = surfxml_bufferstack;
+  surfxml_call_cb_functions(STag_surfxml_foreach_cb_list);
+}
+
+void ETag_surfxml_foreach(void)
+{ 
+  surfxml_call_cb_functions(ETag_surfxml_foreach_cb_list);
+
+  /* free the temporary dynar and restore original */
+  xbt_dynar_free(&STag_surfxml_host_cb_list);
+  xbt_dynar_free(&ETag_surfxml_host_cb_list);
+
+  STag_surfxml_host_cb_list = main_STag_surfxml_host_cb_list;
+  ETag_surfxml_host_cb_list = main_ETag_surfxml_host_cb_list;
+
+  /* free the temporary dynar and restore original */
+  xbt_dynar_free(&STag_surfxml_link_cb_list);
+  xbt_dynar_free(&ETag_surfxml_link_cb_list);
+
+  STag_surfxml_link_cb_list = main_STag_surfxml_link_cb_list;
+  ETag_surfxml_link_cb_list = main_ETag_surfxml_link_cb_list;
+
+}
+
+void STag_surfxml_route_c_multi(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_route_c_multi_cb_list);
+}
+
+void ETag_surfxml_route_c_multi(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_route_c_multi_cb_list);
+}
+
+void STag_surfxml_cluster(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_cluster_cb_list);
+}
+
+void ETag_surfxml_cluster(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_cluster_cb_list);
+}
+
+void STag_surfxml_trace(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_trace_cb_list);
+}
+
+void ETag_surfxml_trace(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_trace_cb_list);
+}
+
+void STag_surfxml_trace_c_connect(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_trace_c_connect_cb_list);
+}
+
+void ETag_surfxml_trace_c_connect(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_trace_c_connect_cb_list);
+}
+
+void STag_surfxml_random(void)
+{
+  surfxml_call_cb_functions(STag_surfxml_random_cb_list);
+}
+
+void ETag_surfxml_random(void)
+{
+  surfxml_call_cb_functions(ETag_surfxml_random_cb_list);
+}
 
 void surf_parse_open(const char *file)
 {
 
 void surf_parse_open(const char *file)
 {
@@ -303,6 +442,15 @@ void surf_parse_get_double(double *value, const char *string)
              surf_parse_lineno, string);
 }
 
              surf_parse_lineno, string);
 }
 
+void surf_parse_get_int(int *value, const char *string)
+{
+  int ret = 0;
+
+  ret = sscanf(string, "%d", value);
+  xbt_assert2((ret == 1), "Parse error line %d : %s not a number",
+             surf_parse_lineno, string);
+}
+
 void surf_parse_get_trace(tmgr_trace_t * trace, const char *string)
 {
   if ((!string) || (strcmp(string, "") == 0))
 void surf_parse_get_trace(tmgr_trace_t * trace, const char *string)
 {
   if ((!string) || (strcmp(string, "") == 0))
@@ -342,23 +490,565 @@ static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t cb_list)
     }
 }
 
     }
 }
 
-void init_route_table(void)
+void init_data(void)
 {
   xbt_dict_free(&route_table);
   xbt_dynar_free(&route_link_list);
 {
   xbt_dict_free(&route_table);
   xbt_dynar_free(&route_link_list);
-  route_table = xbt_dict_new();
+  route_table = xbt_dict_new_ext(202400);
+
+  route_multi_table = xbt_dict_new();
+  route_multi_elements = xbt_dynar_new(sizeof(char*), NULL);
+  traces_set_list = xbt_dict_new();
+  traces_connect_list = xbt_dynar_new(sizeof(char*), NULL);
+  random_data_list = xbt_dict_new();
+
+}
+
+void parse_platform_file(const char* file)
+{
+  surf_parse_open(file);
+  xbt_assert1((!(*surf_parse)()), "Parse error in %s", file);
+  surf_parse_close();
+}
+
+/* Functions to bypass route, host and link tags. Used by the foreach and route:multi tags */
+
+static void parse_make_temporary_route(const char *src, const char *dst, int action)
+{
+  int AX_ptr = 0;
+  surfxml_bufferstack = xbt_new0(char, 2048);
+  
+  A_surfxml_route_action = action;
+  SURFXML_BUFFER_SET(route_src,                     src);
+  SURFXML_BUFFER_SET(route_dst,                     dst);
+  SURFXML_BUFFER_SET(route_impact_on_src,                 "0.0");
+  SURFXML_BUFFER_SET(route_impact_on_dst,                 "0.0");
+  SURFXML_BUFFER_SET(route_impact_on_src_with_other_recv, "0.0");
+  SURFXML_BUFFER_SET(route_impact_on_dst_with_other_send, "0.0");
+}
+
+static void parse_change_cpu_data(const char* hostName, const char* surfxml_host_power, const char* surfxml_host_availability,
+                                       const char* surfxml_host_availability_file, const char* surfxml_host_state_file,
+                                       const char* surfxml_host_interference_send, const char* surfxml_host_interference_recv,
+                                       const char* surfxml_host_interference_send_recv, const char* surfxml_host_max_outgoing_rate)
+{
+  int AX_ptr = 0;
+  surfxml_bufferstack = xbt_new0(char, 2048);
+  SURFXML_BUFFER_SET(host_id,                     hostName);
+  SURFXML_BUFFER_SET(host_power,                  surfxml_host_power /*hostPower*/);
+  SURFXML_BUFFER_SET(host_availability,           surfxml_host_availability);
+  SURFXML_BUFFER_SET(host_availability_file,      surfxml_host_availability_file);
+  SURFXML_BUFFER_SET(host_state_file,             surfxml_host_state_file);
+  SURFXML_BUFFER_SET(host_interference_send,      surfxml_host_interference_send);
+  SURFXML_BUFFER_SET(host_interference_recv,      surfxml_host_interference_recv);
+  SURFXML_BUFFER_SET(host_interference_send_recv, surfxml_host_interference_send_recv);
+  SURFXML_BUFFER_SET(host_max_outgoing_rate,      surfxml_host_max_outgoing_rate);
+}
+
+static void parse_change_link_data(const char* linkName, const char* surfxml_link_bandwidth, const char* surfxml_link_bandwidth_file,
+                                       const char* surfxml_link_latency, const char* surfxml_link_latency_file, const char* surfxml_link_state_file)
+{
+  int AX_ptr = 0;
+  surfxml_bufferstack = xbt_new0(char, 2048);
+  SURFXML_BUFFER_SET(link_id,                linkName);
+  SURFXML_BUFFER_SET(link_bandwidth,         surfxml_link_bandwidth);
+  SURFXML_BUFFER_SET(link_bandwidth_file,    surfxml_link_bandwidth_file);
+  SURFXML_BUFFER_SET(link_latency,           surfxml_link_latency);
+  SURFXML_BUFFER_SET(link_latency_file,      surfxml_link_latency_file);
+  SURFXML_BUFFER_SET(link_state_file,        surfxml_link_state_file);
+}
+
+/**
+* \brief Restores the original surfxml buffer
+*/
+static void parse_restore_original_buffer(void)
+{
+  free(surfxml_bufferstack);
+  surfxml_bufferstack = old_buff;
 }
 
 }
 
+/* Functions for the sets and foreach tags */
+
+void parse_sets(void)
+{
+  char *id, *suffix, *prefix, *radical;
+  int start, end;
+  xbt_dynar_t radical_ends;
+
+  id = xbt_strdup(A_surfxml_set_id);
+  prefix = xbt_strdup(A_surfxml_set_prefix);
+  suffix = xbt_strdup(A_surfxml_set_suffix);
+  radical = xbt_strdup(A_surfxml_set_radical);
+  
+  xbt_assert1(!xbt_dict_get_or_null(set_list, id),
+             "Set '%s' declared several times in the platform file.",id);  
+  radical_ends = xbt_str_split(radical, "-");
+  xbt_assert1((xbt_dynar_length(radical_ends)==2), "Radical must be in the form lvalue-rvalue! Provided value: %s", radical);
+
+  surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char*));
+  surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char*));
+
+  xbt_dynar_t current_set = xbt_dynar_new(sizeof(char*), NULL);
+
+  char *value;
+  int i;
+  for (i=start; i<end; i++) {
+     value = bprintf("%s%d%s", prefix, i, suffix);
+     xbt_dynar_push(current_set, &value);
+  } 
+  
+  xbt_dict_set(set_list, id, current_set, NULL);
+}
+
+static void parse_host_foreach(void)
+{
+  xbt_dynar_t names = NULL;
+  unsigned int cpt = 0;
+  char *name;
+  
+  xbt_assert1((names = xbt_dict_get_or_null(set_list, foreach_set_name)),
+             "Set name '%s' reffered by foreach tag not found.", foreach_set_name);  
+
+  xbt_assert1((strcmp(A_surfxml_host_id, "$1") == 0), "The id of the host within the foreach should point to the foreach set_id (use $1). Your value: %s", A_surfxml_host_id);
+
+  const char* surfxml_host_power = A_surfxml_host_power;
+  const char* surfxml_host_availability = A_surfxml_host_availability;
+  const char* surfxml_host_availability_file = A_surfxml_host_availability_file;
+  const char* surfxml_host_state_file = A_surfxml_host_state_file;
+  const char* surfxml_host_interference_send = A_surfxml_host_interference_send;
+  const char* surfxml_host_interference_recv = A_surfxml_host_interference_recv;
+  const char *surfxml_host_interference_send_recv = A_surfxml_host_interference_send_recv;
+  const char* surfxml_host_max_outgoing_rate = A_surfxml_host_max_outgoing_rate;
+
+  /* foreach name in set call the main host callback */
+  xbt_dynar_foreach (names, cpt, name) {
+    parse_change_cpu_data(name, surfxml_host_power, surfxml_host_availability,
+                                       surfxml_host_availability_file, surfxml_host_state_file,
+                                       surfxml_host_interference_send, surfxml_host_interference_recv,
+                                       surfxml_host_interference_send_recv, surfxml_host_max_outgoing_rate);
+    surfxml_call_cb_functions(main_STag_surfxml_host_cb_list);
+    surfxml_call_cb_functions(main_ETag_surfxml_host_cb_list);
+    free(surfxml_bufferstack);
+  }
+
+  surfxml_bufferstack = old_buff;
+  
+}
+
+static void parse_link_foreach(void)
+{
+  xbt_dynar_t names = NULL;
+  unsigned int cpt = 0;
+  char *name;
+
+  xbt_assert1((names = xbt_dict_get_or_null(set_list, foreach_set_name)),
+             "Set name '%s' reffered by foreach tag not found.", foreach_set_name); 
+
+  xbt_assert1((strcmp(A_surfxml_link_id, "$1") == 0), "The id of the link within the foreach should point to the foreach set_id (use $1). Your value: %s", A_surfxml_link_id);
+
+  const char* surfxml_link_bandwidth = A_surfxml_link_bandwidth;
+  const char* surfxml_link_bandwidth_file = A_surfxml_link_bandwidth_file;
+  const char* surfxml_link_latency = A_surfxml_link_latency;
+  const char* surfxml_link_latency_file = A_surfxml_link_latency_file;
+  const char* surfxml_link_state_file = A_surfxml_link_state_file;
+  /* for each name in set call the main link callback */
+  xbt_dynar_foreach (names, cpt, name) {
+    parse_change_link_data(name, surfxml_link_bandwidth, surfxml_link_bandwidth_file,
+                                       surfxml_link_latency, surfxml_link_latency_file, surfxml_link_state_file);
+    surfxml_call_cb_functions(main_STag_surfxml_link_cb_list);
+    surfxml_call_cb_functions(main_ETag_surfxml_link_cb_list);
+   free(surfxml_bufferstack);
+
+  }
+
+  surfxml_bufferstack = old_buff;
+}
+
+void parse_foreach(void)
+{
+  /* save the host & link callbacks */
+  main_STag_surfxml_host_cb_list = STag_surfxml_host_cb_list;
+  main_ETag_surfxml_host_cb_list = ETag_surfxml_host_cb_list;
+  main_STag_surfxml_link_cb_list = STag_surfxml_link_cb_list;
+  main_ETag_surfxml_link_cb_list = ETag_surfxml_link_cb_list;
+
+  /* define host & link callbacks to be used only by the foreach tag */
+  STag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  STag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+  ETag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t),NULL);
+
+  surfxml_add_callback(STag_surfxml_host_cb_list, &parse_host_foreach);
+  surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_foreach);
+
+  /* get set name */
+  foreach_set_name = xbt_strdup(A_surfxml_foreach_set_id); 
+}
+
+/* Route:multi functions */
+
+static int route_multi_size=0;
+static char* src_name, *dst_name;
+static int is_symmetric_route;
+
 void parse_route_elem(void)
 {
   char *val;
 void parse_route_elem(void)
 {
   char *val;
+
   val = xbt_strdup(A_surfxml_link_c_ctn_id);
   val = xbt_strdup(A_surfxml_link_c_ctn_id);
+  
   xbt_dynar_push(route_link_list, &val);
 }
 
   xbt_dynar_push(route_link_list, &val);
 }
 
-void parse_platform_file(const char* file)
+void parse_route_multi_set_endpoints(void)
 {
 {
-  surf_parse_open(file);
-  xbt_assert1((!(*surf_parse)()), "Parse error in %s", file);
-  surf_parse_close();
+  src_name = xbt_strdup(A_surfxml_route_c_multi_src); 
+  dst_name = xbt_strdup(A_surfxml_route_c_multi_dst); 
+  route_action = A_surfxml_route_c_multi_action;
+  is_symmetric_route = A_surfxml_route_c_multi_symmetric;
+  route_multi_size++;
+
+  route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
+}
+
+static int contains(xbt_dynar_t list, const char* value)
+{
+ unsigned int cpt;
+ char * val;
+ xbt_dynar_foreach(list, cpt, val) {
+   if (strcmp(val, value) == 0)
+      return 1;
+  }
+  return 0;
+}
+
+/* 
+   This function is used to append or override the contents of an alread existing route in the case a new one with its name is found.
+   The decision is based upon the value of action specified in the xml route:multi attribute action
+ */
+void manage_route(xbt_dict_t routing_table, const char *route_name, int action, int isMultiRoute)
+{
+  unsigned int cpt;
+  xbt_dynar_t links;
+  char *value;
+
+  /* get already existing list if it exists */
+  links = xbt_dict_get_or_null(routing_table, route_name);
+  DEBUG1("ROUTE: %s", route_name);
+  if (links != NULL) {
+     switch (action) {
+        case A_surfxml_route_c_multi_action_PREPEND: /* add existing links at the end; route_link_list + links */
+                                   xbt_dynar_foreach(links, cpt, value) {      
+                                       xbt_dynar_push(route_link_list,&value);
+                                   }
+                                    break;
+        case A_surfxml_route_c_multi_action_POSTPEND: /* add existing links in front; links + route_link_list */ 
+                                   xbt_dynar_foreach(route_link_list, cpt, value) {
+                                       xbt_dynar_push(links,&value);
+                                   }
+                                    route_link_list = links;
+                                   break;
+        case A_surfxml_route_c_multi_action_OVERRIDE:
+                                    break;
+        default:break;
+     }
+  }
+  /* this is the final route; do not add if name is a set; add only if name is in set list */
+  if (!isMultiRoute){    
+    xbt_dict_set(routing_table, route_name, route_link_list, NULL);
+  }
+}
+
+void parse_route_multi_set_route(void)
+{
+  char* route_name;
+
+  route_name = bprintf("%s#%s#%d#%d#%d", src_name, dst_name, route_action, is_symmetric_route, route_multi_size);
+
+  xbt_dynar_push(route_multi_elements, &route_name);
+
+  /* Add route */
+  xbt_dict_set(route_multi_table, route_name, route_link_list, NULL);
+  /* add symmetric if it is the case */ 
+  if (is_symmetric_route == 1) {
+    char * symmetric_name = bprintf("%s#%s#%d#%d#%d", dst_name, src_name, route_action, !is_symmetric_route, route_multi_size);
+  
+    xbt_dict_set(route_multi_table, symmetric_name, route_link_list, NULL);
+    xbt_dynar_push(route_multi_elements, &symmetric_name);
+    is_symmetric_route = 0;
+  }
+  free(src_name);
+  free(dst_name);
+}
+
+static void add_multi_links(const char* src, const char* dst, xbt_dynar_t links, const char* src_name, const char* dst_name)
+{
+  unsigned int cpt;
+  char* value, *val;
+   parse_make_temporary_route(src_name, dst_name, route_action);
+   surfxml_call_cb_functions(STag_surfxml_route_cb_list);
+   DEBUG2("\tADDING ROUTE: %s -> %s", src_name, dst_name);
+   /* Build link list */ 
+   xbt_dynar_foreach(links, cpt, value) {
+     if (strcmp(value, src) == 0)
+       val =  xbt_strdup(src_name);
+     else if (strcmp(value, dst) == 0)
+       val = xbt_strdup(dst_name);
+     else if (strcmp(value, "$dst") == 0)
+       val = xbt_strdup(dst_name);
+     else if (strcmp(value, "$src") == 0)
+       val = xbt_strdup(src_name);
+     else
+       val = xbt_strdup(value);
+     xbt_dynar_push(route_link_list, &val);
+   }    
+   surfxml_call_cb_functions(ETag_surfxml_route_cb_list);
+   free(surfxml_bufferstack);
+}
+
+static void convert_route_multi_to_routes(void)
+{
+  xbt_dict_cursor_t cursor_w;
+  int symmetric;
+  unsigned int cpt, cpt2, cursor;
+  char *src_host_name, *dst_host_name, *key, *src, *dst, *val, *key_w, *data_w; 
+  const char* sep="#";
+  xbt_dynar_t src_names = NULL, dst_names = NULL, links;
+
+  if (!route_multi_elements) return;
+
+  old_buff = surfxml_bufferstack;
+  /* Get all routes in the exact order they were entered in the platform file */
+  xbt_dynar_foreach(route_multi_elements, cursor, key) {
+     /* Get links for the route */     
+     links = (xbt_dynar_t)xbt_dict_get_or_null(route_multi_table, key);
+     keys = xbt_str_split_str(key, sep);
+     /* Get route ends */
+     src = xbt_dynar_get_as(keys, 0, char*);
+     dst = xbt_dynar_get_as(keys, 1, char*);
+     route_action = atoi(xbt_dynar_get_as(keys, 2, char*));
+     symmetric = atoi(xbt_dynar_get_as(keys, 3, char*));
+
+    /* Create the dynar of src and dst hosts for the new routes */ 
+    /* NOTE: src and dst can be either set names or simple host names */
+    src_names = (xbt_dynar_t)xbt_dict_get_or_null(set_list, src);
+    dst_names = (xbt_dynar_t)xbt_dict_get_or_null(set_list, dst);
+    /* Add to dynar even if they are simple names */
+    if (src_names == NULL) {
+       src_names = xbt_dynar_new(sizeof(char *), &free_string);
+       val = xbt_strdup(src);
+       xbt_dynar_push(src_names, &val);
+    }
+    if (dst_names == NULL) {
+       dst_names = xbt_dynar_new(sizeof(char *), &free_string);
+       val = xbt_strdup(dst);
+       xbt_dynar_push(dst_names, &val);
+    }
+    /* Build the routes */
+    DEBUG2("ADDING MULTI ROUTE: %s -> %s", xbt_dynar_get_as(keys, 0, char*), xbt_dynar_get_as(keys, 1, char*));
+    xbt_dynar_foreach(src_names, cpt, src_host_name) {
+      xbt_dynar_foreach(dst_names, cpt2, dst_host_name) {
+        /* If dst is $* then set this route to have its dst point to all hosts */
+        if (strcmp(src_host_name,"$*") != 0 && strcmp(dst_host_name,"$*") == 0){
+                 xbt_dict_foreach(workstation_set, cursor_w, key_w, data_w) {
+                          //int n = xbt_dynar_member(src_names, (char*)key_w);
+                                   add_multi_links(src, dst, links, src_host_name, key_w);               
+                 }
+        }
+        /* If src is $* then set this route to have its dst point to all hosts */
+        if (strcmp(src_host_name,"$*") == 0 && strcmp(dst_host_name,"$*") != 0){
+                 xbt_dict_foreach(workstation_set, cursor_w, key_w, data_w) {
+                     // if (!symmetric || (symmetric && !contains(dst_names, key_w)))
+                       add_multi_links(src, dst, links, key_w, dst_host_name);               
+                }
+        }
+        /* if none of them are equal to $* */
+        if (strcmp(src_host_name,"$*") != 0 && strcmp(dst_host_name,"$*") != 0) {
+                       add_multi_links(src, dst, links, src_host_name, dst_host_name);               
+       }     
+      }
+    }
+  }  
+  surfxml_bufferstack = old_buff;
+  xbt_dict_free(&route_multi_table);
+  xbt_dynar_free(&route_multi_elements);
+}
+
+/* Cluster tag functions */
+
+void parse_cluster(void)
+{  
+   static int AX_ptr = 0;
+   static int surfxml_bufferstack_size = 2048;
+   char* cluster_id = A_surfxml_cluster_id;
+   char* cluster_prefix = A_surfxml_cluster_prefix;
+   char* cluster_suffix = A_surfxml_cluster_suffix;
+   char* cluster_radical = A_surfxml_cluster_radical;
+   char* cluster_power = A_surfxml_cluster_power;
+   char* cluster_bw = A_surfxml_cluster_bw;
+   char* cluster_lat = A_surfxml_cluster_lat;
+   char* cluster_bb_bw = A_surfxml_cluster_bb_bw;
+   char* cluster_bb_lat = A_surfxml_cluster_bb_lat;
+   char* saved_buff = surfxml_bufferstack;
+   surfxml_bufferstack = xbt_new0(char, surfxml_bufferstack_size);
+
+   /* Make set */
+   SURFXML_BUFFER_SET(set_id, cluster_id);
+   SURFXML_BUFFER_SET(set_prefix, cluster_prefix);
+   SURFXML_BUFFER_SET(set_suffix, cluster_suffix);
+   SURFXML_BUFFER_SET(set_radical, cluster_radical);
+  
+   SURFXML_START_TAG(set);
+   SURFXML_END_TAG(set);
+
+   /* Make foreach */
+   SURFXML_BUFFER_SET(foreach_set_id, cluster_id);
+
+   SURFXML_START_TAG(foreach);
+
+     /* Make host for the foreach */
+     parse_change_cpu_data("$1", cluster_power, "1.0", "", "", "1.0", "1.0", "1.0","-1.0");
+     A_surfxml_host_state = A_surfxml_host_state_ON;
+
+     SURFXML_START_TAG(host);
+     SURFXML_END_TAG(host);
+
+     /* Make link for the foreach */
+     parse_change_link_data("$1", cluster_bw, "", cluster_lat, "", "");
+     A_surfxml_link_state = A_surfxml_link_state_ON;
+     A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+     SURFXML_START_TAG(link);
+     SURFXML_END_TAG(link);
+
+   SURFXML_END_TAG(foreach);
+
+   /* Make backbone link */
+   char * backbone_name = bprintf("%s_bb", cluster_id);
+   parse_change_link_data(backbone_name, cluster_bb_bw, "", cluster_bb_lat, "", "");
+   A_surfxml_link_state = A_surfxml_link_state_ON;
+   A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+   SURFXML_START_TAG(link);
+   SURFXML_END_TAG(link);
+
+   /* Make route multi with the outside world, i.e. cluster->$* */
+   SURFXML_BUFFER_SET(route_c_multi_src, cluster_id);
+   SURFXML_BUFFER_SET(route_c_multi_dst, "$*");
+   A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_NO;
+   A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_OVERRIDE;
+   
+   SURFXML_START_TAG(route_c_multi);
+
+     SURFXML_BUFFER_SET(link_c_ctn_id, "$src");
+    
+     SURFXML_START_TAG(link_c_ctn);
+     SURFXML_END_TAG(link_c_ctn);
+
+   SURFXML_END_TAG(route_c_multi);
+
+   /* Make route multi between cluster hosts, i.e. cluster->cluster */
+   SURFXML_BUFFER_SET(route_c_multi_src, cluster_id);
+   SURFXML_BUFFER_SET(route_c_multi_dst, cluster_id);
+   A_surfxml_route_c_multi_action = A_surfxml_route_c_multi_action_POSTPEND;
+   A_surfxml_route_c_multi_symmetric = A_surfxml_route_c_multi_symmetric_NO;
+   
+   SURFXML_START_TAG(route_c_multi);
+    
+     SURFXML_BUFFER_SET(link_c_ctn_id, backbone_name);
+    
+     SURFXML_START_TAG(link_c_ctn);
+     SURFXML_END_TAG(link_c_ctn);
+    
+   SURFXML_END_TAG(route_c_multi);
+
+
+   /* Restore buff */
+   free(surfxml_bufferstack);
+   surfxml_bufferstack = saved_buff;
+}
+
+/* Trace management functions */
+
+static double trace_periodicity = -1.0;
+static char* trace_file = NULL;
+static char* trace_id;
+
+void parse_trace_init(void)
+{
+   trace_id = strdup(A_surfxml_trace_id);
+   trace_file = strdup(A_surfxml_trace_file);
+   surf_parse_get_double(&trace_periodicity, A_surfxml_trace_periodicity);
+}
+
+void parse_trace_finalize(void)
+{
+  tmgr_trace_t trace;
+  if (!trace_file || strcmp(trace_file,"") != 0) {
+    surf_parse_get_trace(&trace, trace_file);
+  }
+  else {
+    if (strcmp(surfxml_pcdata, "") == 0) trace = NULL;
+    else
+      trace = tmgr_trace_new_from_string(trace_id, surfxml_pcdata, trace_periodicity);  
+  }
+  xbt_dict_set(traces_set_list, trace_id, (void *)trace, NULL);
+}
+
+void parse_trace_c_connect(void)
+{
+   xbt_assert1(xbt_dict_get_or_null(traces_set_list, A_surfxml_trace_c_connect_trace_id),
+             "Trace %s undefined", A_surfxml_trace_c_connect_trace_id);
+   char* trace_connect = bprintf("%s#%d#%d#%s", A_surfxml_trace_c_connect_trace_id, A_surfxml_trace_c_connect_element, 
+                                   A_surfxml_trace_c_connect_kind, A_surfxml_trace_c_connect_connector_id);
+   xbt_dynar_push(traces_connect_list, &trace_connect);
+}
+
+/* Random tag functions */
+
+double get_cpu_power(const char *power)
+{ 
+  double power_scale = 0.0;
+  const char *p, *q;
+  char *generator;
+  random_data_t random = NULL; 
+  /* randomness is inserted like this: power="$rand(my_random)" */
+  if (((p = strstr(power, "$rand(")) != NULL) && ((q = strstr(power, ")")) != NULL)) {
+     if (p < q) {
+       generator = xbt_malloc(q - (p + 6) + 1);
+       memcpy(generator, p + 6, q - (p + 6)); 
+       generator[q - (p + 6)] = '\0';
+       xbt_assert1((random = xbt_dict_get_or_null(random_data_list, generator)),
+             "Random generator %s undefined", generator);
+       power_scale = random_generate(random);
+     }
+  }
+  else {
+    surf_parse_get_double(&power_scale, power);
+  }
+  return power_scale;
+}
+
+int random_min, random_max, random_mean, random_std_deviation, random_generator;
+char *random_id;
+
+void init_randomness(void)
+{
+  random_id = A_surfxml_random_id;
+  surf_parse_get_int(&random_min, A_surfxml_random_min);
+  surf_parse_get_int(&random_max, A_surfxml_random_max);
+  surf_parse_get_int(&random_mean, A_surfxml_random_mean);
+  surf_parse_get_int(&random_std_deviation, A_surfxml_random_std_deviation);
+  random_generator = A_surfxml_random_generator;
+}
+
+void add_randomness(void)
+{
+   /* If needed aditional properties can be added by using the prop tag */
+   random_data_t random = random_new(random_generator, random_min, random_max, random_mean, random_std_deviation);
+   xbt_dict_set(random_data_list, random_id, (void *)random, NULL);
 }
 }
index cb88ec0..9d00396 100644 (file)
@@ -34,6 +34,60 @@ void tmgr_history_free(tmgr_history_t h)
   free(h);
 }
 
   free(h);
 }
 
+tmgr_trace_t tmgr_trace_new_from_string(const char* id, const char *input, double periodicity)
+{
+  tmgr_trace_t trace = NULL;
+  int linecount = 0;
+  s_tmgr_event_t event;
+  tmgr_event_t last_event = NULL;
+
+  if (trace_list) {
+    trace = xbt_dict_get_or_null(trace_list, id);
+    if (trace)
+      return trace;
+  }
+
+  if (periodicity <= 0) {
+    xbt_assert1(0, "Periodicity has to be positive. Your value %lg", periodicity);
+  }
+
+  trace = xbt_new0(s_tmgr_trace_t, 1);
+  trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
+
+  xbt_dynar_t list = xbt_str_split(input,"\n\r");
+  
+  unsigned int cpt;
+  char * val;
+  xbt_dynar_foreach(list, cpt, val) {
+     linecount++;
+     xbt_str_trim(val, " \t\n\r\x0B");
+     if (strlen(val) > 0) {
+       if (sscanf(val, "%lg" " " "%lg" "\n", &event.delta, &event.value) != 2) {
+          xbt_assert2(0, "%s\n%d: Syntax error", input, linecount);
+       }
+       if (last_event) {
+           if ((last_event->delta = event.delta - last_event->delta) <= 0) {
+              xbt_assert2(0, "%s\n%d: Invalid trace value, events have to be sorted", input, linecount);
+           }
+       }
+       xbt_dynar_push(trace->event_list, &event);
+       last_event = xbt_dynar_get_ptr(trace->event_list, xbt_dynar_length(trace->event_list) - 1);
+       if (periodicity > 0) {
+         if (last_event)
+           last_event->delta = periodicity;
+       }
+     }
+  }
+
+  if (!trace_list)
+    trace_list = xbt_dict_new();
+
+  xbt_dict_set(trace_list, id, (void *) trace, _tmgr_trace_free);
+
+  xbt_dynar_free(&list);
+  return trace;
+}
+
 tmgr_trace_t tmgr_trace_new(const char *filename)
 {
   tmgr_trace_t trace = NULL;
 tmgr_trace_t tmgr_trace_new(const char *filename)
 {
   tmgr_trace_t trace = NULL;
index f64ae93..5e972d8 100644 (file)
@@ -974,7 +974,7 @@ static void parse_cpu_init(void)
   double interference_send_recv = 0.0;
   double max_outgoing_rate = -1.0;
 
   double interference_send_recv = 0.0;
   double max_outgoing_rate = -1.0;
 
-  surf_parse_get_double(&power_scale, A_surfxml_host_power);
+  power_scale = get_cpu_power(A_surfxml_host_power);
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
@@ -1150,17 +1150,20 @@ static void parse_route_set_endpoints(void)
   surf_parse_get_double(&impact_on_dst_with_other_send,
                        A_surfxml_route_impact_on_dst_with_other_send);
 
   surf_parse_get_double(&impact_on_dst_with_other_send,
                        A_surfxml_route_impact_on_dst_with_other_send);
 
+  route_action = A_surfxml_route_action;
   route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
   route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
+
 }
 
 static void parse_route_set_route(void)
 {
   char* name;
   if (src_id != -1 && dst_id != -1) {
 }
 
 static void parse_route_set_route(void)
 {
   char* name;
   if (src_id != -1 && dst_id != -1) {
-    name = bprintf("%d##%d##%lf##%lf##%lf##%lf",src_id, dst_id,impact_on_src,
+    name = bprintf("%x#%x#%lf#%lf#%lf#%lf",src_id, dst_id,impact_on_src,
              impact_on_dst, impact_on_src_with_other_recv,
              impact_on_dst_with_other_send);
              impact_on_dst, impact_on_src_with_other_recv,
              impact_on_dst_with_other_send);
-    xbt_dict_set(route_table, name, route_link_list, NULL);
+
+    manage_route(route_table, name, route_action, 0);
     free(name);
   }
 }
     free(name);
   }
 }
@@ -1168,6 +1171,7 @@ static void parse_route_set_route(void)
 static void add_loopback(void)
 {
   int i;
 static void add_loopback(void)
 {
   int i;
+
   /* Adding loopback if needed */
   for (i = 0; i < nb_workstation; i++) {
     if (!ROUTE(i, i).size) {
   /* Adding loopback if needed */
   for (i = 0; i < nb_workstation; i++) {
     if (!ROUTE(i, i).size) {
@@ -1190,33 +1194,89 @@ static void add_route(void)
   unsigned int cpt = 0;    
   int link_list_capacity = 0;
   link_KCCFLN05_t *link_list = NULL;
   unsigned int cpt = 0;    
   int link_list_capacity = 0;
   link_KCCFLN05_t *link_list = NULL;
-  char* link;
+  xbt_dict_cursor_t cursor = NULL;
+  char *key,*data;
+  const char *sep = "#";
+  xbt_dynar_t links, keys;
 
   if (routing_table == NULL) create_routing_table();
 
 
   if (routing_table == NULL) create_routing_table();
 
-  link_list_capacity = xbt_dynar_length(links);
-  link_list = xbt_new(link_KCCFLN05_t, link_list_capacity);
+  xbt_dict_foreach(route_table, cursor, key, data) {
+    nb_link = 0;
+    links = (xbt_dynar_t)data;
+    keys = xbt_str_split_str(key, sep);
 
 
-  src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
-  dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
-  impact_on_src = atof(xbt_dynar_get_as(keys, 2, char*));
-  impact_on_dst = atof(xbt_dynar_get_as(keys, 3, char*));
-  impact_on_src_with_other_recv = atof(xbt_dynar_get_as(keys, 4, char*));
-  impact_on_dst_with_other_send = atof(xbt_dynar_get_as(keys, 5, char*));
+    link_list_capacity = xbt_dynar_length(links);
+    link_list = xbt_new(link_KCCFLN05_t, link_list_capacity);
 
 
-  link = NULL;
-  xbt_dynar_foreach (links, cpt, link) {
+    src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
+    dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
+    impact_on_src = atof(xbt_dynar_get_as(keys, 2, char*));
+    impact_on_dst = atof(xbt_dynar_get_as(keys, 3, char*));
+    impact_on_src_with_other_recv = atof(xbt_dynar_get_as(keys, 4, char*));
+    impact_on_dst_with_other_send = atof(xbt_dynar_get_as(keys, 5, char*));
+
+    char* link = NULL;
+    xbt_dynar_foreach (links, cpt, link) {
       TRY {
         link_list[nb_link++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
       TRY {
         link_list[nb_link++] = xbt_dict_get(link_set, link);
       }
       CATCH(e) {
         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
       }     
-  }
-  route_new(src_id, dst_id, link_list, nb_link,impact_on_src,
+    }
+    route_new(src_id, dst_id, link_list, nb_link,impact_on_src,
              impact_on_dst, impact_on_src_with_other_recv,
              impact_on_dst_with_other_send);
              impact_on_dst, impact_on_src_with_other_recv,
              impact_on_dst_with_other_send);
+    xbt_dynar_free(&links);
+   }
 
 
+   xbt_dict_free(&route_table);
+
+}
+
+static void add_traces(void)
+{
+   xbt_dynar_t trace_connect = NULL;
+   unsigned int cpt;
+   int connect_element, connect_kind;
+   char *value, *trace_id, *connector_id;
+   link_KCCFLN05_t link;
+   cpu_KCCFLN05_t host = NULL;
+   tmgr_trace_t trace;
+   
+   if (!traces_connect_list) return;
+   /*for all trace connects parse them and update traces for hosts or links */
+   xbt_dynar_foreach (traces_connect_list, cpt, value) {
+     trace_connect = xbt_str_split_str(value, "#");
+     trace_id        = xbt_dynar_get_as(trace_connect, 0, char*);
+     connect_element = atoi(xbt_dynar_get_as(trace_connect, 1, char*)); 
+     connect_kind    = atoi(xbt_dynar_get_as(trace_connect, 2, char*));
+     connector_id    = xbt_dynar_get_as(trace_connect, 3, char*);
+
+     xbt_assert1((trace = xbt_dict_get_or_null(traces_set_list, trace_id)), "Trace %s undefined", trace_id);
+
+     if (connect_element == A_surfxml_trace_c_connect_element_HOST) {
+        xbt_assert1((host = xbt_dict_get_or_null(workstation_set, connector_id)), "Host %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: host->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+           case A_surfxml_trace_c_connect_kind_POWER: host->power_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+        }
+     }
+     else {
+        xbt_assert1((link = xbt_dict_get_or_null(link_set, connector_id)), "Link %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: link->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_BANDWIDTH: link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_LATENCY: link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+        }
+     }
+   }
+
+   xbt_dynar_free(&trace_connect);
+   xbt_dynar_free(&traces_connect_list);
+   xbt_dict_free(&traces_set_list); 
 }
 
 static void define_callbacks(const char *file)
 }
 
 static void define_callbacks(const char *file)
@@ -1225,16 +1285,27 @@ static void define_callbacks(const char *file)
                                   
   /* Adding callback functions */
   surf_parse_reset_parser();
                                   
   /* Adding callback functions */
   surf_parse_reset_parser();
-  surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init);
-  surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
-  surfxml_add_callback(STag_surfxml_router_cb_list, parse_routers);
-  surfxml_add_callback(STag_surfxml_link_cb_list, parse_link_init);
-  surfxml_add_callback(STag_surfxml_route_cb_list, parse_route_set_endpoints);
-  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, parse_route_elem);
-  surfxml_add_callback(ETag_surfxml_route_cb_list, parse_route_set_route);
-  surfxml_add_callback(STag_surfxml_platform_cb_list, init_route_table);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_route);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_loopback);
+  surfxml_add_callback(STag_surfxml_host_cb_list, &parse_cpu_init);
+  surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties);
+  surfxml_add_callback(STag_surfxml_router_cb_list, &parse_routers);
+  surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_init);
+  surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem);
+  surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
+  surfxml_add_callback(STag_surfxml_platform_cb_list, &init_data);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_loopback);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
+  surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets);
+  surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_route);
+  surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_foreach);
+  surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_cluster);
+  surfxml_add_callback(STag_surfxml_trace_cb_list, &parse_trace_init);
+  surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_trace_finalize);
+  surfxml_add_callback(STag_surfxml_trace_c_connect_cb_list, &parse_trace_c_connect);
+  surfxml_add_callback(STag_surfxml_random_cb_list, &init_randomness);
+  surfxml_add_callback(ETag_surfxml_random_cb_list, &add_randomness);
 }
 
 /**************************************/
 }
 
 /**************************************/
index ca617a9..b78601f 100644 (file)
@@ -713,6 +713,7 @@ static cpu_L07_t cpu_new(const char *name, double power_scale,
   cpu->properties =  current_property_set;
 
   xbt_dict_set(workstation_set, name, cpu, cpu_free);
   cpu->properties =  current_property_set;
 
   xbt_dict_set(workstation_set, name, cpu, cpu_free);
+
   return cpu;
 }
 
   return cpu;
 }
 
@@ -729,7 +730,7 @@ static void parse_cpu_init(void)
   e_surf_cpu_state_t state_initial = SURF_CPU_OFF;
   tmgr_trace_t state_trace = NULL;
 
   e_surf_cpu_state_t state_initial = SURF_CPU_OFF;
   tmgr_trace_t state_trace = NULL;
 
-  surf_parse_get_double(&power_scale, A_surfxml_host_power);
+  power_scale = get_cpu_power(A_surfxml_host_power);
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
   surf_parse_get_double(&power_initial, A_surfxml_host_availability);
   surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file);
 
@@ -837,7 +838,6 @@ static void parse_link_init(void)
   current_property_set = xbt_dict_new();
   link_new(name_link, bw_initial, bw_trace, lat_initial, lat_trace,
                   state_initial_link, state_trace, policy_initial_link, current_property_set);
   current_property_set = xbt_dict_new();
   link_new(name_link, bw_initial, bw_trace, lat_initial, lat_trace,
                   state_initial_link, state_trace, policy_initial_link, current_property_set);
-
  }
 
 static void route_new(int src_id, int dst_id,
  }
 
 static void route_new(int src_id, int dst_id,
@@ -867,6 +867,8 @@ static void parse_route_set_endpoints(void)
   if (cpu_tmp != NULL)
     dst_id = cpu_tmp->id;
 
   if (cpu_tmp != NULL)
     dst_id = cpu_tmp->id;
 
+  route_action = A_surfxml_route_action;
+
   route_link_list = xbt_dynar_new(sizeof(char*), &free_string);
 }
 
   route_link_list = xbt_dynar_new(sizeof(char*), &free_string);
 }
 
@@ -874,8 +876,9 @@ static void parse_route_set_route(void)
 {
   char* name;
   if (src_id != -1 && dst_id != -1) {
 {
   char* name;
   if (src_id != -1 && dst_id != -1) {
-     name = bprintf("%d##%d",src_id, dst_id);
-     xbt_dict_set(route_table, name, route_link_list, NULL);
+     name = bprintf("%x#%x",src_id, dst_id);
+
+     manage_route(route_table, name, route_action, 0);
      free(name);
   }
 }
      free(name);
   }
 }
@@ -883,6 +886,7 @@ static void parse_route_set_route(void)
 static void add_loopback(void)
 {
   int i;
 static void add_loopback(void)
 {
   int i;
+
   /* Adding loopback if needed */
   for (i = 0; i < nb_workstation; i++)
     if (!ROUTE(i, i).size) {
   /* Adding loopback if needed */
   for (i = 0; i < nb_workstation; i++)
     if (!ROUTE(i, i).size) {
@@ -905,43 +909,111 @@ static void add_route(void)
     unsigned int cpt = 0;
     int link_list_capacity = 0;
     link_L07_t *link_list = NULL;
     unsigned int cpt = 0;
     int link_list_capacity = 0;
     link_L07_t *link_list = NULL;
-       char* link;
+    xbt_dict_cursor_t cursor = NULL;
+    char *key,*data;
+    const char *sep = "#";
+    xbt_dynar_t links, keys;
 
     if (routing_table == NULL) create_routing_table();
 
 
     if (routing_table == NULL) create_routing_table();
 
-    src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
-    dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
-
-    link_list_capacity = xbt_dynar_length(links);
-    link_list = xbt_new(link_L07_t, link_list_capacity);
+    xbt_dict_foreach(route_table, cursor, key, data) {
+       nb_link = 0;
+       links = (xbt_dynar_t)data;
+       keys = xbt_str_split_str(key, sep);
+       
+       src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
+       dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
+
+       link_list_capacity = xbt_dynar_length(links);
+       link_list = xbt_new(link_L07_t, link_list_capacity);
+
+       char* link = NULL;
+       xbt_dynar_foreach (links, cpt, link) {
+         TRY {
+           link_list[nb_link++] = xbt_dict_get(link_set, link);
+         }
+         CATCH(e) {
+           RETHROW1("Link %s not found (dict raised this exception: %s)", link);
+         }    
+       }
+       route_new(src_id, dst_id, link_list, nb_link);
+       xbt_dynar_free(&links);
+   }
+
+   xbt_dict_free(&route_table);
+}
 
 
-    link = NULL;
-    xbt_dynar_foreach (links, cpt, link) {
-      TRY {
-        link_list[nb_link++] = xbt_dict_get(link_set, link);
-      }
-      CATCH(e) {
-        RETHROW1("Link %s not found (dict raised this exception: %s)", link);
-      }    
-    }
-    route_new(src_id, dst_id, link_list, nb_link);
+static void add_traces(void)
+{
+   xbt_dynar_t trace_connect = NULL;
+   unsigned int cpt;
+   int connect_element, connect_kind;
+   char *value, *trace_id, *connector_id;
+   link_L07_t link;
+   cpu_L07_t host = NULL;
+   tmgr_trace_t trace;
+   
+   if (!traces_connect_list) return;
+   /*for all trace connects parse them and update traces for hosts or links */
+   xbt_dynar_foreach (traces_connect_list, cpt, value) {
+     trace_connect = xbt_str_split_str(value, "#");
+     trace_id        = xbt_dynar_get_as(trace_connect, 0, char*);
+     connect_element = atoi(xbt_dynar_get_as(trace_connect, 1, char*)); 
+     connect_kind    = atoi(xbt_dynar_get_as(trace_connect, 2, char*));
+     connector_id    = xbt_dynar_get_as(trace_connect, 3, char*);
+
+     xbt_assert1((trace = xbt_dict_get_or_null(traces_set_list, trace_id)), "Trace %s undefined", trace_id);
+
+     if (connect_element == A_surfxml_trace_c_connect_element_HOST) {
+        xbt_assert1((host = xbt_dict_get_or_null(workstation_set, connector_id)), "Host %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: host->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+           case A_surfxml_trace_c_connect_kind_POWER: host->power_event = tmgr_history_add_trace(history, trace, 0.0, 0, host); break;
+        }
+     }
+     else {
+        xbt_assert1((link = xbt_dict_get_or_null(link_set, connector_id)), "Link %s undefined", connector_id);
+        switch (connect_kind) {
+           case A_surfxml_trace_c_connect_kind_AVAILABILITY: link->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_BANDWIDTH: link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+           case A_surfxml_trace_c_connect_kind_LATENCY: link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); break;
+        }
+     }
+   }
+
+   xbt_dynar_free(&trace_connect);
+   xbt_dynar_free(&traces_connect_list);
+   xbt_dict_free(&traces_set_list); 
 }
 
 static void define_callbacks(const char *file)
 {
   /* Adding callback functions */
   surf_parse_reset_parser();
 }
 
 static void define_callbacks(const char *file)
 {
   /* Adding callback functions */
   surf_parse_reset_parser();
-  surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init);
-  surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties);
-  surfxml_add_callback(STag_surfxml_link_cb_list, parse_link_init);
-  surfxml_add_callback(STag_surfxml_route_cb_list, parse_route_set_endpoints);
-  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, parse_route_elem);
-  surfxml_add_callback(ETag_surfxml_route_cb_list, parse_route_set_route);
-  surfxml_add_callback(STag_surfxml_platform_cb_list, init_route_table);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_route);
-  surfxml_add_callback(ETag_surfxml_platform_cb_list, add_loopback);
+  surfxml_add_callback(STag_surfxml_host_cb_list, &parse_cpu_init);
+  surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties);
+  surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_init);
+  surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem);
+  surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
+  surfxml_add_callback(STag_surfxml_platform_cb_list, &init_data);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_loopback);
+  surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
+  surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets);
+  surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_endpoints);
+  surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_route);
+  surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_foreach);
+  surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_cluster);
+  surfxml_add_callback(STag_surfxml_trace_cb_list, &parse_trace_init);
+  surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_trace_finalize);
+  surfxml_add_callback(STag_surfxml_trace_c_connect_cb_list, &parse_trace_c_connect);
+  surfxml_add_callback(STag_surfxml_random_cb_list, &init_randomness);
+  surfxml_add_callback(ETag_surfxml_random_cb_list, &add_randomness);
 }
 
 }
 
+
 /**************************************/
 /********* Module  creation ***********/
 /**************************************/
 /**************************************/
 /********* Module  creation ***********/
 /**************************************/
@@ -1027,8 +1099,8 @@ static void model_init_internal(void)
 
   surf_workstation_model->common_public->get_properties = get_properties;
 
 
   surf_workstation_model->common_public->get_properties = get_properties;
 
-  workstation_set = xbt_dict_new();
-  link_set = xbt_dict_new();
+  workstation_set = xbt_dict_new_ext(1024);
+  link_set = xbt_dict_new_ext(1024);
 
   if (!ptask_maxmin_system)
     ptask_maxmin_system = lmm_system_new();
 
   if (!ptask_maxmin_system)
     ptask_maxmin_system = lmm_system_new();
index 36e9151..378bdbf 100644 (file)
@@ -301,17 +301,22 @@ void *xbt_dict_get(xbt_dict_t dict,
  */
 void *xbt_dict_get_or_null(xbt_dict_t     dict,
                     const char     *key) {
  */
 void *xbt_dict_get_or_null(xbt_dict_t     dict,
                     const char     *key) {
-  xbt_ex_t e;
-  void *result = NULL;
-  TRY {
-    result = xbt_dict_get(dict, key);
-  } CATCH(e) {
-    if (e.category != not_found_error) 
-      RETHROW;
-    xbt_ex_free(e);
-    result = NULL;
+  unsigned int hash_code ;
+  xbt_dictelm_t current;
+
+  xbt_assert(dict);
+
+  hash_code = xbt_dict_hash(key) % dict->table_size;
+
+  current = dict->table[hash_code];
+  while (current != NULL && (strcmp(key, current->key))) {
+    current = current->next;
   }
   }
-  return result;
+
+  if (current == NULL) 
+    return NULL;
+
+  return current->content;
 }
 
 
 }