You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/04/20 17:39:36 UTC

[1/5] incubator-tinkerpop git commit: Documented ScriptInputFormat and ScriptOutputFormat. Added sample configurations and an appropriate input dataset.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master e2c61711b -> ffc77f6f8


Documented ScriptInputFormat and ScriptOutputFormat.
Added sample configurations and an appropriate input dataset.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/701493f1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/701493f1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/701493f1

Branch: refs/heads/master
Commit: 701493f1afc71cd887cbc80bed8e0d6605aaab47
Parents: f366285
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Fri Apr 17 18:39:39 2015 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Apr 17 18:39:39 2015 +0200

----------------------------------------------------------------------
 data/script-input.groovy                     | 39 +++++++++++
 data/tinkerpop-classic.txt                   |  6 ++
 docs/src/implementations.asciidoc            | 81 +++++++++++++++++++++++
 hadoop-gremlin/conf/hadoop-script.properties | 52 +++++++++++++++
 pom.xml                                      |  1 +
 5 files changed, 179 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/701493f1/data/script-input.groovy
----------------------------------------------------------------------
diff --git a/data/script-input.groovy b/data/script-input.groovy
new file mode 100644
index 0000000..d2df481
--- /dev/null
+++ b/data/script-input.groovy
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+def parse(line, factory) {
+    def parts = line.split(/ /)
+    def (id, label, name, x) = parts[0].split(/:/).toList()
+    def v1 = factory.vertex(id, label)
+    if (name != null) v1.property("name", name) // first value is always the name
+    if (x != null) {
+        // second value depends on the vertex label; it's either
+        // the age of a person or the language of a project
+        if (label.equals("project")) v1.property("lang", x)
+        else v1.property("age", Integer.valueOf(x))
+    }
+    if (parts.length == 2) {
+        parts[1].split(/,/).grep { !it.isEmpty() }.each {
+            def (eLabel, refId, weight) = it.split(/:/).toList()
+            def v2 = factory.vertex(refId)
+            def edge = factory.edge(v1, v2, eLabel)
+            edge.property("weight", Double.valueOf(weight))
+        }
+    }
+    return v1
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/701493f1/data/tinkerpop-classic.txt
----------------------------------------------------------------------
diff --git a/data/tinkerpop-classic.txt b/data/tinkerpop-classic.txt
new file mode 100644
index 0000000..b7cee39
--- /dev/null
+++ b/data/tinkerpop-classic.txt
@@ -0,0 +1,6 @@
+1:person:marko:29 knows:2:0.5,knows:4:1.0,created:3:0.4
+2:person:vadas:27
+3:project:lop:java
+4:person:josh:32 created:3:0.4,created:5:1.0
+5:project:ripple:java
+6:person:peter:35 created:3:0.2

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/701493f1/docs/src/implementations.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/implementations.asciidoc b/docs/src/implementations.asciidoc
index d0e9d7d..278b7b7 100644
--- a/docs/src/implementations.asciidoc
+++ b/docs/src/implementations.asciidoc
@@ -689,6 +689,87 @@ MapReduceGraphComputer
 
 *COMING SOON*
 
+Input/Output Formats
+~~~~~~~~~~~~~~~~~~~~
+
+Script IO Format
+^^^^^^^^^^^^^^^^
+
+`ScriptInutFormat` and `ScriptOutputFormat` take an arbitrary script and use that script to either read or write Vertex objects, respectively. This can be considered the most general `InputFormat`/`OutputFormat` possible in that link:http://www.tinkerpop.com/docs/3.0.0-SNAPSHOT/#hadoop-gremlin[Hadoop-Gremlin] uses the user provided script for all reading/writing.
+
+ScriptInputFormat
++++++++++++++++++
+
+The data below represents an adjacency list representation of the classic TinkerGraph toy graph. First line reads, "vertex `1`, labeled `person` having 2 property values (`marko` and `29`) has 3 outgoing edges; the first edge is labeled `knows`, connects the current vertex `1` with vertex `2` and has a property value `0.4`, and so on."
+
+[source]
+1:person:marko:29 knows:2:0.5,knows:4:1.0,created:3:0.4
+2:person:vadas:27
+3:project:lop:java
+4:person:josh:32 created:3:0.4,created:5:1.0
+5:project:ripple:java
+6:person:peter:35 created:3:0.2
+
+There is no corresponding `InputFormat` that can parse this particular file (or some adjacency list variant of it). As such, `ScriptInputFormat` can be used. With `ScriptInputFormat` a script is stored in HDFS and leveraged by each mapper in the Hadoop job. The script must have the following method defined:
+
+[source,groovy]
+def parse(String line, ScriptElementFactory factory) { ... }
+
+`ScriptElementFactory` provides the following 4 methods:
+
+[source,java]
+Vertex vertex(Object id); // get or create the vertex with the given id
+Vertex vertex(Object id, String label); // get or create the vertex with the given id and label
+Edge edge(Vertex out, Vertex in); // create an edge between the two given vertices
+Edge edge(Vertex out, Vertex in, String label); // create an edge between the two given vertices using the given label
+
+An appropriate `parse()` for the above adjacency list file is:
+
+[source,groovy]
+def parse(line, factory) {
+    def parts = line.split(/ /)
+    def (id, label, name, x) = parts[0].split(/:/).toList()
+    def v1 = factory.vertex(id, label)
+    if (name != null) v1.property("name", name) // first value is always the name
+    if (x != null) {
+        // second value depends on the vertex label; it's either
+        // the age of a person or the language of a project
+        if (label.equals("project")) v1.property("lang", x)
+        else v1.property("age", Integer.valueOf(x))
+    }
+    if (parts.length == 2) {
+        parts[1].split(/,/).grep { !it.isEmpty() }.each {
+            def (eLabel, refId, weight) = it.split(/:/).toList()
+            def v2 = factory.vertex(refId)
+            def edge = factory.edge(v1, v2, eLabel)
+            edge.property("weight", Double.valueOf(weight))
+        }
+    }
+    return v1
+}
+
+The resultant `Vertex` denotes whether the line parsed yielded a valid Vertex. As such, if the line is not valid (e.g. a comment line, a skip line, etc.), then simply return `null`.
+
+ScriptOutputFormat Support
+++++++++++++++++++++++++++
+
+The principle above can also be used to convert a vertex to an arbitrary `String` representation that is ultimately streamed back to a file in HDFS. This is the role of `ScriptOutputFormat`. `ScriptOutputFormat` requires that the provided script maintains a method with the following signature:
+
+[source,groovy]
+def stringify(Vertex vertex) { ... }
+
+An appropriate `stringify()` to produce output in the same format that was shown in the `ScriptInputFormat` sample is:
+
+[source,groovy]
+def stringify(vertex) {
+    def v = vertex.values("name", "age", "lang").inject(vertex.id(), vertex.label()).join(":")
+    def outE = vertex.outE().map {
+        def e = it.get()
+        e.values("weight").inject(e.label(), e.inV().next().id()).join(":")
+    }.join(",")
+    return [v, outE].join("\t")
+}
+
 Interacting with HDFS
 ~~~~~~~~~~~~~~~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/701493f1/hadoop-gremlin/conf/hadoop-script.properties
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/conf/hadoop-script.properties b/hadoop-gremlin/conf/hadoop-script.properties
new file mode 100644
index 0000000..0388801
--- /dev/null
+++ b/hadoop-gremlin/conf/hadoop-script.properties
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
+gremlin.hadoop.graphInputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptInputFormat
+gremlin.hadoop.graphOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONOutputFormat
+gremlin.hadoop.memoryOutputFormat=org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
+gremlin.hadoop.deriveMemory=false
+gremlin.hadoop.jarsInDistributedCache=true
+
+gremlin.hadoop.inputLocation=tinkerpop-classic.txt
+gremlin.hadoop.scriptInputFormat.script=script-input.groovy
+gremlin.hadoop.outputLocation=output
+
+#####################################
+# GiraphGraphComputer Configuration #
+#####################################
+giraph.minWorkers=2
+giraph.maxWorkers=2
+giraph.useOutOfCoreGraph=true
+giraph.useOutOfCoreMessages=true
+mapred.map.child.java.opts=-Xmx1024m
+mapred.reduce.child.java.opts=-Xmx1024m
+giraph.numInputThreads=4
+giraph.numComputeThreads=4
+# giraph.maxPartitionsInMemory=1
+# giraph.userPartitionCount=2
+
+####################################
+# SparkGraphComputer Configuration #
+####################################
+spark.master=local[4]
+spark.executor.memory=1g
+spark.serializer=org.apache.spark.serializer.KryoSerializer
+# spark.kryo.registrationRequired=true
+# spark.storage.memoryFraction=0.2
+# spark.eventLog.enabled=true
+# spark.eventLog.dir=/tmp/spark-event-logs
+# spark.ui.killEnabled=true

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/701493f1/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index a75ebb8..bb4ba66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -235,6 +235,7 @@ limitations under the License.
                         <exclude>docs/static/**</exclude>
                         <exclude>docs/stylesheets/**</exclude>
                         <exclude>**/target/**</exclude>
+                        <exclude>data/*.txt</exclude>
                         <exclude>**/*.kryo</exclude>
                         <exclude>**/*.iml</exclude>
                         <exclude>**/*.json</exclude>


[2/5] incubator-tinkerpop git commit: added GraphSON IO Format and Gryo IO Format section

Posted by ok...@apache.org.
added GraphSON IO Format and Gryo IO Format section


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/9811e4e9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/9811e4e9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/9811e4e9

Branch: refs/heads/master
Commit: 9811e4e9aa16471712dc19b4b482c454aa44f883
Parents: 701493f
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Apr 20 13:50:17 2015 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Apr 20 13:50:17 2015 +0200

----------------------------------------------------------------------
 docs/src/implementations.asciidoc | 36 ++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9811e4e9/docs/src/implementations.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/implementations.asciidoc b/docs/src/implementations.asciidoc
index 278b7b7..090059e 100644
--- a/docs/src/implementations.asciidoc
+++ b/docs/src/implementations.asciidoc
@@ -692,9 +692,45 @@ MapReduceGraphComputer
 Input/Output Formats
 ~~~~~~~~~~~~~~~~~~~~
 
+GraphSON IO Format
+^^^^^^^^^^^^^^^^^^
+
+* **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONInputFormat`
+* **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONOutputFormat`
+
+GraphSON is a JSON based graph format. Hadoop-Gremlin makes use of a slight variation of the typical form that is:
+
+* **vertex-centric**: a row in a Hadoop-Gremlin GraphSON file is a vertex, its properties, and its incident edges (and their respective properties).
+* **less verbose**: a row does not include both `_inV` and `_outV` ids as one of the ids can be inferred from the incident vertex.
+
+The data below represents an adjacency list representation of the classic TinkerGraph toy graph in GraphSON format.
+
+[source,json]
+{"inE":[],"outE":[{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":9,"label":"created","type":"edge","outV":1,"properties":{"weight":0.4}},{"inV":2,"inVLabel":"vertex","outVLabel":"vertex","id":7,"label":"knows","type":"edge","outV":1,"properties":{"weight":0.5}},{"inV":4,"inVLabel":"vertex","outVLabel":"vertex","id":8,"label":"knows","type":"edge","outV":1,"properties":{"weight":1.0}}],"id":1,"label":"vertex","type":"vertex","properties":{"name":[{"id":0,"label":"name","value":"marko","properties":{}}],"age":[{"id":1,"label":"age","value":29,"properties":{}}]}}
+{"inE":[{"inV":2,"inVLabel":"vertex","outVLabel":"vertex","id":7,"label":"knows","type":"edge","outV":1,"properties":{"weight":0.5}}],"outE":[],"id":2,"label":"vertex","type":"vertex","properties":{"name":[{"id":2,"label":"name","value":"vadas","properties":{}}],"age":[{"id":3,"label":"age","value":27,"properties":{}}]}}
+{"inE":[{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":9,"label":"created","type":"edge","outV":1,"properties":{"weight":0.4}},{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":11,"label":"created","type":"edge","outV":4,"properties":{"weight":0.4}},{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":12,"label":"created","type":"edge","outV":6,"properties":{"weight":0.2}}],"outE":[],"id":3,"label":"vertex","type":"vertex","properties":{"name":[{"id":4,"label":"name","value":"lop","properties":{}}],"lang":[{"id":5,"label":"lang","value":"java","properties":{}}]}}
+{"inE":[{"inV":4,"inVLabel":"vertex","outVLabel":"vertex","id":8,"label":"knows","type":"edge","outV":1,"properties":{"weight":1.0}}],"outE":[{"inV":5,"inVLabel":"vertex","outVLabel":"vertex","id":10,"label":"created","type":"edge","outV":4,"properties":{"weight":1.0}},{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":11,"label":"created","type":"edge","outV":4,"properties":{"weight":0.4}}],"id":4,"label":"vertex","type":"vertex","properties":{"name":[{"id":6,"label":"name","value":"josh","properties":{}}],"age":[{"id":7,"label":"age","value":32,"properties":{}}]}}
+{"inE":[{"inV":5,"inVLabel":"vertex","outVLabel":"vertex","id":10,"label":"created","type":"edge","outV":4,"properties":{"weight":1.0}}],"outE":[],"id":5,"label":"vertex","type":"vertex","properties":{"name":[{"id":8,"label":"name","value":"ripple","properties":{}}],"lang":[{"id":9,"label":"lang","value":"java","properties":{}}]}}
+{"inE":[],"outE":[{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":12,"label":"created","type":"edge","outV":6,"properties":{"weight":0.2}}],"id":6,"label":"vertex","type":"vertex","properties":{"name":[{"id":10,"label":"name","value":"peter","properties":{}}],"age":[{"id":11,"label":"age","value":35,"properties":{}}]}}
+
+GraphSON is a space-expensive graph format in that it is a text-based markup language. However, it is convenient for many developers to work with as its structure is simple (easy to create and parse).
+
+
+Gryo IO Format
+^^^^^^^^^^^^^^
+
+* **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat`
+* **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat`
+
+Gryo is a binary graph format. Given that it's compact and splittable, Gremlin-Hadoop makes use of the Gryo IO Format as the intermediate representation between consecutive Gremlin-Hadoop jobs. In other words, when a Gremlin-Hadoop job requires more than one MapReduce phase, a Gryo file representing the output of the first MapReduce job is temporarily persisted in HDFS and fed as the input to the second MapReduce job.
+
+
 Script IO Format
 ^^^^^^^^^^^^^^^^
 
+* **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptInputFormat`
+* **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptOutputFormat`
+
 `ScriptInutFormat` and `ScriptOutputFormat` take an arbitrary script and use that script to either read or write Vertex objects, respectively. This can be considered the most general `InputFormat`/`OutputFormat` possible in that link:http://www.tinkerpop.com/docs/3.0.0-SNAPSHOT/#hadoop-gremlin[Hadoop-Gremlin] uses the user provided script for all reading/writing.
 
 ScriptInputFormat


[5/5] incubator-tinkerpop git commit: Merge branch 'io-docs'

Posted by ok...@apache.org.
Merge branch 'io-docs'


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/ffc77f6f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/ffc77f6f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/ffc77f6f

Branch: refs/heads/master
Commit: ffc77f6f8e47744376332ea03acc1ef8b8fb52f2
Parents: e2c6171 5f9e24d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Apr 20 09:39:28 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Apr 20 09:39:28 2015 -0600

----------------------------------------------------------------------
 data/script-input.groovy                     |   39 +
 data/tinkerpop-classic.txt                   |    6 +
 docs/src/implementations.asciidoc            |  117 +-
 docs/src/the-graph.asciidoc                  |    3 +-
 docs/static/images/adjacency-list.png        |  Bin 0 -> 36192 bytes
 docs/static/images/tinkerpop3.graffle        | 1334 ++++++++++++++++++++-
 hadoop-gremlin/conf/hadoop-script.properties |   52 +
 pom.xml                                      |    1 +
 8 files changed, 1487 insertions(+), 65 deletions(-)
----------------------------------------------------------------------



[3/5] incubator-tinkerpop git commit: Merge branch 'master' into io-docs

Posted by ok...@apache.org.
Merge branch 'master' into io-docs


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/bfc65661
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/bfc65661
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/bfc65661

Branch: refs/heads/master
Commit: bfc656618ed8b0cdbda40df420cb4ac3dcdedca4
Parents: 9811e4e 107e265
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Apr 20 16:17:06 2015 +0200
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Apr 20 16:17:06 2015 +0200

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   3 +
 README.asciidoc                                 |   2 +-
 data/grateful-dead-vertices.kryo                | Bin 1028298 -> 975214 bytes
 data/grateful-dead.kryo                         | Bin 515409 -> 493339 bytes
 data/tinkerpop-classic-typed.json               |   2 +-
 data/tinkerpop-classic-vertices.kryo            | Bin 1323 -> 1179 bytes
 data/tinkerpop-classic-vertices.ldjson          |  12 +-
 data/tinkerpop-classic.json                     |   2 +-
 data/tinkerpop-classic.kryo                     | Bin 817 -> 765 bytes
 data/tinkerpop-crew-vertices.kryo               | Bin 2743 -> 2575 bytes
 data/tinkerpop-crew.kryo                        | Bin 1916 -> 1858 bytes
 data/tinkerpop-modern-vertices.kryo             | Bin 1439 -> 1295 bytes
 data/tinkerpop-modern.kryo                      | Bin 877 -> 825 bytes
 .../gremlin/process/traversal/Path.java         |   9 +-
 .../process/traversal/TraversalStrategies.java  |   4 -
 .../gremlin/process/traversal/Traverser.java    |  12 +-
 .../gremlin/process/traversal/util/Metrics.java |  10 -
 .../gremlin/structure/io/gryo/GryoMapper.java   | 206 ++-----------------
 .../gremlin/structure/io/gryo/GryoReader.java   |  18 +-
 .../gremlin/structure/io/gryo/GryoWriter.java   |  34 ++-
 .../structure/util/batch/BatchGraph.java        |  21 +-
 .../structure/io/gryo/GryoReaderWriterTest.java | 102 +++++++++
 .../driver/message/ResponseStatusCode.java      |   6 +-
 .../ser/AbstractJsonMessageSerializerV1d0.java  |  37 ++--
 .../driver/ser/GryoMessageSerializerV1d0.java   |  95 ++++-----
 .../driver/ser/JsonMessageSerializerV1d0.java   |  16 +-
 .../ser/GryoMessageSerializerV1D0Test.java      |  21 ++
 gremlin-server/data/sample.kryo                 | Bin 4781783 -> 4781767 bytes
 gremlin-server/pom.xml                          | 176 ----------------
 .../handler/HttpGremlinEndpointHandler.java     |   4 +-
 .../gremlin/server/handler/IteratorHandler.java |   6 +-
 .../handler/NioGremlinResponseEncoder.java      |  20 +-
 .../server/handler/OpExecutorHandler.java       |   6 +-
 .../server/handler/OpSelectorHandler.java       |   6 +-
 .../handler/WsGremlinResponseEncoder.java       |  22 +-
 .../src/test/resources/application.conf         |  26 ---
 gremlin-server/src/test/resources/gatling.conf  | 109 ----------
 .../src/test/resources/logback-test.xml         |  39 ----
 .../GremlinServerAdditionSimulation.scala       |  96 ---------
 .../tinkerpop/gremlin/AbstractGremlinSuite.java |  19 +-
 .../apache/tinkerpop/gremlin/GraphProvider.java |  64 +++---
 .../gremlin/process/ProcessComputerSuite.java   |   2 +-
 .../structure/StructureStandardSuite.java       |  10 +-
 .../structure/io/graphml/grateful-dead.xml      |  18 +-
 .../structure/io/graphml/tinkerpop-classic.xml  |  18 +-
 .../structure/io/graphml/tinkerpop-modern.xml   |  18 +-
 .../graphson/tinkerpop-classic-normalized.json  |   2 +-
 .../io/graphson/tinkerpop-classic-typed.json    |   2 +-
 .../io/graphson/tinkerpop-classic.json          |   2 +-
 .../io/gryo/grateful-dead-vertices.kryo         | Bin 1028298 -> 975214 bytes
 .../structure/io/gryo/grateful-dead.kryo        | Bin 515409 -> 493339 bytes
 .../io/gryo/tinkerpop-classic-vertices.kryo     | Bin 1323 -> 1179 bytes
 .../structure/io/gryo/tinkerpop-classic.kryo    | Bin 817 -> 765 bytes
 .../io/gryo/tinkerpop-crew-vertices.kryo        | Bin 2743 -> 2575 bytes
 .../structure/io/gryo/tinkerpop-crew.kryo       | Bin 1916 -> 1858 bytes
 .../io/gryo/tinkerpop-modern-vertices.kryo      | Bin 1439 -> 1295 bytes
 .../structure/io/gryo/tinkerpop-modern.kryo     | Bin 877 -> 825 bytes
 .../structure/io/gryo/GryoRecordReader.java     |   8 +-
 tinkergraph-gremlin/pom.xml                     |  30 ++-
 .../tinkergraph/structure/TinkerGraph.java      |  36 ++--
 .../tinkergraph/structure/TinkerGraphTest.java  |  23 ++-
 61 files changed, 424 insertions(+), 950 deletions(-)
----------------------------------------------------------------------



[4/5] incubator-tinkerpop git commit: fixed up IO section of docs for @dkuppitz and added a new adjacency-list graphic.

Posted by ok...@apache.org.
fixed up IO section of docs for @dkuppitz and added a new adjacency-list graphic.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/5f9e24df
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/5f9e24df
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/5f9e24df

Branch: refs/heads/master
Commit: 5f9e24df8e84d846e8ed842ee87b86a7098a0478
Parents: bfc6566
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Apr 20 09:39:12 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Apr 20 09:39:12 2015 -0600

----------------------------------------------------------------------
 docs/src/implementations.asciidoc     |   46 +-
 docs/src/the-graph.asciidoc           |    3 +-
 docs/static/images/adjacency-list.png |  Bin 0 -> 36192 bytes
 docs/static/images/tinkerpop3.graffle | 1334 ++++++++++++++++++++++++++--
 4 files changed, 1295 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f9e24df/docs/src/implementations.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/implementations.asciidoc b/docs/src/implementations.asciidoc
index 090059e..acfd291 100644
--- a/docs/src/implementations.asciidoc
+++ b/docs/src/implementations.asciidoc
@@ -692,16 +692,17 @@ MapReduceGraphComputer
 Input/Output Formats
 ~~~~~~~~~~~~~~~~~~~~
 
-GraphSON IO Format
-^^^^^^^^^^^^^^^^^^
+image:adjacency-list.png[width=300,float=right] Hadoop-Gremlin provides various I/O formats -- i.e. Hadoop `InputFormat` and `OutputFormat`. All of the formats make use of an link:http://en.wikipedia.org/wiki/Adjacency_list[adjacency list] representation of the graph where each "row" represents a single vertex, its properties, and its incoming and outgoing edges.
+
+{empty} +
+
+GraphSON I/O Format
+^^^^^^^^^^^^^^^^^^^
 
 * **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONInputFormat`
 * **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONOutputFormat`
 
-GraphSON is a JSON based graph format. Hadoop-Gremlin makes use of a slight variation of the typical form that is:
-
-* **vertex-centric**: a row in a Hadoop-Gremlin GraphSON file is a vertex, its properties, and its incident edges (and their respective properties).
-* **less verbose**: a row does not include both `_inV` and `_outV` ids as one of the ids can be inferred from the incident vertex.
+<<graphson-reader-writer,GraphSON>> is a JSON based graph format. GraphSON is a space-expensive graph format in that it is a text-based markup language. However, it is convenient for many developers to work with as its structure is simple (easy to create and parse).
 
 The data below represents an adjacency list representation of the classic TinkerGraph toy graph in GraphSON format.
 
@@ -713,25 +714,23 @@ The data below represents an adjacency list representation of the classic Tinker
 {"inE":[{"inV":5,"inVLabel":"vertex","outVLabel":"vertex","id":10,"label":"created","type":"edge","outV":4,"properties":{"weight":1.0}}],"outE":[],"id":5,"label":"vertex","type":"vertex","properties":{"name":[{"id":8,"label":"name","value":"ripple","properties":{}}],"lang":[{"id":9,"label":"lang","value":"java","properties":{}}]}}
 {"inE":[],"outE":[{"inV":3,"inVLabel":"vertex","outVLabel":"vertex","id":12,"label":"created","type":"edge","outV":6,"properties":{"weight":0.2}}],"id":6,"label":"vertex","type":"vertex","properties":{"name":[{"id":10,"label":"name","value":"peter","properties":{}}],"age":[{"id":11,"label":"age","value":35,"properties":{}}]}}
 
-GraphSON is a space-expensive graph format in that it is a text-based markup language. However, it is convenient for many developers to work with as its structure is simple (easy to create and parse).
-
-
-Gryo IO Format
-^^^^^^^^^^^^^^
+Gryo I/O Format
+^^^^^^^^^^^^^^^
 
 * **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat`
 * **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat`
 
-Gryo is a binary graph format. Given that it's compact and splittable, Gremlin-Hadoop makes use of the Gryo IO Format as the intermediate representation between consecutive Gremlin-Hadoop jobs. In other words, when a Gremlin-Hadoop job requires more than one MapReduce phase, a Gryo file representing the output of the first MapReduce job is temporarily persisted in HDFS and fed as the input to the second MapReduce job.
+<<gryo-reader-writer,Gryo>> is a binary graph format that leverages link:https://github.com/EsotericSoftware/kryo[Kryo] to make a compact, binary representation of a vertex. It is recommended that users leverage Gryo given its space/time savings over text-based representations.
 
+NOTE: The `GryoInputFormat` is splittable.
 
-Script IO Format
-^^^^^^^^^^^^^^^^
+Script I/O Format
+^^^^^^^^^^^^^^^^^
 
 * **InputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptInputFormat`
 * **OutputFormat**: `org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptOutputFormat`
 
-`ScriptInutFormat` and `ScriptOutputFormat` take an arbitrary script and use that script to either read or write Vertex objects, respectively. This can be considered the most general `InputFormat`/`OutputFormat` possible in that link:http://www.tinkerpop.com/docs/3.0.0-SNAPSHOT/#hadoop-gremlin[Hadoop-Gremlin] uses the user provided script for all reading/writing.
+`ScriptInputFormat` and `ScriptOutputFormat` take an arbitrary script and use that script to either read or write `Vertex` objects, respectively. This can be considered the most general `InputFormat`/`OutputFormat` possible in that Hadoop-Gremlin uses the user provided script for all reading/writing.
 
 ScriptInputFormat
 +++++++++++++++++
@@ -766,19 +765,19 @@ def parse(line, factory) {
     def parts = line.split(/ /)
     def (id, label, name, x) = parts[0].split(/:/).toList()
     def v1 = factory.vertex(id, label)
-    if (name != null) v1.property("name", name) // first value is always the name
+    if (name != null) v1.property('name', name) // first value is always the name
     if (x != null) {
         // second value depends on the vertex label; it's either
         // the age of a person or the language of a project
-        if (label.equals("project")) v1.property("lang", x)
-        else v1.property("age", Integer.valueOf(x))
+        if (label.equals('project')) v1.property('lang', x)
+        else v1.property('age', Integer.valueOf(x))
     }
     if (parts.length == 2) {
         parts[1].split(/,/).grep { !it.isEmpty() }.each {
             def (eLabel, refId, weight) = it.split(/:/).toList()
             def v2 = factory.vertex(refId)
             def edge = factory.edge(v1, v2, eLabel)
-            edge.property("weight", Double.valueOf(weight))
+            edge.property('weight', Double.valueOf(weight))
         }
     }
     return v1
@@ -798,12 +797,12 @@ An appropriate `stringify()` to produce output in the same format that was shown
 
 [source,groovy]
 def stringify(vertex) {
-    def v = vertex.values("name", "age", "lang").inject(vertex.id(), vertex.label()).join(":")
+    def v = vertex.values('name', 'age', 'lang').inject(vertex.id(), vertex.label()).join(':')
     def outE = vertex.outE().map {
         def e = it.get()
-        e.values("weight").inject(e.label(), e.inV().next().id()).join(":")
-    }.join(",")
-    return [v, outE].join("\t")
+        e.values('weight').inject(e.label(), e.inV().next().id()).join(':')
+    }.join(',')
+    return [v, outE].join('\t')
 }
 
 Interacting with HDFS
@@ -822,7 +821,6 @@ gremlin> hdfs.ls()
 ==>rw-r--r-- marko supergroup 1439 tinkerpop-modern-vertices.kryo
 gremlin> hdfs.ls('output')
 ==>rwxr-xr-x marko supergroup 0 (D) a
-==>rwxr-xr-x marko supergroup 0 (D) ~g
 gremlin> hdfs.ls('output/a')
 ==>rw-r--r-- marko supergroup 0 _SUCCESS
 ==>rwxr-xr-x marko supergroup 0 (D) _logs

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f9e24df/docs/src/the-graph.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-graph.asciidoc b/docs/src/the-graph.asciidoc
index 85365c1..f5f06b9 100644
--- a/docs/src/the-graph.asciidoc
+++ b/docs/src/the-graph.asciidoc
@@ -385,6 +385,7 @@ try (final InputStream stream = new FileInputStream("tinkerpop-modern.xml")) {
 }
 ----
 
+[[graphson-reader-writer]]
 GraphSON Reader/Writer
 ~~~~~~~~~~~~~~~~~~~~~~
 
@@ -621,7 +622,7 @@ In the above code, the `embedTypes` option is set to `true` and the output below
 
 The ambiguity of components of the GraphSON is now removed by the `@class` property, which contains Java class information for the data it is associated with.  The `@class` property is used for all non-final types, with the exception of a small number of "natural" types (String, Boolean, Integer, and Double) which can be correctly inferred from JSON typing.  While the output is more verbose, it comes with the security of not losing type information.  While non-JVM languages won't be able to consume this information automatically, at least there is a hint as to how the values should be coerced back into the correct types in the target language.
 
-[[gremlin-kryo]]
+[[gryo-reader-writer]]
 Gryo Reader/Writer
 ~~~~~~~~~~~~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f9e24df/docs/static/images/adjacency-list.png
----------------------------------------------------------------------
diff --git a/docs/static/images/adjacency-list.png b/docs/static/images/adjacency-list.png
new file mode 100644
index 0000000..e6726fd
Binary files /dev/null and b/docs/static/images/adjacency-list.png differ

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f9e24df/docs/static/images/tinkerpop3.graffle
----------------------------------------------------------------------
diff --git a/docs/static/images/tinkerpop3.graffle b/docs/static/images/tinkerpop3.graffle
index 61c7db0..626b191 100644
--- a/docs/static/images/tinkerpop3.graffle
+++ b/docs/static/images/tinkerpop3.graffle
@@ -148438,7 +148438,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2015-04-06 15:38:31 +0000</string>
+	<string>2015-04-20 15:29:36 +0000</string>
 	<key>Modifier</key>
 	<string>Marko Rodriguez</string>
 	<key>NotesVisible</key>
@@ -212521,8 +212521,8 @@ lang:java}</string>
 					<integer>154</integer>
 					<key>Points</key>
 					<array>
-						<string>{411.12995833633272, 249.17537096233991}</string>
-						<string>{393.34156685592802, 263.82463264639244}</string>
+						<string>{411.12995833633278, 249.17537096233991}</string>
+						<string>{393.34156685592797, 263.8246326463925}</string>
 					</array>
 					<key>Style</key>
 					<dict>
@@ -217507,8 +217507,8 @@ lang:java}</string>
 							<integer>142</integer>
 							<key>Points</key>
 							<array>
-								<string>{432.31558180663797, 157.68958738721886}</string>
-								<string>{428.44294795917932, 154.48274935358782}</string>
+								<string>{432.31558180663797, 157.68958738721889}</string>
+								<string>{428.44294795917938, 154.48274935358785}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -228423,8 +228423,8 @@ endTime:2001}</string>
 					<integer>48</integer>
 					<key>Points</key>
 					<array>
-						<string>{207.56428733349856, 306.90079234700102}</string>
-						<string>{275.56067070483158, 339.75387073893654}</string>
+						<string>{207.56428733349856, 306.90079234700096}</string>
+						<string>{275.56067070483152, 339.75387073893648}</string>
 					</array>
 					<key>Style</key>
 					<dict>
@@ -247345,8 +247345,8 @@ endTime:2001}</string>
 							<integer>833</integer>
 							<key>Points</key>
 							<array>
-								<string>{105.52240403029504, 208.3100188140665}</string>
-								<string>{105.63736150330095, 212.65601058722137}</string>
+								<string>{105.52240408494099, 208.31001881262998}</string>
+								<string>{105.63736159747532, 212.65601058474579}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247378,8 +247378,8 @@ endTime:2001}</string>
 							<integer>834</integer>
 							<key>Points</key>
 							<array>
-								<string>{93.331422242558062, 215.70135517219023}</string>
-								<string>{98.654531776153462, 217.66213773341005}</string>
+								<string>{93.331422242689513, 215.70135517183266}</string>
+								<string>{98.654531776548254, 217.66213773233616}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247444,8 +247444,8 @@ endTime:2001}</string>
 							<integer>836</integer>
 							<key>Points</key>
 							<array>
-								<string>{100.21217967313495, 238.89697600430461}</string>
-								<string>{105.91488367654856, 245.27828248892104}</string>
+								<string>{100.21217967313549, 238.89697600430412}</string>
+								<string>{105.91488367655013, 245.27828248891964}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247477,8 +247477,8 @@ endTime:2001}</string>
 							<integer>837</integer>
 							<key>Points</key>
 							<array>
-								<string>{120.05186741437218, 243.60060621851554}</string>
-								<string>{113.0856676721661, 246.78076127235684}</string>
+								<string>{120.05186740484737, 243.6006061976436}</string>
+								<string>{113.08566765786165, 246.78076124101128}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247510,8 +247510,8 @@ endTime:2001}</string>
 							<integer>838</integer>
 							<key>Points</key>
 							<array>
-								<string>{130.57075904798424, 262.18129383817126}</string>
-								<string>{125.06911274984924, 263.81727597372048}</string>
+								<string>{130.5707590466703, 262.18129383373827}</string>
+								<string>{125.06911274687776, 263.81727596369541}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247543,8 +247543,8 @@ endTime:2001}</string>
 							<integer>839</integer>
 							<key>Points</key>
 							<array>
-								<string>{116.15985324700489, 260.40897171735179}</string>
-								<string>{111.32857272868951, 252.5470749258003}</string>
+								<string>{116.15985324700752, 260.4089717173502}</string>
+								<string>{111.32857272869616, 252.54707492579618}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247577,7 +247577,7 @@ endTime:2001}</string>
 							<key>Points</key>
 							<array>
 								<string>{107.28622204221787, 264.95973627295768}</string>
-								<string>{108.48506035797377, 253.1963134696845}</string>
+								<string>{108.48506035797375, 253.1963134696845}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247609,8 +247609,8 @@ endTime:2001}</string>
 							<integer>841</integer>
 							<key>Points</key>
 							<array>
-								<string>{108.63067853348939, 291.16607222356322}</string>
-								<string>{114.28915500094197, 297.78906313757636}</string>
+								<string>{108.63067853348943, 291.16607222356316}</string>
+								<string>{114.28915500094216, 297.78906313757631}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247642,8 +247642,8 @@ endTime:2001}</string>
 							<integer>842</integer>
 							<key>Points</key>
 							<array>
-								<string>{118.22300918817062, 298.0366084071386}</string>
-								<string>{123.67765004029698, 293.07492070790607}</string>
+								<string>{118.22300918811058, 298.03660840707266}</string>
+								<string>{123.67765004008055, 293.07492070766858}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247675,8 +247675,8 @@ endTime:2001}</string>
 							<integer>843</integer>
 							<key>Points</key>
 							<array>
-								<string>{105.45810336850954, 280.63059710466632}</string>
-								<string>{106.27117009328316, 274.00116179971627}</string>
+								<string>{105.45810336836132, 280.63059710464819}</string>
+								<string>{106.27117009297022, 274.00116179967819}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247708,8 +247708,8 @@ endTime:2001}</string>
 							<integer>844</integer>
 							<key>Points</key>
 							<array>
-								<string>{102.04876077774966, 226.96183307128487}</string>
-								<string>{99.433513409899675, 231.55140536390201}</string>
+								<string>{102.04876075241448, 226.96183305682845}</string>
+								<string>{99.433513367086988, 231.55140533947281}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247741,8 +247741,8 @@ endTime:2001}</string>
 							<integer>845</integer>
 							<key>Points</key>
 							<array>
-								<string>{93.50285959490364, 287.07465081623042}</string>
-								<string>{98.721662339079643, 286.85223980477372}</string>
+								<string>{93.502859594886559, 287.07465081582734}</string>
+								<string>{98.72166233903107, 286.85223980362696}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247774,8 +247774,8 @@ endTime:2001}</string>
 							<integer>846</integer>
 							<key>Points</key>
 							<array>
-								<string>{159.43731397913405, 205.84687693941407}</string>
-								<string>{162.35514868127774, 208.67371295169653}</string>
+								<string>{159.43731414980377, 205.84687676336159}</string>
+								<string>{162.35514896731198, 208.67371265664104}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247807,8 +247807,8 @@ endTime:2001}</string>
 							<integer>847</integer>
 							<key>Points</key>
 							<array>
-								<string>{161.23890209607933, 213.05815791344412}</string>
-								<string>{155.15923175253209, 214.74885405344486}</string>
+								<string>{161.23890209574947, 213.05815791225373}</string>
+								<string>{155.15923175174476, 214.74885405060346}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247840,8 +247840,8 @@ endTime:2001}</string>
 							<integer>848</integer>
 							<key>Points</key>
 							<array>
-								<string>{162.56243984296631, 222.63477028615461}</string>
-								<string>{166.19630023458282, 223.00523794504238}</string>
+								<string>{162.56243990273416, 222.63476969645922}</string>
+								<string>{166.19630037145237, 223.00523659462658}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247873,8 +247873,8 @@ endTime:2001}</string>
 							<integer>849</integer>
 							<key>Points</key>
 							<array>
-								<string>{168.78580754083944, 215.10846427118236}</string>
-								<string>{169.5950657085998, 215.9448375789141}</string>
+								<string>{168.79233034099153, 215.10213683409572}</string>
+								<string>{169.60321976391066, 215.93685289937744}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247906,8 +247906,8 @@ endTime:2001}</string>
 							<integer>850</integer>
 							<key>Points</key>
 							<array>
-								<string>{183.94200051992217, 233.83165400902206}</string>
-								<string>{184.80121324579733, 235.15210129191226}</string>
+								<string>{183.94247138049354, 233.83134696888808}</string>
+								<string>{184.80174841130375, 235.15175216273306}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247939,8 +247939,8 @@ endTime:2001}</string>
 							<integer>851</integer>
 							<key>Points</key>
 							<array>
-								<string>{175.24913725059324, 235.44080899813503}</string>
-								<string>{174.40161903293651, 239.40563672732344}</string>
+								<string>{175.24913584438843, 235.44080869892082}</string>
+								<string>{174.40161713189687, 239.40563632281714}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247972,8 +247972,8 @@ endTime:2001}</string>
 							<integer>852</integer>
 							<key>Points</key>
 							<array>
-								<string>{173.92627549970555, 248.37919269665824}</string>
-								<string>{174.71179922172865, 255.85018463435762}</string>
+								<string>{173.92627550037102, 248.37919269658866}</string>
+								<string>{174.7117992234929, 255.85018463417322}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248426,7 +248426,7 @@ endTime:2001}</string>
 							<key>Points</key>
 							<array>
 								<string>{162.31406161317949, 239.75189222681848}</string>
-								<string>{170.48263333262153, 257.03200725594502}</string>
+								<string>{170.48263333262159, 257.03200725594496}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248458,8 +248458,8 @@ endTime:2001}</string>
 							<integer>866</integer>
 							<key>Points</key>
 							<array>
-								<string>{144.5279522224894, 248.24181403781614}</string>
-								<string>{148.15905792004799, 252.00481950796657}</string>
+								<string>{144.52796784439431, 248.24179895285823}</string>
+								<string>{148.15907889641588, 252.00479925247197}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248524,8 +248524,8 @@ endTime:2001}</string>
 							<integer>868</integer>
 							<key>Points</key>
 							<array>
-								<string>{151.67980343045804, 286.44727021079694}</string>
-								<string>{149.25206386874544, 294.20494474688684}</string>
+								<string>{151.67980343039275, 286.44727021077659}</string>
+								<string>{149.25206386859193, 294.20494474683892}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248662,8 +248662,8 @@ endTime:2001}</string>
 							<integer>872</integer>
 							<key>Points</key>
 							<array>
-								<string>{158.30376887390227, 284.2902307202425}</string>
-								<string>{162.57830127756046, 287.45935204713572}</string>
+								<string>{158.30376897028509, 284.29023059058028}</string>
+								<string>{162.57830145926638, 287.45935180268981}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248695,8 +248695,8 @@ endTime:2001}</string>
 							<integer>873</integer>
 							<key>Points</key>
 							<array>
-								<string>{172.11519751861155, 281.36045772624959}</string>
-								<string>{171.04736859995992, 284.72178649020134}</string>
+								<string>{172.11508225554951, 281.36042121351852}</string>
+								<string>{171.04722230483219, 284.72174014425366}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248761,8 +248761,8 @@ endTime:2001}</string>
 							<integer>875</integer>
 							<key>Points</key>
 							<array>
-								<string>{143.63683143705023, 202.97385223022545}</string>
-								<string>{149.14894806624338, 202.34555971560366}</string>
+								<string>{143.63683101175044, 202.97384847746898}</string>
+								<string>{149.14894746079224, 202.34555437325542}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248794,8 +248794,8 @@ endTime:2001}</string>
 							<integer>876</integer>
 							<key>Points</key>
 							<array>
-								<string>{112.29024516438258, 216.18315264170525}</string>
-								<string>{119.58822631367659, 211.51538189673749}</string>
+								<string>{112.29024510905514, 216.18315255538488}</string>
+								<string>{119.5882261957522, 211.51538171275507}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248827,8 +248827,8 @@ endTime:2001}</string>
 							<integer>877</integer>
 							<key>Points</key>
 							<array>
-								<string>{120.86900144778934, 229.37865256488112}</string>
-								<string>{112.39567531047626, 224.26518336544657}</string>
+								<string>{120.86900147638671, 229.37865251757736}</string>
+								<string>{112.39567535762028, 224.26518328746423}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248860,8 +248860,8 @@ endTime:2001}</string>
 							<integer>878</integer>
 							<key>Points</key>
 							<array>
-								<string>{82.683863244162524, 237.10127510276209}</string>
-								<string>{83.628230255244361, 245.16711254704902}</string>
+								<string>{82.683863249710825, 237.1012751021162}</string>
+								<string>{83.628230268289229, 245.16711254553044}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -254483,6 +254483,1209 @@ program}</string>
 			<key>VPages</key>
 			<integer>1</integer>
 		</dict>
+		<dict>
+			<key>ActiveLayerIndex</key>
+			<integer>0</integer>
+			<key>AutoAdjust</key>
+			<true/>
+			<key>BackgroundGraphic</key>
+			<dict>
+				<key>Bounds</key>
+				<string>{{0, 0}, {576.00000953674316, 733}}</string>
+				<key>Class</key>
+				<string>SolidGraphic</string>
+				<key>ID</key>
+				<integer>2</integer>
+				<key>Style</key>
+				<dict>
+					<key>shadow</key>
+					<dict>
+						<key>Draws</key>
+						<string>NO</string>
+					</dict>
+					<key>stroke</key>
+					<dict>
+						<key>Draws</key>
+						<string>NO</string>
+					</dict>
+				</dict>
+			</dict>
+			<key>BaseZoom</key>
+			<integer>0</integer>
+			<key>CanvasOrigin</key>
+			<string>{0, 0}</string>
+			<key>ColumnAlign</key>
+			<integer>1</integer>
+			<key>ColumnSpacing</key>
+			<real>36</real>
+			<key>DisplayScale</key>
+			<string>1 0/72 in = 1.0000 in</string>
+			<key>GraphicsList</key>
+			<array>
+				<dict>
+					<key>Bounds</key>
+					<string>{{333.32059001922607, 91.394824981689453}, {44, 28}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>213</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\b\fs24 \cf0 outoing\
+edges}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{245.50003337860107, 91.535919189453125}, {54, 28}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>212</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\b\fs24 \cf0 incoming\
+edges}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{125.14100646972656, 98.394828796386719}, {36, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>211</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\b\fs24 \cf0 vertex}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{171.00000381469727, 98.394828796386719}, {59, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>210</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\b\fs24 \cf0 properties}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{172.50000262260437, 206.90742111206055}, {16, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>ID</key>
+					<integer>209</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 k/v}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{172.49999856948853, 174.18954086303711}, {51, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>ID</key>
+					<integer>208</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 k/v,k/v,k/v}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{171.00000429153442, 153.47166061401367}, {34, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>ID</key>
+					<integer>207</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 k/v,k/v}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>205</integer>
+					<key>Points</key>
+					<array>
+						<string>{345.32059574127197, 213.40742111206055}</string>
+						<string>{366.32059574127197, 213.40742111206055}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>204</integer>
+					<key>Points</key>
+					<array>
+						<string>{321.32059574127197, 213.40742111206055}</string>
+						<string>{342.32059574127197, 213.40742111206055}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>203</integer>
+					<key>Points</key>
+					<array>
+						<string>{344.82059574127197, 180.68951034545898}</string>
+						<string>{365.82059574127197, 180.68951034545898}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>202</integer>
+					<key>Points</key>
+					<array>
+						<string>{321.32059574127197, 180.68952560424805}</string>
+						<string>{342.32059574127197, 180.68952560424805}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>201</integer>
+					<key>Points</key>
+					<array>
+						<string>{321.32058668136597, 159.97164535522461}</string>
+						<string>{342.32058668136597, 159.97164535522461}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>200</integer>
+					<key>Points</key>
+					<array>
+						<string>{368.67954349517822, 139.25378036499023}</string>
+						<string>{389.67954349517822, 139.53586959838867}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>199</integer>
+					<key>Points</key>
+					<array>
+						<string>{345.32059574127197, 139.25378036499023}</string>
+						<string>{366.32059574127197, 139.25378036499023}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>198</integer>
+					<key>Points</key>
+					<array>
+						<string>{321.32059574127197, 139.25378036499023}</string>
+						<string>{342.32059574127197, 139.25378036499023}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>FilledArrow</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>0</string>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{171, 132.75378799438477}, {51, 14}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>ID</key>
+					<integer>194</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 k/v,k/v,k/v}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>117</integer>
+					<key>Points</key>
+					<array>
+						<string>{288.00004529953003, 213.40742874145508}</string>
+						<string>{309.00004529953003, 213.40742874145508}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>116</integer>
+					<key>Points</key>
+					<array>
+						<string>{262.00004529953003, 213.40742874145508}</string>
+						<string>{283.00004529953003, 213.40742874145508}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>115</integer>
+					<key>Points</key>
+					<array>
+						<string>{238.00004529953003, 213.40742874145508}</string>
+						<string>{259.00004529953003, 213.40742874145508}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>114</integer>
+					<key>Points</key>
+					<array>
+						<string>{261.50004529953003, 180.68951797485352}</string>
+						<string>{282.50004529953003, 180.68951797485352}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>113</integer>
+					<key>Points</key>
+					<array>
+						<string>{238.00004529953003, 180.68953323364258}</string>
+						<string>{259.00004529953003, 180.68953323364258}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>109</integer>
+					<key>Points</key>
+					<array>
+						<string>{262.00004529953003, 139.25378799438477}</string>
+						<string>{283.00004529953003, 139.25378799438477}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Class</key>
+					<string>LineGraphic</string>
+					<key>ID</key>
+					<integer>59</integer>
+					<key>Points</key>
+					<array>
+						<string>{238.00004529953003, 139.25378799438477}</string>
+						<string>{259.00004529953003, 139.25378799438477}</string>
+					</array>
+					<key>Style</key>
+					<dict>
+						<key>stroke</key>
+						<dict>
+							<key>HeadArrow</key>
+							<string>0</string>
+							<key>HeadScale</key>
+							<real>0.59999990463256836</real>
+							<key>Legacy</key>
+							<true/>
+							<key>LineType</key>
+							<integer>1</integer>
+							<key>TailArrow</key>
+							<string>FilledArrow</string>
+							<key>TailScale</key>
+							<real>0.59999990463256836</real>
+							<key>Width</key>
+							<real>2</real>
+						</dict>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{131.28207397460938, 203.54848709702492}, {20.717874149566725, 20.717874149566725}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>108</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>b</key>
+								<string>0.994293</string>
+								<key>g</key>
+								<string>0.853217</string>
+								<key>r</key>
+								<string>0.622309</string>
+							</dict>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 n}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{136.14101409912109, 185.54848098754883}, {11, 16}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica-Bold</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>107</integer>
+					<key>Shape</key>
+					<string>Rectangle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+						<key>stroke</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Pad</key>
+						<integer>0</integer>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\b\fs26 \cf0 ...}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{131.28207397460938, 170.83060073852539}, {20.717874149566725, 20.717874149566725}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>106</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>b</key>
+								<string>0.994293</string>
+								<key>g</key>
+								<string>0.853217</string>
+								<key>r</key>
+								<string>0.622309</string>
+							</dict>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 3}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{131.28207397460938, 150.11272048950195}, {20.717874149566725, 20.717874149566725}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>105</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>b</key>
+								<string>0.994293</string>
+								<key>g</key>
+								<string>0.853217</string>
+								<key>r</key>
+								<string>0.622309</string>
+							</dict>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 2}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+				<dict>
+					<key>Bounds</key>
+					<string>{{131.28207397460938, 129.39485323717179}, {20.717874149566725, 20.717874149566725}}</string>
+					<key>Class</key>
+					<string>ShapedGraphic</string>
+					<key>FontInfo</key>
+					<dict>
+						<key>Font</key>
+						<string>Helvetica</string>
+						<key>Size</key>
+						<real>12</real>
+					</dict>
+					<key>ID</key>
+					<integer>104</integer>
+					<key>Shape</key>
+					<string>Circle</string>
+					<key>Style</key>
+					<dict>
+						<key>fill</key>
+						<dict>
+							<key>Color</key>
+							<dict>
+								<key>b</key>
+								<string>0.994293</string>
+								<key>g</key>
+								<string>0.853217</string>
+								<key>r</key>
+								<string>0.622309</string>
+							</dict>
+						</dict>
+						<key>shadow</key>
+						<dict>
+							<key>Draws</key>
+							<string>NO</string>
+						</dict>
+					</dict>
+					<key>Text</key>
+					<dict>
+						<key>Text</key>
+						<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 1}</string>
+						<key>VerticalPad</key>
+						<integer>0</integer>
+					</dict>
+				</dict>
+			</array>
+			<key>GridInfo</key>
+			<dict/>
+			<key>HPages</key>
+			<integer>1</integer>
+			<key>KeepToScale</key>
+			<false/>
+			<key>Layers</key>
+			<array>
+				<dict>
+					<key>Lock</key>
+					<string>NO</string>
+					<key>Name</key>
+					<string>Layer 1</string>
+					<key>Print</key>
+					<string>YES</string>
+					<key>View</key>
+					<string>YES</string>
+				</dict>
+			</array>
+			<key>LayoutInfo</key>
+			<dict>
+				<key>Animate</key>
+				<string>NO</string>
+				<key>circoMinDist</key>
+				<real>18</real>
+				<key>circoSeparation</key>
+				<real>0.0</real>
+				<key>layoutEngine</key>
+				<string>dot</string>
+				<key>neatoSeparation</key>
+				<real>0.0</real>
+				<key>twopiSeparation</key>
+				<real>0.0</real>
+			</dict>
+			<key>Orientation</key>
+			<integer>2</integer>
+			<key>PrintOnePage</key>
+			<false/>
+			<key>RowAlign</key>
+			<integer>1</integer>
+			<key>RowSpacing</key>
+			<real>36</real>
+			<key>SheetTitle</key>
+			<string>adjacency-list</string>
+			<key>UniqueID</key>
+			<integer>73</integer>
+			<key>VPages</key>
+			<integer>1</integer>
+		</dict>
 	</array>
 	<key>SmartAlignmentGuidesActive</key>
 	<string>YES</string>
@@ -254493,7 +255696,7 @@ program}</string>
 	<key>WindowInfo</key>
 	<dict>
 		<key>CurrentSheet</key>
-		<integer>66</integer>
+		<integer>67</integer>
 		<key>ExpandedCanvases</key>
 		<array/>
 		<key>Frame</key>
@@ -254511,7 +255714,7 @@ program}</string>
 		<key>SidebarWidth</key>
 		<integer>173</integer>
 		<key>VisibleRegion</key>
-		<string>{{0, -6}, {861, 746}}</string>
+		<string>{{-142, -14}, {861, 761}}</string>
 		<key>Zoom</key>
 		<real>1</real>
 		<key>ZoomValues</key>
@@ -254851,6 +256054,11 @@ program}</string>
 				<real>1</real>
 				<real>1</real>
 			</array>
+			<array>
+				<string>adjacency-list</string>
+				<real>1</real>
+				<real>1</real>
+			</array>
 		</array>
 	</dict>
 </dict>