diff --git a/Projects/p3-skeleton/__MACOSX/._cs448p3 b/Projects/p3-skeleton/__MACOSX/._cs448p3
new file mode 100755
index 0000000..1c29b35
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/._cs448p3 differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._.gitignore b/Projects/p3-skeleton/__MACOSX/cs448p3/._.gitignore
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._.gitignore differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._Makefile b/Projects/p3-skeleton/__MACOSX/cs448p3/._Makefile
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._Makefile differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._lib b/Projects/p3-skeleton/__MACOSX/cs448p3/._lib
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._lib differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._pom.xml b/Projects/p3-skeleton/__MACOSX/cs448p3/._pom.xml
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._pom.xml differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._solution.txt b/Projects/p3-skeleton/__MACOSX/cs448p3/._solution.txt
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._solution.txt differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/._src b/Projects/p3-skeleton/__MACOSX/cs448p3/._src
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/._src differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/._main b/Projects/p3-skeleton/__MACOSX/cs448p3/src/._main
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/._main differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/._test b/Projects/p3-skeleton/__MACOSX/cs448p3/src/._test
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/._test differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/._java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/._java
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/._java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._global b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._global
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._global differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._relop b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._relop
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/._relop differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrOperator.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrOperator.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrOperator.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrType.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrType.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._AttrType.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Convert.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Convert.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Convert.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._GlobalConst.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._GlobalConst.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._GlobalConst.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Minibase.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Minibase.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Minibase.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Page.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Page.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._Page.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._PageId.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._PageId.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._PageId.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._RID.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._RID.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._RID.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SearchKey.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SearchKey.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SearchKey.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SortKey.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SortKey.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/global/._SortKey.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._FileScan.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._FileScan.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._FileScan.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashJoin.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashJoin.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashJoin.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashTableDup.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashTableDup.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._HashTableDup.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._IndexScan.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._IndexScan.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._IndexScan.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Iterator.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Iterator.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Iterator.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._KeyScan.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._KeyScan.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._KeyScan.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Predicate.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Predicate.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Predicate.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Projection.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Projection.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Projection.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Schema.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Schema.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Schema.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Selection.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Selection.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Selection.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._SimpleJoin.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._SimpleJoin.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._SimpleJoin.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Tuple.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Tuple.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/main/java/relop/._Tuple.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._java
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._resources b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._resources
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/._resources differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/._tests b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/._tests
new file mode 100755
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/._tests differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._Field.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._Field.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._Field.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._QEPTest.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._QEPTest.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._QEPTest.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._ROTest.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._ROTest.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._ROTest.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._TestDriver.java b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._TestDriver.java
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/java/tests/._TestDriver.java differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._drivers.json differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._driversBig.json differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groups.json differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._groupsBig.json differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._rides.json differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.csv b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.csv
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.csv differ
diff --git a/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.json b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.json
new file mode 100644
index 0000000..a23c5d4
Binary files /dev/null and b/Projects/p3-skeleton/__MACOSX/cs448p3/src/test/resources/._ridesBig.json differ
diff --git a/Projects/p3-skeleton/cs448p3/.gitignore b/Projects/p3-skeleton/cs448p3/.gitignore
new file mode 100644
index 0000000..00b41c6
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/.gitignore
@@ -0,0 +1,2 @@
+bin/
+.DS_Store
diff --git a/Projects/p3-skeleton/cs448p3/Makefile b/Projects/p3-skeleton/cs448p3/Makefile
new file mode 100644
index 0000000..099fa66
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/Makefile
@@ -0,0 +1,20 @@
+JDKPATH = /usr
+LIBPATH = lib/bufmgr.jar:lib/diskmgr.jar:lib/heap.jar:lib/index.jar:lib/junit.jar:lib/org.hamcrest.core_1.3.0.v201303031735.jar
+SRCPATH = src/main/java/*/
+TESTPATH = src/test/java/*/
+
+CLASSPATH = .:..:$(LIBPATH)
+BINPATH = $(JDKPATH)/bin
+JAVAC = $(JDKPATH)/bin/javac
+JAVA = $(JDKPATH)/bin/java
+
+PROGS = xx
+
+all: $(PROGS)
+
+compile:${SRCPATH}*.java
+ $(JAVAC) -cp $(CLASSPATH) -d bin ${SRCPATH}*.java ${TESTPATH}*.java
+
+xx : compile
+ $(JAVA) -cp $(CLASSPATH):bin tests.ROTest
+
diff --git a/Projects/p3-skeleton/cs448p3/p3-handout.pdf b/Projects/p3-skeleton/cs448p3/p3-handout.pdf
new file mode 100644
index 0000000..98ce7de
Binary files /dev/null and b/Projects/p3-skeleton/cs448p3/p3-handout.pdf differ
diff --git a/Projects/p3-skeleton/cs448p3/pom.xml b/Projects/p3-skeleton/cs448p3/pom.xml
new file mode 100644
index 0000000..a55f734
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/pom.xml
@@ -0,0 +1,131 @@
+
+
+
+ 4.0.0
+
+ edu.cs.purdue
+ cs448p3
+ 1.0-SNAPSHOT
+
+ cs448p3
+ https://www.cs.purdue.edu/homes/bb/cs448f19/
+
+
+ 10
+ UTF-8
+ ${java.version}
+ ${java.version}
+
+
+
+
+ com.googlecode.json-simple
+ json-simple
+ 1.1.1
+
+
+ com.opencsv
+ opencsv
+ 4.0
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ minibase
+ bufmgr
+ 1.0
+ system
+ ${basedir}/lib/bufmgr.jar
+
+
+ minibase
+ diskmgr
+ 1.0
+ system
+ ${basedir}/lib/diskmgr.jar
+ jar
+
+
+ minibase
+ heap
+ 1.0
+ system
+ ${basedir}/lib/heap.jar
+
+
+ minibase
+ index
+ 1.0
+ system
+ ${basedir}/lib/index.jar
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+ ${java.version}
+
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+ maven-assembly-plugin
+
+
+
+ test.TestDriver
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
diff --git a/Projects/p3-skeleton/cs448p3/solution.txt b/Projects/p3-skeleton/cs448p3/solution.txt
new file mode 100644
index 0000000..5e89823
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/solution.txt
@@ -0,0 +1,24 @@
+proj_idx=3:18.|9:19.|2:20.|8:20.|4:22.|6:23.|7:24.|1:25.|5:26.
+proj_key=2:20.|8:20.
+proj_sel=2:20.|8:20.
+proj_proj=1:25.|2:20.|3:18.|4:22.|5:26.|6:23.|7:24.|8:20.|9:19.
+proj_sj=1:25.|1:25.|2:20.|2:20.|3:18.|3:18.|3:18.|4:22.|5:26.|6:23.|8:20.|9:19.
+proj_hj=1:25.|1:25.|2:20.|2:20.|3:18.|3:18.|3:18.|4:22.|5:26.|6:23.|8:20.|9:19.
+keyscan=2:Walid:Aref:20.013|8:Arif:Ghafoor:20.05
+selection=1:Ahmed:Elmagarmid:25.05|4:Sunil:Prabhakar:22.07|5:Elisa:Bertino:26.05|6:Susanne:Hambrusch:23.03|7:David:Eberts:24.08
+idxscan=3:Christopher:Clifton:18.04|9:Jeff:Vitter:19.010|2:Walid:Aref:20.013|8:Arif:Ghafoor:20.05|4:Sunil:Prabhakar:22.07|6:Susanne:Hambrusch:23.03|7:David:Eberts:24.08|1:Ahmed:Elmagarmid:25.05|5:Elisa:Bertino:26.05
+filescan=1:Ahmed:Elmagarmid:25.05|2:Walid:Aref:20.013|3:Christopher:Clifton:18.04|4:Sunil:Prabhakar:22.07|5:Elisa:Bertino:26.05|6:Susanne:Hambrusch:23.03|7:David:Eberts:24.08|8:Arif:Ghafoor:20.05|9:Jeff:Vitter:19.010
+sel_idx=2:Walid:Aref:20.013
+sel_key=2:Walid:Aref:20.013
+sel_sel=2:Walid:Aref:20.013
+sel_proj=2:Walid
+sel_sj=2:Walid:Aref:20.013:2:6:2/17/2006:2/20/2006|2:Walid:Aref:20.013:2:7:2/18/2006:2/23/2006
+sel_jh=2:Walid:Aref:20.013:2:6:2/17/2006:2/20/2006|2:Walid:Aref:20.013:2:7:2/18/2006:2/23/2006
+selection_preds=1:Ahmed:Elmagarmid:25.05|3:Christopher:Clifton:18.04|5:Elisa:Bertino:26.05|7:David:Eberts:24.08
+hj_sel_sj=6:Susanne:Hambrusch:23.03:6:6:2/25/2006:2/26/2006:1:Purdue1
+hj_proj_hj=1:25.01:2:2/12/2006:2/14/2006:2:Purdue2|1:25.01:3:2/15/2006:2/16/2006:3:Purdue3|2:20.02:6:2/17/2006:2/20/2006:6:Purdue6|2:20.02:7:2/18/2006:2/23/2006:7:Purdue7|3:18.03:2:2/24/2006:2/26/2006:2:Purdue2|3:18.03:4:2/18/2006:2/19/2006:4:Purdue4|3:18.03:5:2/10/2006:2/13/2006:5:Purdue5|4:22.04:1:2/19/2006:2/19/2006:1:Purdue1|5:26.05:7:2/14/2006:2/18/2006:7:Purdue7|6:23.06:6:2/25/2006:2/26/2006:6:Purdue6|8:20.08:5:2/20/2006:2/22/2006:5:Purdue5|9:19.09:1:2/15/2006:2/15/2006:1:Purdue1
+hj_iscan_kscan=4:Sunil:Prabhakar:22.07:4:1:2/19/2006:2/19/2006|9:Jeff:Vitter:19.010:9:1:2/15/2006:2/15/2006
+hashjoin=1:Ahmed:Elmagarmid:25.05:1:2:2/12/2006:2/14/2006|1:Ahmed:Elmagarmid:25.05:1:3:2/15/2006:2/16/2006|2:Walid:Aref:20.013:2:6:2/17/2006:2/20/2006|2:Walid:Aref:20.013:2:7:2/18/2006:2/23/2006|3:Christopher:Clifton:18.04:3:5:2/10/2006:2/13/2006|3:Christopher:Clifton:18.04:3:4:2/18/2006:2/19/2006|3:Christopher:Clifton:18.04:3:2:2/24/2006:2/26/2006|4:Sunil:Prabhakar:22.07:4:1:2/19/2006:2/19/2006|5:Elisa:Bertino:26.05:5:7:2/14/2006:2/18/2006|6:Susanne:Hambrusch:23.03:6:6:2/25/2006:2/26/2006|8:Arif:Ghafoor:20.05:8:5:2/20/2006:2/22/2006|9:Jeff:Vitter:19.010:9:1:2/15/2006:2/15/2006
+projection=Ahmed:5|Walid:13|Christopher:4|Sunil:7|Elisa:5|Susanne:3|David:8|Arif:5|Jeff:10
+hashEqual=128:"Adnan":"Bob":19.010:128:"Adnan":"Bob":19.010|256:"Adnan":"Bob":19.010:256:"Adnan":"Bob":19.010|384:"Adnan":"Bob":19.010:384:"Adnan":"Bob":19.010|512:"Adnan":"Bob":19.010:512:"Adnan":"Bob":19.010|640:"Adnan":"Bob":19.010:640:"Adnan":"Bob":19.010|768:"Adnan":"Bob":19.010:768:"Adnan":"Bob":19.010|896:"Adnan":"Bob":19.010:896:"Adnan":"Bob":19.010|1:"Ahmed":"Elmagarmid":25.05:1:"Ahmed":"Elmagarmid":25.05|129:"Adnan":"Edgardo":19.010:129:"Adnan":"Edgardo":19.010|257:"Adnan":"Edgardo":19.010:257:"Adnan":"Edgardo":19.010|385:"Adnan":"Edgardo":19.010:385:"Adnan":"Edgardo":19.010|513:"Adnan":"Edgardo":19.010:513:"Adnan":"Edgardo":19.010|641:"Adnan":"Edgardo":19.010:641:"Adnan":"Edgardo":19.010|769:"Adnan":"Edgardo":19.010:769:"Adnan":"Edgardo":19.010|897:"Adnan":"Edgardo":19.010:897:"Adnan":"Edgardo":19.010|2:"Walid":"Aref":20.013:2:"Walid":"Aref":20.013|130:"Adnan":"Bob":19.010:130:"Adnan":"Bob":19.010|258:"Adnan":"Bob":19.010:258:"Adnan":"Bob":19.010|386:"Adnan":"Bob":19.010:386:"Adnan":"Bob":19.010|514:"Adnan":"Bob":19.010:514:"Adnan":"Bob":19.010|642:"Adnan":"Bob":19.010:642:"Adnan":"Bob":19.010|770:"Adnan":"Bob":19.010:770:"Adnan":"Bob":19.010|898:"Adnan":"Bob":19.010:898:"Adnan":"Bob":19.010|3:"Christopher":"Clifton":18.04:3:"Christopher":"Clifton":18.04|131:"Adnan":"Edgardo":19.010:131:"Adnan":"Edgardo":19.010|259:"Adnan":"Edgardo":19.010:259:"Adnan":"Edgardo":19.010|387:"Adnan":"Edgardo":19.010:387:"Adnan":"Edgardo":19.010|515:"Adnan":"Edgardo":19.010:515:"Adnan":"Edgardo":19.010|643:"Adnan":"Edgardo":19.010:643:"Adnan":"Edgardo":19.010|771:"Adnan":"Edgardo":19.010:771:"Adnan":"Edgardo":19.010|899:"Adnan":"Edgardo":19.010:899:"Adnan":"Edgardo":19.010|4:"Sunil":"Prabhakar":22.07:4:"Sunil":"Prabhakar":22.07|132:"Adnan":"Bob":19.010:132:"Adnan":"Bob":19.010|260:"Adnan":"Bob":19.010:260:"Adnan":"Bob":19.010|388:"Adnan":"Bob":19.010:388:"Adnan":"Bob":19.010|516:"Adnan":"Bob":19.010:516:"Adnan":"Bob":19.010|644:"Adnan":"Bob":19.010:644:"Adnan":"Bob":19.010|772:"Adnan":"Bob":19.010:772:"Adnan":"Bob":19.010|900:"Adnan":"Bob":19.010:900:"Adnan":"Bob":19.010|5:"Elisa":"Bertino":26.05:5:"Elisa":"Bertino":26.05|133:"Adnan":"Edgardo":19.010:133:"Adnan":"Edgardo":19.010|261:"Adnan":"Edgardo":19.010:261:"Adnan":"Edgardo":19.010|389:"Adnan":"Edgardo":19.010:389:"Adnan":"Edgardo":19.010|517:"Adnan":"Edgardo":19.010:517:"Adnan":"Edgardo":19.010|645:"Adnan":"Edgardo":19.010:645:"Adnan":"Edgardo":19.010|773:"Adnan":"Edgardo":19.010:773:"Adnan":"Edgardo":19.010|901:"Adnan":"Edgardo":19.010:901:"Adnan":"Edgardo":19.010|6:"Susanne":"Hambrusch":23.03:6:"Susanne":"Hambrusch":23.03|134:"Adnan":"Bob":19.010:134:"Adnan":"Bob":19.010|262:"Adnan":"Bob":19.010:262:"Adnan":"Bob":19.010|390:"Adnan":"Bob":19.010:390:"Adnan":"Bob":19.010|518:"Adnan":"Bob":19.010:518:"Adnan":"Bob":19.010|646:"Adnan":"Bob":19.010:646:"Adnan":"Bob":19.010|774:"Adnan":"Bob":19.010:774:"Adnan":"Bob":19.010|902:"Adnan":"Bob":19.010:902:"Adnan":"Bob":19.010|7:"David":"Eberts":24.08:7:"David":"Eberts":24.08|135:"Adnan":"Edgardo":19.010:135:"Adnan":"Edgardo":19.010|263:"Adnan":"Edgardo":19.010:263:"Adnan":"Edgardo":19.010|391:"Adnan":"Edgardo":19.010:391:"Adnan":"Edgardo":19.010|519:"Adnan":"Edgardo":19.010:519:"Adnan":"Edgardo":19.010|647:"Adnan":"Edgardo":19.010:647:"Adnan":"Edgardo":19.010|775:"Adnan":"Edgardo":19.010:775:"Adnan":"Edgardo":19.010|903:"Adnan":"Edgardo":19.010:903:"Adnan":"Edgardo":19.010|8:"Arif":"Ghafoor":20.05:8:"Arif":"Ghafoor":20.05|136:"Adnan":"Bob":19.010:136:"Adnan":"Bob":19.010|264:"Adnan":"Bob":19.010:264:"Adnan":"Bob":19.010|392:"Adnan":"Bob":19.010:392:"Adnan":"Bob":19.010|520:"Adnan":"Bob":19.010:520:"Adnan":"Bob":19.010|648:"Adnan":"Bob":19.010:648:"Adnan":"Bob":19.010|776:"Adnan":"Bob":19.010:776:"Adnan":"Bob":19.010|904:"Adnan":"Bob":19.010:904:"Adnan":"Bob":19.010|9:"Jeff":"Vitter":19.010:9:"Jeff":"Vitter":19.010|137:"Adnan":"Edgardo":19.010:137:"Adnan":"Edgardo":19.010|265:"Adnan":"Edgardo":19.010:265:"Adnan":"Edgardo":19.010|393:"Adnan":"Edgardo":19.010:393:"Adnan":"Edgardo":19.010|521:"Adnan":"Edgardo":19.010:521:"Adnan":"Edgardo":19.010|649:"Adnan":"Edgardo":19.010:649:"Adnan":"Edgardo":19.010|777:"Adnan":"Edgardo":19.010:777:"Adnan":"Edgardo":19.010|905:"Adnan":"Edgardo":19.010:905:"Adnan":"Edgardo":19.010|10:"Adnan":"Bob":19.010:10:"Adnan":"Bob":19.010|138:"Adnan":"Bob":19.010:138:"Adnan":"Bob":19.010|266:"Adnan":"Bob":19.010:266:"Adnan":"Bob":19.010|394:"Adnan":"Bob":19.010:394:"Adnan":"Bob":19.010|522:"Adnan":"Bob":19.010:522:"Adnan":"Bob":19.010|650:"Adnan":"Bob":19.010:650:"Adnan":"Bob":19.010|778:"Adnan":"Bob":19.010:778:"Adnan":"Bob":19.010|906:"Adnan":"Bob":19.010:906:"Adnan":"Bob":19.010|11:"Adnan":"Edgardo":19.010:11:"Adnan":"Edgardo":19.010|139:"Adnan":"Edgardo":19.010:139:"Adnan":"Edgardo":19.010|267:"Adnan":"Edgardo":19.010:267:"Adnan":"Edgardo":19.010|395:"Adnan":"Edgardo":19.010:395:"Adnan":"Edgardo":19.010|523:"Adnan":"Edgardo":19.010:523:"Adnan":"Edgardo":19.010|651:"Adnan":"Edgardo":19.010:651:"Adnan":"Edgardo":19.010|779:"Adnan":"Edgardo":19.010:779:"Adnan":"Edgardo":19.010|907:"Adnan":"Edgardo":19.010:907:"Adnan":"Edgardo":19.010|12:"Adnan":"Bob":19.010:12:"Adnan":"Bob":19.010|140:"Adnan":"Bob":19.010:140:"Adnan":"Bob":19.010|268:"Adnan":"Bob":19.010:268:"Adnan":"Bob":19.010|396:"Adnan":"Bob":19.010:396:"Adnan":"Bob":19.010|524:"Adnan":"Bob":19.010:524:"Adnan":"Bob":19.010|652:"Adnan":"Bob":19.010:652:"Adnan":"Bob":19.010|780:"Adnan":"Bob":19.010:780:"Adnan":"Bob":19.010|908:"Adnan":"Bob":19.010:908:"Adnan":"Bob":19.010|13:"Adnan":"Edgardo":19.010:13:"Adnan":"Edgardo":19.010|141:"Adnan":"Edgardo":19.010:141:"Adnan":"Edgardo":19.010|269:"Adnan":"Edgardo":19.010:269:"Adnan":"Edgardo":19.010|397:"Adnan":"Edgardo":19.010:397:"Adnan":"Edgardo":19.010|525:"Adnan":"Edgardo":19.010:525:"Adnan":"Edgardo":19.010|653:"Adnan":"Edgardo":19.010:653:"Adnan":"Edgardo":19.010|781:"Adnan":"Edgardo":19.010:781:"Adnan":"Edgardo":19.010|909:"Adnan":"Edgardo":19.010:909:"Adnan":"Edgardo":19.010|14:"Adnan":"Bob":19.010:14:"Adnan":"Bob":19.010|142:"Adnan":"Bob":19.010:142:"Adnan":"Bob":19.010|270:"Adnan":"Bob":19.010:270:"Adnan":"Bob":19.010|398:"Adnan":"Bob":19.010:398:"Adnan":"Bob":19.010|526:"Adnan":"Bob":19.010:526:"Adnan":"Bob":19.010|654:"Adnan":"Bob":19.010:654:"Adnan":"Bob":19.010|782:"Adnan":"Bob":19.010:782:"Adnan":"Bob":19.010|910:"Adnan":"Bob":19.010:910:"Adnan":"Bob":19.010|15:"Adnan":"Edgardo":19.010:15:"Adnan":"Edgardo":19.010|143:"Adnan":"Edgardo":19.010:143:"Adnan":"Edgardo":19.010|271:"Adnan":"Edgardo":19.010:271:"Adnan":"Edgardo":19.010|399:"Adnan":"Edgardo":19.010:399:"Adnan":"Edgardo":19.010|527:"Adnan":"Edgardo":19.010:527:"Adnan":"Edgardo":19.010|655:"Adnan":"Edgardo":19.010:655:"Adnan":"Edgardo":19.010|783:"Adnan":"Edgardo":19.010:783:"Adnan":"Edgardo":19.010|911:"Adnan":"Edgardo":19.010:911:"Adnan":"Edgardo":19.010|16:"Adnan":"Bob":19.010:16:"Adnan":"Bob":19.010|144:"Adnan":"Bob":19.010:144:"Adnan":"Bob":19.010|272:"Adnan":"Bob":19.010:272:"Adnan":"Bob":19.010|400:"Adnan":"Bob":19.010:400:"Adnan":"Bob":19.010|528:"Adnan":"Bob":19.010:528:"Adnan":"Bob":19.010|656:"Adnan":"Bob":19.010:656:"Adnan":"Bob":19.010|784:"Adnan":"Bob":19.010:784:"Adnan":"Bob":19.010|912:"Adnan":"Bob":19.010:912:"Adnan":"Bob":19.010|17:"Adnan":"Edgardo":19.010:17:"Adnan":"Edgardo":19.010|145:"Adnan":"Edgardo":19.010:145:"Adnan":"Edgardo":19.010|273:"Adnan":"Edgardo":19.010:273:"Adnan":"Edgardo":19.010|401:"Adnan":"Edgardo":19.010:401:"Adnan":"Edgardo":19.010|529:"Adnan":"Edgardo":19.010:529:"Adnan":"Edgardo":19.010|657:"Adnan":"Edgardo":19.010:657:"Adnan":"Edgardo":19.010|785:"Adnan":"Edgardo":19.010:785:"Adnan":"Edgardo":19.010|913:"Adnan":"Edgardo":19.010:913:"Adnan":"Edgardo":19.010|18:"Adnan":"Bob":19.010:18:"Adnan":"Bob":19.010|146:"Adnan":"Bob":19.010:146:"Adnan":"Bob":19.010|274:"Adnan":"Bob":19.010:274:"Adnan":"Bob":19.010|402:"Adnan":"Bob":19.010:402:"Adnan":"Bob":19.010|530:"Adnan":"Bob":19.010:530:"Adnan":"Bob":19.010|658:"Adnan":"Bob":19.010:658:"Adnan":"Bob":19.010|786:"Adnan":"Bob":19.010:786:"Adnan":"Bob":19.010|914:"Adnan":"Bob":19.010:914:"Adnan":"Bob":19.010|19:"Adnan":"Edgardo":19.010:19:"Adnan":"Edgardo":19.010|147:"Adnan":"Edgardo":19.010:147:"Adnan":"Edgardo":19.010|275:"Adnan":"Edgardo":19.010:275:"Adnan":"Edgardo":19.010|403:"Adnan":"Edgardo":19.010:403:"Adnan":"Edgardo":19.010|531:"Adnan":"Edgardo":19.010:531:"Adnan":"Edgardo":19.010|659:"Adnan":"Edgardo":19.010:659:"Adnan":"Edgardo":19.010|787:"Adnan":"Edgardo":19.010:787:"Adnan":"Edgardo":19.010|915:"Adnan":"Edgardo":19.010:915:"Adnan":"Edgardo":19.010|20:"Adnan":"Bob":19.010:20:"Adnan":"Bob":19.010|148:"Adnan":"Bob":19.010:148:"Adnan":"Bob":19.010|276:"Adnan":"Bob":19.010:276:"Adnan":"Bob":19.010|404:"Adnan":"Bob":19.010:404:"Adnan":"Bob":19.010|532:"Adnan":"Bob":19.010:532:"Adnan":"Bob":19.010|660:"Adnan":"Bob":19.010:660:"Adnan":"Bob":19.010|788:"Adnan":"Bob":19.010:788:"Adnan":"Bob":19.010|916:"Adnan":"Bob":19.010:916:"Adnan":"Bob":19.010|21:"Adnan":"Edgardo":19.010:21:"Adnan":"Edgardo":19.010|149:"Adnan":"Edgardo":19.010:149:"Adnan":"Edgardo":19.010|277:"Adnan":"Edgardo":19.010:277:"Adnan":"Edgardo":19.010|405:"Adnan":"Edgardo":19.010:405:"Adnan":"Edgardo":19.010|533:"Adnan":"Edgardo":19.010:533:"Adnan":"Edgardo":19.010|661:"Adnan":"Edgardo":19.010:661:"Adnan":"Edgardo":19.010|789:"Adnan":"Edgardo":19.010:789:"Adnan":"Edgardo":19.010|917:"Adnan":"Edgardo":19.010:917:"Adnan":"Edgardo":19.010|22:"Adnan":"Bob":19.010:22:"Adnan":"Bob":19.010|150:"Adnan":"Bob":19.010:150:"Adnan":"Bob":19.010|278:"Adnan":"Bob":19.010:278:"Adnan":"Bob":19.010|406:"Adnan":"Bob":19.010:406:"Adnan":"Bob":19.010|534:"Adnan":"Bob":19.010:534:"Adnan":"Bob":19.010|662:"Adnan":"Bob":19.010:662:"Adnan":"Bob":19.010|790:"Adnan":"Bob":19.010:790:"Adnan":"Bob":19.010|918:"Adnan":"Bob":19.010:918:"Adnan":"Bob":19.010|23:"Adnan":"Edgardo":19.010:23:"Adnan":"Edgardo":19.010|151:"Adnan":"Edgardo":19.010:151:"Adnan":"Edgardo":19.010|279:"Adnan":"Edgardo":19.010:279:"Adnan":"Edgardo":19.010|407:"Adnan":"Edgardo":19.010:407:"Adnan":"Edgardo":19.010|535:"Adnan":"Edgardo":19.010:535:"Adnan":"Edgardo":19.010|663:"Adnan":"Edgardo":19.010:663:"Adnan":"Edgardo":19.010|791:"Adnan":"Edgardo":19.010:791:"Adnan":"Edgardo":19.010|919:"Adnan":"Edgardo":19.010:919:"Adnan":"Edgardo":19.010|24:"Adnan":"Bob":19.010:24:"Adnan":"Bob":19.010|152:"Adnan":"Bob":19.010:152:"Adnan":"Bob":19.010|280:"Adnan":"Bob":19.010:280:"Adnan":"Bob":19.010|408:"Adnan":"Bob":19.010:408:"Adnan":"Bob":19.010|536:"Adnan":"Bob":19.010:536:"Adnan":"Bob":19.010|664:"Adnan":"Bob":19.010:664:"Adnan":"Bob":19.010|792:"Adnan":"Bob":19.010:792:"Adnan":"Bob":19.010|920:"Adnan":"Bob":19.010:920:"Adnan":"Bob":19.010|25:"Adnan":"Edgardo":19.010:25:"Adnan":"Edgardo":19.010|153:"Adnan":"Edgardo":19.010:153:"Adnan":"Edgardo":19.010|281:"Adnan":"Edgardo":19.010:281:"Adnan":"Edgardo":19.010|409:"Adnan":"Edgardo":19.010:409:"Adnan":"Edgardo":19.010|537:"Adnan":"Edgardo":19.010:537:"Adnan":"Edgardo":19.010|665:"Adnan":"Edgardo":19.010:665:"Adnan":"Edgardo":19.010|793:"Adnan":"Edgardo":19.010:793:"Adnan":"Edgardo":19.010|921:"Adnan":"Edgardo":19.010:921:"Adnan":"Edgardo":19.010|26:"Adnan":"Bob":19.010:26:"Adnan":"Bob":19.010|154:"Adnan":"Bob":19.010:154:"Adnan":"Bob":19.010|282:"Adnan":"Bob":19.010:282:"Adnan":"Bob":19.010|410:"Adnan":"Bob":19.010:410:"Adnan":"Bob":19.010|538:"Adnan":"Bob":19.010:538:"Adnan":"Bob":19.010|666:"Adnan":"Bob":19.010:666:"Adnan":"Bob":19.010|794:"Adnan":"Bob":19.010:794:"Adnan":"Bob":19.010|922:"Adnan":"Bob":19.010:922:"Adnan":"Bob":19.010|27:"Adnan":"Edgardo":19.010:27:"Adnan":"Edgardo":19.010|155:"Adnan":"Edgardo":19.010:155:"Adnan":"Edgardo":19.010|283:"Adnan":"Edgardo":19.010:283:"Adnan":"Edgardo":19.010|411:"Adnan":"Edgardo":19.010:411:"Adnan":"Edgardo":19.010|539:"Adnan":"Edgardo":19.010:539:"Adnan":"Edgardo":19.010|667:"Adnan":"Edgardo":19.010:667:"Adnan":"Edgardo":19.010|795:"Adnan":"Edgardo":19.010:795:"Adnan":"Edgardo":19.010|923:"Adnan":"Edgardo":19.010:923:"Adnan":"Edgardo":19.010|28:"Adnan":"Bob":19.010:28:"Adnan":"Bob":19.010|156:"Adnan":"Bob":19.010:156:"Adnan":"Bob":19.010|284:"Adnan":"Bob":19.010:284:"Adnan":"Bob":19.010|412:"Adnan":"Bob":19.010:412:"Adnan":"Bob":19.010|540:"Adnan":"Bob":19.010:540:"Adnan":"Bob":19.010|668:"Adnan":"Bob":19.010:668:"Adnan":"Bob":19.010|796:"Adnan":"Bob":19.010:796:"Adnan":"Bob":19.010|924:"Adnan":"Bob":19.010:924:"Adnan":"Bob":19.010|29:"Adnan":"Edgardo":19.010:29:"Adnan":"Edgardo":19.010|157:"Adnan":"Edgardo":19.010:157:"Adnan":"Edgardo":19.010|285:"Adnan":"Edgardo":19.010:285:"Adnan":"Edgardo":19.010|413:"Adnan":"Edgardo":19.010:413:"Adnan":"Edgardo":19.010|541:"Adnan":"Edgardo":19.010:541:"Adnan":"Edgardo":19.010|669:"Adnan":"Edgardo":19.010:669:"Adnan":"Edgardo":19.010|797:"Adnan":"Edgardo":19.010:797:"Adnan":"Edgardo":19.010|925:"Adnan":"Edgardo":19.010:925:"Adnan":"Edgardo":19.010|30:"Adnan":"Bob":19.010:30:"Adnan":"Bob":19.010|158:"Adnan":"Bob":19.010:158:"Adnan":"Bob":19.010|286:"Adnan":"Bob":19.010:286:"Adnan":"Bob":19.010|414:"Adnan":"Bob":19.010:414:"Adnan":"Bob":19.010|542:"Adnan":"Bob":19.010:542:"Adnan":"Bob":19.010|670:"Adnan":"Bob":19.010:670:"Adnan":"Bob":19.010|798:"Adnan":"Bob":19.010:798:"Adnan":"Bob":19.010|926:"Adnan":"Bob":19.010:926:"Adnan":"Bob":19.010|31:"Adnan":"Edgardo":19.010:31:"Adnan":"Edgardo":19.010|159:"Adnan":"Edgardo":19.010:159:"Adnan":"Edgardo":19.010|287:"Adnan":"Edgardo":19.010:287:"Adnan":"Edgardo":19.010|415:"Adnan":"Edgardo":19.010:415:"Adnan":"Edgardo":19.010|543:"Adnan":"Edgardo":19.010:543:"Adnan":"Edgardo":19.010|671:"Adnan":"Edgardo":19.010:671:"Adnan":"Edgardo":19.010|799:"Adnan":"Edgardo":19.010:799:"Adnan":"Edgardo":19.010|927:"Adnan":"Edgardo":19.010:927:"Adnan":"Edgardo":19.010|32:"Adnan":"Bob":19.010:32:"Adnan":"Bob":19.010|160:"Adnan":"Bob":19.010:160:"Adnan":"Bob":19.010|288:"Adnan":"Bob":19.010:288:"Adnan":"Bob":19.010|416:"Adnan":"Bob":19.010:416:"Adnan":"Bob":19.010|544:"Adnan":"Bob":19.010:544:"Adnan":"Bob":19.010|672:"Adnan":"Bob":19.010:672:"Adnan":"Bob":19.010|800:"Adnan":"Bob":19.010:800:"Adnan":"Bob":19.010|928:"Adnan":"Bob":19.010:928:"Adnan":"Bob":19.010|33:"Adnan":"Edgardo":19.010:33:"Adnan":"Edgardo":19.010|161:"Adnan":"Edgardo":19.010:161:"Adnan":"Edgardo":19.010|289:"Adnan":"Edgardo":19.010:289:"Adnan":"Edgardo":19.010|417:"Adnan":"Edgardo":19.010:417:"Adnan":"Edgardo":19.010|545:"Adnan":"Edgardo":19.010:545:"Adnan":"Edgardo":19.010|673:"Adnan":"Edgardo":19.010:673:"Adnan":"Edgardo":19.010|801:"Adnan":"Edgardo":19.010:801:"Adnan":"Edgardo":19.010|929:"Adnan":"Edgardo":19.010:929:"Adnan":"Edgardo":19.010|34:"Adnan":"Bob":19.010:34:"Adnan":"Bob":19.010|162:"Adnan":"Bob":19.010:162:"Adnan":"Bob":19.010|290:"Adnan":"Bob":19.010:290:"Adnan":"Bob":19.010|418:"Adnan":"Bob":19.010:418:"Adnan":"Bob":19.010|546:"Adnan":"Bob":19.010:546:"Adnan":"Bob":19.010|674:"Adnan":"Bob":19.010:674:"Adnan":"Bob":19.010|802:"Adnan":"Bob":19.010:802:"Adnan":"Bob":19.010|930:"Adnan":"Bob":19.010:930:"Adnan":"Bob":19.010|35:"Adnan":"Edgardo":19.010:35:"Adnan":"Edgardo":19.010|163:"Adnan":"Edgardo":19.010:163:"Adnan":"Edgardo":19.010|291:"Adnan":"Edgardo":19.010:291:"Adnan":"Edgardo":19.010|419:"Adnan":"Edgardo":19.010:419:"Adnan":"Edgardo":19.010|547:"Adnan":"Edgardo":19.010:547:"Adnan":"Edgardo":19.010|675:"Adnan":"Edgardo":19.010:675:"Adnan":"Edgardo":19.010|803:"Adnan":"Edgardo":19.010:803:"Adnan":"Edgardo":19.010|931:"Adnan":"Edgardo":19.010:931:"Adnan":"Edgardo":19.010|36:"Adnan":"Bob":19.010:36:"Adnan":"Bob":19.010|164:"Adnan":"Bob":19.010:164:"Adnan":"Bob":19.010|292:"Adnan":"Bob":19.010:292:"Adnan":"Bob":19.010|420:"Adnan":"Bob":19.010:420:"Adnan":"Bob":19.010|548:"Adnan":"Bob":19.010:548:"Adnan":"Bob":19.010|676:"Adnan":"Bob":19.010:676:"Adnan":"Bob":19.010|804:"Adnan":"Bob":19.010:804:"Adnan":"Bob":19.010|932:"Adnan":"Bob":19.010:932:"Adnan":"Bob":19.010|37:"Adnan":"Edgardo":19.010:37:"Adnan":"Edgardo":19.010|165:"Adnan":"Edgardo":19.010:165:"Adnan":"Edgardo":19.010|293:"Adnan":"Edgardo":19.010:293:"Adnan":"Edgardo":19.010|421:"Adnan":"Edgardo":19.010:421:"Adnan":"Edgardo":19.010|549:"Adnan":"Edgardo":19.010:549:"Adnan":"Edgardo":19.010|677:"Adnan":"Edgardo":19.010:677:"Adnan":"Edgardo":19.010|805:"Adnan":"Edgardo":19.010:805:"Adnan":"Edgardo":19.010|933:"Adnan":"Edgardo":19.010:933:"Adnan":"Edgardo":19.010|38:"Adnan":"Bob":19.010:38:"Adnan":"Bob":19.010|166:"Adnan":"Bob":19.010:166:"Adnan":"Bob":19.010|294:"Adnan":"Bob":19.010:294:"Adnan":"Bob":19.010|422:"Adnan":"Bob":19.010:422:"Adnan":"Bob":19.010|550:"Adnan":"Bob":19.010:550:"Adnan":"Bob":19.010|678:"Adnan":"Bob":19.010:678:"Adnan":"Bob":19.010|806:"Adnan":"Bob":19.010:806:"Adnan":"Bob":19.010|934:"Adnan":"Bob":19.010:934:"Adnan":"Bob":19.010|39:"Adnan":"Edgardo":19.010:39:"Adnan":"Edgardo":19.010|167:"Adnan":"Edgardo":19.010:167:"Adnan":"Edgardo":19.010|295:"Adnan":"Edgardo":19.010:295:"Adnan":"Edgardo":19.010|423:"Adnan":"Edgardo":19.010:423:"Adnan":"Edgardo":19.010|551:"Adnan":"Edgardo":19.010:551:"Adnan":"Edgardo":19.010|679:"Adnan":"Edgardo":19.010:679:"Adnan":"Edgardo":19.010|807:"Adnan":"Edgardo":19.010:807:"Adnan":"Edgardo":19.010|935:"Adnan":"Edgardo":19.010:935:"Adnan":"Edgardo":19.010|40:"Adnan":"Bob":19.010:40:"Adnan":"Bob":19.010|168:"Adnan":"Bob":19.010:168:"Adnan":"Bob":19.010|296:"Adnan":"Bob":19.010:296:"Adnan":"Bob":19.010|424:"Adnan":"Bob":19.010:424:"Adnan":"Bob":19.010|552:"Adnan":"Bob":19.010:552:"Adnan":"Bob":19.010|680:"Adnan":"Bob":19.010:680:"Adnan":"Bob":19.010|808:"Adnan":"Bob":19.010:808:"Adnan":"Bob":19.010|936:"Adnan":"Bob":19.010:936:"Adnan":"Bob":19.010|41:"Adnan":"Edgardo":19.010:41:"Adnan":"Edgardo":19.010|169:"Adnan":"Edgardo":19.010:169:"Adnan":"Edgardo":19.010|297:"Adnan":"Edgardo":19.010:297:"Adnan":"Edgardo":19.010|425:"Adnan":"Edgardo":19.010:425:"Adnan":"Edgardo":19.010|553:"Adnan":"Edgardo":19.010:553:"Adnan":"Edgardo":19.010|681:"Adnan":"Edgardo":19.010:681:"Adnan":"Edgardo":19.010|809:"Adnan":"Edgardo":19.010:809:"Adnan":"Edgardo":19.010|937:"Adnan":"Edgardo":19.010:937:"Adnan":"Edgardo":19.010|42:"Adnan":"Bob":19.010:42:"Adnan":"Bob":19.010|170:"Adnan":"Bob":19.010:170:"Adnan":"Bob":19.010|298:"Adnan":"Bob":19.010:298:"Adnan":"Bob":19.010|426:"Adnan":"Bob":19.010:426:"Adnan":"Bob":19.010|554:"Adnan":"Bob":19.010:554:"Adnan":"Bob":19.010|682:"Adnan":"Bob":19.010:682:"Adnan":"Bob":19.010|810:"Adnan":"Bob":19.010:810:"Adnan":"Bob":19.010|938:"Adnan":"Bob":19.010:938:"Adnan":"Bob":19.010|43:"Adnan":"Edgardo":19.010:43:"Adnan":"Edgardo":19.010|171:"Adnan":"Edgardo":19.010:171:"Adnan":"Edgardo":19.010|299:"Adnan":"Edgardo":19.010:299:"Adnan":"Edgardo":19.010|427:"Adnan":"Edgardo":19.010:427:"Adnan":"Edgardo":19.010|555:"Adnan":"Edgardo":19.010:555:"Adnan":"Edgardo":19.010|683:"Adnan":"Edgardo":19.010:683:"Adnan":"Edgardo":19.010|811:"Adnan":"Edgardo":19.010:811:"Adnan":"Edgardo":19.010|939:"Adnan":"Edgardo":19.010:939:"Adnan":"Edgardo":19.010|44:"Adnan":"Bob":19.010:44:"Adnan":"Bob":19.010|172:"Adnan":"Bob":19.010:172:"Adnan":"Bob":19.010|300:"Adnan":"Bob":19.010:300:"Adnan":"Bob":19.010|428:"Adnan":"Bob":19.010:428:"Adnan":"Bob":19.010|556:"Adnan":"Bob":19.010:556:"Adnan":"Bob":19.010|684:"Adnan":"Bob":19.010:684:"Adnan":"Bob":19.010|812:"Adnan":"Bob":19.010:812:"Adnan":"Bob":19.010|940:"Adnan":"Bob":19.010:940:"Adnan":"Bob":19.010|45:"Adnan":"Edgardo":19.010:45:"Adnan":"Edgardo":19.010|173:"Adnan":"Edgardo":19.010:173:"Adnan":"Edgardo":19.010|301:"Adnan":"Edgardo":19.010:301:"Adnan":"Edgardo":19.010|429:"Adnan":"Edgardo":19.010:429:"Adnan":"Edgardo":19.010|557:"Adnan":"Edgardo":19.010:557:"Adnan":"Edgardo":19.010|685:"Adnan":"Edgardo":19.010:685:"Adnan":"Edgardo":19.010|813:"Adnan":"Edgardo":19.010:813:"Adnan":"Edgardo":19.010|941:"Adnan":"Edgardo":19.010:941:"Adnan":"Edgardo":19.010|46:"Adnan":"Bob":19.010:46:"Adnan":"Bob":19.010|174:"Adnan":"Bob":19.010:174:"Adnan":"Bob":19.010|302:"Adnan":"Bob":19.010:302:"Adnan":"Bob":19.010|430:"Adnan":"Bob":19.010:430:"Adnan":"Bob":19.010|558:"Adnan":"Bob":19.010:558:"Adnan":"Bob":19.010|686:"Adnan":"Bob":19.010:686:"Adnan":"Bob":19.010|814:"Adnan":"Bob":19.010:814:"Adnan":"Bob":19.010|942:"Adnan":"Bob":19.010:942:"Adnan":"Bob":19.010|47:"Adnan":"Edgardo":19.010:47:"Adnan":"Edgardo":19.010|175:"Adnan":"Edgardo":19.010:175:"Adnan":"Edgardo":19.010|303:"Adnan":"Edgardo":19.010:303:"Adnan":"Edgardo":19.010|431:"Adnan":"Edgardo":19.010:431:"Adnan":"Edgardo":19.010|559:"Adnan":"Edgardo":19.010:559:"Adnan":"Edgardo":19.010|687:"Adnan":"Edgardo":19.010:687:"Adnan":"Edgardo":19.010|815:"Adnan":"Edgardo":19.010:815:"Adnan":"Edgardo":19.010|943:"Adnan":"Edgardo":19.010:943:"Adnan":"Edgardo":19.010|48:"Adnan":"Bob":19.010:48:"Adnan":"Bob":19.010|176:"Adnan":"Bob":19.010:176:"Adnan":"Bob":19.010|304:"Adnan":"Bob":19.010:304:"Adnan":"Bob":19.010|432:"Adnan":"Bob":19.010:432:"Adnan":"Bob":19.010|560:"Adnan":"Bob":19.010:560:"Adnan":"Bob":19.010|688:"Adnan":"Bob":19.010:688:"Adnan":"Bob":19.010|816:"Adnan":"Bob":19.010:816:"Adnan":"Bob":19.010|944:"Adnan":"Bob":19.010:944:"Adnan":"Bob":19.010|49:"Adnan":"Edgardo":19.010:49:"Adnan":"Edgardo":19.010|177:"Adnan":"Edgardo":19.010:177:"Adnan":"Edgardo":19.010|305:"Adnan":"Edgardo":19.010:305:"Adnan":"Edgardo":19.010|433:"Adnan":"Edgardo":19.010:433:"Adnan":"Edgardo":19.010|561:"Adnan":"Edgardo":19.010:561:"Adnan":"Edgardo":19.010|689:"Adnan":"Edgardo":19.010:689:"Adnan":"Edgardo":19.010|817:"Adnan":"Edgardo":19.010:817:"Adnan":"Edgardo":19.010|945:"Adnan":"Edgardo":19.010:945:"Adnan":"Edgardo":19.010|50:"Adnan":"Bob":19.010:50:"Adnan":"Bob":19.010|178:"Adnan":"Bob":19.010:178:"Adnan":"Bob":19.010|306:"Adnan":"Bob":19.010:306:"Adnan":"Bob":19.010|434:"Adnan":"Bob":19.010:434:"Adnan":"Bob":19.010|562:"Adnan":"Bob":19.010:562:"Adnan":"Bob":19.010|690:"Adnan":"Bob":19.010:690:"Adnan":"Bob":19.010|818:"Adnan":"Bob":19.010:818:"Adnan":"Bob":19.010|946:"Adnan":"Bob":19.010:946:"Adnan":"Bob":19.010|51:"Adnan":"Edgardo":19.010:51:"Adnan":"Edgardo":19.010|179:"Adnan":"Edgardo":19.010:179:"Adnan":"Edgardo":19.010|307:"Adnan":"Edgardo":19.010:307:"Adnan":"Edgardo":19.010|435:"Adnan":"Edgardo":19.010:435:"Adnan":"Edgardo":19.010|563:"Adnan":"Edgardo":19.010:563:"Adnan":"Edgardo":19.010|691:"Adnan":"Edgardo":19.010:691:"Adnan":"Edgardo":19.010|819:"Adnan":"Edgardo":19.010:819:"Adnan":"Edgardo":19.010|947:"Adnan":"Edgardo":19.010:947:"Adnan":"Edgardo":19.010|52:"Adnan":"Bob":19.010:52:"Adnan":"Bob":19.010|180:"Adnan":"Bob":19.010:180:"Adnan":"Bob":19.010|308:"Adnan":"Bob":19.010:308:"Adnan":"Bob":19.010|436:"Adnan":"Bob":19.010:436:"Adnan":"Bob":19.010|564:"Adnan":"Bob":19.010:564:"Adnan":"Bob":19.010|692:"Adnan":"Bob":19.010:692:"Adnan":"Bob":19.010|820:"Adnan":"Bob":19.010:820:"Adnan":"Bob":19.010|948:"Adnan":"Bob":19.010:948:"Adnan":"Bob":19.010|53:"Adnan":"Edgardo":19.010:53:"Adnan":"Edgardo":19.010|181:"Adnan":"Edgardo":19.010:181:"Adnan":"Edgardo":19.010|309:"Adnan":"Edgardo":19.010:309:"Adnan":"Edgardo":19.010|437:"Adnan":"Edgardo":19.010:437:"Adnan":"Edgardo":19.010|565:"Adnan":"Edgardo":19.010:565:"Adnan":"Edgardo":19.010|693:"Adnan":"Edgardo":19.010:693:"Adnan":"Edgardo":19.010|821:"Adnan":"Edgardo":19.010:821:"Adnan":"Edgardo":19.010|949:"Adnan":"Edgardo":19.010:949:"Adnan":"Edgardo":19.010|54:"Adnan":"Bob":19.010:54:"Adnan":"Bob":19.010|182:"Adnan":"Bob":19.010:182:"Adnan":"Bob":19.010|310:"Adnan":"Bob":19.010:310:"Adnan":"Bob":19.010|438:"Adnan":"Bob":19.010:438:"Adnan":"Bob":19.010|566:"Adnan":"Bob":19.010:566:"Adnan":"Bob":19.010|694:"Adnan":"Bob":19.010:694:"Adnan":"Bob":19.010|822:"Adnan":"Bob":19.010:822:"Adnan":"Bob":19.010|950:"Adnan":"Bob":19.010:950:"Adnan":"Bob":19.010|55:"Adnan":"Edgardo":19.010:55:"Adnan":"Edgardo":19.010|183:"Adnan":"Edgardo":19.010:183:"Adnan":"Edgardo":19.010|311:"Adnan":"Edgardo":19.010:311:"Adnan":"Edgardo":19.010|439:"Adnan":"Edgardo":19.010:439:"Adnan":"Edgardo":19.010|567:"Adnan":"Edgardo":19.010:567:"Adnan":"Edgardo":19.010|695:"Adnan":"Edgardo":19.010:695:"Adnan":"Edgardo":19.010|823:"Adnan":"Edgardo":19.010:823:"Adnan":"Edgardo":19.010|951:"Adnan":"Edgardo":19.010:951:"Adnan":"Edgardo":19.010|56:"Adnan":"Bob":19.010:56:"Adnan":"Bob":19.010|184:"Adnan":"Bob":19.010:184:"Adnan":"Bob":19.010|312:"Adnan":"Bob":19.010:312:"Adnan":"Bob":19.010|440:"Adnan":"Bob":19.010:440:"Adnan":"Bob":19.010|568:"Adnan":"Bob":19.010:568:"Adnan":"Bob":19.010|696:"Adnan":"Bob":19.010:696:"Adnan":"Bob":19.010|824:"Adnan":"Bob":19.010:824:"Adnan":"Bob":19.010|952:"Adnan":"Bob":19.010:952:"Adnan":"Bob":19.010|57:"Adnan":"Edgardo":19.010:57:"Adnan":"Edgardo":19.010|185:"Adnan":"Edgardo":19.010:185:"Adnan":"Edgardo":19.010|313:"Adnan":"Edgardo":19.010:313:"Adnan":"Edgardo":19.010|441:"Adnan":"Edgardo":19.010:441:"Adnan":"Edgardo":19.010|569:"Adnan":"Edgardo":19.010:569:"Adnan":"Edgardo":19.010|697:"Adnan":"Edgardo":19.010:697:"Adnan":"Edgardo":19.010|825:"Adnan":"Edgardo":19.010:825:"Adnan":"Edgardo":19.010|953:"Adnan":"Edgardo":19.010:953:"Adnan":"Edgardo":19.010|58:"Adnan":"Bob":19.010:58:"Adnan":"Bob":19.010|186:"Adnan":"Bob":19.010:186:"Adnan":"Bob":19.010|314:"Adnan":"Bob":19.010:314:"Adnan":"Bob":19.010|442:"Adnan":"Bob":19.010:442:"Adnan":"Bob":19.010|570:"Adnan":"Bob":19.010:570:"Adnan":"Bob":19.010|698:"Adnan":"Bob":19.010:698:"Adnan":"Bob":19.010|826:"Adnan":"Bob":19.010:826:"Adnan":"Bob":19.010|954:"Adnan":"Bob":19.010:954:"Adnan":"Bob":19.010|59:"Adnan":"Edgardo":19.010:59:"Adnan":"Edgardo":19.010|187:"Adnan":"Edgardo":19.010:187:"Adnan":"Edgardo":19.010|315:"Adnan":"Edgardo":19.010:315:"Adnan":"Edgardo":19.010|443:"Adnan":"Edgardo":19.010:443:"Adnan":"Edgardo":19.010|571:"Adnan":"Edgardo":19.010:571:"Adnan":"Edgardo":19.010|699:"Adnan":"Edgardo":19.010:699:"Adnan":"Edgardo":19.010|827:"Adnan":"Edgardo":19.010:827:"Adnan":"Edgardo":19.010|955:"Adnan":"Edgardo":19.010:955:"Adnan":"Edgardo":19.010|60:"Adnan":"Bob":19.010:60:"Adnan":"Bob":19.010|188:"Adnan":"Bob":19.010:188:"Adnan":"Bob":19.010|316:"Adnan":"Bob":19.010:316:"Adnan":"Bob":19.010|444:"Adnan":"Bob":19.010:444:"Adnan":"Bob":19.010|572:"Adnan":"Bob":19.010:572:"Adnan":"Bob":19.010|700:"Adnan":"Bob":19.010:700:"Adnan":"Bob":19.010|828:"Adnan":"Bob":19.010:828:"Adnan":"Bob":19.010|956:"Adnan":"Bob":19.010:956:"Adnan":"Bob":19.010|61:"Adnan":"Edgardo":19.010:61:"Adnan":"Edgardo":19.010|189:"Adnan":"Edgardo":19.010:189:"Adnan":"Edgardo":19.010|317:"Adnan":"Edgardo":19.010:317:"Adnan":"Edgardo":19.010|445:"Adnan":"Edgardo":19.010:445:"Adnan":"Edgardo":19.010|573:"Adnan":"Edgardo":19.010:573:"Adnan":"Edgardo":19.010|701:"Adnan":"Edgardo":19.010:701:"Adnan":"Edgardo":19.010|829:"Adnan":"Edgardo":19.010:829:"Adnan":"Edgardo":19.010|957:"Adnan":"Edgardo":19.010:957:"Adnan":"Edgardo":19.010|62:"Adnan":"Bob":19.010:62:"Adnan":"Bob":19.010|190:"Adnan":"Bob":19.010:190:"Adnan":"Bob":19.010|318:"Adnan":"Bob":19.010:318:"Adnan":"Bob":19.010|446:"Adnan":"Bob":19.010:446:"Adnan":"Bob":19.010|574:"Adnan":"Bob":19.010:574:"Adnan":"Bob":19.010|702:"Adnan":"Bob":19.010:702:"Adnan":"Bob":19.010|830:"Adnan":"Bob":19.010:830:"Adnan":"Bob":19.010|958:"Adnan":"Bob":19.010:958:"Adnan":"Bob":19.010|63:"Adnan":"Edgardo":19.010:63:"Adnan":"Edgardo":19.010|191:"Adnan":"Edgardo":19.010:191:"Adnan":"Edgardo":19.010|319:"Adnan":"Edgardo":19.010:319:"Adnan":"Edgardo":19.010|447:"Adnan":"Edgardo":19.010:447:"Adnan":"Edgardo":19.010|575:"Adnan":"Edgardo":19.010:575:"Adnan":"Edgardo":19.010|703:"Adnan":"Edgardo":19.010:703:"Adnan":"Edgardo":19.010|831:"Adnan":"Edgardo":19.010:831:"Adnan":"Edgardo":19.010|959:"Adnan":"Edgardo":19.010:959:"Adnan":"Edgardo":19.010|64:"Adnan":"Bob":19.010:64:"Adnan":"Bob":19.010|192:"Adnan":"Bob":19.010:192:"Adnan":"Bob":19.010|320:"Adnan":"Bob":19.010:320:"Adnan":"Bob":19.010|448:"Adnan":"Bob":19.010:448:"Adnan":"Bob":19.010|576:"Adnan":"Bob":19.010:576:"Adnan":"Bob":19.010|704:"Adnan":"Bob":19.010:704:"Adnan":"Bob":19.010|832:"Adnan":"Bob":19.010:832:"Adnan":"Bob":19.010|960:"Adnan":"Bob":19.010:960:"Adnan":"Bob":19.010|65:"Adnan":"Edgardo":19.010:65:"Adnan":"Edgardo":19.010|193:"Adnan":"Edgardo":19.010:193:"Adnan":"Edgardo":19.010|321:"Adnan":"Edgardo":19.010:321:"Adnan":"Edgardo":19.010|449:"Adnan":"Edgardo":19.010:449:"Adnan":"Edgardo":19.010|577:"Adnan":"Edgardo":19.010:577:"Adnan":"Edgardo":19.010|705:"Adnan":"Edgardo":19.010:705:"Adnan":"Edgardo":19.010|833:"Adnan":"Edgardo":19.010:833:"Adnan":"Edgardo":19.010|961:"Adnan":"Edgardo":19.010:961:"Adnan":"Edgardo":19.010|66:"Adnan":"Bob":19.010:66:"Adnan":"Bob":19.010|194:"Adnan":"Bob":19.010:194:"Adnan":"Bob":19.010|322:"Adnan":"Bob":19.010:322:"Adnan":"Bob":19.010|450:"Adnan":"Bob":19.010:450:"Adnan":"Bob":19.010|578:"Adnan":"Bob":19.010:578:"Adnan":"Bob":19.010|706:"Adnan":"Bob":19.010:706:"Adnan":"Bob":19.010|834:"Adnan":"Bob":19.010:834:"Adnan":"Bob":19.010|962:"Adnan":"Bob":19.010:962:"Adnan":"Bob":19.010|67:"Adnan":"Edgardo":19.010:67:"Adnan":"Edgardo":19.010|195:"Adnan":"Edgardo":19.010:195:"Adnan":"Edgardo":19.010|323:"Adnan":"Edgardo":19.010:323:"Adnan":"Edgardo":19.010|451:"Adnan":"Edgardo":19.010:451:"Adnan":"Edgardo":19.010|579:"Adnan":"Edgardo":19.010:579:"Adnan":"Edgardo":19.010|707:"Adnan":"Edgardo":19.010:707:"Adnan":"Edgardo":19.010|835:"Adnan":"Edgardo":19.010:835:"Adnan":"Edgardo":19.010|963:"Adnan":"Edgardo":19.010:963:"Adnan":"Edgardo":19.010|68:"Adnan":"Bob":19.010:68:"Adnan":"Bob":19.010|196:"Adnan":"Bob":19.010:196:"Adnan":"Bob":19.010|324:"Adnan":"Bob":19.010:324:"Adnan":"Bob":19.010|452:"Adnan":"Bob":19.010:452:"Adnan":"Bob":19.010|580:"Adnan":"Bob":19.010:580:"Adnan":"Bob":19.010|708:"Adnan":"Bob":19.010:708:"Adnan":"Bob":19.010|836:"Adnan":"Bob":19.010:836:"Adnan":"Bob":19.010|964:"Adnan":"Bob":19.010:964:"Adnan":"Bob":19.010|69:"Adnan":"Edgardo":19.010:69:"Adnan":"Edgardo":19.010|197:"Adnan":"Edgardo":19.010:197:"Adnan":"Edgardo":19.010|325:"Adnan":"Edgardo":19.010:325:"Adnan":"Edgardo":19.010|453:"Adnan":"Edgardo":19.010:453:"Adnan":"Edgardo":19.010|581:"Adnan":"Edgardo":19.010:581:"Adnan":"Edgardo":19.010|709:"Adnan":"Edgardo":19.010:709:"Adnan":"Edgardo":19.010|837:"Adnan":"Edgardo":19.010:837:"Adnan":"Edgardo":19.010|965:"Adnan":"Edgardo":19.010:965:"Adnan":"Edgardo":19.010|70:"Adnan":"Bob":19.010:70:"Adnan":"Bob":19.010|198:"Adnan":"Bob":19.010:198:"Adnan":"Bob":19.010|326:"Adnan":"Bob":19.010:326:"Adnan":"Bob":19.010|454:"Adnan":"Bob":19.010:454:"Adnan":"Bob":19.010|582:"Adnan":"Bob":19.010:582:"Adnan":"Bob":19.010|710:"Adnan":"Bob":19.010:710:"Adnan":"Bob":19.010|838:"Adnan":"Bob":19.010:838:"Adnan":"Bob":19.010|966:"Adnan":"Bob":19.010:966:"Adnan":"Bob":19.010|71:"Adnan":"Edgardo":19.010:71:"Adnan":"Edgardo":19.010|199:"Adnan":"Edgardo":19.010:199:"Adnan":"Edgardo":19.010|327:"Adnan":"Edgardo":19.010:327:"Adnan":"Edgardo":19.010|455:"Adnan":"Edgardo":19.010:455:"Adnan":"Edgardo":19.010|583:"Adnan":"Edgardo":19.010:583:"Adnan":"Edgardo":19.010|711:"Adnan":"Edgardo":19.010:711:"Adnan":"Edgardo":19.010|839:"Adnan":"Edgardo":19.010:839:"Adnan":"Edgardo":19.010|967:"Adnan":"Edgardo":19.010:967:"Adnan":"Edgardo":19.010|72:"Adnan":"Bob":19.010:72:"Adnan":"Bob":19.010|200:"Adnan":"Bob":19.010:200:"Adnan":"Bob":19.010|328:"Adnan":"Bob":19.010:328:"Adnan":"Bob":19.010|456:"Adnan":"Bob":19.010:456:"Adnan":"Bob":19.010|584:"Adnan":"Bob":19.010:584:"Adnan":"Bob":19.010|712:"Adnan":"Bob":19.010:712:"Adnan":"Bob":19.010|840:"Adnan":"Bob":19.010:840:"Adnan":"Bob":19.010|968:"Adnan":"Bob":19.010:968:"Adnan":"Bob":19.010|73:"Adnan":"Edgardo":19.010:73:"Adnan":"Edgardo":19.010|201:"Adnan":"Edgardo":19.010:201:"Adnan":"Edgardo":19.010|329:"Adnan":"Edgardo":19.010:329:"Adnan":"Edgardo":19.010|457:"Adnan":"Edgardo":19.010:457:"Adnan":"Edgardo":19.010|585:"Adnan":"Edgardo":19.010:585:"Adnan":"Edgardo":19.010|713:"Adnan":"Edgardo":19.010:713:"Adnan":"Edgardo":19.010|841:"Adnan":"Edgardo":19.010:841:"Adnan":"Edgardo":19.010|969:"Adnan":"Edgardo":19.010:969:"Adnan":"Edgardo":19.010|74:"Adnan":"Bob":19.010:74:"Adnan":"Bob":19.010|202:"Adnan":"Bob":19.010:202:"Adnan":"Bob":19.010|330:"Adnan":"Bob":19.010:330:"Adnan":"Bob":19.010|458:"Adnan":"Bob":19.010:458:"Adnan":"Bob":19.010|586:"Adnan":"Bob":19.010:586:"Adnan":"Bob":19.010|714:"Adnan":"Bob":19.010:714:"Adnan":"Bob":19.010|842:"Adnan":"Bob":19.010:842:"Adnan":"Bob":19.010|970:"Adnan":"Bob":19.010:970:"Adnan":"Bob":19.010|75:"Adnan":"Edgardo":19.010:75:"Adnan":"Edgardo":19.010|203:"Adnan":"Edgardo":19.010:203:"Adnan":"Edgardo":19.010|331:"Adnan":"Edgardo":19.010:331:"Adnan":"Edgardo":19.010|459:"Adnan":"Edgardo":19.010:459:"Adnan":"Edgardo":19.010|587:"Adnan":"Edgardo":19.010:587:"Adnan":"Edgardo":19.010|715:"Adnan":"Edgardo":19.010:715:"Adnan":"Edgardo":19.010|843:"Adnan":"Edgardo":19.010:843:"Adnan":"Edgardo":19.010|971:"Adnan":"Edgardo":19.010:971:"Adnan":"Edgardo":19.010|76:"Adnan":"Bob":19.010:76:"Adnan":"Bob":19.010|204:"Adnan":"Bob":19.010:204:"Adnan":"Bob":19.010|332:"Adnan":"Bob":19.010:332:"Adnan":"Bob":19.010|460:"Adnan":"Bob":19.010:460:"Adnan":"Bob":19.010|588:"Adnan":"Bob":19.010:588:"Adnan":"Bob":19.010|716:"Adnan":"Bob":19.010:716:"Adnan":"Bob":19.010|844:"Adnan":"Bob":19.010:844:"Adnan":"Bob":19.010|972:"Adnan":"Bob":19.010:972:"Adnan":"Bob":19.010|77:"Adnan":"Edgardo":19.010:77:"Adnan":"Edgardo":19.010|205:"Adnan":"Edgardo":19.010:205:"Adnan":"Edgardo":19.010|333:"Adnan":"Edgardo":19.010:333:"Adnan":"Edgardo":19.010|461:"Adnan":"Edgardo":19.010:461:"Adnan":"Edgardo":19.010|589:"Adnan":"Edgardo":19.010:589:"Adnan":"Edgardo":19.010|717:"Adnan":"Edgardo":19.010:717:"Adnan":"Edgardo":19.010|845:"Adnan":"Edgardo":19.010:845:"Adnan":"Edgardo":19.010|973:"Adnan":"Edgardo":19.010:973:"Adnan":"Edgardo":19.010|78:"Adnan":"Bob":19.010:78:"Adnan":"Bob":19.010|206:"Adnan":"Bob":19.010:206:"Adnan":"Bob":19.010|334:"Adnan":"Bob":19.010:334:"Adnan":"Bob":19.010|462:"Adnan":"Bob":19.010:462:"Adnan":"Bob":19.010|590:"Adnan":"Bob":19.010:590:"Adnan":"Bob":19.010|718:"Adnan":"Bob":19.010:718:"Adnan":"Bob":19.010|846:"Adnan":"Bob":19.010:846:"Adnan":"Bob":19.010|974:"Adnan":"Bob":19.010:974:"Adnan":"Bob":19.010|79:"Adnan":"Edgardo":19.010:79:"Adnan":"Edgardo":19.010|207:"Adnan":"Edgardo":19.010:207:"Adnan":"Edgardo":19.010|335:"Adnan":"Edgardo":19.010:335:"Adnan":"Edgardo":19.010|463:"Adnan":"Edgardo":19.010:463:"Adnan":"Edgardo":19.010|591:"Adnan":"Edgardo":19.010:591:"Adnan":"Edgardo":19.010|719:"Adnan":"Edgardo":19.010:719:"Adnan":"Edgardo":19.010|847:"Adnan":"Edgardo":19.010:847:"Adnan":"Edgardo":19.010|975:"Adnan":"Edgardo":19.010:975:"Adnan":"Edgardo":19.010|80:"Adnan":"Bob":19.010:80:"Adnan":"Bob":19.010|208:"Adnan":"Bob":19.010:208:"Adnan":"Bob":19.010|336:"Adnan":"Bob":19.010:336:"Adnan":"Bob":19.010|464:"Adnan":"Bob":19.010:464:"Adnan":"Bob":19.010|592:"Adnan":"Bob":19.010:592:"Adnan":"Bob":19.010|720:"Adnan":"Bob":19.010:720:"Adnan":"Bob":19.010|848:"Adnan":"Bob":19.010:848:"Adnan":"Bob":19.010|976:"Adnan":"Bob":19.010:976:"Adnan":"Bob":19.010|81:"Adnan":"Edgardo":19.010:81:"Adnan":"Edgardo":19.010|209:"Adnan":"Edgardo":19.010:209:"Adnan":"Edgardo":19.010|337:"Adnan":"Edgardo":19.010:337:"Adnan":"Edgardo":19.010|465:"Adnan":"Edgardo":19.010:465:"Adnan":"Edgardo":19.010|593:"Adnan":"Edgardo":19.010:593:"Adnan":"Edgardo":19.010|721:"Adnan":"Edgardo":19.010:721:"Adnan":"Edgardo":19.010|849:"Adnan":"Edgardo":19.010:849:"Adnan":"Edgardo":19.010|977:"Adnan":"Edgardo":19.010:977:"Adnan":"Edgardo":19.010|82:"Adnan":"Bob":19.010:82:"Adnan":"Bob":19.010|210:"Adnan":"Bob":19.010:210:"Adnan":"Bob":19.010|338:"Adnan":"Bob":19.010:338:"Adnan":"Bob":19.010|466:"Adnan":"Bob":19.010:466:"Adnan":"Bob":19.010|594:"Adnan":"Bob":19.010:594:"Adnan":"Bob":19.010|722:"Adnan":"Bob":19.010:722:"Adnan":"Bob":19.010|850:"Adnan":"Bob":19.010:850:"Adnan":"Bob":19.010|978:"Adnan":"Bob":19.010:978:"Adnan":"Bob":19.010|83:"Adnan":"Edgardo":19.010:83:"Adnan":"Edgardo":19.010|211:"Adnan":"Edgardo":19.010:211:"Adnan":"Edgardo":19.010|339:"Adnan":"Edgardo":19.010:339:"Adnan":"Edgardo":19.010|467:"Adnan":"Edgardo":19.010:467:"Adnan":"Edgardo":19.010|595:"Adnan":"Edgardo":19.010:595:"Adnan":"Edgardo":19.010|723:"Adnan":"Edgardo":19.010:723:"Adnan":"Edgardo":19.010|851:"Adnan":"Edgardo":19.010:851:"Adnan":"Edgardo":19.010|979:"Adnan":"Edgardo":19.010:979:"Adnan":"Edgardo":19.010|84:"Adnan":"Bob":19.010:84:"Adnan":"Bob":19.010|212:"Adnan":"Bob":19.010:212:"Adnan":"Bob":19.010|340:"Adnan":"Bob":19.010:340:"Adnan":"Bob":19.010|468:"Adnan":"Bob":19.010:468:"Adnan":"Bob":19.010|596:"Adnan":"Bob":19.010:596:"Adnan":"Bob":19.010|724:"Adnan":"Bob":19.010:724:"Adnan":"Bob":19.010|852:"Adnan":"Bob":19.010:852:"Adnan":"Bob":19.010|980:"Adnan":"Bob":19.010:980:"Adnan":"Bob":19.010|85:"Adnan":"Edgardo":19.010:85:"Adnan":"Edgardo":19.010|213:"Adnan":"Edgardo":19.010:213:"Adnan":"Edgardo":19.010|341:"Adnan":"Edgardo":19.010:341:"Adnan":"Edgardo":19.010|469:"Adnan":"Edgardo":19.010:469:"Adnan":"Edgardo":19.010|597:"Adnan":"Edgardo":19.010:597:"Adnan":"Edgardo":19.010|725:"Adnan":"Edgardo":19.010:725:"Adnan":"Edgardo":19.010|853:"Adnan":"Edgardo":19.010:853:"Adnan":"Edgardo":19.010|981:"Adnan":"Edgardo":19.010:981:"Adnan":"Edgardo":19.010|86:"Adnan":"Bob":19.010:86:"Adnan":"Bob":19.010|214:"Adnan":"Bob":19.010:214:"Adnan":"Bob":19.010|342:"Adnan":"Bob":19.010:342:"Adnan":"Bob":19.010|470:"Adnan":"Bob":19.010:470:"Adnan":"Bob":19.010|598:"Adnan":"Bob":19.010:598:"Adnan":"Bob":19.010|726:"Adnan":"Bob":19.010:726:"Adnan":"Bob":19.010|854:"Adnan":"Bob":19.010:854:"Adnan":"Bob":19.010|982:"Adnan":"Bob":19.010:982:"Adnan":"Bob":19.010|87:"Adnan":"Edgardo":19.010:87:"Adnan":"Edgardo":19.010|215:"Adnan":"Edgardo":19.010:215:"Adnan":"Edgardo":19.010|343:"Adnan":"Edgardo":19.010:343:"Adnan":"Edgardo":19.010|471:"Adnan":"Edgardo":19.010:471:"Adnan":"Edgardo":19.010|599:"Adnan":"Edgardo":19.010:599:"Adnan":"Edgardo":19.010|727:"Adnan":"Edgardo":19.010:727:"Adnan":"Edgardo":19.010|855:"Adnan":"Edgardo":19.010:855:"Adnan":"Edgardo":19.010|983:"Adnan":"Edgardo":19.010:983:"Adnan":"Edgardo":19.010|88:"Adnan":"Bob":19.010:88:"Adnan":"Bob":19.010|216:"Adnan":"Bob":19.010:216:"Adnan":"Bob":19.010|344:"Adnan":"Bob":19.010:344:"Adnan":"Bob":19.010|472:"Adnan":"Bob":19.010:472:"Adnan":"Bob":19.010|600:"Adnan":"Bob":19.010:600:"Adnan":"Bob":19.010|728:"Adnan":"Bob":19.010:728:"Adnan":"Bob":19.010|856:"Adnan":"Bob":19.010:856:"Adnan":"Bob":19.010|984:"Adnan":"Bob":19.010:984:"Adnan":"Bob":19.010|89:"Adnan":"Edgardo":19.010:89:"Adnan":"Edgardo":19.010|217:"Adnan":"Edgardo":19.010:217:"Adnan":"Edgardo":19.010|345:"Adnan":"Edgardo":19.010:345:"Adnan":"Edgardo":19.010|473:"Adnan":"Edgardo":19.010:473:"Adnan":"Edgardo":19.010|601:"Adnan":"Edgardo":19.010:601:"Adnan":"Edgardo":19.010|729:"Adnan":"Edgardo":19.010:729:"Adnan":"Edgardo":19.010|857:"Adnan":"Edgardo":19.010:857:"Adnan":"Edgardo":19.010|985:"Adnan":"Edgardo":19.010:985:"Adnan":"Edgardo":19.010|90:"Adnan":"Bob":19.010:90:"Adnan":"Bob":19.010|218:"Adnan":"Bob":19.010:218:"Adnan":"Bob":19.010|346:"Adnan":"Bob":19.010:346:"Adnan":"Bob":19.010|474:"Adnan":"Bob":19.010:474:"Adnan":"Bob":19.010|602:"Adnan":"Bob":19.010:602:"Adnan":"Bob":19.010|730:"Adnan":"Bob":19.010:730:"Adnan":"Bob":19.010|858:"Adnan":"Bob":19.010:858:"Adnan":"Bob":19.010|986:"Adnan":"Bob":19.010:986:"Adnan":"Bob":19.010|91:"Adnan":"Edgardo":19.010:91:"Adnan":"Edgardo":19.010|219:"Adnan":"Edgardo":19.010:219:"Adnan":"Edgardo":19.010|347:"Adnan":"Edgardo":19.010:347:"Adnan":"Edgardo":19.010|475:"Adnan":"Edgardo":19.010:475:"Adnan":"Edgardo":19.010|603:"Adnan":"Edgardo":19.010:603:"Adnan":"Edgardo":19.010|731:"Adnan":"Edgardo":19.010:731:"Adnan":"Edgardo":19.010|859:"Adnan":"Edgardo":19.010:859:"Adnan":"Edgardo":19.010|987:"Adnan":"Edgardo":19.010:987:"Adnan":"Edgardo":19.010|92:"Adnan":"Bob":19.010:92:"Adnan":"Bob":19.010|220:"Adnan":"Bob":19.010:220:"Adnan":"Bob":19.010|348:"Adnan":"Bob":19.010:348:"Adnan":"Bob":19.010|476:"Adnan":"Bob":19.010:476:"Adnan":"Bob":19.010|604:"Adnan":"Bob":19.010:604:"Adnan":"Bob":19.010|732:"Adnan":"Bob":19.010:732:"Adnan":"Bob":19.010|860:"Adnan":"Bob":19.010:860:"Adnan":"Bob":19.010|988:"Adnan":"Bob":19.010:988:"Adnan":"Bob":19.010|93:"Adnan":"Edgardo":19.010:93:"Adnan":"Edgardo":19.010|221:"Adnan":"Edgardo":19.010:221:"Adnan":"Edgardo":19.010|349:"Adnan":"Edgardo":19.010:349:"Adnan":"Edgardo":19.010|477:"Adnan":"Edgardo":19.010:477:"Adnan":"Edgardo":19.010|605:"Adnan":"Edgardo":19.010:605:"Adnan":"Edgardo":19.010|733:"Adnan":"Edgardo":19.010:733:"Adnan":"Edgardo":19.010|861:"Adnan":"Edgardo":19.010:861:"Adnan":"Edgardo":19.010|989:"Adnan":"Edgardo":19.010:989:"Adnan":"Edgardo":19.010|94:"Adnan":"Bob":19.010:94:"Adnan":"Bob":19.010|222:"Adnan":"Bob":19.010:222:"Adnan":"Bob":19.010|350:"Adnan":"Bob":19.010:350:"Adnan":"Bob":19.010|478:"Adnan":"Bob":19.010:478:"Adnan":"Bob":19.010|606:"Adnan":"Bob":19.010:606:"Adnan":"Bob":19.010|734:"Adnan":"Bob":19.010:734:"Adnan":"Bob":19.010|862:"Adnan":"Bob":19.010:862:"Adnan":"Bob":19.010|990:"Adnan":"Bob":19.010:990:"Adnan":"Bob":19.010|95:"Adnan":"Edgardo":19.010:95:"Adnan":"Edgardo":19.010|223:"Adnan":"Edgardo":19.010:223:"Adnan":"Edgardo":19.010|351:"Adnan":"Edgardo":19.010:351:"Adnan":"Edgardo":19.010|479:"Adnan":"Edgardo":19.010:479:"Adnan":"Edgardo":19.010|607:"Adnan":"Edgardo":19.010:607:"Adnan":"Edgardo":19.010|735:"Adnan":"Edgardo":19.010:735:"Adnan":"Edgardo":19.010|863:"Adnan":"Edgardo":19.010:863:"Adnan":"Edgardo":19.010|991:"Adnan":"Edgardo":19.010:991:"Adnan":"Edgardo":19.010|96:"Adnan":"Bob":19.010:96:"Adnan":"Bob":19.010|224:"Adnan":"Bob":19.010:224:"Adnan":"Bob":19.010|352:"Adnan":"Bob":19.010:352:"Adnan":"Bob":19.010|480:"Adnan":"Bob":19.010:480:"Adnan":"Bob":19.010|608:"Adnan":"Bob":19.010:608:"Adnan":"Bob":19.010|736:"Adnan":"Bob":19.010:736:"Adnan":"Bob":19.010|864:"Adnan":"Bob":19.010:864:"Adnan":"Bob":19.010|992:"Adnan":"Bob":19.010:992:"Adnan":"Bob":19.010|97:"Adnan":"Edgardo":19.010:97:"Adnan":"Edgardo":19.010|225:"Adnan":"Edgardo":19.010:225:"Adnan":"Edgardo":19.010|353:"Adnan":"Edgardo":19.010:353:"Adnan":"Edgardo":19.010|481:"Adnan":"Edgardo":19.010:481:"Adnan":"Edgardo":19.010|609:"Adnan":"Edgardo":19.010:609:"Adnan":"Edgardo":19.010|737:"Adnan":"Edgardo":19.010:737:"Adnan":"Edgardo":19.010|865:"Adnan":"Edgardo":19.010:865:"Adnan":"Edgardo":19.010|993:"Adnan":"Edgardo":19.010:993:"Adnan":"Edgardo":19.010|98:"Adnan":"Bob":19.010:98:"Adnan":"Bob":19.010|226:"Adnan":"Bob":19.010:226:"Adnan":"Bob":19.010|354:"Adnan":"Bob":19.010:354:"Adnan":"Bob":19.010|482:"Adnan":"Bob":19.010:482:"Adnan":"Bob":19.010|610:"Adnan":"Bob":19.010:610:"Adnan":"Bob":19.010|738:"Adnan":"Bob":19.010:738:"Adnan":"Bob":19.010|866:"Adnan":"Bob":19.010:866:"Adnan":"Bob":19.010|994:"Adnan":"Bob":19.010:994:"Adnan":"Bob":19.010|99:"Adnan":"Edgardo":19.010:99:"Adnan":"Edgardo":19.010|227:"Adnan":"Edgardo":19.010:227:"Adnan":"Edgardo":19.010|355:"Adnan":"Edgardo":19.010:355:"Adnan":"Edgardo":19.010|483:"Adnan":"Edgardo":19.010:483:"Adnan":"Edgardo":19.010|611:"Adnan":"Edgardo":19.010:611:"Adnan":"Edgardo":19.010|739:"Adnan":"Edgardo":19.010:739:"Adnan":"Edgardo":19.010|867:"Adnan":"Edgardo":19.010:867:"Adnan":"Edgardo":19.010|995:"Adnan":"Edgardo":19.010:995:"Adnan":"Edgardo":19.010|100:"Adnan":"Bob":19.010:100:"Adnan":"Bob":19.010|228:"Adnan":"Bob":19.010:228:"Adnan":"Bob":19.010|356:"Adnan":"Bob":19.010:356:"Adnan":"Bob":19.010|484:"Adnan":"Bob":19.010:484:"Adnan":"Bob":19.010|612:"Adnan":"Bob":19.010:612:"Adnan":"Bob":19.010|740:"Adnan":"Bob":19.010:740:"Adnan":"Bob":19.010|868:"Adnan":"Bob":19.010:868:"Adnan":"Bob":19.010|996:"Adnan":"Bob":19.010:996:"Adnan":"Bob":19.010|101:"Adnan":"Edgardo":19.010:101:"Adnan":"Edgardo":19.010|229:"Adnan":"Edgardo":19.010:229:"Adnan":"Edgardo":19.010|357:"Adnan":"Edgardo":19.010:357:"Adnan":"Edgardo":19.010|485:"Adnan":"Edgardo":19.010:485:"Adnan":"Edgardo":19.010|613:"Adnan":"Edgardo":19.010:613:"Adnan":"Edgardo":19.010|741:"Adnan":"Edgardo":19.010:741:"Adnan":"Edgardo":19.010|869:"Adnan":"Edgardo":19.010:869:"Adnan":"Edgardo":19.010|997:"Adnan":"Edgardo":19.010:997:"Adnan":"Edgardo":19.010|102:"Adnan":"Bob":19.010:102:"Adnan":"Bob":19.010|230:"Adnan":"Bob":19.010:230:"Adnan":"Bob":19.010|358:"Adnan":"Bob":19.010:358:"Adnan":"Bob":19.010|486:"Adnan":"Bob":19.010:486:"Adnan":"Bob":19.010|614:"Adnan":"Bob":19.010:614:"Adnan":"Bob":19.010|742:"Adnan":"Bob":19.010:742:"Adnan":"Bob":19.010|870:"Adnan":"Bob":19.010:870:"Adnan":"Bob":19.010|998:"Adnan":"Bob":19.010:998:"Adnan":"Bob":19.010|103:"Adnan":"Edgardo":19.010:103:"Adnan":"Edgardo":19.010|231:"Adnan":"Edgardo":19.010:231:"Adnan":"Edgardo":19.010|359:"Adnan":"Edgardo":19.010:359:"Adnan":"Edgardo":19.010|487:"Adnan":"Edgardo":19.010:487:"Adnan":"Edgardo":19.010|615:"Adnan":"Edgardo":19.010:615:"Adnan":"Edgardo":19.010|743:"Adnan":"Edgardo":19.010:743:"Adnan":"Edgardo":19.010|871:"Adnan":"Edgardo":19.010:871:"Adnan":"Edgardo":19.010|999:"Adnan":"Edgardo":19.010:999:"Adnan":"Edgardo":19.010|104:"Adnan":"Bob":19.010:104:"Adnan":"Bob":19.010|232:"Adnan":"Bob":19.010:232:"Adnan":"Bob":19.010|360:"Adnan":"Bob":19.010:360:"Adnan":"Bob":19.010|488:"Adnan":"Bob":19.010:488:"Adnan":"Bob":19.010|616:"Adnan":"Bob":19.010:616:"Adnan":"Bob":19.010|744:"Adnan":"Bob":19.010:744:"Adnan":"Bob":19.010|872:"Adnan":"Bob":19.010:872:"Adnan":"Bob":19.010|1000:"Adnan":"Bob":19.010:1000:"Adnan":"Bob":19.010|105:"Adnan":"Edgardo":19.010:105:"Adnan":"Edgardo":19.010|233:"Adnan":"Edgardo":19.010:233:"Adnan":"Edgardo":19.010|361:"Adnan":"Edgardo":19.010:361:"Adnan":"Edgardo":19.010|489:"Adnan":"Edgardo":19.010:489:"Adnan":"Edgardo":19.010|617:"Adnan":"Edgardo":19.010:617:"Adnan":"Edgardo":19.010|745:"Adnan":"Edgardo":19.010:745:"Adnan":"Edgardo":19.010|873:"Adnan":"Edgardo":19.010:873:"Adnan":"Edgardo":19.010|1001:"Adnan":"Edgardo":19.010:1001:"Adnan":"Edgardo":19.010|106:"Adnan":"Bob":19.010:106:"Adnan":"Bob":19.010|234:"Adnan":"Bob":19.010:234:"Adnan":"Bob":19.010|362:"Adnan":"Bob":19.010:362:"Adnan":"Bob":19.010|490:"Adnan":"Bob":19.010:490:"Adnan":"Bob":19.010|618:"Adnan":"Bob":19.010:618:"Adnan":"Bob":19.010|746:"Adnan":"Bob":19.010:746:"Adnan":"Bob":19.010|874:"Adnan":"Bob":19.010:874:"Adnan":"Bob":19.010|1002:"Adnan":"Bob":19.010:1002:"Adnan":"Bob":19.010|107:"Adnan":"Edgardo":19.010:107:"Adnan":"Edgardo":19.010|235:"Adnan":"Edgardo":19.010:235:"Adnan":"Edgardo":19.010|363:"Adnan":"Edgardo":19.010:363:"Adnan":"Edgardo":19.010|491:"Adnan":"Edgardo":19.010:491:"Adnan":"Edgardo":19.010|619:"Adnan":"Edgardo":19.010:619:"Adnan":"Edgardo":19.010|747:"Adnan":"Edgardo":19.010:747:"Adnan":"Edgardo":19.010|875:"Adnan":"Edgardo":19.010:875:"Adnan":"Edgardo":19.010|1003:"Adnan":"Edgardo":19.010:1003:"Adnan":"Edgardo":19.010|108:"Adnan":"Bob":19.010:108:"Adnan":"Bob":19.010|236:"Adnan":"Bob":19.010:236:"Adnan":"Bob":19.010|364:"Adnan":"Bob":19.010:364:"Adnan":"Bob":19.010|492:"Adnan":"Bob":19.010:492:"Adnan":"Bob":19.010|620:"Adnan":"Bob":19.010:620:"Adnan":"Bob":19.010|748:"Adnan":"Bob":19.010:748:"Adnan":"Bob":19.010|876:"Adnan":"Bob":19.010:876:"Adnan":"Bob":19.010|1004:"Adnan":"Bob":19.010:1004:"Adnan":"Bob":19.010|109:"Adnan":"Edgardo":19.010:109:"Adnan":"Edgardo":19.010|237:"Adnan":"Edgardo":19.010:237:"Adnan":"Edgardo":19.010|365:"Adnan":"Edgardo":19.010:365:"Adnan":"Edgardo":19.010|493:"Adnan":"Edgardo":19.010:493:"Adnan":"Edgardo":19.010|621:"Adnan":"Edgardo":19.010:621:"Adnan":"Edgardo":19.010|749:"Adnan":"Edgardo":19.010:749:"Adnan":"Edgardo":19.010|877:"Adnan":"Edgardo":19.010:877:"Adnan":"Edgardo":19.010|1005:"Adnan":"Edgardo":19.010:1005:"Adnan":"Edgardo":19.010|110:"Adnan":"Bob":19.010:110:"Adnan":"Bob":19.010|238:"Adnan":"Bob":19.010:238:"Adnan":"Bob":19.010|366:"Adnan":"Bob":19.010:366:"Adnan":"Bob":19.010|494:"Adnan":"Bob":19.010:494:"Adnan":"Bob":19.010|622:"Adnan":"Bob":19.010:622:"Adnan":"Bob":19.010|750:"Adnan":"Bob":19.010:750:"Adnan":"Bob":19.010|878:"Adnan":"Bob":19.010:878:"Adnan":"Bob":19.010|1006:"Adnan":"Bob":19.010:1006:"Adnan":"Bob":19.010|111:"Adnan":"Edgardo":19.010:111:"Adnan":"Edgardo":19.010|239:"Adnan":"Edgardo":19.010:239:"Adnan":"Edgardo":19.010|367:"Adnan":"Edgardo":19.010:367:"Adnan":"Edgardo":19.010|495:"Adnan":"Edgardo":19.010:495:"Adnan":"Edgardo":19.010|623:"Adnan":"Edgardo":19.010:623:"Adnan":"Edgardo":19.010|751:"Adnan":"Edgardo":19.010:751:"Adnan":"Edgardo":19.010|879:"Adnan":"Edgardo":19.010:879:"Adnan":"Edgardo":19.010|1007:"Adnan":"Edgardo":19.010:1007:"Adnan":"Edgardo":19.010|112:"Adnan":"Bob":19.010:112:"Adnan":"Bob":19.010|240:"Adnan":"Bob":19.010:240:"Adnan":"Bob":19.010|368:"Adnan":"Bob":19.010:368:"Adnan":"Bob":19.010|496:"Adnan":"Bob":19.010:496:"Adnan":"Bob":19.010|624:"Adnan":"Bob":19.010:624:"Adnan":"Bob":19.010|752:"Adnan":"Bob":19.010:752:"Adnan":"Bob":19.010|880:"Adnan":"Bob":19.010:880:"Adnan":"Bob":19.010|1008:"Adnan":"Bob":19.010:1008:"Adnan":"Bob":19.010|113:"Adnan":"Edgardo":19.010:113:"Adnan":"Edgardo":19.010|241:"Adnan":"Edgardo":19.010:241:"Adnan":"Edgardo":19.010|369:"Adnan":"Edgardo":19.010:369:"Adnan":"Edgardo":19.010|497:"Adnan":"Edgardo":19.010:497:"Adnan":"Edgardo":19.010|625:"Adnan":"Edgardo":19.010:625:"Adnan":"Edgardo":19.010|753:"Adnan":"Edgardo":19.010:753:"Adnan":"Edgardo":19.010|881:"Adnan":"Edgardo":19.010:881:"Adnan":"Edgardo":19.010|1009:"Adnan":"Edgardo":19.010:1009:"Adnan":"Edgardo":19.010|114:"Adnan":"Bob":19.010:114:"Adnan":"Bob":19.010|242:"Adnan":"Bob":19.010:242:"Adnan":"Bob":19.010|370:"Adnan":"Bob":19.010:370:"Adnan":"Bob":19.010|498:"Adnan":"Bob":19.010:498:"Adnan":"Bob":19.010|626:"Adnan":"Bob":19.010:626:"Adnan":"Bob":19.010|754:"Adnan":"Bob":19.010:754:"Adnan":"Bob":19.010|882:"Adnan":"Bob":19.010:882:"Adnan":"Bob":19.010|1010:"Adnan":"Bob":19.010:1010:"Adnan":"Bob":19.010|115:"Adnan":"Edgardo":19.010:115:"Adnan":"Edgardo":19.010|243:"Adnan":"Edgardo":19.010:243:"Adnan":"Edgardo":19.010|371:"Adnan":"Edgardo":19.010:371:"Adnan":"Edgardo":19.010|499:"Adnan":"Edgardo":19.010:499:"Adnan":"Edgardo":19.010|627:"Adnan":"Edgardo":19.010:627:"Adnan":"Edgardo":19.010|755:"Adnan":"Edgardo":19.010:755:"Adnan":"Edgardo":19.010|883:"Adnan":"Edgardo":19.010:883:"Adnan":"Edgardo":19.010|116:"Adnan":"Bob":19.010:116:"Adnan":"Bob":19.010|244:"Adnan":"Bob":19.010:244:"Adnan":"Bob":19.010|372:"Adnan":"Bob":19.010:372:"Adnan":"Bob":19.010|500:"Adnan":"Bob":19.010:500:"Adnan":"Bob":19.010|628:"Adnan":"Bob":19.010:628:"Adnan":"Bob":19.010|756:"Adnan":"Bob":19.010:756:"Adnan":"Bob":19.010|884:"Adnan":"Bob":19.010:884:"Adnan":"Bob":19.010|117:"Adnan":"Edgardo":19.010:117:"Adnan":"Edgardo":19.010|245:"Adnan":"Edgardo":19.010:245:"Adnan":"Edgardo":19.010|373:"Adnan":"Edgardo":19.010:373:"Adnan":"Edgardo":19.010|501:"Adnan":"Edgardo":19.010:501:"Adnan":"Edgardo":19.010|629:"Adnan":"Edgardo":19.010:629:"Adnan":"Edgardo":19.010|757:"Adnan":"Edgardo":19.010:757:"Adnan":"Edgardo":19.010|885:"Adnan":"Edgardo":19.010:885:"Adnan":"Edgardo":19.010|118:"Adnan":"Bob":19.010:118:"Adnan":"Bob":19.010|246:"Adnan":"Bob":19.010:246:"Adnan":"Bob":19.010|374:"Adnan":"Bob":19.010:374:"Adnan":"Bob":19.010|502:"Adnan":"Bob":19.010:502:"Adnan":"Bob":19.010|630:"Adnan":"Bob":19.010:630:"Adnan":"Bob":19.010|758:"Adnan":"Bob":19.010:758:"Adnan":"Bob":19.010|886:"Adnan":"Bob":19.010:886:"Adnan":"Bob":19.010|119:"Adnan":"Edgardo":19.010:119:"Adnan":"Edgardo":19.010|247:"Adnan":"Edgardo":19.010:247:"Adnan":"Edgardo":19.010|375:"Adnan":"Edgardo":19.010:375:"Adnan":"Edgardo":19.010|503:"Adnan":"Edgardo":19.010:503:"Adnan":"Edgardo":19.010|631:"Adnan":"Edgardo":19.010:631:"Adnan":"Edgardo":19.010|759:"Adnan":"Edgardo":19.010:759:"Adnan":"Edgardo":19.010|887:"Adnan":"Edgardo":19.010:887:"Adnan":"Edgardo":19.010|120:"Adnan":"Bob":19.010:120:"Adnan":"Bob":19.010|248:"Adnan":"Bob":19.010:248:"Adnan":"Bob":19.010|376:"Adnan":"Bob":19.010:376:"Adnan":"Bob":19.010|504:"Adnan":"Bob":19.010:504:"Adnan":"Bob":19.010|632:"Adnan":"Bob":19.010:632:"Adnan":"Bob":19.010|760:"Adnan":"Bob":19.010:760:"Adnan":"Bob":19.010|888:"Adnan":"Bob":19.010:888:"Adnan":"Bob":19.010|121:"Adnan":"Edgardo":19.010:121:"Adnan":"Edgardo":19.010|249:"Adnan":"Edgardo":19.010:249:"Adnan":"Edgardo":19.010|377:"Adnan":"Edgardo":19.010:377:"Adnan":"Edgardo":19.010|505:"Adnan":"Edgardo":19.010:505:"Adnan":"Edgardo":19.010|633:"Adnan":"Edgardo":19.010:633:"Adnan":"Edgardo":19.010|761:"Adnan":"Edgardo":19.010:761:"Adnan":"Edgardo":19.010|889:"Adnan":"Edgardo":19.010:889:"Adnan":"Edgardo":19.010|122:"Adnan":"Bob":19.010:122:"Adnan":"Bob":19.010|250:"Adnan":"Bob":19.010:250:"Adnan":"Bob":19.010|378:"Adnan":"Bob":19.010:378:"Adnan":"Bob":19.010|506:"Adnan":"Bob":19.010:506:"Adnan":"Bob":19.010|634:"Adnan":"Bob":19.010:634:"Adnan":"Bob":19.010|762:"Adnan":"Bob":19.010:762:"Adnan":"Bob":19.010|890:"Adnan":"Bob":19.010:890:"Adnan":"Bob":19.010|123:"Adnan":"Edgardo":19.010:123:"Adnan":"Edgardo":19.010|251:"Adnan":"Edgardo":19.010:251:"Adnan":"Edgardo":19.010|379:"Adnan":"Edgardo":19.010:379:"Adnan":"Edgardo":19.010|507:"Adnan":"Edgardo":19.010:507:"Adnan":"Edgardo":19.010|635:"Adnan":"Edgardo":19.010:635:"Adnan":"Edgardo":19.010|763:"Adnan":"Edgardo":19.010:763:"Adnan":"Edgardo":19.010|891:"Adnan":"Edgardo":19.010:891:"Adnan":"Edgardo":19.010|124:"Adnan":"Bob":19.010:124:"Adnan":"Bob":19.010|252:"Adnan":"Bob":19.010:252:"Adnan":"Bob":19.010|380:"Adnan":"Bob":19.010:380:"Adnan":"Bob":19.010|508:"Adnan":"Bob":19.010:508:"Adnan":"Bob":19.010|636:"Adnan":"Bob":19.010:636:"Adnan":"Bob":19.010|764:"Adnan":"Bob":19.010:764:"Adnan":"Bob":19.010|892:"Adnan":"Bob":19.010:892:"Adnan":"Bob":19.010|125:"Adnan":"Edgardo":19.010:125:"Adnan":"Edgardo":19.010|253:"Adnan":"Edgardo":19.010:253:"Adnan":"Edgardo":19.010|381:"Adnan":"Edgardo":19.010:381:"Adnan":"Edgardo":19.010|509:"Adnan":"Edgardo":19.010:509:"Adnan":"Edgardo":19.010|637:"Adnan":"Edgardo":19.010:637:"Adnan":"Edgardo":19.010|765:"Adnan":"Edgardo":19.010:765:"Adnan":"Edgardo":19.010|893:"Adnan":"Edgardo":19.010:893:"Adnan":"Edgardo":19.010|126:"Adnan":"Bob":19.010:126:"Adnan":"Bob":19.010|254:"Adnan":"Bob":19.010:254:"Adnan":"Bob":19.010|382:"Adnan":"Bob":19.010:382:"Adnan":"Bob":19.010|510:"Adnan":"Bob":19.010:510:"Adnan":"Bob":19.010|638:"Adnan":"Bob":19.010:638:"Adnan":"Bob":19.010|766:"Adnan":"Bob":19.010:766:"Adnan":"Bob":19.010|894:"Adnan":"Bob":19.010:894:"Adnan":"Bob":19.010|127:"Adnan":"Edgardo":19.010:127:"Adnan":"Edgardo":19.010|255:"Adnan":"Edgardo":19.010:255:"Adnan":"Edgardo":19.010|383:"Adnan":"Edgardo":19.010:383:"Adnan":"Edgardo":19.010|511:"Adnan":"Edgardo":19.010:511:"Adnan":"Edgardo":19.010|639:"Adnan":"Edgardo":19.010:639:"Adnan":"Edgardo":19.010|767:"Adnan":"Edgardo":19.010:767:"Adnan":"Edgardo":19.010|895:"Adnan":"Edgardo":19.010:895:"Adnan":"Edgardo":19.010
+hashSame=1:Ahmed:Elmagarmid:25.05:1:Ahmed:Elmagarmid:25.05|2:Walid:Aref:20.013:2:Walid:Aref:20.013|3:Christopher:Clifton:18.04:3:Christopher:Clifton:18.04|4:Sunil:Prabhakar:22.07:4:Sunil:Prabhakar:22.07|5:Elisa:Bertino:26.05:5:Elisa:Bertino:26.05|6:Susanne:Hambrusch:23.03:6:Susanne:Hambrusch:23.03|7:David:Eberts:24.08:7:David:Eberts:24.08|8:Arif:Ghafoor:20.05:8:Arif:Ghafoor:20.05|9:Jeff:Vitter:19.010:9:Jeff:Vitter:19.010
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrOperator.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrOperator.java
new file mode 100644
index 0000000..2b2fc0a
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrOperator.java
@@ -0,0 +1,79 @@
+package global;
+
+/**
+ * Enumeration class for predicate operators.
+ */
+public class AttrOperator {
+
+ public static final int EQ = 11;
+ public static final int NEQ = 12;
+ public static final int GT = 13;
+ public static final int GTE = 14;
+ public static final int LT = 15;
+ public static final int LTE = 16;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Private constructor (static class).
+ */
+ private AttrOperator() {}
+
+ /**
+ * Returns the constant value for the string representation (i.e. inverse of
+ * the toString() method).
+ */
+ public static int toValue(String str) {
+
+ // it may have been better to use the parse tree node, but this
+ // makes it easier to release class projects independently
+ if (str.equals("=")) {
+ return EQ;
+ } else if (str.equals("<>")) {
+ return NEQ;
+ } else if (str.equals(">")) {
+ return GT;
+ } else if (str.equals(">=")) {
+ return GTE;
+ } else if (str.equals("<")) {
+ return LT;
+ } else if (str.equals("<=")) {
+ return LTE;
+ } else {
+ throw new IllegalArgumentException("unknown operator");
+ }
+
+ } // public static int toValue(String str)
+
+ /**
+ * Returns a string representation of an AttrOperator.
+ */
+ public static String toString(int value) {
+
+ switch (value) {
+
+ case EQ:
+ return "=";
+
+ case NEQ:
+ return "<>";
+
+ case GT:
+ return ">";
+
+ case GTE:
+ return ">=";
+
+ case LT:
+ return "<";
+
+ case LTE:
+ return "<=";
+
+ } // switch
+
+ return ("Unexpected AttrOperator " + value);
+
+ } // public static String toString(int value)
+
+} // public class AttrOperator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrType.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrType.java
new file mode 100644
index 0000000..6334db3
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/AttrType.java
@@ -0,0 +1,98 @@
+package global;
+
+/**
+ * Enumeration class for attribute data types.
+ */
+public class AttrType {
+
+ public static final int INTEGER = 11;
+ public static final int FLOAT = 12;
+ public static final int STRING = 13;
+
+ public static final int COLNAME = 21;
+ public static final int FIELDNO = 22;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Private constructor (static class).
+ */
+ private AttrType() {}
+
+ /**
+ * Gets the AttrType of the given value; i.e. not applicable for column names
+ * or field numbers.
+ *
+ * @throws IllegalArgumentException if obj is not an AttrType
+ */
+ public static int getType(Object obj) {
+
+ if (obj instanceof Integer) {
+ return INTEGER;
+ }
+
+ if (obj instanceof Float) {
+ return FLOAT;
+ }
+
+ if (obj instanceof String) {
+ return STRING;
+ }
+
+ // otherwise, unknown type
+ throw new IllegalArgumentException("Unknown AttrType "
+ + obj.getClass().getName());
+
+ } // public static int getType(Object obj)
+
+ /**
+ * Returns a string representation of an AttrType.
+ */
+ public static String toString(int value) {
+
+ switch (value) {
+
+ case INTEGER:
+ return "INTEGER";
+
+ case FLOAT:
+ return "FLOAT";
+
+ case STRING:
+ return "STRING";
+
+ case COLNAME:
+ return "COLNAME";
+
+ case FIELDNO:
+ return "FIELDNO";
+
+ } // switch
+
+ return ("Unexpected AttrType " + value);
+
+ } // public static String toString(int value)
+
+
+ /**
+ * Returns the AttrType that match the given type (@link String)
+ * @param type
+ * @return
+ */
+ public static int fromString(String type) {
+
+ switch (type) {
+ case "INTEGER":
+ return INTEGER;
+
+ case "FLOAT":
+ return FLOAT;
+
+ case "STRING":
+ default:
+ return STRING;
+ }
+
+ } // public static int fromString (String type)
+
+} // public class AttrType
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/Convert.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/Convert.java
new file mode 100644
index 0000000..7661e6c
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/Convert.java
@@ -0,0 +1,122 @@
+package global;
+
+/**
+ * Provides conversion routines for getting and setting data in byte arrays.
+ */
+public class Convert {
+
+ /**
+ * Reads from the given byte array at the specified position, and converts it
+ * into a unicode character.
+ */
+ public static char getCharValue(int pos, byte[] data) {
+
+ // ignoring that UTF-8 could be up to six bytes
+ return (char) data[pos];
+
+ } // public static char getCharValue(int pos, byte[] data)
+
+ /**
+ * Writes a unicode character into the given byte array at the specified
+ * position.
+ */
+ public static void setCharValue(char value, int pos, byte[] data) {
+
+ // ignoring that UTF-8 could be up to six bytes
+ data[pos] = (byte) value;
+
+ } // public static void setCharValue(char value, int pos, byte[] data)
+
+ /**
+ * Reads from the given byte array at the specified position, and converts it
+ * into a short.
+ */
+ public static short getShortValue(int pos, byte[] data) {
+
+ return (short) (((data[pos] & 0xff) << 8) | (data[pos + 1] & 0xff));
+
+ } // public static short getShortValue(int pos, byte[] data)
+
+ /**
+ * Writes a short into the given byte array at the specified position.
+ */
+ public static void setShortValue(short value, int pos, byte[] data) {
+
+ data[pos] = (byte) ((value >> 8) & 0xff);
+ data[pos + 1] = (byte) (value & 0xff);
+
+ } // public static void setShortValue(short value, int pos, byte[] data)
+
+ /**
+ * Reads from the given byte array at the specified position, and converts it
+ * into an integer.
+ */
+ public static int getIntValue(int pos, byte[] data) {
+
+ return ((data[pos] & 0xff) << 24) | ((data[pos + 1] & 0xff) << 16)
+ | ((data[pos + 2] & 0xff) << 8) | (data[pos + 3] & 0xff);
+
+ } // public static int getIntValue(int pos, byte[] data)
+
+ /**
+ * Writes an integer into the given byte array at the specified position.
+ */
+ public static void setIntValue(int value, int pos, byte[] data) {
+
+ data[pos] = (byte) ((value >> 24) & 0xff);
+ data[pos + 1] = (byte) ((value >> 16) & 0xff);
+ data[pos + 2] = (byte) ((value >> 8) & 0xff);
+ data[pos + 3] = (byte) (value & 0xff);
+
+ } // public static void setIntValue(int value, int pos, byte[] data)
+
+ /**
+ * Reads from the given byte array at the specified position, and converts it
+ * to a float.
+ */
+ public static float getFloatValue(int pos, byte[] data) {
+
+ // let java do the IEEE 754 conversion
+ return Float.intBitsToFloat(getIntValue(pos, data));
+
+ } // public static float getFloatValue(int pos, byte[] data)
+
+ /**
+ * Writes a float into the given byte array at the specified position.
+ */
+ public static void setFloatValue(float value, int pos, byte[] data) {
+
+ // let java do the IEEE 754 conversion
+ setIntValue(Float.floatToIntBits(value), pos, data);
+
+ } // public static void setFloatValue(float value, int pos, byte[] data)
+
+ /**
+ * Reads from the given byte array at the specified position, and converts it
+ * to a string of given length.
+ */
+ public static String getStringValue(int pos, byte[] data, int length) {
+
+ // validate the maximum length
+ int buflen = data.length - pos;
+ if (buflen < length) {
+ length = buflen;
+ }
+
+ // is there any way in Java to avoid these mem copies?
+ return new String(data, pos, length).trim();
+
+ } // public static String getStringValue(int pos, byte[] data, int length)
+
+ /**
+ * Writes a string into the given byte array at the specified position.
+ */
+ public static void setStringValue(String value, int pos, byte[] data) {
+
+ // is there any way in Java to avoid these mem copies?
+ byte[] ba = value.getBytes();
+ System.arraycopy(ba, 0, data, pos, ba.length);
+
+ } // public static void setStringValue(String value, int pos, byte[] data)
+
+} // public class Convert
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/GlobalConst.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/GlobalConst.java
new file mode 100644
index 0000000..0b2a48d
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/GlobalConst.java
@@ -0,0 +1,57 @@
+package global;
+
+/**
+ * Global constants; implement this interface to access them conveniently.
+ */
+public interface GlobalConst {
+
+ //
+ // Disk Manager Constants
+ //
+
+ /** Size of a page, in bytes. */
+ public static final int PAGE_SIZE = 1024;
+
+ /** Page number of an invalid page (i.e. null pointer). */
+ public static final int INVALID_PAGEID = -1;
+
+ /** Page number of the first page in a database file. */
+ public static final int FIRST_PAGEID = 0;
+
+ /** Maximum size of a name (i.e. of files or attributes). */
+ public static final int NAME_MAXLEN = 50;
+
+ //
+ // Buffer Manager Constants
+ //
+
+ /** Replace the buffer frame with an existing memory page. */
+ public static final boolean PIN_MEMCPY = true;
+
+ /** Replace an existing memory page with the current disk page. */
+ public static final boolean PIN_DISKIO = false;
+
+ /** Forces the page to be written to disk when unpinned. */
+ public static final boolean UNPIN_DIRTY = true;
+
+ /** Optimization to avoid writing to disk when unpinned. */
+ public static final boolean UNPIN_CLEAN = false;
+
+ //
+ // Heap File Constants
+ //
+
+ /** Length of an "empty" slot in a heap file page. */
+ public static final int EMPTY_SLOT = -1;
+
+ //
+ // System Catalog Constants
+ //
+
+ /** Maximum length of a column (in bytes). */
+ public static final int MAX_COLSIZE = 1001;
+
+ /** Maximum length of a tuple (in bytes). */
+ public static final int MAX_TUPSIZE = 1004;
+
+} // public interface GlobalConst
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/Minibase.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/Minibase.java
new file mode 100644
index 0000000..92111a1
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/Minibase.java
@@ -0,0 +1,89 @@
+package global;
+
+import bufmgr.BufMgr;
+import diskmgr.DiskMgr;
+
+/**
+ * Definitions for the running Minibase system, including references to static
+ * layers and database-level attributes.
+ */
+public class Minibase {
+
+ /** Name of the data file. */
+ public static String DatabaseName;
+
+ /** The Minibase Disk Space Manager. */
+ public static DiskMgr DiskManager;
+
+ /** The Minibase Buffer Manager. */
+ public static BufMgr BufferManager;
+
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Constructs and starts an instance of Minibase, given the configuration.
+ *
+ * @param dbname Name of the data file
+ * @param num_pgs Number of pages to allocate
+ * @param bufpoolsize Buffer pool size (in pages)
+ * @param replacement_policy Buffer pool replacement policy
+ * @param exists If the database already exists on disk
+ */
+ public Minibase(String dbname, int num_pgs, int bufpoolsize,
+ String replacement_policy, boolean exists) {
+
+ // simply initialize the database
+ init(dbname, num_pgs, bufpoolsize, replacement_policy, exists);
+
+ } // constructor
+
+ /**
+ * Initializes the current instance of Minibase with the given configuration.
+ *
+ * @param dbname Name of the data file
+ * @param num_pgs Number of pages to allocate
+ * @param bufpoolsize Buffer pool size (in pages)
+ * @param replacement_policy Buffer pool replacement policy
+ * @param exists If the database already exists on disk
+ */
+ public void init(String dbname, int num_pgs, int bufpoolsize,
+ String replacement_policy, boolean exists) {
+
+ // save the file name
+ DatabaseName = dbname;
+
+ // load the static layers
+ try {
+ DiskManager = new DiskMgr();
+ BufferManager = new BufMgr(bufpoolsize);
+ } catch (Exception exc) {
+ haltSystem(exc);
+ }
+
+ // create or open the database
+ try {
+ if (exists) {
+ DiskManager.openDB(dbname);
+
+ } else {
+ DiskManager.createDB(dbname, num_pgs);
+
+ BufferManager.flushAllPages();
+ }
+ } catch (Exception exc) {
+ haltSystem(exc);
+ }
+
+ } // init
+
+ /**
+ * Displays an unrecoverable error and halts the system.
+ */
+ public static void haltSystem(Exception exc) {
+ System.err.println("\n*** Unrecoverable system error ***");
+ exc.printStackTrace();
+ Runtime.getRuntime().exit(1);
+ }
+
+} // public class Minibase
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/Page.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/Page.java
new file mode 100644
index 0000000..3c8b365
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/Page.java
@@ -0,0 +1,133 @@
+package global;
+
+/**
+ * Lowest-level view of a disk page.
+ */
+public class Page implements GlobalConst {
+
+ /** The actual byte array for the page. */
+ protected byte[] data;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Default constructor; creates a blank page.
+ */
+ public Page() {
+ data = new byte[PAGE_SIZE];
+ }
+
+ /**
+ * Constructor that wraps the given byte array.
+ */
+ public Page(byte[] data) {
+ setData(data);
+ }
+
+ /**
+ * Get accessor for the data byte array.
+ */
+ public byte[] getData() {
+ return data;
+ }
+
+ /**
+ * Set accessor for the data byte array.
+ *
+ * @throws IllegalArgumentException if the data array size is invalid
+ */
+ public void setData(byte[] data) {
+ if (data.length != PAGE_SIZE) {
+ Minibase.haltSystem(new IllegalArgumentException(
+ "Invalid page buffer size"));
+ }
+ this.data = data;
+ }
+
+ /**
+ * Sets this page's data array to share the given page's data array.
+ */
+ public void setPage(Page page) {
+ this.data = page.data;
+ }
+
+ /**
+ * Copies the contents of the given page's buffer into this page's buffer.
+ */
+ public void copyPage(Page page) {
+ System.arraycopy(page.data, 0, this.data, 0, PAGE_SIZE);
+ }
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Gets a char at the given page offset.
+ */
+ public char getCharValue(int offset) {
+ return Convert.getCharValue(offset, data);
+ }
+
+ /**
+ * Sets a char at the given page offset.
+ */
+ public void setCharValue(char value, int offset) {
+ Convert.setCharValue(value, offset, data);
+ }
+
+ /**
+ * Gets a short at the given page offset.
+ */
+ public short getShortValue(int offset) {
+ return Convert.getShortValue(offset, data);
+ }
+
+ /**
+ * Sets a short at the given page offset.
+ */
+ public void setShortValue(short value, int offset) {
+ Convert.setShortValue(value, offset, data);
+ }
+
+ /**
+ * Gets an int at the given page offset.
+ */
+ public int getIntValue(int offset) {
+ return Convert.getIntValue(offset, data);
+ }
+
+ /**
+ * Sets an int at the given page offset.
+ */
+ public void setIntValue(int value, int offset) {
+ Convert.setIntValue(value, offset, data);
+ }
+
+ /**
+ * Gets a float at the given page offset.
+ */
+ public float getFloatValue(int offset) {
+ return Convert.getFloatValue(offset, data);
+ }
+
+ /**
+ * Sets a float at the given page offset.
+ */
+ public void setFloatValue(float value, int offset) {
+ Convert.setFloatValue(value, offset, data);
+ }
+
+ /**
+ * Gets a string at the given page offset, given the maximum length.
+ */
+ public String getStringValue(int offset, int length) {
+ return Convert.getStringValue(offset, data, length);
+ }
+
+ /**
+ * Sets a string at the given page offset.
+ */
+ public void setStringValue(String value, int offset) {
+ Convert.setStringValue(value, offset, data);
+ }
+
+} // public class Page implements GlobalConst
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/PageId.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/PageId.java
new file mode 100644
index 0000000..d653551
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/PageId.java
@@ -0,0 +1,60 @@
+package global;
+
+/**
+ * Although a PageId is simply an integer, wrapping it provides convenient
+ * methods and allows returning it via method parameters.
+ */
+public class PageId implements GlobalConst {
+
+ /** The actual page id value. */
+ public int pid;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Default constructor.
+ */
+ public PageId() {
+ pid = INVALID_PAGEID;
+ }
+
+ /**
+ * Constructs a PageId from the given value.
+ */
+ public PageId(int pid) {
+ this.pid = pid;
+ }
+
+ /**
+ * Makes a copy of the given PageId.
+ */
+ public void copyPageId(PageId pageNo) {
+ this.pid = pageNo.pid;
+ }
+
+ /**
+ * Returns a hash code value for the PageId.
+ */
+ public int hashCode() {
+ return pid;
+ }
+
+ /**
+ * True if obj is a PageId with the same pid; false otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof PageId) {
+ PageId pageno = (PageId) obj;
+ return (this.pid == pageno.pid);
+ }
+ return false;
+ }
+
+ /**
+ * Returns a string representation of the PageId.
+ */
+ public String toString() {
+ return Integer.toString(pid);
+ }
+
+} // public class PageId implements GlobalConst
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/RID.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/RID.java
new file mode 100644
index 0000000..4dc96fa
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/RID.java
@@ -0,0 +1,98 @@
+package global;
+
+/**
+ * A record is uniquely identified by its page number and slot number.
+ */
+public class RID {
+
+ /** The record's page number. */
+ public PageId pageno;
+
+ /** The record's slot number. */
+ public int slotno;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Default constructor.
+ */
+ public RID() {
+ pageno = new PageId();
+ slotno = 0;
+ }
+
+ /**
+ * Copy constructor.
+ */
+ public RID(RID rid) {
+ copyRID(rid);
+ }
+
+ /**
+ * Constructs an RID from the given values.
+ */
+ public RID(PageId pageno, int slotno) {
+ this.pageno = new PageId();
+ this.pageno.pid = pageno.pid;
+ this.slotno = slotno;
+ }
+
+ /**
+ * Constructs an RID stored in the given data buffer.
+ */
+ public RID(byte[] data, short offset) {
+ pageno = new PageId(Convert.getIntValue(offset, data));
+ slotno = Convert.getIntValue(offset + 4, data);
+ }
+
+ /**
+ * Writes the RID into the given data buffer.
+ */
+ public void writeData(byte[] data, short offset) {
+ Convert.setIntValue(pageno.pid, offset, data);
+ Convert.setIntValue(slotno, offset + 4, data);
+ }
+
+ /**
+ * Gets the total length of the RID (in bytes).
+ */
+ public short getLength() {
+ return 8;
+ }
+
+ /**
+ * Makes a copy of the given RID.
+ */
+ public void copyRID(RID rid) {
+ this.pageno = new PageId();
+ this.pageno.pid = rid.pageno.pid;
+ slotno = rid.slotno;
+ }
+
+ /**
+ * Returns a hash code value for the RID.
+ */
+ public int hashCode() {
+ // won't work if DB supports more than 65535 pages
+ return ((pageno.pid & 0xFFFF) << 16) | (slotno & 0xFFFF);
+ }
+
+ /**
+ * True if obj is an RID with the same values; false otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof RID) {
+ RID rid = (RID) obj;
+ return ((pageno.pid == rid.pageno.pid) && (slotno == rid.slotno));
+ }
+ return false;
+ }
+
+ /**
+ * Returns a string representation of the PageId.
+ */
+ public String toString() {
+ return pageno.toString() + ":" + Integer.toString(slotno);
+ }
+
+} // public class RID
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/SearchKey.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/SearchKey.java
new file mode 100644
index 0000000..c81f0df
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/SearchKey.java
@@ -0,0 +1,291 @@
+package global;
+
+/**
+ * Provides a general and type-safe way to store and compare index search keys.
+ */
+public class SearchKey implements Comparable {
+
+ /** Internal type number for Integer keys. */
+ protected static final byte INTEGER_KEY = 1;
+
+ /** Internal type number for Float keys. */
+ protected static final byte FLOAT_KEY = 2;
+
+ /** Internal type number for String keys. */
+ protected static final byte STRING_KEY = 3;
+
+ // --------------------------------------------------------------------------
+
+ /** The type of the key value. */
+ protected byte type;
+
+ /** The size of the key value (in bytes). */
+ protected short size;
+
+ /** The actual key value. */
+ protected Object value;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Constructs a new integer search key.
+ */
+ public SearchKey(Integer value) {
+ this.type = INTEGER_KEY;
+ this.size = Integer.SIZE / Byte.SIZE;
+ this.value = value;
+ }
+
+ /**
+ * Constructs a new float search key.
+ */
+ public SearchKey(Float value) {
+ this.type = FLOAT_KEY;
+ this.size = Float.SIZE / Byte.SIZE;
+ this.value = value;
+ }
+
+ /**
+ * Constructs a new string search key.
+ */
+ public SearchKey(String value) {
+ this.type = STRING_KEY;
+ this.size = (short) value.length();
+ this.value = value;
+ }
+
+ /**
+ * Constructs a search key from a generic value.
+ *
+ * @throws IllegalArgumentException if value's type is invalid
+ */
+ public SearchKey(Object value) {
+
+ // Integer key?
+ if (value instanceof Integer) {
+ this.type = INTEGER_KEY;
+ this.size = Integer.SIZE / Byte.SIZE;
+ this.value = value;
+ }
+
+ // Float key?
+ else if (value instanceof Float) {
+ this.type = FLOAT_KEY;
+ this.size = Float.SIZE / Byte.SIZE;
+ this.value = value;
+ }
+
+ // String key?
+ else if (value instanceof String) {
+ this.type = STRING_KEY;
+ this.size = (short) ((String) value).length();
+ this.value = value;
+ }
+
+ // otherwise, none of the above
+ else {
+ throw new IllegalArgumentException("invalid key value type");
+ }
+
+ } // public SearchKey(Object value)
+
+ /**
+ * Copy constructor for a search key.
+ */
+ public SearchKey(SearchKey key) {
+
+ // copy the type and size
+ this.type = key.type;
+ this.size = key.size;
+
+ // copy the value
+ switch (key.type) {
+ case INTEGER_KEY:
+ this.value = new Integer((Integer) key.value);
+ break;
+ case FLOAT_KEY:
+ this.value = new Float((Float) key.value);
+ break;
+ case STRING_KEY:
+ this.value = new String((String) key.value);
+ break;
+ }
+
+ } // public SearchKey(SearchKey key)
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Constructs a SearchKey stored in the given data buffer.
+ */
+ public SearchKey(byte[] data, short offset) {
+
+ // extract the type and size
+ type = data[offset];
+ size = Convert.getShortValue(offset + 1, data);
+
+ // extract the key value
+ switch (type) {
+ case INTEGER_KEY:
+ value = new Integer(Convert.getIntValue(offset + 3, data));
+ break;
+ case FLOAT_KEY:
+ value = new Float(Convert.getFloatValue(offset + 3, data));
+ break;
+ case STRING_KEY:
+ value = Convert.getStringValue(offset + 3, data, size);
+ break;
+ }
+
+ } // public SearchKey(byte[] data, short offset)
+
+ /**
+ * Writes the SearchKey into the given data buffer.
+ */
+ public void writeData(byte[] data, short offset) {
+
+ // write the type and size
+ data[offset] = type;
+ Convert.setShortValue(size, offset + 1, data);
+
+ // write the key value
+ switch (type) {
+ case INTEGER_KEY:
+ Convert.setIntValue((Integer) value, offset + 3, data);
+ break;
+ case FLOAT_KEY:
+ Convert.setFloatValue((Float) value, offset + 3, data);
+ break;
+ case STRING_KEY:
+ Convert.setStringValue((String) value, offset + 3, data);
+ break;
+ }
+
+ } // public void writeData(byte[] data, short offset)
+
+ /**
+ * Gets the total length of the search key (in bytes).
+ */
+ public short getLength() {
+ return (short) (3 + size);
+ }
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Gets the hash value for the search key, given the depth (i.e. number of
+ * bits to consider).
+ */
+ public int getHash(int depth) {
+
+ // apply the appropriate calculation
+ int mask = (1 << depth) - 1;
+ switch (type) {
+
+ default:
+ case INTEGER_KEY:
+ int ikey = ((Integer) value).intValue();
+ return ikey & mask;
+
+ case FLOAT_KEY:
+ int fkey = Float.floatToIntBits((Float) value);
+ return fkey & mask;
+
+ case STRING_KEY:
+
+ // reverse the first four bytes of the string
+ byte[] s = ((String) value).getBytes();
+ int skey = 0;
+ int len = s.length > 4 ? 4 : s.length;
+ for (int i = 0; i < len; i++) {
+ skey |= (s[i] << (i * Byte.SIZE));
+ }
+ return skey & mask;
+
+ } // switch
+
+ } // public int getHash(int depth)
+
+ /**
+ * Returns true if the search key matches the given hash value, false
+ * otherwise.
+ */
+ public boolean isHash(int hash) {
+
+ // calculate the bit depth (i.e. the left-most '1' bit)
+ int depth = (int) (Math.log(hash) / Math.log(2) + 1);
+
+ // compare the hash codes
+ return (getHash(depth) == hash);
+
+ } // public boolean isHash(int hash)
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Returns a generic hash code for the key value.
+ */
+ public int hashCode() {
+ return value.hashCode();
+ }
+
+ /**
+ * True if obj is a SearchKey with the same values; false otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof SearchKey) {
+ SearchKey key = (SearchKey) obj;
+ return (value.equals(key.value));
+ }
+ return false;
+ }
+
+ /**
+ * Generically compares two search keys.
+ *
+ * @return a negative integer, zero, or a positive integer as this object is
+ * less than, equal to, or greater than the specified object
+ * @throws IllegalArgumentException if the search keys are not comparable
+ */
+ public int compareTo(SearchKey key) {
+
+ // Integer comparison
+ if (value instanceof Integer) {
+ if (key.value instanceof Integer) {
+
+ Integer ikey1 = (Integer) this.value;
+ Integer ikey2 = (Integer) key.value;
+ return ikey1.compareTo(ikey2);
+
+ } else {
+ throw new IllegalArgumentException("search keys are not comparable");
+ }
+ }
+
+ // Float comparison
+ if (value instanceof Float) {
+ if (key.value instanceof Float) {
+
+ Float fkey1 = (Float) this.value;
+ Float fkey2 = (Float) key.value;
+ return fkey1.compareTo(fkey2);
+
+ } else {
+ throw new IllegalArgumentException("search keys are not comparable");
+ }
+ }
+
+ // default: String comparison
+ if (key.value instanceof String) {
+
+ String skey1 = (String) this.value;
+ String skey2 = (String) key.value;
+ return skey1.compareTo(skey2);
+
+ } else {
+ throw new IllegalArgumentException("search keys are not comparable");
+ }
+
+ } // public int compareTo(SearchKey key)
+
+} // public class SearchKey implements Comparable
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/global/SortKey.java b/Projects/p3-skeleton/cs448p3/src/main/java/global/SortKey.java
new file mode 100644
index 0000000..192f869
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/global/SortKey.java
@@ -0,0 +1,23 @@
+package global;
+
+/**
+ * One term in an ORDER BY clause; i.e. relations can be sorted on multiple
+ * (distinct) attributes, as well as in ascending or descending order.
+ */
+public class SortKey {
+
+ /** Column name or field number. */
+ public Object field;
+
+ /** True if descending order, false if ascending order. */
+ public boolean isDesc;
+
+ /**
+ * Constructs a SortKey from the given values.
+ */
+ public SortKey(Object field, boolean isDesc) {
+ this.field = field;
+ this.isDesc = isDesc;
+ }
+
+} // public class SortKey
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/FileScan.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/FileScan.java
new file mode 100644
index 0000000..73ddbcb
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/FileScan.java
@@ -0,0 +1,92 @@
+package relop;
+
+import global.RID;
+import heap.HeapFile;
+import heap.HeapScan;
+
+/**
+ * Wrapper for heap file scan, the most basic access method. This "iterator"
+ * version takes schema into consideration and generates real tuples.
+ */
+public class FileScan extends Iterator {
+
+ private HeapFile file = null; // needed for restart(), getFile();
+ private HeapScan scan = null;
+ private RID rid = null;
+ private boolean isOpen;
+
+ /**
+ * Constructs a file scan, given the schema and heap file.
+ */
+ public FileScan(Schema aSchema, HeapFile aFile) {
+ this.schema = aSchema;
+ this.file = aFile;
+ this.scan = file.openScan();
+ this.rid = new RID();
+ isOpen = true;
+ }
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+ for(int i = 0; i < depth; i++){
+ System.out.printf(" ");
+ }
+ System.out.printf("FileScan\n");
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+ scan.close();
+ scan = file.openScan();
+ //rid = new RID();
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+ return isOpen;
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+ scan.close();
+ isOpen = false;
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public boolean hasNext() {
+ return scan.hasNext();
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+ return new Tuple(schema, scan.getNext(rid));
+ }
+
+ /**
+ * Gets the RID of the last tuple returned.
+ */
+ public RID getLastRID() {
+ return rid;
+ }
+
+ // getter; added so HashJoin doesn't have to copy the file;
+ public HeapFile getFile(){
+ return file;
+ }
+
+} // public class FileScan extends Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashJoin.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashJoin.java
new file mode 100644
index 0000000..682516f
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashJoin.java
@@ -0,0 +1,52 @@
+package relop;
+
+import heap.HeapFile;
+import index.HashIndex;
+import global.SearchKey;
+import global.RID;
+import global.AttrOperator;
+import global.AttrType;
+
+public class HashJoin extends Iterator {
+
+ public HashJoin(Iterator aIter1, Iterator aIter2, int aJoinCol1, int aJoinCol2){
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public void explain(int depth) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public void restart() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public boolean isOpen() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public void close() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public boolean hasNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ @Override
+ public Tuple getNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+} // end class HashJoin;
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashTableDup.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashTableDup.java
new file mode 100644
index 0000000..87cd765
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/HashTableDup.java
@@ -0,0 +1,83 @@
+package relop;
+
+import global.SearchKey;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+
+/**
+ * A extension to Java's hash table that allows duplicate keys.
+ * http://mindprod.com/jgloss/hashtable.html
+ */
+@SuppressWarnings("unchecked")
+class HashTableDup extends Hashtable {
+
+ /**
+ * Maps the specified key to the specified value in this hashtable.
+ */
+ public void add(SearchKey key, Tuple value) {
+
+ // to conserve RAM, duplicate values are either stored as single objects,
+ // pairs in an array, or multiples in an ArrayList
+ Object existing = get(key);
+ if (existing == null) {
+
+ // store the single value
+ put(key, value);
+
+ } else if (existing instanceof Tuple) {
+
+ // was a single object; make into a pair
+ put(key, new Tuple[] { (Tuple) existing, value });
+
+ } else if (existing instanceof Tuple[]) {
+
+ // was a pair; make into an ArrayList of 3
+ ArrayList a = new ArrayList();
+ a.addAll(Arrays.asList((Tuple[]) existing));
+ a.add(value);
+ put(key, a);
+
+ } else {
+
+ // just add to tail end of existing ArrayList
+ ((ArrayList) existing).add(value);
+
+ } // else
+
+ } // public void add(SearchKey key, Tuple value)
+
+ /**
+ * Returns the values to which the specified key is mapped in this hashtable.
+ */
+ public Tuple[] getAll(SearchKey key) {
+
+ // look up the key
+ Object match = get(key);
+ if (match == null) {
+
+ // not found
+ return null;
+
+ } else if (match instanceof Tuple) {
+
+ // return the single match
+ return new Tuple[] { (Tuple) match };
+
+ } else if (match instanceof Tuple[]) {
+
+ // return the matches
+ return (Tuple[]) match;
+
+ } else {
+
+ // convert ArrayList to Tuple[]
+ ArrayList a = (ArrayList) match;
+ return a.toArray(new Tuple[a.size()]);
+
+ } // elsee
+
+ } // public Tuple[] getAll(SearchKey key)
+
+} // class HashTableDup extends Hashtable
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/IndexScan.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/IndexScan.java
new file mode 100644
index 0000000..9672576
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/IndexScan.java
@@ -0,0 +1,89 @@
+package relop;
+
+import global.SearchKey;
+import heap.HeapFile;
+import index.HashIndex;
+
+/**
+ * Wrapper for bucket scan, an index access method.
+ */
+public class IndexScan extends Iterator {
+
+
+ /**
+ * Constructs an index scan, given the hash index and schema.
+ */
+ public IndexScan(Schema schema, HashIndex index, HeapFile file) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gives a one-line explaination of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public boolean hasNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gets the key of the last tuple returned.
+ */
+ public SearchKey getLastKey() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns the hash value for the bucket containing the next tuple, or maximum
+ * number of buckets if none.
+ */
+ public int getNextHash() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+} // public class IndexScan extends Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Iterator.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Iterator.java
new file mode 100644
index 0000000..e586fc0
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Iterator.java
@@ -0,0 +1,107 @@
+package relop;
+
+/**
+ * Minibase Iterators
+ * Query execution is driven by a tree of relational operators, all of which are
+ * implemented as iterators. Results are requested by successive "get next
+ * tuple" calls on the root of the tree, which in turn makes similar calls to
+ * child iterators throughout the tree. Intermediate nodes (i.e. join iterators)
+ * drive the leaf-level nodes (i.e. file or index scan iterators).
+ */
+public abstract class Iterator {
+
+ /** Schema for resulting tuples; must be set in all subclass constructors. */
+ protected Schema schema;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public abstract void explain(int depth);
+
+ /**
+ * Outputs the indentation for the given depth.
+ */
+ protected void indent(int depth) {
+ for (int i = 0; i < depth * 2; i++) {
+ System.out.print(' ');
+ }
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public abstract void restart();
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public abstract boolean isOpen();
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public abstract void close();
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public abstract boolean hasNext();
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public abstract Tuple getNext();
+
+ /**
+ * Prints the schema, gets and prints all tuples, and closes the iterator.
+ *
+ * @return number of tuples processed
+ */
+ public int execute() {
+ result = ""; //Modification to store result of queries for test case comparison
+ int cnt = 0;
+ getSchema().print();
+ Tuple next;
+ while (hasNext()) {
+ next = getNext();
+ next.print();
+ //Modification to store result of queries for test case comparison
+ result += next.toString() + "|";
+ cnt++;
+ }
+ if(result.length() > 0)
+ result = result.substring(0, result.length() - 1);
+ close();
+ return cnt;
+ }
+
+ /**
+ * Called by the garbage collector when there are no more references to the
+ * object; closes the iterator if it's still open.
+ */
+ protected void finalize() throws Throwable {
+ if (isOpen()) {
+ close();
+ }
+ }
+
+public void setSchema(Schema schema) {
+ this.schema = schema;
+}
+
+public Schema getSchema() {
+ return schema;
+}
+
+// *** DO NOT CHANGE ANY EXISTING METHODS OR VARIABLES BELOW THIS LINE ***
+//Store values for test cases only
+//String format: row0|row1|row2|...rowN|
+private String result;
+public String getResult() { return result; }
+
+} // public abstract class Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/KeyScan.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/KeyScan.java
new file mode 100644
index 0000000..5ae6996
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/KeyScan.java
@@ -0,0 +1,72 @@
+package relop;
+
+import global.SearchKey;
+import heap.HeapFile;
+import index.HashIndex;
+import index.HashScan;
+
+/**
+ * Wrapper for hash scan, an index access method.
+ */
+public class KeyScan extends Iterator {
+
+ /**
+ * Constructs an index scan, given the hash index and schema.
+ */
+ public KeyScan(Schema aSchema, HashIndex aIndex, SearchKey aKey, HeapFile aFile) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+ throw new UnsupportedOperationException("Not implemented");
+
+ //Your code here
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public boolean hasNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+} // public class KeyScan extends Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Predicate.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Predicate.java
new file mode 100644
index 0000000..2f48a52
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Predicate.java
@@ -0,0 +1,188 @@
+package relop;
+
+import global.AttrOperator;
+import global.AttrType;
+
+/**
+ * Internal representation of simple SQL expressions. Operators are referenced
+ * by constants in global.AttrOperator, and operands can be constants or field
+ * numbers (i.e. if referring to an attribute).
+ */
+public class Predicate {
+
+ /** The operator. */
+ protected int oper;
+
+ /** Type of left operand. */
+ protected int ltype;
+
+ /** Left operand. */
+ protected Object left;
+
+ /** Type of right operand. */
+ protected int rtype;
+
+ /** Right operand. */
+ protected Object right;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Constructs a predicate, given the expression.
+ *
+ * @param oper AttrOperator constant
+ * @param ltype AttrType of the field
+ * @param left operand value, field number, or column name
+ * @param rtype AttrType of the field
+ * @param right operand value, field number, or column name
+ */
+ public Predicate(int oper, int ltype, Object left, int rtype, Object right) {
+ this.oper = oper;
+ this.ltype = ltype;
+ this.rtype = rtype;
+ this.left = left;
+ this.right = right;
+ }
+
+ /**
+ * Validates AttrType.COLNAME operands against the given schema.
+ *
+ * @return true if the predicate is valid, false otherwise
+ */
+ public boolean validate(Schema schema) {
+
+ // if column name, make sure it exists
+ int type1 = ltype;
+ if (type1 == AttrType.COLNAME) {
+ int fldno = schema.fieldNumber((String) left);
+ if (fldno < 0) {
+ return false;
+ }
+ type1 = schema.fieldType(fldno);
+ }
+ int type2 = rtype;
+ if (type2 == AttrType.COLNAME) {
+ int fldno = schema.fieldNumber((String) right);
+ if (fldno < 0) {
+ return false;
+ }
+ type2 = schema.fieldType(fldno);
+ }
+
+ // test left and right type compatibility
+ return (type1 == type2);
+
+ } // public boolean validate(Schema schema)
+
+ /**
+ * Evaluates the predicate on the given tuple and returns true if it passes.
+ *
+ * @throws IllegalStateException if member data lead to an invalid operation
+ */
+ public boolean evaluate(Tuple tuple) {
+
+ // if necessary, resolve column names to field numbers
+ if (ltype == AttrType.COLNAME) {
+ left = tuple.schema.fieldNumber((String) left);
+ ltype = AttrType.FIELDNO;
+ }
+ if (rtype == AttrType.COLNAME) {
+ right = tuple.schema.fieldNumber((String) right);
+ rtype = AttrType.FIELDNO;
+ }
+
+ // get the values to compare
+ int type = ltype;
+ Object lval = left;
+ if (ltype == AttrType.FIELDNO) {
+ type = tuple.schema.fieldType((Integer) lval);
+ lval = tuple.getField((Integer) lval);
+ }
+ Object rval = right;
+ if (rtype == AttrType.FIELDNO) {
+ rval = tuple.getField((Integer) rval);
+ }
+
+ // compare the values
+ int comp = 0;
+ switch (type) {
+
+ case AttrType.INTEGER:
+ comp = ((Integer) lval).compareTo((Integer) rval);
+ break;
+
+ case AttrType.FLOAT:
+ comp = ((Float) lval).compareTo((Float) rval);
+ break;
+
+ case AttrType.STRING:
+ comp = ((String) lval).compareTo((String) rval);
+ break;
+
+ default:
+ throw new IllegalStateException("unknown types to compare");
+
+ } // switch (type)
+
+ // evaluate the operator
+ switch (oper) {
+
+ case AttrOperator.EQ:
+ return (comp == 0);
+
+ case AttrOperator.NEQ:
+ return (comp != 0);
+
+ case AttrOperator.GT:
+ return (comp > 0);
+
+ case AttrOperator.GTE:
+ return (comp >= 0);
+
+ case AttrOperator.LT:
+ return (comp < 0);
+
+ case AttrOperator.LTE:
+ return (comp <= 0);
+
+ default:
+ throw new IllegalStateException("unknown operator to evaluate");
+
+ } // switch (oper)
+
+ } // public boolean evaluate(Tuple tuple)
+
+ /**
+ * Returns a string representation of the Predicate.
+ */
+ public String toString() {
+
+ return opString(ltype, left) + ' ' + AttrOperator.toString(oper) + ' '
+ + opString(rtype, right);
+
+ } // public String toString()
+
+ /**
+ * Returns a string representation of an operand.
+ */
+ protected String opString(int type, Object operand) {
+
+ // get the string version
+ String str = operand.toString();
+
+ // wrap strings in single quotes
+ if (type == AttrType.STRING) {
+ return "'" + str + "'";
+ }
+
+ // wrap column numbers in braces
+ if (type == AttrType.FIELDNO) {
+ return "{" + str + "}";
+ }
+
+ // otherwise, just return the string
+ return str;
+
+ } // protected String opString(int type, Object obj)
+
+} // public class Predicate
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Projection.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Projection.java
new file mode 100644
index 0000000..48c32b7
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Projection.java
@@ -0,0 +1,79 @@
+package relop;
+
+
+/**
+ * The projection operator extracts columns from a relation; unlike in
+ * relational algebra, this operator does NOT eliminate duplicate tuples.
+ */
+public class Projection extends Iterator {
+
+ private Iterator iter = null;
+ private Integer[] fields = null;
+ private boolean isOpen;
+ /**
+ * Constructs a projection, given the underlying iterator and field numbers.
+ */
+ public Projection(Iterator aIter, Integer... aFields) {
+ this.iter = aIter;
+ this.fields = aFields;
+ this.isOpen = true;
+
+ this.schema = new Schema(fields.length);
+ Schema iterSchema = iter.getSchema();
+ for(int i = 0; i < fields.length; i++){
+ this.schema.initField(i, iterSchema, fields[i]);
+ }
+ }
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public boolean hasNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+} // public class Projection extends Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Schema.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Schema.java
new file mode 100644
index 0000000..dc9240e
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Schema.java
@@ -0,0 +1,195 @@
+package relop;
+
+import global.AttrType;
+
+/**
+ * Each tuple has a schema that defines the logical view of the raw bytes; it
+ * describes the types, lengths, offsets, and names of a tuple's fields.
+ */
+public class Schema {
+
+ /** Minimum column width for output. */
+ public static final int MIN_WIDTH = 10;
+
+ // --------------------------------------------------------------------------
+
+ /** Attribute types of the fields. */
+ protected int[] types;
+
+ /** Variable lengths of the fields. */
+ protected int[] lengths;
+
+ /** Relative offsets of the fields. */
+ protected int[] offsets;
+
+ /** Column names of the fields. */
+ protected String[] names;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Constructs a schema for the given number of fields.
+ */
+ public Schema(int fldcnt) {
+ types = new int[fldcnt];
+ lengths = new int[fldcnt];
+ offsets = new int[fldcnt];
+ names = new String[fldcnt];
+ }
+
+ /**
+ * Sets the type, length, and name for the given field; this automatically
+ * calculates its offset, provided that fields are set in ascending order.
+ */
+ public void initField(int fldno, int type, int length, String name) {
+
+ // save the type, length, and name
+ types[fldno] = type;
+ lengths[fldno] = length;
+ names[fldno] = name;
+
+ // calculate the relative offset
+ if (fldno > 0) {
+ offsets[fldno] = offsets[fldno - 1] + lengths[fldno - 1];
+ } else {
+ offsets[fldno] = 0;
+ }
+
+ } // public void initField(int fldno, int type, int length, String name)
+
+ /**
+ * Copies a field from another schema.
+ *
+ * @param fldno number of this field to set
+ * @param schema contains the info to copy
+ * @param srcno number of the field to copy
+ */
+ public void initField(int fldno, Schema schema, int srcno) {
+ initField(fldno, schema.types[srcno], schema.lengths[srcno],
+ schema.names[srcno]);
+ }
+
+ /**
+ * Builds and returns a new schema resulting from joining two schemas.
+ *
+ * @param s1 the left schema
+ * @param s2 the right schema
+ */
+ public static Schema join(Schema s1, Schema s2) {
+
+ // construct the new schema
+ int s1cnt = s1.getCount();
+ int s2cnt = s2.getCount();
+ Schema schema = new Schema(s1cnt + s2cnt);
+
+ // copy all fields from s1 and s2
+ int fldno = 0;
+ for (int i = 0; i < s1cnt; i++) {
+ schema.initField(fldno++, s1, i);
+ }
+ for (int i = 0; i < s2cnt; i++) {
+ schema.initField(fldno++, s2, i);
+ }
+
+ // return the resulting schema
+ return schema;
+
+ } // public static Schema join(Schema s1, Schema s2)
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Gets the number of fields in the schema.
+ */
+ public int getCount() {
+ // all arrays are same length
+ return types.length;
+ }
+
+ /**
+ * Gets the size of a tuple (in bytes).
+ */
+ public int getLength() {
+ int len = 0;
+ for (int i = 0; i < lengths.length; i++) {
+ len += lengths[i];
+ }
+ return len;
+ }
+
+ /**
+ * Gets the type of the given field.
+ */
+ public int fieldType(int fldno) {
+ return types[fldno];
+ }
+
+ /**
+ * Gets the length of the given field.
+ */
+ public int fieldLength(int fldno) {
+ return lengths[fldno];
+ }
+
+ /**
+ * Gets the offset of the given field.
+ */
+ public int fieldOffset(int fldno) {
+ return offsets[fldno];
+ }
+
+ /**
+ * Gets the name of the given field.
+ */
+ public String fieldName(int fldno) {
+ return names[fldno];
+ }
+
+ /**
+ * Gets the number of the field with the given name, or -1 if not found.
+ */
+ public int fieldNumber(String name) {
+ for (int i = 0; i < names.length; i++) {
+ if (names[i].equalsIgnoreCase(name)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Prints the schema (i.e. the first lines of typical query output).
+ */
+ public void print() {
+
+ // print and space the column names
+ int len = 0;
+ for (int i = 0; i < types.length; i++) {
+
+ // print the column name
+ System.out.print(names[i]);
+
+ // figure out the padding
+ int collen = Math.max(names[i].length(), MIN_WIDTH);
+ if (types[i] == AttrType.STRING) {
+ collen = Math.max(lengths[i], collen);
+ }
+ len += collen;
+
+ // pad the output to the field length
+ for (int j = 0; j < collen - names[i].length(); j++) {
+ System.out.print(' ');
+ }
+
+ } // for
+
+ // print the line separator
+ System.out.println();
+ for (int i = 0; i < len; i++) {
+ System.out.print('-');
+ }
+ System.out.println();
+
+ } // public void print()
+
+} // public class Schema
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Selection.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Selection.java
new file mode 100644
index 0000000..900b8a6
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Selection.java
@@ -0,0 +1,78 @@
+package relop;
+
+/**
+ * The selection operator specifies which tuples to retain under a condition; in
+ * Minibase, this condition is simply a set of independent predicates logically
+ * connected by OR operators.
+ */
+public class Selection extends Iterator {
+
+ private Iterator iter = null;
+ private Predicate[] preds = null;
+ //boolean hasNext;
+ Tuple next = null;
+ private boolean consumed;
+ private boolean isOpen;
+ /**
+ * Constructs a selection, given the underlying iterator and predicates.
+ */
+ public Selection(Iterator aIter, Predicate... aPreds) {
+ this.schema = aIter.getSchema();
+ this.iter = aIter;
+ this.preds = aPreds;
+ this.consumed = true;
+ this.isOpen = true;
+ }
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ */
+ public boolean hasNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+ throw new UnsupportedOperationException("Not implemented");
+ //Your code here
+ }
+
+} // public class Selection extends Iterator
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/SimpleJoin.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/SimpleJoin.java
new file mode 100644
index 0000000..3490176
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/SimpleJoin.java
@@ -0,0 +1,126 @@
+package relop;
+
+/**
+ * The simplest of all join algorithms: nested loops (see textbook, 3rd edition,
+ * section 14.4.1, page 454).
+ */
+public class SimpleJoin extends Iterator {
+
+ private Iterator outer;
+ private Iterator inner;
+ private Predicate[] preds;
+
+ private boolean startJoin = true;
+ Tuple leftTuple;
+
+ // boolean variable to indicate whether the pre-fetched tuple is consumed or not
+ private boolean nextTupleIsConsumed;
+
+ // pre-fetched tuple
+ private Tuple nextTuple;
+
+ /**
+ * Constructs a join, given the left and right iterators and join predicates
+ * (relative to the combined schema).
+ */
+ public SimpleJoin(Iterator left, Iterator right, Predicate... preds) {
+
+ this.outer = left;
+ this.inner = right;
+ this.preds = preds;
+ this.schema = Schema.join(left.schema, right.schema);
+
+ nextTupleIsConsumed = true;
+ }
+
+ /**
+ * Gives a one-line explanation of the iterator, repeats the call on any
+ * child iterators, and increases the indent depth along the way.
+ */
+ public void explain(int depth) {
+
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ /**
+ * Restarts the iterator, i.e. as if it were just constructed.
+ */
+ public void restart() {
+
+ outer.restart();
+ inner.restart();
+ nextTupleIsConsumed = true;
+ }
+
+ /**
+ * Returns true if the iterator is open; false otherwise.
+ */
+ public boolean isOpen() {
+
+ return outer.isOpen() && inner.isOpen();
+ }
+
+ /**
+ * Closes the iterator, releasing any resources (i.e. pinned pages).
+ */
+ public void close() {
+
+ outer.close();
+ inner.close();
+ }
+
+ /**
+ * Returns true if there are more tuples, false otherwise.
+ *
+ */
+ public boolean hasNext() {
+
+ if (!nextTupleIsConsumed)
+ return true;
+
+ if (!outer.hasNext())
+ //if(!inner.hasNext() && !outer.hasNext()) // Piazza post 116
+ return false;
+
+ Tuple rightTuple;
+
+ if (startJoin) {
+ leftTuple = outer.getNext();
+ startJoin = false;
+ }
+
+ while (true) {
+
+ while (inner.hasNext()) {
+
+ rightTuple = inner.getNext();
+
+ // try to match
+ nextTuple = Tuple.join(leftTuple, rightTuple, this.schema);
+ for (int i = 0; i < preds.length; i++)
+ if (preds[i].evaluate(nextTuple)) {
+ nextTupleIsConsumed = false;
+ return true;
+ }
+ }
+
+ if (outer.hasNext()) {
+ leftTuple = outer.getNext();
+ inner.restart();
+ }
+ else
+ return false;
+ }
+ }
+
+ /**
+ * Gets the next tuple in the iteration.
+ *
+ * @throws IllegalStateException if no more tuples
+ */
+ public Tuple getNext() {
+
+ nextTupleIsConsumed = true;
+ return nextTuple;
+ }
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/main/java/relop/Tuple.java b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Tuple.java
new file mode 100644
index 0000000..73992b4
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/main/java/relop/Tuple.java
@@ -0,0 +1,315 @@
+package relop;
+
+import global.AttrType;
+import global.Convert;
+import global.RID;
+import heap.HeapFile;
+
+/**
+ * Each tuple in a relation is a collection of bytes that must fit within a
+ * single page. The Tuple class provides a logical view of fields, allowing get
+ * and set operations while automatically handling offsets and type conversions.
+ */
+public class Tuple {
+
+ /** Page buffer containing this tuple. */
+ protected byte[] data;
+
+ /** Schema information for the fields. */
+ protected Schema schema;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Creates a new empty tuple, given its schema.
+ *
+ * @param schema logical information for the fields
+ */
+ public Tuple(Schema schema) {
+ this.schema = schema;
+ data = new byte[schema.getLength()];
+ }
+
+ /**
+ * Creates a new tuple, given its schema and values.
+ *
+ * @param schema logical information for the fields
+ * @param values individual data values of the fields
+ */
+ public Tuple(Schema schema, Object... values) {
+ this.schema = schema;
+ data = new byte[schema.getLength()];
+ setAllFields(values);
+ }
+
+ /**
+ * Creates a new tuple, given existing values to wrap.
+ *
+ * @param schema logical information for the fields
+ * @param data record buffer containing the tuple
+ */
+ public Tuple(Schema schema, byte[] data) {
+ this.schema = schema;
+ this.data = data;
+ }
+
+ /**
+ * Builds and returns a new tuple resulting from joining two tuples.
+ *
+ * @param t1 the left tuple
+ * @param t2 the right tuple
+ * @param schema of the result
+ */
+ public static Tuple join(Tuple t1, Tuple t2, Schema schema) {
+
+ // construct the new tuple
+ int t1cnt = t1.schema.getCount();
+ int t2cnt = t2.schema.getCount();
+ Tuple tuple = new Tuple(schema);
+
+ // copy all fields from t1 and t2
+ int fldno = 0;
+ for (int i = 0; i < t1cnt; i++) {
+ tuple.setField(fldno++, t1.getField(i));
+ }
+ for (int i = 0; i < t2cnt; i++) {
+ tuple.setField(fldno++, t2.getField(i));
+ }
+
+ // return the resulting tuple
+ return tuple;
+
+ } // public static Tuple join(Tuple t1, Tuple t2, Schema schema)
+
+ /**
+ * Gets the underlying data buffer.
+ */
+ public byte[] getData() {
+ return data;
+ }
+
+ /**
+ * Inserts the tuple into the given heap file.
+ */
+ public RID insertIntoFile(HeapFile file) {
+ return file.insertRecord(data);
+ }
+
+ /**
+ * Gets a field's value generically.
+ */
+ public Object getField(int fldno) {
+
+ // refer to the schema for the appropriate conversion
+ switch (schema.fieldType(fldno)) {
+
+ case AttrType.INTEGER:
+ return getIntFld(fldno);
+
+ case AttrType.FLOAT:
+ return getFloatFld(fldno);
+
+ case AttrType.STRING:
+ return getStringFld(fldno);
+
+ default:
+ throw new IllegalStateException("invalid attribute type");
+ }
+
+ } // public Object getField(int fldno)
+
+ /**
+ * Gets a field's value generically, by column name.
+ */
+ public Object getField(String fldName) {
+ return getField(schema.fieldNumber(fldName));
+ }
+
+ /**
+ * Sets a field's value generically.
+ */
+ public void setField(int fldno, Object val) {
+
+ // refer to the schema for the appropriate conversion
+ switch (schema.fieldType(fldno)) {
+
+ case AttrType.INTEGER:
+ setIntFld(fldno, (Integer) val);
+ break;
+
+ case AttrType.FLOAT:
+ setFloatFld(fldno, (Float) val);
+ break;
+
+ case AttrType.STRING:
+ setStringFld(fldno, (String) val);
+ break;
+
+ default:
+ throw new IllegalStateException("invalid attribute type");
+ }
+
+ } // public void setField(int fldno, Object val)
+
+ /**
+ * Sets a field's value generically, by column name.
+ */
+ public void setField(String fldName, Object val) {
+ setField(schema.fieldNumber(fldName), val);
+ }
+
+ /**
+ * Returns generic values for all fields.
+ */
+ public Object[] getAllFields() {
+
+ Object[] values = new Object[schema.getCount()];
+ for (int i = 0; i < values.length; i++) {
+ values[i] = getField(i);
+ }
+ return values;
+
+ } // public Object[] getAllFields()
+
+ /**
+ * Sets all fields, given generic values.
+ */
+ public void setAllFields(Object... values) {
+
+ for (int i = 0; i < values.length; i++) {
+ setField(i, values[i]);
+ }
+
+ } // public void setAllFields(Object... values)
+
+ /**
+ * Gets an integer field.
+ */
+ public int getIntFld(int fldno) {
+ return Convert.getIntValue(schema.fieldOffset(fldno), data);
+ }
+
+ /**
+ * Sets an integer field.
+ */
+ public void setIntFld(int fldno, int val) {
+ Convert.setIntValue(val, schema.fieldOffset(fldno), data);
+ }
+
+ /**
+ * Gets a float field.
+ */
+ public float getFloatFld(int fldno) {
+ return Convert.getFloatValue(schema.fieldOffset(fldno), data);
+ }
+
+ /**
+ * Sets a float field.
+ */
+ public void setFloatFld(int fldno, float val) {
+ Convert.setFloatValue(val, schema.fieldOffset(fldno), data);
+ }
+
+ /**
+ * Gets a string field.
+ */
+ public String getStringFld(int fldno) {
+ return Convert.getStringValue(schema.fieldOffset(fldno), data, schema
+ .fieldLength(fldno));
+ }
+
+ /**
+ * Sets a string field (automatically truncates, if necessary).
+ */
+ public void setStringFld(int fldno, String val) {
+
+ // truncate the string if too long
+ int len = schema.fieldLength(fldno);
+ if (val.length() > len) {
+ val = val.substring(0, len - 1);
+ }
+
+ // set the string and zero out the rest
+ int off = schema.fieldOffset(fldno);
+ Convert.setStringValue(val, off, data);
+ for (int i = val.length(); i < len; i++) {
+ data[off + i] = 0;
+ }
+
+ } // public void setStringFld(int fldno, String val)
+
+ /**
+ * Prints the tuple in a human-readable format.
+ */
+ public void print() {
+
+ // print everything as a string, with padding
+ String str = null;
+ int cnt = schema.getCount();
+ for (int i = 0; i < cnt; i++) {
+ switch (schema.fieldType(i)) {
+
+ case AttrType.INTEGER:
+ str = Integer.toString(getIntFld(i));
+ System.out.print(str);
+ padOutput(0, str.length());
+ break;
+
+ case AttrType.FLOAT:
+ str = Float.toString(getFloatFld(i));
+ System.out.print(str);
+ padOutput(0, str.length());
+ break;
+
+ case AttrType.STRING:
+ str = getStringFld(i);
+ System.out.print(str);
+ padOutput(schema.fieldLength(i), str.length());
+ break;
+
+ }
+ }
+ System.out.println();
+
+ } // public void print()
+
+ /**
+ * Pads the current output to make columns line up.
+ *
+ * @param fieldLen minimum length of the current field
+ * @param outputLen length of the current output so far
+ */
+ protected void padOutput(int fieldLen, int outputLen) {
+
+ fieldLen = Math.max(Schema.MIN_WIDTH, fieldLen);
+ for (int j = 0; j < fieldLen - outputLen; j++) {
+ System.out.print(' ');
+ }
+
+ } // protected void padOutput(int fieldLen, int outputLen)
+
+
+ // *** DO NOT CHANGE ANY EXISTING METHODS OR VARIABLES BELOW THIS LINE ***
+ //String format: field0|field1|field2|...fieldN|
+ public String toString()
+ {
+ String res = "";
+ for(int i = 0; i < schema.getCount(); i++)
+ {
+ switch(schema.fieldType(i))
+ {
+ case AttrType.FLOAT:
+ res += Float.toString(getFloatFld(i)) + "";
+ break;
+ case AttrType.INTEGER:
+ res += Integer.toString(getIntFld(i)) + ":";
+ break;
+ case AttrType.STRING:
+ res += getStringFld(i) + ":";
+ break;
+ }
+ }
+ if(res.length() > 0) res = res.substring(0, res.length()-1);
+ return res;
+ }
+} // public class Tuple
diff --git a/Projects/p3-skeleton/cs448p3/src/test/java/tests/Field.java b/Projects/p3-skeleton/cs448p3/src/test/java/tests/Field.java
new file mode 100644
index 0000000..1727e1e
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/java/tests/Field.java
@@ -0,0 +1,51 @@
+package tests;
+
+import global.AttrType;
+import org.json.simple.JSONObject;
+
+public class Field {
+
+ private int no;
+ private int type;
+ private int length;
+ private String name;
+
+ Field(JSONObject obj) {
+ no = ((Long) obj.get("no")).intValue();
+ type = AttrType.fromString((String) obj.get("type"));
+ length = ((Long) obj.get("length")).intValue();
+ name = (String) obj.get("name");
+ }
+
+ public Object getValue(String val) {
+ switch (type) {
+ case AttrType.INTEGER: {
+ return Integer.parseInt(val.trim());
+ }
+
+ case AttrType.FLOAT: {
+ return Float.parseFloat(val);
+ }
+
+ default: {
+ return val;
+ }
+ }
+ }
+
+ public int getNo() {
+ return no;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/java/tests/QEPTest.java b/Projects/p3-skeleton/cs448p3/src/test/java/tests/QEPTest.java
new file mode 100644
index 0000000..635b960
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/java/tests/QEPTest.java
@@ -0,0 +1,262 @@
+package tests;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+
+import global.AttrOperator;
+import global.AttrType;
+import heap.HeapFile;
+import relop.FileScan;
+import relop.HashJoin;
+import relop.Predicate;
+import relop.Projection;
+import relop.Schema;
+import relop.Selection;
+import relop.SimpleJoin;
+import relop.Tuple;
+
+// YOUR CODE FOR PART3 SHOULD GO HERE.
+
+public class QEPTest extends TestDriver
+{
+ /** The display name of the test suite. */
+ private static final String TEST_NAME = "QEP Tests";
+
+
+ /** Employee table schema. */
+ private static Schema s_emp;
+
+ /** Department table schema. */
+ private static Schema s_dept;
+
+ private static String empFilePath;
+ private static String deptFilePath;
+
+ private static HeapFile empHeapFile;
+ private static HeapFile deptHeapFile;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Test application entry point; runs all tests.
+ * @throws IOException
+ */
+ public static void main(String argv[]) throws IOException
+ {
+ empFilePath = argv[0] + "/Employee.txt";
+ deptFilePath = argv[0] + "/Department.txt";
+ // create a clean Minibase instance
+ QEPTest qepTest = new QEPTest();
+ qepTest.create_minibase();
+
+ initSchema();
+ loadData();
+
+
+ qepTest.q1();
+ qepTest.q2();
+ qepTest.q3();
+ qepTest.q4();
+ qepTest.q5();
+ qepTest.q6();
+ qepTest.q7();
+ qepTest.q8();
+
+ /*
+ qepTest.q5();
+ qepTest.q5_hash();
+ */
+ }
+
+ public void q1()
+ {
+ System.out.println("\n 1) Display for each employee his Name and Salary:\n");
+ FileScan scan = new FileScan(s_emp, empHeapFile);
+ Projection pro = new Projection(scan, s_emp.fieldNumber(Constants.EmpNameColName) , s_emp.fieldNumber(Constants.EmpSalaryColName));
+ pro.execute();
+ }
+
+ public void q2()
+ {
+ System.out.println("\n 2) Display the Name for the departments with MinSalary = 1000:\n");
+ FileScan scan = new FileScan(s_dept, deptHeapFile);
+ Predicate pred = new Predicate(AttrOperator.EQ, AttrType.COLNAME, Constants.DeptMinSalaryColName, AttrType.FLOAT, 1000F);
+ Selection sel = new Selection(scan, pred);
+ Projection pro = new Projection(sel, s_dept.fieldNumber(Constants.DeptNameColName));
+ pro.execute();
+ }
+
+ public void q3()
+ {
+ System.out.println("\n 3) Display the Name for the departments with MinSalary = MaxSalary:\n");
+ FileScan scan = new FileScan(s_dept, deptHeapFile);
+ Predicate pred = new Predicate(AttrOperator.EQ, AttrType.COLNAME, Constants.DeptMinSalaryColName, AttrType.COLNAME, Constants.DeptMaxSalaryColName);
+ Selection sel = new Selection(scan, pred);
+ Projection pro = new Projection(sel, s_dept.fieldNumber(Constants.DeptNameColName));
+ pro.execute();
+ }
+
+ public void q4()
+ {
+ System.out.println("\n 4) Display the Name for employees whose Age > 30 and Salary < 1000:\n");
+ FileScan scan = new FileScan(s_emp, empHeapFile);
+ Predicate predAge = new Predicate(AttrOperator.GT, AttrType.COLNAME, Constants.EmpAgeColName, AttrType.FLOAT, 30F);
+ Predicate predSalary = new Predicate(AttrOperator.LT, AttrType.COLNAME, Constants.EmpSalaryColName, AttrType.FLOAT, 1000F);
+ Selection selAge = new Selection(scan, predAge);
+ Selection selSalary = new Selection(selAge, predSalary);
+ Projection projName = new Projection(selSalary, s_emp.fieldNumber(Constants.EmpNameColName));
+ projName.execute();
+ }
+
+ public void q5()
+ {
+ System.out.println("\n 5) For each employee, display his Salary and the Name of his department:\n");
+ FileScan empScan = new FileScan(s_emp, empHeapFile);
+ FileScan deptScan = new FileScan(s_dept, deptHeapFile);
+ Predicate joinPred = new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 8);
+ SimpleJoin join = new SimpleJoin(deptScan, empScan, joinPred);
+ Projection proj = new Projection(join, 7, 1);
+ proj.execute();
+ }
+
+ public void q6()
+ {
+ System.out.println("\n 6) Display the Name and Salary for employees who work in the department that has DeptId = 3:\n");
+ FileScan scan = new FileScan(s_emp, empHeapFile);
+ Predicate predDept = new Predicate(AttrOperator.EQ, AttrType.COLNAME, Constants.EmpDeptIDColName, AttrType.INTEGER, 3);
+ Selection sel = new Selection(scan, predDept);
+ Projection proj = new Projection(sel, s_emp.fieldNumber(Constants.EmpNameColName), s_emp.fieldNumber(Constants.EmpSalaryColName));
+ proj.execute();
+ }
+
+ public void q7()
+ {
+ System.out.println("\n 7) Display the Salary for each employee who works in a department that has MaxSalary > 100000:\n");
+ FileScan empScan = new FileScan(s_emp, empHeapFile);
+ FileScan deptScan = new FileScan(s_dept, deptHeapFile);
+ Predicate predMaxSalary = new Predicate(AttrOperator.GT, AttrType.COLNAME, Constants.DeptMaxSalaryColName, AttrType.FLOAT, 100000F);
+ Selection selDept = new Selection(deptScan, predMaxSalary);
+ Predicate joinPred = new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 8);
+ SimpleJoin join = new SimpleJoin(selDept, empScan, joinPred);
+ Projection proj = new Projection(join, 7);
+ proj.execute();
+ }
+
+ public void q8()
+ {
+ System.out.println("\n 8) Display the Name for each employee whose Salary is less than the MinSalary of his department:\n");
+ FileScan empScan = new FileScan(s_emp, empHeapFile);
+ FileScan deptScan = new FileScan(s_dept, deptHeapFile);
+ Predicate joinPred = new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 8);
+ SimpleJoin join = new SimpleJoin(deptScan, empScan, joinPred);
+ Predicate pred = new Predicate(AttrOperator.LT, AttrType.FIELDNO, 7, AttrType.FIELDNO, 2);
+ Selection sel = new Selection(join, pred);
+ Projection proj = new Projection(sel, 5);
+ proj.execute();
+ }
+
+
+
+ public void q5_hash()
+ {
+ System.out.println("\n 5) For each employee, display his Salary and the Name of his department:\n");
+ FileScan empScan = new FileScan(s_emp, empHeapFile);
+ FileScan deptScan = new FileScan(s_dept, deptHeapFile);
+ Predicate joinPred = new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 8);
+ //SimpleJoin join = new SimpleJoin(deptScan, empScan, joinPred);
+ HashJoin join = new HashJoin(deptScan, empScan, 0, 4);
+ Projection proj = new Projection(join, 7, 1);
+ proj.execute();
+ }
+
+ protected static void initSchema()
+ {
+ //initialize schema for the "Employee" table
+ s_emp = new Schema(5);
+ s_emp.initField(0, AttrType.INTEGER, 4, Constants.EmpIdColName);
+ s_emp.initField(1, AttrType.STRING, 40, Constants.EmpNameColName);
+ s_emp.initField(2, AttrType.FLOAT, 4, Constants.EmpAgeColName);
+ s_emp.initField(3, AttrType.FLOAT, 4, Constants.EmpSalaryColName);
+ s_emp.initField(4, AttrType.INTEGER, 4, Constants.EmpDeptIDColName);
+
+ //initialize schema for the "Department" table
+ s_dept = new Schema(4);
+ s_dept.initField(0, AttrType.INTEGER, 4, Constants.DeptIdColName);
+ s_dept.initField(1, AttrType.STRING, 40, Constants.DeptNameColName);
+ s_dept.initField(2, AttrType.FLOAT, 4, Constants.DeptMinSalaryColName);
+ s_dept.initField(3, AttrType.FLOAT, 4, Constants.DeptMaxSalaryColName);
+
+ }
+
+ protected static void loadData() throws IOException
+ {
+ empHeapFile = new HeapFile(null);
+ loadEmpTable(empHeapFile);
+
+ deptHeapFile = new HeapFile(null);
+ loadDeptTable(deptHeapFile);
+ }
+
+
+ protected static void loadEmpTable(HeapFile file) throws IOException
+ {
+ Tuple tuple = new Tuple(s_emp);
+ BufferedReader reader = new BufferedReader(new FileReader(empFilePath));
+ reader.readLine(); //ignore the header
+ String line = "";
+ String[] temp = null;
+ int empId; String empName; float age; float salary; int deptId;
+ while((line = reader.readLine()) != null)
+ {
+ temp = line.split(",");
+ empId = Integer.parseInt(temp[0].trim());
+ empName = temp[1].trim();
+ age = Float.parseFloat(temp[2].trim());
+ salary = Float.parseFloat(temp[3].trim());
+ deptId = Integer.parseInt(temp[4].trim());
+ tuple.setAllFields(empId, empName, age, salary, deptId);
+ tuple.insertIntoFile(file);
+ }
+ reader.close();
+ }
+
+ protected static void loadDeptTable(HeapFile file) throws IOException
+ {
+ Tuple tuple = new Tuple(s_dept);
+ BufferedReader reader = new BufferedReader(new FileReader(deptFilePath));
+ reader.readLine(); //ignore the header
+ String line = "";
+ String[] temp = null;
+ int deptId; String deptName; float minSalary; float maxSalary;
+ while((line = reader.readLine()) != null)
+ {
+ temp = line.split(",");
+ deptId = Integer.parseInt(temp[0].trim());
+ deptName = temp[1].trim();
+ minSalary = Float.parseFloat(temp[2].trim());
+ maxSalary = Float.parseFloat(temp[3].trim());
+ tuple.setAllFields(deptId, deptName, minSalary, maxSalary);
+ tuple.insertIntoFile(file);
+ }
+ reader.close();
+ }
+
+ static class Constants
+ {
+
+ public final static String EmpIdColName = "EmpId";
+ public final static String EmpNameColName = "Name";
+ public final static String EmpAgeColName = "Age";
+ public final static String EmpSalaryColName = "Salary";
+ public final static String EmpDeptIDColName = "DeptID";
+
+ public final static String DeptIdColName = "DeptId";
+ public final static String DeptNameColName = "Name";
+ public final static String DeptMinSalaryColName = "MinSalary";
+ public final static String DeptMaxSalaryColName = "MaxSalary";
+
+
+ }
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/java/tests/ROTest.java b/Projects/p3-skeleton/cs448p3/src/test/java/tests/ROTest.java
new file mode 100644
index 0000000..a66a746
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/java/tests/ROTest.java
@@ -0,0 +1,367 @@
+package tests;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.ParseException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import global.AttrOperator;
+import global.AttrType;
+import global.RID;
+import global.SearchKey;
+import heap.HeapFile;
+import index.HashIndex;
+import relop.FileScan;
+import relop.HashJoin;
+import relop.IndexScan;
+import relop.KeyScan;
+import relop.Predicate;
+import relop.Projection;
+import relop.Schema;
+import relop.Selection;
+import relop.SimpleJoin;
+import relop.Tuple;
+import relop.Iterator;
+
+import java.io.*;
+import java.util.*;
+
+import com.opencsv.CSVReader;
+import org.json.simple.parser.JSONParser;
+
+/**
+ * Test suite for the relop layer.
+ */
+public class ROTest extends TestDriver {
+
+ private static ROTest rot;
+
+ /** The display name of the test suite. */
+ private static final String TEST_NAME = "relational operator tests";
+
+ /** Size of tables in test3. */
+ private static final int SUPER_SIZE = 2000;
+
+ private Scanner in;
+
+ /** Drivers schema/table/index */
+ private static Schema s_drivers;
+ private static HeapFile f_drivers;
+ private static HashIndex idx_drivers;
+
+ private static Schema s_driversBig;
+ private static HeapFile f_driversBig;
+ private static HashIndex idx_driversBig;
+ /** Rides schema/table/index */
+
+ private static Schema s_rides;
+ private static HeapFile f_rides;
+ private static HashIndex idx_rides;
+
+ private static Schema s_ridesBig;
+ private static HeapFile f_ridesBig;
+ private static HashIndex idx_ridesBig;
+
+ /** Groups schema/table/index */
+ private static Schema s_groups;
+ private static HeapFile f_groups;
+ private static HashIndex idx_groups;
+
+ private static Schema s_groupsBig;
+ private static HeapFile f_groupsBig;
+ private static HashIndex idx_groupsBig;
+
+ /** Expected result strings for test cases */
+ private static HashMap results;
+
+ /** */
+ private static void loadTable(Schema schema, HeapFile f_table, HashIndex idx_table, String table)
+ throws FileNotFoundException, IOException, ParseException {
+
+ // initialize schema for table
+ InputStream in = ClassLoader.getSystemResourceAsStream(table.concat(".json"));
+ JSONObject jsonObj = (JSONObject) new JSONParser().parse(new InputStreamReader(in));
+ JSONArray jsonFields = (JSONArray) jsonObj.get("schema");
+ Field[] fields = new Field[jsonFields.size()];
+
+ int key = ((Long) jsonObj.get("key")).intValue();
+ int xx = 0;
+ for (Object obj : jsonFields) {
+ Field field = new Field((JSONObject) obj);
+ fields[xx] = field; xx++;
+ schema.initField(field.getNo(), field.getType(), field.getLength(), field.getName());
+ }
+
+ // populate relation
+ in = ClassLoader.getSystemResourceAsStream(table.concat(".csv"));
+ try (CSVReader csvReader = new CSVReader(new InputStreamReader(in))) {
+ String[] values = null;
+ Tuple tuple = new Tuple(schema);
+ while((values = csvReader.readNext()) != null) {
+
+ for (int i=0; i();
+
+ try
+ {
+ Scanner in = new Scanner(new File("solution.txt"));
+ String line;
+ String[] res;
+ while(in.hasNextLine())
+ {
+ line = in.nextLine();
+ res = line.split("=");
+ results.put(res[0],res[1]);
+
+ }
+ } catch (IOException e)
+ {
+ e.printStackTrace();
+ System.exit(1);
+ }
+
+ // "Drivers" table
+ s_drivers = new Schema(5);
+ f_drivers = new HeapFile("drivers");
+ idx_drivers = new HashIndex("drivers_idx");
+ loadTable(s_drivers, f_drivers, idx_drivers, "drivers");
+
+
+ s_driversBig = new Schema(5);
+ f_driversBig = new HeapFile("driversBig");
+ idx_driversBig = new HashIndex("drivers_idxBig");
+ loadTable(s_driversBig, f_driversBig, idx_driversBig, "driversBig");
+ // "Rides" table
+ s_rides = new Schema(4);
+ f_rides = new HeapFile("rides");
+ idx_rides = new HashIndex("rides_idx");
+ loadTable(s_rides, f_rides, idx_rides, "rides");
+
+ s_ridesBig = new Schema(4);
+ f_ridesBig = new HeapFile("ridesBig");
+ idx_ridesBig = new HashIndex("rides_idxBig");
+ loadTable(s_ridesBig, f_ridesBig, idx_ridesBig, "ridesBig");
+
+ // "Groups" table
+ s_groupsBig = new Schema(2);
+ f_groupsBig = new HeapFile("groupsBig");
+ idx_groupsBig = new HashIndex("groups_idxBig");
+ loadTable(s_groupsBig, f_groupsBig, idx_groupsBig, "groupsBig");
+
+ s_groups = new Schema(2);
+ f_groups = new HeapFile("groups");
+ idx_groups = new HashIndex("groups_idx");
+ loadTable(s_groups, f_groups, idx_groups, "groups");
+
+ System.out.println();
+
+ }
+
+ @AfterClass
+ public static void tearDownDB()
+ {
+ idx_drivers.deleteFile();
+ idx_rides.deleteFile();
+ idx_groups.deleteFile();
+ f_rides.deleteFile();
+ f_drivers.deleteFile();
+ f_groups.deleteFile();
+ rot.delete_minibase();
+ }
+
+ @Test
+ public void testFileScan() {
+ //Scan drivers table
+ Iterator fscan = new FileScan(s_drivers, f_drivers);
+ execute_and_compare("Filescan", "filescan", fscan);
+ }
+
+ @Test
+ public void testIndexScan() {
+ //Scan drivers index
+ Iterator idxscan = new IndexScan(s_drivers, idx_drivers, f_drivers);
+ execute_and_compare("IndexScan", "idxscan", idxscan);
+ }
+
+ @Test
+ public void testKeyScan() {
+ //Scan drivers index for key 20f
+ Iterator keyscan = new KeyScan(s_drivers, idx_drivers, new SearchKey(20f), f_drivers);
+ execute_and_compare("KeyScan", "keyscan", keyscan);
+ }
+
+ @Test
+ public void testSelection() {
+ //Selection drivers with age > 20
+ Iterator selection = new Selection(new FileScan(s_drivers, f_drivers),
+ new Predicate(AttrOperator.GT, AttrType.COLNAME, "age", AttrType.FLOAT, 20F));
+ execute_and_compare("Selection", "selection", selection);
+ }
+
+ @Test
+ public void testSelectionMultiplePredicates() {
+ Iterator selection_preds = new Selection(new FileScan(s_drivers, f_drivers),
+ new Predicate(AttrOperator.GT, AttrType.COLNAME, "age", AttrType.FLOAT, 23F),
+ new Predicate(AttrOperator.LT, AttrType.COLNAME, "age", AttrType.FLOAT, 19F));
+ execute_and_compare("Selection Multipled Predicates", "selection_preds", selection_preds);
+ }
+
+ @Test
+ public void testProjection() {
+ //Projection on Drivers: {FirstName, NumSeats}
+ Iterator projection = new Projection(new FileScan(s_drivers, f_drivers), s_drivers.fieldNumber("FirstName"), s_drivers.fieldNumber("NumSeats"));
+ execute_and_compare("Projection", "projection", projection);
+ }
+
+ @Test
+ public void testHashJoin() {
+ //HashJoin on Drivers X Rides on DriverID
+ Iterator hashjoin = new HashJoin(new FileScan(s_drivers, f_drivers),
+ new FileScan(s_rides, f_rides), 0, 0);
+ execute_and_compare("Hash Join", "hashjoin", hashjoin);
+ }
+
+ @Test
+ public void testSelectionPipelining() {
+ //Test all possible Iterator inputs to Selection
+ Iterator sel_idx = new Selection(new IndexScan(s_drivers, idx_drivers, f_drivers),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining IndexScan", "sel_idx", sel_idx);
+ Iterator sel_key = new Selection(new KeyScan(s_drivers, idx_drivers, new SearchKey(20F), f_drivers),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining Keyscan", "sel_key", sel_key);
+ Iterator sel_sel = new Selection(new Selection(new FileScan(s_drivers, f_drivers),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "Age", AttrType.FLOAT, 20F)),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining Selection", "sel_sel", sel_sel);
+ Iterator sel_proj = new Selection(new Projection(
+ new FileScan(s_drivers, f_drivers), s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("FirstName")),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining Projection", "sel_proj", sel_proj);
+ /* Iterator sel_sj = new Selection(new SimpleJoin(new FileScan(s_drivers, f_drivers), new FileScan(s_rides, f_rides),
+ new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 5)),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining Simple Join", "sel_sj", sel_sj);
+ */
+ Iterator sel_hj = new Selection(new HashJoin(new FileScan(s_drivers, f_drivers), new FileScan(s_rides, f_rides),0,0),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "FirstName", AttrType.STRING, "Walid"));
+ execute_and_compare("Selection - Pipelining Hash Join", "sel_jh", sel_hj);
+ }
+
+ @Test
+ public void testProjectionPipelining() {
+ //Test all possible Iterator inputs to HashJoin
+ Iterator proj_idx = new Projection(new IndexScan(s_drivers, idx_drivers, f_drivers),
+ s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("Age"));
+ execute_and_compare("Projection - Pipelining IndexScan", "proj_idx", proj_idx);
+ Iterator proj_key = new Projection(new KeyScan(s_drivers, idx_drivers, new SearchKey(20F), f_drivers),
+ s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("Age"));
+ execute_and_compare("Projection - Pipelining KeyScan", "proj_key", proj_key);
+ Iterator proj_sel = new Projection(new Selection(new FileScan(s_drivers, f_drivers),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "Age", AttrType.FLOAT, 20F)),
+ s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("Age"));
+ execute_and_compare("Projection - Pipelining Selection", "proj_sel", proj_sel);
+ Iterator proj_proj = new Projection(new Projection(new FileScan(s_drivers, f_drivers),
+ s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("FirstName"), s_drivers.fieldNumber("Age")),
+ 0, 2);
+ execute_and_compare("Projection - Pipelining Projection", "proj_proj", proj_proj);
+ /*
+ Iterator proj_sj = new Projection(new SimpleJoin(new FileScan(s_drivers, f_drivers), new FileScan(s_rides, f_rides),
+ new Predicate(AttrOperator.EQ, AttrType.FIELDNO, 0, AttrType.FIELDNO, 5)),
+ 0, 3);
+ execute_and_compare("Projection - Pipelining Simple Join", "proj_sj", proj_sj);
+ */
+ Iterator proj_hj = new Projection(new HashJoin(new FileScan(s_drivers, f_drivers), new FileScan(s_rides, f_rides),0,0),
+ 0, 3);
+ execute_and_compare("Projection - Pipelining Hash Join", "proj_hj", proj_hj);
+ }
+
+ @Test
+ public void testHashjoinPipelining() {
+ //Test all possible Iterator inputs to HashJoin
+ /*
+ Iterator hj_sel_sj = new HashJoin(new Selection(new FileScan(s_drivers, f_drivers),
+ new Predicate(AttrOperator.GTE, AttrType.COLNAME, "DriverId", AttrType.INTEGER, 1)),
+ new SimpleJoin(new FileScan(s_rides, f_rides), new FileScan(s_groups, f_groups),
+ new Predicate(AttrOperator.EQ, AttrType.COLNAME, "GroupId", AttrType.COLNAME, "DriverId")),0,0);
+ execute_and_compare("Hash Join - Pipelining Selection/Simple Join", "hj_sel_sj", hj_sel_sj);
+ */
+ Iterator hj_proj_hj = new HashJoin(new Projection(new FileScan(s_drivers, f_drivers), s_drivers.fieldNumber("DriverId"), s_drivers.fieldNumber("Age")),
+ new HashJoin(new FileScan(s_rides, f_rides), new FileScan(s_groups, f_groups), 1, 0), 0, 0);
+ execute_and_compare("Hash Join - Pipelining Projection/Hash Join", "hj_proj_hj", hj_proj_hj);
+ Iterator hj_iscan_kscan = new HashJoin(new IndexScan(s_drivers, idx_drivers, f_drivers),
+ new KeyScan(s_rides, idx_rides, new SearchKey(1), f_rides), 0, 0);
+ execute_and_compare("Hash Join - Pipelining IndexScan/KeyScan", "hj_iscan_kscan", hj_iscan_kscan);
+ }
+
+ //This is an EXTRA test to do Drivers X Drivers using HashJoin and we will calibrate this by changing the value of HashTableDup in the HashTableDup class
+ @Test
+ public void testHashJoinOnBigTables() {
+ //HashJoin on Drivers X Rides on DriverID
+ //Anytime the HashTableDup count goes over the threshold, a runtimeexception is thrown
+ Iterator hashSame = new HashJoin(new FileScan(s_drivers, f_drivers),
+ new FileScan(s_drivers, f_drivers), 0, 0);
+ execute_and_compare("Hash Join", "hashSame", hashSame);
+ }
+
+ //This is second EXTRA test to do DriversBig X DriversBig using HashJoin and we will calibrate this by changing the value of HashTableDup in the HashTableDup class
+ //Anytime the HashTableDup count goes over the threshold, a runtimeexception is thrown
+ //In addition, any call to Simplejoin throws a RunTimeException
+ @Test
+ public void testHashJoinOnEqualTables() {
+ //HashJoin on Drivers X Rides on DriverID
+ Iterator hashEqual = new HashJoin(new FileScan(s_driversBig, f_driversBig),
+ new FileScan(s_driversBig, f_driversBig), 0, 0);
+ execute_and_compare("Hash Join", "hashEqual", hashEqual);
+ }
+
+} // class ROTest extends TestDriver
diff --git a/Projects/p3-skeleton/cs448p3/src/test/java/tests/TestDriver.java b/Projects/p3-skeleton/cs448p3/src/test/java/tests/TestDriver.java
new file mode 100644
index 0000000..215f7d8
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/java/tests/TestDriver.java
@@ -0,0 +1,179 @@
+package tests;
+
+import global.GlobalConst;
+import global.Minibase;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * Minibase Test Driver
+ * This base class contains common code to each layer's test suite.
+ */
+class TestDriver implements GlobalConst {
+
+ /** Success value, for readability. */
+ protected static final boolean PASS = true;
+
+ /** Failure value, for readability. */
+ protected static final boolean FAIL = false;
+
+ // --------------------------------------------------------------------------
+
+ /** Default database file name. */
+ protected String DB_PATH = System.getProperty("user.name") + ".minibase";
+
+ /** Default database size (in pages). */
+ protected int DB_SIZE = 10000;
+
+ /** Default buffer pool size (in pages) */
+ protected int BUF_SIZE = 100;
+
+ /** Default buffer pool replacement policy */
+ protected String BUF_POLICY = "Clock";
+
+ // --------------------------------------------------------------------------
+
+ /** Random generator; use the same seed to make tests deterministic. */
+ protected Random random;
+
+ /**
+ * Counter values saved with a particular description.
+ */
+ protected class CountData {
+
+ public String desc;
+
+ public int reads;
+
+ public int writes;
+
+ public int allocs;
+
+ public int pinned;
+
+ } // protected class CountData
+
+ /**
+ * Incremental history of the performance counters; odd elements are snapshots
+ * before the tests, and even elements are after.
+ */
+ protected ArrayList counts;
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Deletes the database files from the disk.
+ */
+ protected void delete_minibase() {
+ new File(DB_PATH).delete();
+ }
+
+ /**
+ * Creates a new database on the disk.
+ */
+ protected void create_minibase() {
+ System.out.println("Creating database...\nReplacer: " + BUF_POLICY);
+ new Minibase(DB_PATH, DB_SIZE, BUF_SIZE, BUF_POLICY, false);
+ }
+
+ /**
+ * Loads an existing database from the disk.
+ */
+ protected void load_minibase() {
+ System.out.println("Loading database...\nReplacer: " + BUF_POLICY);
+ new Minibase(DB_PATH, DB_SIZE, BUF_SIZE, BUF_POLICY, true);
+ }
+
+ // --------------------------------------------------------------------------
+
+ /**
+ * Resets the random generator to the default seed.
+ */
+ protected void initRandom() {
+ random = new Random(74);
+ }
+
+ /**
+ * Resets the performance counter history.
+ */
+ protected void initCounts() {
+ counts = new ArrayList();
+ }
+
+ /**
+ * Saves the current performance counters, given the description.
+ */
+ protected void saveCounts(String desc) {
+
+ // create the new count data
+ CountData data = new CountData();
+ counts.add(data);
+ data.desc = desc;
+
+ // save the counts (in correct order)
+ Minibase.BufferManager.flushAllPages();
+ data.reads = Minibase.DiskManager.getReadCount();
+ data.writes = Minibase.DiskManager.getWriteCount();
+ data.allocs = Minibase.DiskManager.getAllocCount();
+ data.pinned = BUF_SIZE - Minibase.BufferManager.getNumUnpinned();
+
+ } // protected void saveCounts(String desc)
+
+ /**
+ * Prints the performance counters (i.e. for the current test).
+ */
+ protected void printCounters() {
+
+ CountData data = counts.get(counts.size() - 1);
+ System.out.println();
+ Minibase.BufferManager.flushAllPages();
+ System.out.println(" *** Number of reads: "
+ + (Minibase.DiskManager.getReadCount() - data.reads));
+ System.out.println(" *** Number of writes: "
+ + (Minibase.DiskManager.getWriteCount() - data.writes));
+ System.out.println(" *** Net total pages: "
+ + (Minibase.DiskManager.getAllocCount() - data.allocs));
+ int numbufs = Minibase.BufferManager.getNumBuffers();
+ System.out
+ .println(" *** Remaining Pinned: "
+ + (numbufs - Minibase.BufferManager.getNumUnpinned()) + " / "
+ + numbufs);
+
+ } // protected void printCounters()
+
+ /**
+ * Prints the complete history of the performance counters.
+ *
+ * @param sepcnt how many lines to print before each separator
+ */
+ protected void printSummary(int sepcnt) {
+
+ System.out.println();
+ String seperator = "--------------------------------------";
+ System.out.println(seperator);
+ System.out.println("\tReads\tWrites\tAllocs\tPinned");
+ int size = counts.size();
+ for (int i = 1; i < size; i += 2) {
+
+ if (i % (sepcnt * 2) == 1) {
+ System.out.println(seperator);
+ }
+
+ CountData before = counts.get(i - 1);
+ CountData after = counts.get(i);
+ System.out.print(after.desc);
+
+ System.out.print("\t" + (after.reads - before.reads));
+ System.out.print("\t" + (after.writes - before.writes));
+ System.out.print("\t" + (after.allocs - before.allocs));
+ System.out.print("\t" + (after.pinned - before.pinned));
+ System.out.println();
+
+ } // for
+ System.out.println(seperator);
+
+ } // protected void printSummary(int sepcnt)
+
+} // class TestDriver implements GlobalConst
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.csv
new file mode 100644
index 0000000..bef7605
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.csv
@@ -0,0 +1,9 @@
+1, "Ahmed", "Elmagarmid", 25, 5
+2, "Walid", "Aref", 20, 13
+3, "Christopher", "Clifton", 18, 4
+4, "Sunil", "Prabhakar", 22, 7
+5, "Elisa", "Bertino", 26, 5
+6, "Susanne", "Hambrusch", 23, 3
+7, "David", "Eberts", 24, 8
+8, "Arif", "Ghafoor", 20, 5
+9, "Jeff", "Vitter", 19, 10
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.json b/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.json
new file mode 100644
index 0000000..7c7c7c5
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/drivers.json
@@ -0,0 +1,35 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "DriverId"
+ },
+ {
+ "no": 1,
+ "type": "STRING",
+ "length": 20,
+ "name": "FirstName"
+ },
+ {
+ "no": 2,
+ "type": "STRING",
+ "length": 20,
+ "name": "LastName"
+ },
+ {
+ "no": 3,
+ "type": "FLOAT",
+ "length": 4,
+ "name": "Age"
+ },
+ {
+ "no": 4,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "NumSeats"
+ }
+ ],
+ "key": 3
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.csv
new file mode 100644
index 0000000..fae9cec
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.csv
@@ -0,0 +1,1010 @@
+1," ""Ahmed"""," ""Elmagarmid""",25,5
+2," ""Walid"""," ""Aref""",20,13
+3," ""Christopher"""," ""Clifton""",18,4
+4," ""Sunil"""," ""Prabhakar""",22,7
+5," ""Elisa"""," ""Bertino""",26,5
+6," ""Susanne"""," ""Hambrusch""",23,3
+7," ""David"""," ""Eberts""",24,8
+8," ""Arif"""," ""Ghafoor""",20,5
+9," ""Jeff"""," ""Vitter""",19,10
+10,"""Adnan""","""Bob""",19,10
+11,"""Adnan""","""Edgardo""",19,10
+12,"""Adnan""","""Bob""",19,10
+13,"""Adnan""","""Edgardo""",19,10
+14,"""Adnan""","""Bob""",19,10
+15,"""Adnan""","""Edgardo""",19,10
+16,"""Adnan""","""Bob""",19,10
+17,"""Adnan""","""Edgardo""",19,10
+18,"""Adnan""","""Bob""",19,10
+19,"""Adnan""","""Edgardo""",19,10
+20,"""Adnan""","""Bob""",19,10
+21,"""Adnan""","""Edgardo""",19,10
+22,"""Adnan""","""Bob""",19,10
+23,"""Adnan""","""Edgardo""",19,10
+24,"""Adnan""","""Bob""",19,10
+25,"""Adnan""","""Edgardo""",19,10
+26,"""Adnan""","""Bob""",19,10
+27,"""Adnan""","""Edgardo""",19,10
+28,"""Adnan""","""Bob""",19,10
+29,"""Adnan""","""Edgardo""",19,10
+30,"""Adnan""","""Bob""",19,10
+31,"""Adnan""","""Edgardo""",19,10
+32,"""Adnan""","""Bob""",19,10
+33,"""Adnan""","""Edgardo""",19,10
+34,"""Adnan""","""Bob""",19,10
+35,"""Adnan""","""Edgardo""",19,10
+36,"""Adnan""","""Bob""",19,10
+37,"""Adnan""","""Edgardo""",19,10
+38,"""Adnan""","""Bob""",19,10
+39,"""Adnan""","""Edgardo""",19,10
+40,"""Adnan""","""Bob""",19,10
+41,"""Adnan""","""Edgardo""",19,10
+42,"""Adnan""","""Bob""",19,10
+43,"""Adnan""","""Edgardo""",19,10
+44,"""Adnan""","""Bob""",19,10
+45,"""Adnan""","""Edgardo""",19,10
+46,"""Adnan""","""Bob""",19,10
+47,"""Adnan""","""Edgardo""",19,10
+48,"""Adnan""","""Bob""",19,10
+49,"""Adnan""","""Edgardo""",19,10
+50,"""Adnan""","""Bob""",19,10
+51,"""Adnan""","""Edgardo""",19,10
+52,"""Adnan""","""Bob""",19,10
+53,"""Adnan""","""Edgardo""",19,10
+54,"""Adnan""","""Bob""",19,10
+55,"""Adnan""","""Edgardo""",19,10
+56,"""Adnan""","""Bob""",19,10
+57,"""Adnan""","""Edgardo""",19,10
+58,"""Adnan""","""Bob""",19,10
+59,"""Adnan""","""Edgardo""",19,10
+60,"""Adnan""","""Bob""",19,10
+61,"""Adnan""","""Edgardo""",19,10
+62,"""Adnan""","""Bob""",19,10
+63,"""Adnan""","""Edgardo""",19,10
+64,"""Adnan""","""Bob""",19,10
+65,"""Adnan""","""Edgardo""",19,10
+66,"""Adnan""","""Bob""",19,10
+67,"""Adnan""","""Edgardo""",19,10
+68,"""Adnan""","""Bob""",19,10
+69,"""Adnan""","""Edgardo""",19,10
+70,"""Adnan""","""Bob""",19,10
+71,"""Adnan""","""Edgardo""",19,10
+72,"""Adnan""","""Bob""",19,10
+73,"""Adnan""","""Edgardo""",19,10
+74,"""Adnan""","""Bob""",19,10
+75,"""Adnan""","""Edgardo""",19,10
+76,"""Adnan""","""Bob""",19,10
+77,"""Adnan""","""Edgardo""",19,10
+78,"""Adnan""","""Bob""",19,10
+79,"""Adnan""","""Edgardo""",19,10
+80,"""Adnan""","""Bob""",19,10
+81,"""Adnan""","""Edgardo""",19,10
+82,"""Adnan""","""Bob""",19,10
+83,"""Adnan""","""Edgardo""",19,10
+84,"""Adnan""","""Bob""",19,10
+85,"""Adnan""","""Edgardo""",19,10
+86,"""Adnan""","""Bob""",19,10
+87,"""Adnan""","""Edgardo""",19,10
+88,"""Adnan""","""Bob""",19,10
+89,"""Adnan""","""Edgardo""",19,10
+90,"""Adnan""","""Bob""",19,10
+91,"""Adnan""","""Edgardo""",19,10
+92,"""Adnan""","""Bob""",19,10
+93,"""Adnan""","""Edgardo""",19,10
+94,"""Adnan""","""Bob""",19,10
+95,"""Adnan""","""Edgardo""",19,10
+96,"""Adnan""","""Bob""",19,10
+97,"""Adnan""","""Edgardo""",19,10
+98,"""Adnan""","""Bob""",19,10
+99,"""Adnan""","""Edgardo""",19,10
+100,"""Adnan""","""Bob""",19,10
+101,"""Adnan""","""Edgardo""",19,10
+102,"""Adnan""","""Bob""",19,10
+103,"""Adnan""","""Edgardo""",19,10
+104,"""Adnan""","""Bob""",19,10
+105,"""Adnan""","""Edgardo""",19,10
+106,"""Adnan""","""Bob""",19,10
+107,"""Adnan""","""Edgardo""",19,10
+108,"""Adnan""","""Bob""",19,10
+109,"""Adnan""","""Edgardo""",19,10
+110,"""Adnan""","""Bob""",19,10
+111,"""Adnan""","""Edgardo""",19,10
+112,"""Adnan""","""Bob""",19,10
+113,"""Adnan""","""Edgardo""",19,10
+114,"""Adnan""","""Bob""",19,10
+115,"""Adnan""","""Edgardo""",19,10
+116,"""Adnan""","""Bob""",19,10
+117,"""Adnan""","""Edgardo""",19,10
+118,"""Adnan""","""Bob""",19,10
+119,"""Adnan""","""Edgardo""",19,10
+120,"""Adnan""","""Bob""",19,10
+121,"""Adnan""","""Edgardo""",19,10
+122,"""Adnan""","""Bob""",19,10
+123,"""Adnan""","""Edgardo""",19,10
+124,"""Adnan""","""Bob""",19,10
+125,"""Adnan""","""Edgardo""",19,10
+126,"""Adnan""","""Bob""",19,10
+127,"""Adnan""","""Edgardo""",19,10
+128,"""Adnan""","""Bob""",19,10
+129,"""Adnan""","""Edgardo""",19,10
+130,"""Adnan""","""Bob""",19,10
+131,"""Adnan""","""Edgardo""",19,10
+132,"""Adnan""","""Bob""",19,10
+133,"""Adnan""","""Edgardo""",19,10
+134,"""Adnan""","""Bob""",19,10
+135,"""Adnan""","""Edgardo""",19,10
+136,"""Adnan""","""Bob""",19,10
+137,"""Adnan""","""Edgardo""",19,10
+138,"""Adnan""","""Bob""",19,10
+139,"""Adnan""","""Edgardo""",19,10
+140,"""Adnan""","""Bob""",19,10
+141,"""Adnan""","""Edgardo""",19,10
+142,"""Adnan""","""Bob""",19,10
+143,"""Adnan""","""Edgardo""",19,10
+144,"""Adnan""","""Bob""",19,10
+145,"""Adnan""","""Edgardo""",19,10
+146,"""Adnan""","""Bob""",19,10
+147,"""Adnan""","""Edgardo""",19,10
+148,"""Adnan""","""Bob""",19,10
+149,"""Adnan""","""Edgardo""",19,10
+150,"""Adnan""","""Bob""",19,10
+151,"""Adnan""","""Edgardo""",19,10
+152,"""Adnan""","""Bob""",19,10
+153,"""Adnan""","""Edgardo""",19,10
+154,"""Adnan""","""Bob""",19,10
+155,"""Adnan""","""Edgardo""",19,10
+156,"""Adnan""","""Bob""",19,10
+157,"""Adnan""","""Edgardo""",19,10
+158,"""Adnan""","""Bob""",19,10
+159,"""Adnan""","""Edgardo""",19,10
+160,"""Adnan""","""Bob""",19,10
+161,"""Adnan""","""Edgardo""",19,10
+162,"""Adnan""","""Bob""",19,10
+163,"""Adnan""","""Edgardo""",19,10
+164,"""Adnan""","""Bob""",19,10
+165,"""Adnan""","""Edgardo""",19,10
+166,"""Adnan""","""Bob""",19,10
+167,"""Adnan""","""Edgardo""",19,10
+168,"""Adnan""","""Bob""",19,10
+169,"""Adnan""","""Edgardo""",19,10
+170,"""Adnan""","""Bob""",19,10
+171,"""Adnan""","""Edgardo""",19,10
+172,"""Adnan""","""Bob""",19,10
+173,"""Adnan""","""Edgardo""",19,10
+174,"""Adnan""","""Bob""",19,10
+175,"""Adnan""","""Edgardo""",19,10
+176,"""Adnan""","""Bob""",19,10
+177,"""Adnan""","""Edgardo""",19,10
+178,"""Adnan""","""Bob""",19,10
+179,"""Adnan""","""Edgardo""",19,10
+180,"""Adnan""","""Bob""",19,10
+181,"""Adnan""","""Edgardo""",19,10
+182,"""Adnan""","""Bob""",19,10
+183,"""Adnan""","""Edgardo""",19,10
+184,"""Adnan""","""Bob""",19,10
+185,"""Adnan""","""Edgardo""",19,10
+186,"""Adnan""","""Bob""",19,10
+187,"""Adnan""","""Edgardo""",19,10
+188,"""Adnan""","""Bob""",19,10
+189,"""Adnan""","""Edgardo""",19,10
+190,"""Adnan""","""Bob""",19,10
+191,"""Adnan""","""Edgardo""",19,10
+192,"""Adnan""","""Bob""",19,10
+193,"""Adnan""","""Edgardo""",19,10
+194,"""Adnan""","""Bob""",19,10
+195,"""Adnan""","""Edgardo""",19,10
+196,"""Adnan""","""Bob""",19,10
+197,"""Adnan""","""Edgardo""",19,10
+198,"""Adnan""","""Bob""",19,10
+199,"""Adnan""","""Edgardo""",19,10
+200,"""Adnan""","""Bob""",19,10
+201,"""Adnan""","""Edgardo""",19,10
+202,"""Adnan""","""Bob""",19,10
+203,"""Adnan""","""Edgardo""",19,10
+204,"""Adnan""","""Bob""",19,10
+205,"""Adnan""","""Edgardo""",19,10
+206,"""Adnan""","""Bob""",19,10
+207,"""Adnan""","""Edgardo""",19,10
+208,"""Adnan""","""Bob""",19,10
+209,"""Adnan""","""Edgardo""",19,10
+210,"""Adnan""","""Bob""",19,10
+211,"""Adnan""","""Edgardo""",19,10
+212,"""Adnan""","""Bob""",19,10
+213,"""Adnan""","""Edgardo""",19,10
+214,"""Adnan""","""Bob""",19,10
+215,"""Adnan""","""Edgardo""",19,10
+216,"""Adnan""","""Bob""",19,10
+217,"""Adnan""","""Edgardo""",19,10
+218,"""Adnan""","""Bob""",19,10
+219,"""Adnan""","""Edgardo""",19,10
+220,"""Adnan""","""Bob""",19,10
+221,"""Adnan""","""Edgardo""",19,10
+222,"""Adnan""","""Bob""",19,10
+223,"""Adnan""","""Edgardo""",19,10
+224,"""Adnan""","""Bob""",19,10
+225,"""Adnan""","""Edgardo""",19,10
+226,"""Adnan""","""Bob""",19,10
+227,"""Adnan""","""Edgardo""",19,10
+228,"""Adnan""","""Bob""",19,10
+229,"""Adnan""","""Edgardo""",19,10
+230,"""Adnan""","""Bob""",19,10
+231,"""Adnan""","""Edgardo""",19,10
+232,"""Adnan""","""Bob""",19,10
+233,"""Adnan""","""Edgardo""",19,10
+234,"""Adnan""","""Bob""",19,10
+235,"""Adnan""","""Edgardo""",19,10
+236,"""Adnan""","""Bob""",19,10
+237,"""Adnan""","""Edgardo""",19,10
+238,"""Adnan""","""Bob""",19,10
+239,"""Adnan""","""Edgardo""",19,10
+240,"""Adnan""","""Bob""",19,10
+241,"""Adnan""","""Edgardo""",19,10
+242,"""Adnan""","""Bob""",19,10
+243,"""Adnan""","""Edgardo""",19,10
+244,"""Adnan""","""Bob""",19,10
+245,"""Adnan""","""Edgardo""",19,10
+246,"""Adnan""","""Bob""",19,10
+247,"""Adnan""","""Edgardo""",19,10
+248,"""Adnan""","""Bob""",19,10
+249,"""Adnan""","""Edgardo""",19,10
+250,"""Adnan""","""Bob""",19,10
+251,"""Adnan""","""Edgardo""",19,10
+252,"""Adnan""","""Bob""",19,10
+253,"""Adnan""","""Edgardo""",19,10
+254,"""Adnan""","""Bob""",19,10
+255,"""Adnan""","""Edgardo""",19,10
+256,"""Adnan""","""Bob""",19,10
+257,"""Adnan""","""Edgardo""",19,10
+258,"""Adnan""","""Bob""",19,10
+259,"""Adnan""","""Edgardo""",19,10
+260,"""Adnan""","""Bob""",19,10
+261,"""Adnan""","""Edgardo""",19,10
+262,"""Adnan""","""Bob""",19,10
+263,"""Adnan""","""Edgardo""",19,10
+264,"""Adnan""","""Bob""",19,10
+265,"""Adnan""","""Edgardo""",19,10
+266,"""Adnan""","""Bob""",19,10
+267,"""Adnan""","""Edgardo""",19,10
+268,"""Adnan""","""Bob""",19,10
+269,"""Adnan""","""Edgardo""",19,10
+270,"""Adnan""","""Bob""",19,10
+271,"""Adnan""","""Edgardo""",19,10
+272,"""Adnan""","""Bob""",19,10
+273,"""Adnan""","""Edgardo""",19,10
+274,"""Adnan""","""Bob""",19,10
+275,"""Adnan""","""Edgardo""",19,10
+276,"""Adnan""","""Bob""",19,10
+277,"""Adnan""","""Edgardo""",19,10
+278,"""Adnan""","""Bob""",19,10
+279,"""Adnan""","""Edgardo""",19,10
+280,"""Adnan""","""Bob""",19,10
+281,"""Adnan""","""Edgardo""",19,10
+282,"""Adnan""","""Bob""",19,10
+283,"""Adnan""","""Edgardo""",19,10
+284,"""Adnan""","""Bob""",19,10
+285,"""Adnan""","""Edgardo""",19,10
+286,"""Adnan""","""Bob""",19,10
+287,"""Adnan""","""Edgardo""",19,10
+288,"""Adnan""","""Bob""",19,10
+289,"""Adnan""","""Edgardo""",19,10
+290,"""Adnan""","""Bob""",19,10
+291,"""Adnan""","""Edgardo""",19,10
+292,"""Adnan""","""Bob""",19,10
+293,"""Adnan""","""Edgardo""",19,10
+294,"""Adnan""","""Bob""",19,10
+295,"""Adnan""","""Edgardo""",19,10
+296,"""Adnan""","""Bob""",19,10
+297,"""Adnan""","""Edgardo""",19,10
+298,"""Adnan""","""Bob""",19,10
+299,"""Adnan""","""Edgardo""",19,10
+300,"""Adnan""","""Bob""",19,10
+301,"""Adnan""","""Edgardo""",19,10
+302,"""Adnan""","""Bob""",19,10
+303,"""Adnan""","""Edgardo""",19,10
+304,"""Adnan""","""Bob""",19,10
+305,"""Adnan""","""Edgardo""",19,10
+306,"""Adnan""","""Bob""",19,10
+307,"""Adnan""","""Edgardo""",19,10
+308,"""Adnan""","""Bob""",19,10
+309,"""Adnan""","""Edgardo""",19,10
+310,"""Adnan""","""Bob""",19,10
+311,"""Adnan""","""Edgardo""",19,10
+312,"""Adnan""","""Bob""",19,10
+313,"""Adnan""","""Edgardo""",19,10
+314,"""Adnan""","""Bob""",19,10
+315,"""Adnan""","""Edgardo""",19,10
+316,"""Adnan""","""Bob""",19,10
+317,"""Adnan""","""Edgardo""",19,10
+318,"""Adnan""","""Bob""",19,10
+319,"""Adnan""","""Edgardo""",19,10
+320,"""Adnan""","""Bob""",19,10
+321,"""Adnan""","""Edgardo""",19,10
+322,"""Adnan""","""Bob""",19,10
+323,"""Adnan""","""Edgardo""",19,10
+324,"""Adnan""","""Bob""",19,10
+325,"""Adnan""","""Edgardo""",19,10
+326,"""Adnan""","""Bob""",19,10
+327,"""Adnan""","""Edgardo""",19,10
+328,"""Adnan""","""Bob""",19,10
+329,"""Adnan""","""Edgardo""",19,10
+330,"""Adnan""","""Bob""",19,10
+331,"""Adnan""","""Edgardo""",19,10
+332,"""Adnan""","""Bob""",19,10
+333,"""Adnan""","""Edgardo""",19,10
+334,"""Adnan""","""Bob""",19,10
+335,"""Adnan""","""Edgardo""",19,10
+336,"""Adnan""","""Bob""",19,10
+337,"""Adnan""","""Edgardo""",19,10
+338,"""Adnan""","""Bob""",19,10
+339,"""Adnan""","""Edgardo""",19,10
+340,"""Adnan""","""Bob""",19,10
+341,"""Adnan""","""Edgardo""",19,10
+342,"""Adnan""","""Bob""",19,10
+343,"""Adnan""","""Edgardo""",19,10
+344,"""Adnan""","""Bob""",19,10
+345,"""Adnan""","""Edgardo""",19,10
+346,"""Adnan""","""Bob""",19,10
+347,"""Adnan""","""Edgardo""",19,10
+348,"""Adnan""","""Bob""",19,10
+349,"""Adnan""","""Edgardo""",19,10
+350,"""Adnan""","""Bob""",19,10
+351,"""Adnan""","""Edgardo""",19,10
+352,"""Adnan""","""Bob""",19,10
+353,"""Adnan""","""Edgardo""",19,10
+354,"""Adnan""","""Bob""",19,10
+355,"""Adnan""","""Edgardo""",19,10
+356,"""Adnan""","""Bob""",19,10
+357,"""Adnan""","""Edgardo""",19,10
+358,"""Adnan""","""Bob""",19,10
+359,"""Adnan""","""Edgardo""",19,10
+360,"""Adnan""","""Bob""",19,10
+361,"""Adnan""","""Edgardo""",19,10
+362,"""Adnan""","""Bob""",19,10
+363,"""Adnan""","""Edgardo""",19,10
+364,"""Adnan""","""Bob""",19,10
+365,"""Adnan""","""Edgardo""",19,10
+366,"""Adnan""","""Bob""",19,10
+367,"""Adnan""","""Edgardo""",19,10
+368,"""Adnan""","""Bob""",19,10
+369,"""Adnan""","""Edgardo""",19,10
+370,"""Adnan""","""Bob""",19,10
+371,"""Adnan""","""Edgardo""",19,10
+372,"""Adnan""","""Bob""",19,10
+373,"""Adnan""","""Edgardo""",19,10
+374,"""Adnan""","""Bob""",19,10
+375,"""Adnan""","""Edgardo""",19,10
+376,"""Adnan""","""Bob""",19,10
+377,"""Adnan""","""Edgardo""",19,10
+378,"""Adnan""","""Bob""",19,10
+379,"""Adnan""","""Edgardo""",19,10
+380,"""Adnan""","""Bob""",19,10
+381,"""Adnan""","""Edgardo""",19,10
+382,"""Adnan""","""Bob""",19,10
+383,"""Adnan""","""Edgardo""",19,10
+384,"""Adnan""","""Bob""",19,10
+385,"""Adnan""","""Edgardo""",19,10
+386,"""Adnan""","""Bob""",19,10
+387,"""Adnan""","""Edgardo""",19,10
+388,"""Adnan""","""Bob""",19,10
+389,"""Adnan""","""Edgardo""",19,10
+390,"""Adnan""","""Bob""",19,10
+391,"""Adnan""","""Edgardo""",19,10
+392,"""Adnan""","""Bob""",19,10
+393,"""Adnan""","""Edgardo""",19,10
+394,"""Adnan""","""Bob""",19,10
+395,"""Adnan""","""Edgardo""",19,10
+396,"""Adnan""","""Bob""",19,10
+397,"""Adnan""","""Edgardo""",19,10
+398,"""Adnan""","""Bob""",19,10
+399,"""Adnan""","""Edgardo""",19,10
+400,"""Adnan""","""Bob""",19,10
+401,"""Adnan""","""Edgardo""",19,10
+402,"""Adnan""","""Bob""",19,10
+403,"""Adnan""","""Edgardo""",19,10
+404,"""Adnan""","""Bob""",19,10
+405,"""Adnan""","""Edgardo""",19,10
+406,"""Adnan""","""Bob""",19,10
+407,"""Adnan""","""Edgardo""",19,10
+408,"""Adnan""","""Bob""",19,10
+409,"""Adnan""","""Edgardo""",19,10
+410,"""Adnan""","""Bob""",19,10
+411,"""Adnan""","""Edgardo""",19,10
+412,"""Adnan""","""Bob""",19,10
+413,"""Adnan""","""Edgardo""",19,10
+414,"""Adnan""","""Bob""",19,10
+415,"""Adnan""","""Edgardo""",19,10
+416,"""Adnan""","""Bob""",19,10
+417,"""Adnan""","""Edgardo""",19,10
+418,"""Adnan""","""Bob""",19,10
+419,"""Adnan""","""Edgardo""",19,10
+420,"""Adnan""","""Bob""",19,10
+421,"""Adnan""","""Edgardo""",19,10
+422,"""Adnan""","""Bob""",19,10
+423,"""Adnan""","""Edgardo""",19,10
+424,"""Adnan""","""Bob""",19,10
+425,"""Adnan""","""Edgardo""",19,10
+426,"""Adnan""","""Bob""",19,10
+427,"""Adnan""","""Edgardo""",19,10
+428,"""Adnan""","""Bob""",19,10
+429,"""Adnan""","""Edgardo""",19,10
+430,"""Adnan""","""Bob""",19,10
+431,"""Adnan""","""Edgardo""",19,10
+432,"""Adnan""","""Bob""",19,10
+433,"""Adnan""","""Edgardo""",19,10
+434,"""Adnan""","""Bob""",19,10
+435,"""Adnan""","""Edgardo""",19,10
+436,"""Adnan""","""Bob""",19,10
+437,"""Adnan""","""Edgardo""",19,10
+438,"""Adnan""","""Bob""",19,10
+439,"""Adnan""","""Edgardo""",19,10
+440,"""Adnan""","""Bob""",19,10
+441,"""Adnan""","""Edgardo""",19,10
+442,"""Adnan""","""Bob""",19,10
+443,"""Adnan""","""Edgardo""",19,10
+444,"""Adnan""","""Bob""",19,10
+445,"""Adnan""","""Edgardo""",19,10
+446,"""Adnan""","""Bob""",19,10
+447,"""Adnan""","""Edgardo""",19,10
+448,"""Adnan""","""Bob""",19,10
+449,"""Adnan""","""Edgardo""",19,10
+450,"""Adnan""","""Bob""",19,10
+451,"""Adnan""","""Edgardo""",19,10
+452,"""Adnan""","""Bob""",19,10
+453,"""Adnan""","""Edgardo""",19,10
+454,"""Adnan""","""Bob""",19,10
+455,"""Adnan""","""Edgardo""",19,10
+456,"""Adnan""","""Bob""",19,10
+457,"""Adnan""","""Edgardo""",19,10
+458,"""Adnan""","""Bob""",19,10
+459,"""Adnan""","""Edgardo""",19,10
+460,"""Adnan""","""Bob""",19,10
+461,"""Adnan""","""Edgardo""",19,10
+462,"""Adnan""","""Bob""",19,10
+463,"""Adnan""","""Edgardo""",19,10
+464,"""Adnan""","""Bob""",19,10
+465,"""Adnan""","""Edgardo""",19,10
+466,"""Adnan""","""Bob""",19,10
+467,"""Adnan""","""Edgardo""",19,10
+468,"""Adnan""","""Bob""",19,10
+469,"""Adnan""","""Edgardo""",19,10
+470,"""Adnan""","""Bob""",19,10
+471,"""Adnan""","""Edgardo""",19,10
+472,"""Adnan""","""Bob""",19,10
+473,"""Adnan""","""Edgardo""",19,10
+474,"""Adnan""","""Bob""",19,10
+475,"""Adnan""","""Edgardo""",19,10
+476,"""Adnan""","""Bob""",19,10
+477,"""Adnan""","""Edgardo""",19,10
+478,"""Adnan""","""Bob""",19,10
+479,"""Adnan""","""Edgardo""",19,10
+480,"""Adnan""","""Bob""",19,10
+481,"""Adnan""","""Edgardo""",19,10
+482,"""Adnan""","""Bob""",19,10
+483,"""Adnan""","""Edgardo""",19,10
+484,"""Adnan""","""Bob""",19,10
+485,"""Adnan""","""Edgardo""",19,10
+486,"""Adnan""","""Bob""",19,10
+487,"""Adnan""","""Edgardo""",19,10
+488,"""Adnan""","""Bob""",19,10
+489,"""Adnan""","""Edgardo""",19,10
+490,"""Adnan""","""Bob""",19,10
+491,"""Adnan""","""Edgardo""",19,10
+492,"""Adnan""","""Bob""",19,10
+493,"""Adnan""","""Edgardo""",19,10
+494,"""Adnan""","""Bob""",19,10
+495,"""Adnan""","""Edgardo""",19,10
+496,"""Adnan""","""Bob""",19,10
+497,"""Adnan""","""Edgardo""",19,10
+498,"""Adnan""","""Bob""",19,10
+499,"""Adnan""","""Edgardo""",19,10
+500,"""Adnan""","""Bob""",19,10
+501,"""Adnan""","""Edgardo""",19,10
+502,"""Adnan""","""Bob""",19,10
+503,"""Adnan""","""Edgardo""",19,10
+504,"""Adnan""","""Bob""",19,10
+505,"""Adnan""","""Edgardo""",19,10
+506,"""Adnan""","""Bob""",19,10
+507,"""Adnan""","""Edgardo""",19,10
+508,"""Adnan""","""Bob""",19,10
+509,"""Adnan""","""Edgardo""",19,10
+510,"""Adnan""","""Bob""",19,10
+511,"""Adnan""","""Edgardo""",19,10
+512,"""Adnan""","""Bob""",19,10
+513,"""Adnan""","""Edgardo""",19,10
+514,"""Adnan""","""Bob""",19,10
+515,"""Adnan""","""Edgardo""",19,10
+516,"""Adnan""","""Bob""",19,10
+517,"""Adnan""","""Edgardo""",19,10
+518,"""Adnan""","""Bob""",19,10
+519,"""Adnan""","""Edgardo""",19,10
+520,"""Adnan""","""Bob""",19,10
+521,"""Adnan""","""Edgardo""",19,10
+522,"""Adnan""","""Bob""",19,10
+523,"""Adnan""","""Edgardo""",19,10
+524,"""Adnan""","""Bob""",19,10
+525,"""Adnan""","""Edgardo""",19,10
+526,"""Adnan""","""Bob""",19,10
+527,"""Adnan""","""Edgardo""",19,10
+528,"""Adnan""","""Bob""",19,10
+529,"""Adnan""","""Edgardo""",19,10
+530,"""Adnan""","""Bob""",19,10
+531,"""Adnan""","""Edgardo""",19,10
+532,"""Adnan""","""Bob""",19,10
+533,"""Adnan""","""Edgardo""",19,10
+534,"""Adnan""","""Bob""",19,10
+535,"""Adnan""","""Edgardo""",19,10
+536,"""Adnan""","""Bob""",19,10
+537,"""Adnan""","""Edgardo""",19,10
+538,"""Adnan""","""Bob""",19,10
+539,"""Adnan""","""Edgardo""",19,10
+540,"""Adnan""","""Bob""",19,10
+541,"""Adnan""","""Edgardo""",19,10
+542,"""Adnan""","""Bob""",19,10
+543,"""Adnan""","""Edgardo""",19,10
+544,"""Adnan""","""Bob""",19,10
+545,"""Adnan""","""Edgardo""",19,10
+546,"""Adnan""","""Bob""",19,10
+547,"""Adnan""","""Edgardo""",19,10
+548,"""Adnan""","""Bob""",19,10
+549,"""Adnan""","""Edgardo""",19,10
+550,"""Adnan""","""Bob""",19,10
+551,"""Adnan""","""Edgardo""",19,10
+552,"""Adnan""","""Bob""",19,10
+553,"""Adnan""","""Edgardo""",19,10
+554,"""Adnan""","""Bob""",19,10
+555,"""Adnan""","""Edgardo""",19,10
+556,"""Adnan""","""Bob""",19,10
+557,"""Adnan""","""Edgardo""",19,10
+558,"""Adnan""","""Bob""",19,10
+559,"""Adnan""","""Edgardo""",19,10
+560,"""Adnan""","""Bob""",19,10
+561,"""Adnan""","""Edgardo""",19,10
+562,"""Adnan""","""Bob""",19,10
+563,"""Adnan""","""Edgardo""",19,10
+564,"""Adnan""","""Bob""",19,10
+565,"""Adnan""","""Edgardo""",19,10
+566,"""Adnan""","""Bob""",19,10
+567,"""Adnan""","""Edgardo""",19,10
+568,"""Adnan""","""Bob""",19,10
+569,"""Adnan""","""Edgardo""",19,10
+570,"""Adnan""","""Bob""",19,10
+571,"""Adnan""","""Edgardo""",19,10
+572,"""Adnan""","""Bob""",19,10
+573,"""Adnan""","""Edgardo""",19,10
+574,"""Adnan""","""Bob""",19,10
+575,"""Adnan""","""Edgardo""",19,10
+576,"""Adnan""","""Bob""",19,10
+577,"""Adnan""","""Edgardo""",19,10
+578,"""Adnan""","""Bob""",19,10
+579,"""Adnan""","""Edgardo""",19,10
+580,"""Adnan""","""Bob""",19,10
+581,"""Adnan""","""Edgardo""",19,10
+582,"""Adnan""","""Bob""",19,10
+583,"""Adnan""","""Edgardo""",19,10
+584,"""Adnan""","""Bob""",19,10
+585,"""Adnan""","""Edgardo""",19,10
+586,"""Adnan""","""Bob""",19,10
+587,"""Adnan""","""Edgardo""",19,10
+588,"""Adnan""","""Bob""",19,10
+589,"""Adnan""","""Edgardo""",19,10
+590,"""Adnan""","""Bob""",19,10
+591,"""Adnan""","""Edgardo""",19,10
+592,"""Adnan""","""Bob""",19,10
+593,"""Adnan""","""Edgardo""",19,10
+594,"""Adnan""","""Bob""",19,10
+595,"""Adnan""","""Edgardo""",19,10
+596,"""Adnan""","""Bob""",19,10
+597,"""Adnan""","""Edgardo""",19,10
+598,"""Adnan""","""Bob""",19,10
+599,"""Adnan""","""Edgardo""",19,10
+600,"""Adnan""","""Bob""",19,10
+601,"""Adnan""","""Edgardo""",19,10
+602,"""Adnan""","""Bob""",19,10
+603,"""Adnan""","""Edgardo""",19,10
+604,"""Adnan""","""Bob""",19,10
+605,"""Adnan""","""Edgardo""",19,10
+606,"""Adnan""","""Bob""",19,10
+607,"""Adnan""","""Edgardo""",19,10
+608,"""Adnan""","""Bob""",19,10
+609,"""Adnan""","""Edgardo""",19,10
+610,"""Adnan""","""Bob""",19,10
+611,"""Adnan""","""Edgardo""",19,10
+612,"""Adnan""","""Bob""",19,10
+613,"""Adnan""","""Edgardo""",19,10
+614,"""Adnan""","""Bob""",19,10
+615,"""Adnan""","""Edgardo""",19,10
+616,"""Adnan""","""Bob""",19,10
+617,"""Adnan""","""Edgardo""",19,10
+618,"""Adnan""","""Bob""",19,10
+619,"""Adnan""","""Edgardo""",19,10
+620,"""Adnan""","""Bob""",19,10
+621,"""Adnan""","""Edgardo""",19,10
+622,"""Adnan""","""Bob""",19,10
+623,"""Adnan""","""Edgardo""",19,10
+624,"""Adnan""","""Bob""",19,10
+625,"""Adnan""","""Edgardo""",19,10
+626,"""Adnan""","""Bob""",19,10
+627,"""Adnan""","""Edgardo""",19,10
+628,"""Adnan""","""Bob""",19,10
+629,"""Adnan""","""Edgardo""",19,10
+630,"""Adnan""","""Bob""",19,10
+631,"""Adnan""","""Edgardo""",19,10
+632,"""Adnan""","""Bob""",19,10
+633,"""Adnan""","""Edgardo""",19,10
+634,"""Adnan""","""Bob""",19,10
+635,"""Adnan""","""Edgardo""",19,10
+636,"""Adnan""","""Bob""",19,10
+637,"""Adnan""","""Edgardo""",19,10
+638,"""Adnan""","""Bob""",19,10
+639,"""Adnan""","""Edgardo""",19,10
+640,"""Adnan""","""Bob""",19,10
+641,"""Adnan""","""Edgardo""",19,10
+642,"""Adnan""","""Bob""",19,10
+643,"""Adnan""","""Edgardo""",19,10
+644,"""Adnan""","""Bob""",19,10
+645,"""Adnan""","""Edgardo""",19,10
+646,"""Adnan""","""Bob""",19,10
+647,"""Adnan""","""Edgardo""",19,10
+648,"""Adnan""","""Bob""",19,10
+649,"""Adnan""","""Edgardo""",19,10
+650,"""Adnan""","""Bob""",19,10
+651,"""Adnan""","""Edgardo""",19,10
+652,"""Adnan""","""Bob""",19,10
+653,"""Adnan""","""Edgardo""",19,10
+654,"""Adnan""","""Bob""",19,10
+655,"""Adnan""","""Edgardo""",19,10
+656,"""Adnan""","""Bob""",19,10
+657,"""Adnan""","""Edgardo""",19,10
+658,"""Adnan""","""Bob""",19,10
+659,"""Adnan""","""Edgardo""",19,10
+660,"""Adnan""","""Bob""",19,10
+661,"""Adnan""","""Edgardo""",19,10
+662,"""Adnan""","""Bob""",19,10
+663,"""Adnan""","""Edgardo""",19,10
+664,"""Adnan""","""Bob""",19,10
+665,"""Adnan""","""Edgardo""",19,10
+666,"""Adnan""","""Bob""",19,10
+667,"""Adnan""","""Edgardo""",19,10
+668,"""Adnan""","""Bob""",19,10
+669,"""Adnan""","""Edgardo""",19,10
+670,"""Adnan""","""Bob""",19,10
+671,"""Adnan""","""Edgardo""",19,10
+672,"""Adnan""","""Bob""",19,10
+673,"""Adnan""","""Edgardo""",19,10
+674,"""Adnan""","""Bob""",19,10
+675,"""Adnan""","""Edgardo""",19,10
+676,"""Adnan""","""Bob""",19,10
+677,"""Adnan""","""Edgardo""",19,10
+678,"""Adnan""","""Bob""",19,10
+679,"""Adnan""","""Edgardo""",19,10
+680,"""Adnan""","""Bob""",19,10
+681,"""Adnan""","""Edgardo""",19,10
+682,"""Adnan""","""Bob""",19,10
+683,"""Adnan""","""Edgardo""",19,10
+684,"""Adnan""","""Bob""",19,10
+685,"""Adnan""","""Edgardo""",19,10
+686,"""Adnan""","""Bob""",19,10
+687,"""Adnan""","""Edgardo""",19,10
+688,"""Adnan""","""Bob""",19,10
+689,"""Adnan""","""Edgardo""",19,10
+690,"""Adnan""","""Bob""",19,10
+691,"""Adnan""","""Edgardo""",19,10
+692,"""Adnan""","""Bob""",19,10
+693,"""Adnan""","""Edgardo""",19,10
+694,"""Adnan""","""Bob""",19,10
+695,"""Adnan""","""Edgardo""",19,10
+696,"""Adnan""","""Bob""",19,10
+697,"""Adnan""","""Edgardo""",19,10
+698,"""Adnan""","""Bob""",19,10
+699,"""Adnan""","""Edgardo""",19,10
+700,"""Adnan""","""Bob""",19,10
+701,"""Adnan""","""Edgardo""",19,10
+702,"""Adnan""","""Bob""",19,10
+703,"""Adnan""","""Edgardo""",19,10
+704,"""Adnan""","""Bob""",19,10
+705,"""Adnan""","""Edgardo""",19,10
+706,"""Adnan""","""Bob""",19,10
+707,"""Adnan""","""Edgardo""",19,10
+708,"""Adnan""","""Bob""",19,10
+709,"""Adnan""","""Edgardo""",19,10
+710,"""Adnan""","""Bob""",19,10
+711,"""Adnan""","""Edgardo""",19,10
+712,"""Adnan""","""Bob""",19,10
+713,"""Adnan""","""Edgardo""",19,10
+714,"""Adnan""","""Bob""",19,10
+715,"""Adnan""","""Edgardo""",19,10
+716,"""Adnan""","""Bob""",19,10
+717,"""Adnan""","""Edgardo""",19,10
+718,"""Adnan""","""Bob""",19,10
+719,"""Adnan""","""Edgardo""",19,10
+720,"""Adnan""","""Bob""",19,10
+721,"""Adnan""","""Edgardo""",19,10
+722,"""Adnan""","""Bob""",19,10
+723,"""Adnan""","""Edgardo""",19,10
+724,"""Adnan""","""Bob""",19,10
+725,"""Adnan""","""Edgardo""",19,10
+726,"""Adnan""","""Bob""",19,10
+727,"""Adnan""","""Edgardo""",19,10
+728,"""Adnan""","""Bob""",19,10
+729,"""Adnan""","""Edgardo""",19,10
+730,"""Adnan""","""Bob""",19,10
+731,"""Adnan""","""Edgardo""",19,10
+732,"""Adnan""","""Bob""",19,10
+733,"""Adnan""","""Edgardo""",19,10
+734,"""Adnan""","""Bob""",19,10
+735,"""Adnan""","""Edgardo""",19,10
+736,"""Adnan""","""Bob""",19,10
+737,"""Adnan""","""Edgardo""",19,10
+738,"""Adnan""","""Bob""",19,10
+739,"""Adnan""","""Edgardo""",19,10
+740,"""Adnan""","""Bob""",19,10
+741,"""Adnan""","""Edgardo""",19,10
+742,"""Adnan""","""Bob""",19,10
+743,"""Adnan""","""Edgardo""",19,10
+744,"""Adnan""","""Bob""",19,10
+745,"""Adnan""","""Edgardo""",19,10
+746,"""Adnan""","""Bob""",19,10
+747,"""Adnan""","""Edgardo""",19,10
+748,"""Adnan""","""Bob""",19,10
+749,"""Adnan""","""Edgardo""",19,10
+750,"""Adnan""","""Bob""",19,10
+751,"""Adnan""","""Edgardo""",19,10
+752,"""Adnan""","""Bob""",19,10
+753,"""Adnan""","""Edgardo""",19,10
+754,"""Adnan""","""Bob""",19,10
+755,"""Adnan""","""Edgardo""",19,10
+756,"""Adnan""","""Bob""",19,10
+757,"""Adnan""","""Edgardo""",19,10
+758,"""Adnan""","""Bob""",19,10
+759,"""Adnan""","""Edgardo""",19,10
+760,"""Adnan""","""Bob""",19,10
+761,"""Adnan""","""Edgardo""",19,10
+762,"""Adnan""","""Bob""",19,10
+763,"""Adnan""","""Edgardo""",19,10
+764,"""Adnan""","""Bob""",19,10
+765,"""Adnan""","""Edgardo""",19,10
+766,"""Adnan""","""Bob""",19,10
+767,"""Adnan""","""Edgardo""",19,10
+768,"""Adnan""","""Bob""",19,10
+769,"""Adnan""","""Edgardo""",19,10
+770,"""Adnan""","""Bob""",19,10
+771,"""Adnan""","""Edgardo""",19,10
+772,"""Adnan""","""Bob""",19,10
+773,"""Adnan""","""Edgardo""",19,10
+774,"""Adnan""","""Bob""",19,10
+775,"""Adnan""","""Edgardo""",19,10
+776,"""Adnan""","""Bob""",19,10
+777,"""Adnan""","""Edgardo""",19,10
+778,"""Adnan""","""Bob""",19,10
+779,"""Adnan""","""Edgardo""",19,10
+780,"""Adnan""","""Bob""",19,10
+781,"""Adnan""","""Edgardo""",19,10
+782,"""Adnan""","""Bob""",19,10
+783,"""Adnan""","""Edgardo""",19,10
+784,"""Adnan""","""Bob""",19,10
+785,"""Adnan""","""Edgardo""",19,10
+786,"""Adnan""","""Bob""",19,10
+787,"""Adnan""","""Edgardo""",19,10
+788,"""Adnan""","""Bob""",19,10
+789,"""Adnan""","""Edgardo""",19,10
+790,"""Adnan""","""Bob""",19,10
+791,"""Adnan""","""Edgardo""",19,10
+792,"""Adnan""","""Bob""",19,10
+793,"""Adnan""","""Edgardo""",19,10
+794,"""Adnan""","""Bob""",19,10
+795,"""Adnan""","""Edgardo""",19,10
+796,"""Adnan""","""Bob""",19,10
+797,"""Adnan""","""Edgardo""",19,10
+798,"""Adnan""","""Bob""",19,10
+799,"""Adnan""","""Edgardo""",19,10
+800,"""Adnan""","""Bob""",19,10
+801,"""Adnan""","""Edgardo""",19,10
+802,"""Adnan""","""Bob""",19,10
+803,"""Adnan""","""Edgardo""",19,10
+804,"""Adnan""","""Bob""",19,10
+805,"""Adnan""","""Edgardo""",19,10
+806,"""Adnan""","""Bob""",19,10
+807,"""Adnan""","""Edgardo""",19,10
+808,"""Adnan""","""Bob""",19,10
+809,"""Adnan""","""Edgardo""",19,10
+810,"""Adnan""","""Bob""",19,10
+811,"""Adnan""","""Edgardo""",19,10
+812,"""Adnan""","""Bob""",19,10
+813,"""Adnan""","""Edgardo""",19,10
+814,"""Adnan""","""Bob""",19,10
+815,"""Adnan""","""Edgardo""",19,10
+816,"""Adnan""","""Bob""",19,10
+817,"""Adnan""","""Edgardo""",19,10
+818,"""Adnan""","""Bob""",19,10
+819,"""Adnan""","""Edgardo""",19,10
+820,"""Adnan""","""Bob""",19,10
+821,"""Adnan""","""Edgardo""",19,10
+822,"""Adnan""","""Bob""",19,10
+823,"""Adnan""","""Edgardo""",19,10
+824,"""Adnan""","""Bob""",19,10
+825,"""Adnan""","""Edgardo""",19,10
+826,"""Adnan""","""Bob""",19,10
+827,"""Adnan""","""Edgardo""",19,10
+828,"""Adnan""","""Bob""",19,10
+829,"""Adnan""","""Edgardo""",19,10
+830,"""Adnan""","""Bob""",19,10
+831,"""Adnan""","""Edgardo""",19,10
+832,"""Adnan""","""Bob""",19,10
+833,"""Adnan""","""Edgardo""",19,10
+834,"""Adnan""","""Bob""",19,10
+835,"""Adnan""","""Edgardo""",19,10
+836,"""Adnan""","""Bob""",19,10
+837,"""Adnan""","""Edgardo""",19,10
+838,"""Adnan""","""Bob""",19,10
+839,"""Adnan""","""Edgardo""",19,10
+840,"""Adnan""","""Bob""",19,10
+841,"""Adnan""","""Edgardo""",19,10
+842,"""Adnan""","""Bob""",19,10
+843,"""Adnan""","""Edgardo""",19,10
+844,"""Adnan""","""Bob""",19,10
+845,"""Adnan""","""Edgardo""",19,10
+846,"""Adnan""","""Bob""",19,10
+847,"""Adnan""","""Edgardo""",19,10
+848,"""Adnan""","""Bob""",19,10
+849,"""Adnan""","""Edgardo""",19,10
+850,"""Adnan""","""Bob""",19,10
+851,"""Adnan""","""Edgardo""",19,10
+852,"""Adnan""","""Bob""",19,10
+853,"""Adnan""","""Edgardo""",19,10
+854,"""Adnan""","""Bob""",19,10
+855,"""Adnan""","""Edgardo""",19,10
+856,"""Adnan""","""Bob""",19,10
+857,"""Adnan""","""Edgardo""",19,10
+858,"""Adnan""","""Bob""",19,10
+859,"""Adnan""","""Edgardo""",19,10
+860,"""Adnan""","""Bob""",19,10
+861,"""Adnan""","""Edgardo""",19,10
+862,"""Adnan""","""Bob""",19,10
+863,"""Adnan""","""Edgardo""",19,10
+864,"""Adnan""","""Bob""",19,10
+865,"""Adnan""","""Edgardo""",19,10
+866,"""Adnan""","""Bob""",19,10
+867,"""Adnan""","""Edgardo""",19,10
+868,"""Adnan""","""Bob""",19,10
+869,"""Adnan""","""Edgardo""",19,10
+870,"""Adnan""","""Bob""",19,10
+871,"""Adnan""","""Edgardo""",19,10
+872,"""Adnan""","""Bob""",19,10
+873,"""Adnan""","""Edgardo""",19,10
+874,"""Adnan""","""Bob""",19,10
+875,"""Adnan""","""Edgardo""",19,10
+876,"""Adnan""","""Bob""",19,10
+877,"""Adnan""","""Edgardo""",19,10
+878,"""Adnan""","""Bob""",19,10
+879,"""Adnan""","""Edgardo""",19,10
+880,"""Adnan""","""Bob""",19,10
+881,"""Adnan""","""Edgardo""",19,10
+882,"""Adnan""","""Bob""",19,10
+883,"""Adnan""","""Edgardo""",19,10
+884,"""Adnan""","""Bob""",19,10
+885,"""Adnan""","""Edgardo""",19,10
+886,"""Adnan""","""Bob""",19,10
+887,"""Adnan""","""Edgardo""",19,10
+888,"""Adnan""","""Bob""",19,10
+889,"""Adnan""","""Edgardo""",19,10
+890,"""Adnan""","""Bob""",19,10
+891,"""Adnan""","""Edgardo""",19,10
+892,"""Adnan""","""Bob""",19,10
+893,"""Adnan""","""Edgardo""",19,10
+894,"""Adnan""","""Bob""",19,10
+895,"""Adnan""","""Edgardo""",19,10
+896,"""Adnan""","""Bob""",19,10
+897,"""Adnan""","""Edgardo""",19,10
+898,"""Adnan""","""Bob""",19,10
+899,"""Adnan""","""Edgardo""",19,10
+900,"""Adnan""","""Bob""",19,10
+901,"""Adnan""","""Edgardo""",19,10
+902,"""Adnan""","""Bob""",19,10
+903,"""Adnan""","""Edgardo""",19,10
+904,"""Adnan""","""Bob""",19,10
+905,"""Adnan""","""Edgardo""",19,10
+906,"""Adnan""","""Bob""",19,10
+907,"""Adnan""","""Edgardo""",19,10
+908,"""Adnan""","""Bob""",19,10
+909,"""Adnan""","""Edgardo""",19,10
+910,"""Adnan""","""Bob""",19,10
+911,"""Adnan""","""Edgardo""",19,10
+912,"""Adnan""","""Bob""",19,10
+913,"""Adnan""","""Edgardo""",19,10
+914,"""Adnan""","""Bob""",19,10
+915,"""Adnan""","""Edgardo""",19,10
+916,"""Adnan""","""Bob""",19,10
+917,"""Adnan""","""Edgardo""",19,10
+918,"""Adnan""","""Bob""",19,10
+919,"""Adnan""","""Edgardo""",19,10
+920,"""Adnan""","""Bob""",19,10
+921,"""Adnan""","""Edgardo""",19,10
+922,"""Adnan""","""Bob""",19,10
+923,"""Adnan""","""Edgardo""",19,10
+924,"""Adnan""","""Bob""",19,10
+925,"""Adnan""","""Edgardo""",19,10
+926,"""Adnan""","""Bob""",19,10
+927,"""Adnan""","""Edgardo""",19,10
+928,"""Adnan""","""Bob""",19,10
+929,"""Adnan""","""Edgardo""",19,10
+930,"""Adnan""","""Bob""",19,10
+931,"""Adnan""","""Edgardo""",19,10
+932,"""Adnan""","""Bob""",19,10
+933,"""Adnan""","""Edgardo""",19,10
+934,"""Adnan""","""Bob""",19,10
+935,"""Adnan""","""Edgardo""",19,10
+936,"""Adnan""","""Bob""",19,10
+937,"""Adnan""","""Edgardo""",19,10
+938,"""Adnan""","""Bob""",19,10
+939,"""Adnan""","""Edgardo""",19,10
+940,"""Adnan""","""Bob""",19,10
+941,"""Adnan""","""Edgardo""",19,10
+942,"""Adnan""","""Bob""",19,10
+943,"""Adnan""","""Edgardo""",19,10
+944,"""Adnan""","""Bob""",19,10
+945,"""Adnan""","""Edgardo""",19,10
+946,"""Adnan""","""Bob""",19,10
+947,"""Adnan""","""Edgardo""",19,10
+948,"""Adnan""","""Bob""",19,10
+949,"""Adnan""","""Edgardo""",19,10
+950,"""Adnan""","""Bob""",19,10
+951,"""Adnan""","""Edgardo""",19,10
+952,"""Adnan""","""Bob""",19,10
+953,"""Adnan""","""Edgardo""",19,10
+954,"""Adnan""","""Bob""",19,10
+955,"""Adnan""","""Edgardo""",19,10
+956,"""Adnan""","""Bob""",19,10
+957,"""Adnan""","""Edgardo""",19,10
+958,"""Adnan""","""Bob""",19,10
+959,"""Adnan""","""Edgardo""",19,10
+960,"""Adnan""","""Bob""",19,10
+961,"""Adnan""","""Edgardo""",19,10
+962,"""Adnan""","""Bob""",19,10
+963,"""Adnan""","""Edgardo""",19,10
+964,"""Adnan""","""Bob""",19,10
+965,"""Adnan""","""Edgardo""",19,10
+966,"""Adnan""","""Bob""",19,10
+967,"""Adnan""","""Edgardo""",19,10
+968,"""Adnan""","""Bob""",19,10
+969,"""Adnan""","""Edgardo""",19,10
+970,"""Adnan""","""Bob""",19,10
+971,"""Adnan""","""Edgardo""",19,10
+972,"""Adnan""","""Bob""",19,10
+973,"""Adnan""","""Edgardo""",19,10
+974,"""Adnan""","""Bob""",19,10
+975,"""Adnan""","""Edgardo""",19,10
+976,"""Adnan""","""Bob""",19,10
+977,"""Adnan""","""Edgardo""",19,10
+978,"""Adnan""","""Bob""",19,10
+979,"""Adnan""","""Edgardo""",19,10
+980,"""Adnan""","""Bob""",19,10
+981,"""Adnan""","""Edgardo""",19,10
+982,"""Adnan""","""Bob""",19,10
+983,"""Adnan""","""Edgardo""",19,10
+984,"""Adnan""","""Bob""",19,10
+985,"""Adnan""","""Edgardo""",19,10
+986,"""Adnan""","""Bob""",19,10
+987,"""Adnan""","""Edgardo""",19,10
+988,"""Adnan""","""Bob""",19,10
+989,"""Adnan""","""Edgardo""",19,10
+990,"""Adnan""","""Bob""",19,10
+991,"""Adnan""","""Edgardo""",19,10
+992,"""Adnan""","""Bob""",19,10
+993,"""Adnan""","""Edgardo""",19,10
+994,"""Adnan""","""Bob""",19,10
+995,"""Adnan""","""Edgardo""",19,10
+996,"""Adnan""","""Bob""",19,10
+997,"""Adnan""","""Edgardo""",19,10
+998,"""Adnan""","""Bob""",19,10
+999,"""Adnan""","""Edgardo""",19,10
+1000,"""Adnan""","""Bob""",19,10
+1001,"""Adnan""","""Edgardo""",19,10
+1002,"""Adnan""","""Bob""",19,10
+1003,"""Adnan""","""Edgardo""",19,10
+1004,"""Adnan""","""Bob""",19,10
+1005,"""Adnan""","""Edgardo""",19,10
+1006,"""Adnan""","""Bob""",19,10
+1007,"""Adnan""","""Edgardo""",19,10
+1008,"""Adnan""","""Bob""",19,10
+1009,"""Adnan""","""Edgardo""",19,10
+1010,"""Adnan""","""Bob""",19,10
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.json b/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.json
new file mode 100644
index 0000000..7c7c7c5
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/driversBig.json
@@ -0,0 +1,35 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "DriverId"
+ },
+ {
+ "no": 1,
+ "type": "STRING",
+ "length": 20,
+ "name": "FirstName"
+ },
+ {
+ "no": 2,
+ "type": "STRING",
+ "length": 20,
+ "name": "LastName"
+ },
+ {
+ "no": 3,
+ "type": "FLOAT",
+ "length": 4,
+ "name": "Age"
+ },
+ {
+ "no": 4,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "NumSeats"
+ }
+ ],
+ "key": 3
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/groups.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/groups.csv
new file mode 100644
index 0000000..ce95fe1
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/groups.csv
@@ -0,0 +1,7 @@
+1, "Purdue1"
+2, "Purdue2"
+3, "Purdue3"
+4, "Purdue4"
+5, "Purdue5"
+6, "Purdue6"
+7, "Purdue7"
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/groups.json b/Projects/p3-skeleton/cs448p3/src/test/resources/groups.json
new file mode 100644
index 0000000..f0858c0
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/groups.json
@@ -0,0 +1,17 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "GroupId"
+ },
+ {
+ "no": 1,
+ "type": "STRING",
+ "length": 10,
+ "name": "GroupName"
+ }
+ ],
+ "key": 0
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.csv
new file mode 100644
index 0000000..bc08997
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.csv
@@ -0,0 +1,10 @@
+1," ""Purdue1"""
+2," ""Purdue2"""
+3," ""Purdue3"""
+4," ""Purdue4"""
+5," ""Purdue5"""
+6," ""Purdue6"""
+7," ""Purdue7"""
+8," ""Purdue8"""
+9," ""Purdue9"""
+10," ""Purdue10"""
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.json b/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.json
new file mode 100644
index 0000000..f0858c0
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/groupsBig.json
@@ -0,0 +1,17 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "GroupId"
+ },
+ {
+ "no": 1,
+ "type": "STRING",
+ "length": 10,
+ "name": "GroupName"
+ }
+ ],
+ "key": 0
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/rides.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/rides.csv
new file mode 100644
index 0000000..b6acb3c
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/rides.csv
@@ -0,0 +1,12 @@
+3, 5, "2/10/2006", "2/13/2006"
+1, 2, "2/12/2006", "2/14/2006"
+9, 1, "2/15/2006", "2/15/2006"
+5, 7, "2/14/2006", "2/18/2006"
+1, 3, "2/15/2006", "2/16/2006"
+2, 6, "2/17/2006", "2/20/2006"
+3, 4, "2/18/2006", "2/19/2006"
+4, 1, "2/19/2006", "2/19/2006"
+2, 7, "2/18/2006", "2/23/2006"
+8, 5, "2/20/2006", "2/22/2006"
+3, 2, "2/24/2006", "2/26/2006"
+6, 6, "2/25/2006", "2/26/2006"
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/rides.json b/Projects/p3-skeleton/cs448p3/src/test/resources/rides.json
new file mode 100644
index 0000000..041754b
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/rides.json
@@ -0,0 +1,29 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "DriverId"
+ },
+ {
+ "no": 1,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "GroupId"
+ },
+ {
+ "no": 2,
+ "type": "STRING",
+ "length": 10,
+ "name": "FromDate"
+ },
+ {
+ "no": 3,
+ "type": "STRING",
+ "length": 10,
+ "name": "ToDate"
+ }
+ ],
+ "key": 1
+}
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.csv b/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.csv
new file mode 100644
index 0000000..338c7fd
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.csv
@@ -0,0 +1,1000 @@
+1,1," ""2/10/2006"""," ""2/13/2006"""
+2,2," ""2/12/2006"""," ""2/14/2006"""
+3,3," ""2/15/2006"""," ""2/15/2006"""
+4,4," ""2/14/2006"""," ""2/18/2006"""
+5,5," ""2/15/2006"""," ""2/16/2006"""
+6,6," ""2/17/2006"""," ""2/20/2006"""
+7,7," ""2/18/2006"""," ""2/19/2006"""
+8,8," ""2/19/2006"""," ""2/19/2006"""
+9,9," ""2/18/2006"""," ""2/23/2006"""
+10,10," ""2/20/2006"""," ""2/22/2006"""
+11,1," ""2/24/2006"""," ""2/26/2006"""
+12,2," ""2/25/2006"""," ""2/26/2006"""
+13,3," ""2/10/2006"""," ""2/13/2006"""
+14,4," ""2/12/2006"""," ""2/14/2006"""
+15,5," ""2/15/2006"""," ""2/15/2006"""
+16,6," ""2/14/2006"""," ""2/18/2006"""
+17,7," ""2/15/2006"""," ""2/16/2006"""
+18,8," ""2/17/2006"""," ""2/20/2006"""
+19,9," ""2/18/2006"""," ""2/19/2006"""
+20,10," ""2/19/2006"""," ""2/19/2006"""
+21,1," ""2/18/2006"""," ""2/23/2006"""
+22,2," ""2/20/2006"""," ""2/22/2006"""
+23,3," ""2/24/2006"""," ""2/26/2006"""
+24,4," ""2/25/2006"""," ""2/26/2006"""
+25,5," ""2/10/2006"""," ""2/13/2006"""
+26,6," ""2/12/2006"""," ""2/14/2006"""
+27,7," ""2/15/2006"""," ""2/15/2006"""
+28,8," ""2/14/2006"""," ""2/18/2006"""
+29,9," ""2/15/2006"""," ""2/16/2006"""
+30,10," ""2/17/2006"""," ""2/20/2006"""
+31,1," ""2/18/2006"""," ""2/19/2006"""
+32,2," ""2/19/2006"""," ""2/19/2006"""
+33,3," ""2/18/2006"""," ""2/23/2006"""
+34,4," ""2/20/2006"""," ""2/22/2006"""
+35,5," ""2/24/2006"""," ""2/26/2006"""
+36,6," ""2/25/2006"""," ""2/26/2006"""
+37,7," ""2/10/2006"""," ""2/13/2006"""
+38,8," ""2/12/2006"""," ""2/14/2006"""
+39,9," ""2/15/2006"""," ""2/15/2006"""
+40,10," ""2/14/2006"""," ""2/18/2006"""
+41,1," ""2/15/2006"""," ""2/16/2006"""
+42,2," ""2/17/2006"""," ""2/20/2006"""
+43,3," ""2/18/2006"""," ""2/19/2006"""
+44,4," ""2/19/2006"""," ""2/19/2006"""
+45,5," ""2/18/2006"""," ""2/23/2006"""
+46,6," ""2/20/2006"""," ""2/22/2006"""
+47,7," ""2/24/2006"""," ""2/26/2006"""
+48,8," ""2/25/2006"""," ""2/26/2006"""
+49,9," ""2/10/2006"""," ""2/13/2006"""
+50,10," ""2/12/2006"""," ""2/14/2006"""
+51,1," ""2/15/2006"""," ""2/15/2006"""
+52,2," ""2/14/2006"""," ""2/18/2006"""
+53,3," ""2/15/2006"""," ""2/16/2006"""
+54,4," ""2/17/2006"""," ""2/20/2006"""
+55,5," ""2/18/2006"""," ""2/19/2006"""
+56,6," ""2/19/2006"""," ""2/19/2006"""
+57,7," ""2/18/2006"""," ""2/23/2006"""
+58,8," ""2/20/2006"""," ""2/22/2006"""
+59,9," ""2/24/2006"""," ""2/26/2006"""
+60,10," ""2/25/2006"""," ""2/26/2006"""
+61,1," ""2/10/2006"""," ""2/13/2006"""
+62,2," ""2/12/2006"""," ""2/14/2006"""
+63,3," ""2/15/2006"""," ""2/15/2006"""
+64,4," ""2/14/2006"""," ""2/18/2006"""
+65,5," ""2/15/2006"""," ""2/16/2006"""
+66,6," ""2/17/2006"""," ""2/20/2006"""
+67,7," ""2/18/2006"""," ""2/19/2006"""
+68,8," ""2/19/2006"""," ""2/19/2006"""
+69,9," ""2/18/2006"""," ""2/23/2006"""
+70,10," ""2/20/2006"""," ""2/22/2006"""
+71,1," ""2/24/2006"""," ""2/26/2006"""
+72,2," ""2/25/2006"""," ""2/26/2006"""
+73,3," ""2/10/2006"""," ""2/13/2006"""
+74,4," ""2/12/2006"""," ""2/14/2006"""
+75,5," ""2/15/2006"""," ""2/15/2006"""
+76,6," ""2/14/2006"""," ""2/18/2006"""
+77,7," ""2/15/2006"""," ""2/16/2006"""
+78,8," ""2/17/2006"""," ""2/20/2006"""
+79,9," ""2/18/2006"""," ""2/19/2006"""
+80,10," ""2/19/2006"""," ""2/19/2006"""
+81,1," ""2/18/2006"""," ""2/23/2006"""
+82,2," ""2/20/2006"""," ""2/22/2006"""
+83,3," ""2/24/2006"""," ""2/26/2006"""
+84,4," ""2/25/2006"""," ""2/26/2006"""
+85,5," ""2/10/2006"""," ""2/13/2006"""
+86,6," ""2/12/2006"""," ""2/14/2006"""
+87,7," ""2/15/2006"""," ""2/15/2006"""
+88,8," ""2/14/2006"""," ""2/18/2006"""
+89,9," ""2/15/2006"""," ""2/16/2006"""
+90,10," ""2/17/2006"""," ""2/20/2006"""
+91,1," ""2/18/2006"""," ""2/19/2006"""
+92,2," ""2/19/2006"""," ""2/19/2006"""
+93,3," ""2/18/2006"""," ""2/23/2006"""
+94,4," ""2/20/2006"""," ""2/22/2006"""
+95,5," ""2/24/2006"""," ""2/26/2006"""
+96,6," ""2/25/2006"""," ""2/26/2006"""
+97,7," ""2/10/2006"""," ""2/13/2006"""
+98,8," ""2/12/2006"""," ""2/14/2006"""
+99,9," ""2/15/2006"""," ""2/15/2006"""
+100,10," ""2/14/2006"""," ""2/18/2006"""
+101,1," ""2/15/2006"""," ""2/16/2006"""
+102,2," ""2/17/2006"""," ""2/20/2006"""
+103,3," ""2/18/2006"""," ""2/19/2006"""
+104,4," ""2/19/2006"""," ""2/19/2006"""
+105,5," ""2/18/2006"""," ""2/23/2006"""
+106,6," ""2/20/2006"""," ""2/22/2006"""
+107,7," ""2/24/2006"""," ""2/26/2006"""
+108,8," ""2/25/2006"""," ""2/26/2006"""
+109,9," ""2/10/2006"""," ""2/13/2006"""
+110,10," ""2/12/2006"""," ""2/14/2006"""
+111,1," ""2/15/2006"""," ""2/15/2006"""
+112,2," ""2/14/2006"""," ""2/18/2006"""
+113,3," ""2/15/2006"""," ""2/16/2006"""
+114,4," ""2/17/2006"""," ""2/20/2006"""
+115,5," ""2/18/2006"""," ""2/19/2006"""
+116,6," ""2/19/2006"""," ""2/19/2006"""
+117,7," ""2/18/2006"""," ""2/23/2006"""
+118,8," ""2/20/2006"""," ""2/22/2006"""
+119,9," ""2/24/2006"""," ""2/26/2006"""
+120,10," ""2/25/2006"""," ""2/26/2006"""
+121,1," ""2/10/2006"""," ""2/13/2006"""
+122,2," ""2/12/2006"""," ""2/14/2006"""
+123,3," ""2/15/2006"""," ""2/15/2006"""
+124,4," ""2/14/2006"""," ""2/18/2006"""
+125,5," ""2/15/2006"""," ""2/16/2006"""
+126,6," ""2/17/2006"""," ""2/20/2006"""
+127,7," ""2/18/2006"""," ""2/19/2006"""
+128,8," ""2/19/2006"""," ""2/19/2006"""
+129,9," ""2/18/2006"""," ""2/23/2006"""
+130,10," ""2/20/2006"""," ""2/22/2006"""
+131,1," ""2/24/2006"""," ""2/26/2006"""
+132,2," ""2/25/2006"""," ""2/26/2006"""
+133,3," ""2/10/2006"""," ""2/13/2006"""
+134,4," ""2/12/2006"""," ""2/14/2006"""
+135,5," ""2/15/2006"""," ""2/15/2006"""
+136,6," ""2/14/2006"""," ""2/18/2006"""
+137,7," ""2/15/2006"""," ""2/16/2006"""
+138,8," ""2/17/2006"""," ""2/20/2006"""
+139,9," ""2/18/2006"""," ""2/19/2006"""
+140,10," ""2/19/2006"""," ""2/19/2006"""
+141,1," ""2/18/2006"""," ""2/23/2006"""
+142,2," ""2/20/2006"""," ""2/22/2006"""
+143,3," ""2/24/2006"""," ""2/26/2006"""
+144,4," ""2/25/2006"""," ""2/26/2006"""
+145,5," ""2/10/2006"""," ""2/13/2006"""
+146,6," ""2/12/2006"""," ""2/14/2006"""
+147,7," ""2/15/2006"""," ""2/15/2006"""
+148,8," ""2/14/2006"""," ""2/18/2006"""
+149,9," ""2/15/2006"""," ""2/16/2006"""
+150,10," ""2/17/2006"""," ""2/20/2006"""
+151,1," ""2/18/2006"""," ""2/19/2006"""
+152,2," ""2/19/2006"""," ""2/19/2006"""
+153,3," ""2/18/2006"""," ""2/23/2006"""
+154,4," ""2/20/2006"""," ""2/22/2006"""
+155,5," ""2/24/2006"""," ""2/26/2006"""
+156,6," ""2/25/2006"""," ""2/26/2006"""
+157,7," ""2/10/2006"""," ""2/13/2006"""
+158,8," ""2/12/2006"""," ""2/14/2006"""
+159,9," ""2/15/2006"""," ""2/15/2006"""
+160,10," ""2/14/2006"""," ""2/18/2006"""
+161,1," ""2/15/2006"""," ""2/16/2006"""
+162,2," ""2/17/2006"""," ""2/20/2006"""
+163,3," ""2/18/2006"""," ""2/19/2006"""
+164,4," ""2/19/2006"""," ""2/19/2006"""
+165,5," ""2/18/2006"""," ""2/23/2006"""
+166,6," ""2/20/2006"""," ""2/22/2006"""
+167,7," ""2/24/2006"""," ""2/26/2006"""
+168,8," ""2/25/2006"""," ""2/26/2006"""
+169,9," ""2/10/2006"""," ""2/13/2006"""
+170,10," ""2/12/2006"""," ""2/14/2006"""
+171,1," ""2/15/2006"""," ""2/15/2006"""
+172,2," ""2/14/2006"""," ""2/18/2006"""
+173,3," ""2/15/2006"""," ""2/16/2006"""
+174,4," ""2/17/2006"""," ""2/20/2006"""
+175,5," ""2/18/2006"""," ""2/19/2006"""
+176,6," ""2/19/2006"""," ""2/19/2006"""
+177,7," ""2/18/2006"""," ""2/23/2006"""
+178,8," ""2/20/2006"""," ""2/22/2006"""
+179,9," ""2/24/2006"""," ""2/26/2006"""
+180,10," ""2/25/2006"""," ""2/26/2006"""
+181,1," ""2/10/2006"""," ""2/13/2006"""
+182,2," ""2/12/2006"""," ""2/14/2006"""
+183,3," ""2/15/2006"""," ""2/15/2006"""
+184,4," ""2/14/2006"""," ""2/18/2006"""
+185,5," ""2/15/2006"""," ""2/16/2006"""
+186,6," ""2/17/2006"""," ""2/20/2006"""
+187,7," ""2/18/2006"""," ""2/19/2006"""
+188,8," ""2/19/2006"""," ""2/19/2006"""
+189,9," ""2/18/2006"""," ""2/23/2006"""
+190,10," ""2/20/2006"""," ""2/22/2006"""
+191,1," ""2/24/2006"""," ""2/26/2006"""
+192,2," ""2/25/2006"""," ""2/26/2006"""
+193,3," ""2/10/2006"""," ""2/13/2006"""
+194,4," ""2/12/2006"""," ""2/14/2006"""
+195,5," ""2/15/2006"""," ""2/15/2006"""
+196,6," ""2/14/2006"""," ""2/18/2006"""
+197,7," ""2/15/2006"""," ""2/16/2006"""
+198,8," ""2/17/2006"""," ""2/20/2006"""
+199,9," ""2/18/2006"""," ""2/19/2006"""
+200,10," ""2/19/2006"""," ""2/19/2006"""
+201,1," ""2/18/2006"""," ""2/23/2006"""
+202,2," ""2/20/2006"""," ""2/22/2006"""
+203,3," ""2/24/2006"""," ""2/26/2006"""
+204,4," ""2/25/2006"""," ""2/26/2006"""
+205,5," ""2/10/2006"""," ""2/13/2006"""
+206,6," ""2/12/2006"""," ""2/14/2006"""
+207,7," ""2/15/2006"""," ""2/15/2006"""
+208,8," ""2/14/2006"""," ""2/18/2006"""
+209,9," ""2/15/2006"""," ""2/16/2006"""
+210,10," ""2/17/2006"""," ""2/20/2006"""
+211,1," ""2/18/2006"""," ""2/19/2006"""
+212,2," ""2/19/2006"""," ""2/19/2006"""
+213,3," ""2/18/2006"""," ""2/23/2006"""
+214,4," ""2/20/2006"""," ""2/22/2006"""
+215,5," ""2/24/2006"""," ""2/26/2006"""
+216,6," ""2/25/2006"""," ""2/26/2006"""
+217,7," ""2/10/2006"""," ""2/13/2006"""
+218,8," ""2/12/2006"""," ""2/14/2006"""
+219,9," ""2/15/2006"""," ""2/15/2006"""
+220,10," ""2/14/2006"""," ""2/18/2006"""
+221,1," ""2/15/2006"""," ""2/16/2006"""
+222,2," ""2/17/2006"""," ""2/20/2006"""
+223,3," ""2/18/2006"""," ""2/19/2006"""
+224,4," ""2/19/2006"""," ""2/19/2006"""
+225,5," ""2/18/2006"""," ""2/23/2006"""
+226,6," ""2/20/2006"""," ""2/22/2006"""
+227,7," ""2/24/2006"""," ""2/26/2006"""
+228,8," ""2/25/2006"""," ""2/26/2006"""
+229,9," ""2/10/2006"""," ""2/13/2006"""
+230,10," ""2/12/2006"""," ""2/14/2006"""
+231,1," ""2/15/2006"""," ""2/15/2006"""
+232,2," ""2/14/2006"""," ""2/18/2006"""
+233,3," ""2/15/2006"""," ""2/16/2006"""
+234,4," ""2/17/2006"""," ""2/20/2006"""
+235,5," ""2/18/2006"""," ""2/19/2006"""
+236,6," ""2/19/2006"""," ""2/19/2006"""
+237,7," ""2/18/2006"""," ""2/23/2006"""
+238,8," ""2/20/2006"""," ""2/22/2006"""
+239,9," ""2/24/2006"""," ""2/26/2006"""
+240,10," ""2/25/2006"""," ""2/26/2006"""
+241,1," ""2/10/2006"""," ""2/13/2006"""
+242,2," ""2/12/2006"""," ""2/14/2006"""
+243,3," ""2/15/2006"""," ""2/15/2006"""
+244,4," ""2/14/2006"""," ""2/18/2006"""
+245,5," ""2/15/2006"""," ""2/16/2006"""
+246,6," ""2/17/2006"""," ""2/20/2006"""
+247,7," ""2/18/2006"""," ""2/19/2006"""
+248,8," ""2/19/2006"""," ""2/19/2006"""
+249,9," ""2/18/2006"""," ""2/23/2006"""
+250,10," ""2/20/2006"""," ""2/22/2006"""
+251,1," ""2/24/2006"""," ""2/26/2006"""
+252,2," ""2/25/2006"""," ""2/26/2006"""
+253,3," ""2/10/2006"""," ""2/13/2006"""
+254,4," ""2/12/2006"""," ""2/14/2006"""
+255,5," ""2/15/2006"""," ""2/15/2006"""
+256,6," ""2/14/2006"""," ""2/18/2006"""
+257,7," ""2/15/2006"""," ""2/16/2006"""
+258,8," ""2/17/2006"""," ""2/20/2006"""
+259,9," ""2/18/2006"""," ""2/19/2006"""
+260,10," ""2/19/2006"""," ""2/19/2006"""
+261,1," ""2/18/2006"""," ""2/23/2006"""
+262,2," ""2/20/2006"""," ""2/22/2006"""
+263,3," ""2/24/2006"""," ""2/26/2006"""
+264,4," ""2/25/2006"""," ""2/26/2006"""
+265,5," ""2/10/2006"""," ""2/13/2006"""
+266,6," ""2/12/2006"""," ""2/14/2006"""
+267,7," ""2/15/2006"""," ""2/15/2006"""
+268,8," ""2/14/2006"""," ""2/18/2006"""
+269,9," ""2/15/2006"""," ""2/16/2006"""
+270,10," ""2/17/2006"""," ""2/20/2006"""
+271,1," ""2/18/2006"""," ""2/19/2006"""
+272,2," ""2/19/2006"""," ""2/19/2006"""
+273,3," ""2/18/2006"""," ""2/23/2006"""
+274,4," ""2/20/2006"""," ""2/22/2006"""
+275,5," ""2/24/2006"""," ""2/26/2006"""
+276,6," ""2/25/2006"""," ""2/26/2006"""
+277,7," ""2/10/2006"""," ""2/13/2006"""
+278,8," ""2/12/2006"""," ""2/14/2006"""
+279,9," ""2/15/2006"""," ""2/15/2006"""
+280,10," ""2/14/2006"""," ""2/18/2006"""
+281,1," ""2/15/2006"""," ""2/16/2006"""
+282,2," ""2/17/2006"""," ""2/20/2006"""
+283,3," ""2/18/2006"""," ""2/19/2006"""
+284,4," ""2/19/2006"""," ""2/19/2006"""
+285,5," ""2/18/2006"""," ""2/23/2006"""
+286,6," ""2/20/2006"""," ""2/22/2006"""
+287,7," ""2/24/2006"""," ""2/26/2006"""
+288,8," ""2/25/2006"""," ""2/26/2006"""
+289,9," ""2/10/2006"""," ""2/13/2006"""
+290,10," ""2/12/2006"""," ""2/14/2006"""
+291,1," ""2/15/2006"""," ""2/15/2006"""
+292,2," ""2/14/2006"""," ""2/18/2006"""
+293,3," ""2/15/2006"""," ""2/16/2006"""
+294,4," ""2/17/2006"""," ""2/20/2006"""
+295,5," ""2/18/2006"""," ""2/19/2006"""
+296,6," ""2/19/2006"""," ""2/19/2006"""
+297,7," ""2/18/2006"""," ""2/23/2006"""
+298,8," ""2/20/2006"""," ""2/22/2006"""
+299,9," ""2/24/2006"""," ""2/26/2006"""
+300,10," ""2/25/2006"""," ""2/26/2006"""
+301,1," ""2/10/2006"""," ""2/13/2006"""
+302,2," ""2/12/2006"""," ""2/14/2006"""
+303,3," ""2/15/2006"""," ""2/15/2006"""
+304,4," ""2/14/2006"""," ""2/18/2006"""
+305,5," ""2/15/2006"""," ""2/16/2006"""
+306,6," ""2/17/2006"""," ""2/20/2006"""
+307,7," ""2/18/2006"""," ""2/19/2006"""
+308,8," ""2/19/2006"""," ""2/19/2006"""
+309,9," ""2/18/2006"""," ""2/23/2006"""
+310,10," ""2/20/2006"""," ""2/22/2006"""
+311,1," ""2/24/2006"""," ""2/26/2006"""
+312,2," ""2/25/2006"""," ""2/26/2006"""
+313,3," ""2/10/2006"""," ""2/13/2006"""
+314,4," ""2/12/2006"""," ""2/14/2006"""
+315,5," ""2/15/2006"""," ""2/15/2006"""
+316,6," ""2/14/2006"""," ""2/18/2006"""
+317,7," ""2/15/2006"""," ""2/16/2006"""
+318,8," ""2/17/2006"""," ""2/20/2006"""
+319,9," ""2/18/2006"""," ""2/19/2006"""
+320,10," ""2/19/2006"""," ""2/19/2006"""
+321,1," ""2/18/2006"""," ""2/23/2006"""
+322,2," ""2/20/2006"""," ""2/22/2006"""
+323,3," ""2/24/2006"""," ""2/26/2006"""
+324,4," ""2/25/2006"""," ""2/26/2006"""
+325,5," ""2/10/2006"""," ""2/13/2006"""
+326,6," ""2/12/2006"""," ""2/14/2006"""
+327,7," ""2/15/2006"""," ""2/15/2006"""
+328,8," ""2/14/2006"""," ""2/18/2006"""
+329,9," ""2/15/2006"""," ""2/16/2006"""
+330,10," ""2/17/2006"""," ""2/20/2006"""
+331,1," ""2/18/2006"""," ""2/19/2006"""
+332,2," ""2/19/2006"""," ""2/19/2006"""
+333,3," ""2/18/2006"""," ""2/23/2006"""
+334,4," ""2/20/2006"""," ""2/22/2006"""
+335,5," ""2/24/2006"""," ""2/26/2006"""
+336,6," ""2/25/2006"""," ""2/26/2006"""
+337,7," ""2/10/2006"""," ""2/13/2006"""
+338,8," ""2/12/2006"""," ""2/14/2006"""
+339,9," ""2/15/2006"""," ""2/15/2006"""
+340,10," ""2/14/2006"""," ""2/18/2006"""
+341,1," ""2/15/2006"""," ""2/16/2006"""
+342,2," ""2/17/2006"""," ""2/20/2006"""
+343,3," ""2/18/2006"""," ""2/19/2006"""
+344,4," ""2/19/2006"""," ""2/19/2006"""
+345,5," ""2/18/2006"""," ""2/23/2006"""
+346,6," ""2/20/2006"""," ""2/22/2006"""
+347,7," ""2/24/2006"""," ""2/26/2006"""
+348,8," ""2/25/2006"""," ""2/26/2006"""
+349,9," ""2/10/2006"""," ""2/13/2006"""
+350,10," ""2/12/2006"""," ""2/14/2006"""
+351,1," ""2/15/2006"""," ""2/15/2006"""
+352,2," ""2/14/2006"""," ""2/18/2006"""
+353,3," ""2/15/2006"""," ""2/16/2006"""
+354,4," ""2/17/2006"""," ""2/20/2006"""
+355,5," ""2/18/2006"""," ""2/19/2006"""
+356,6," ""2/19/2006"""," ""2/19/2006"""
+357,7," ""2/18/2006"""," ""2/23/2006"""
+358,8," ""2/20/2006"""," ""2/22/2006"""
+359,9," ""2/24/2006"""," ""2/26/2006"""
+360,10," ""2/25/2006"""," ""2/26/2006"""
+361,1," ""2/10/2006"""," ""2/13/2006"""
+362,2," ""2/12/2006"""," ""2/14/2006"""
+363,3," ""2/15/2006"""," ""2/15/2006"""
+364,4," ""2/14/2006"""," ""2/18/2006"""
+365,5," ""2/15/2006"""," ""2/16/2006"""
+366,6," ""2/17/2006"""," ""2/20/2006"""
+367,7," ""2/18/2006"""," ""2/19/2006"""
+368,8," ""2/19/2006"""," ""2/19/2006"""
+369,9," ""2/18/2006"""," ""2/23/2006"""
+370,10," ""2/20/2006"""," ""2/22/2006"""
+371,1," ""2/24/2006"""," ""2/26/2006"""
+372,2," ""2/25/2006"""," ""2/26/2006"""
+373,3," ""2/10/2006"""," ""2/13/2006"""
+374,4," ""2/12/2006"""," ""2/14/2006"""
+375,5," ""2/15/2006"""," ""2/15/2006"""
+376,6," ""2/14/2006"""," ""2/18/2006"""
+377,7," ""2/15/2006"""," ""2/16/2006"""
+378,8," ""2/17/2006"""," ""2/20/2006"""
+379,9," ""2/18/2006"""," ""2/19/2006"""
+380,10," ""2/19/2006"""," ""2/19/2006"""
+381,1," ""2/18/2006"""," ""2/23/2006"""
+382,2," ""2/20/2006"""," ""2/22/2006"""
+383,3," ""2/24/2006"""," ""2/26/2006"""
+384,4," ""2/25/2006"""," ""2/26/2006"""
+385,5," ""2/10/2006"""," ""2/13/2006"""
+386,6," ""2/12/2006"""," ""2/14/2006"""
+387,7," ""2/15/2006"""," ""2/15/2006"""
+388,8," ""2/14/2006"""," ""2/18/2006"""
+389,9," ""2/15/2006"""," ""2/16/2006"""
+390,10," ""2/17/2006"""," ""2/20/2006"""
+391,1," ""2/18/2006"""," ""2/19/2006"""
+392,2," ""2/19/2006"""," ""2/19/2006"""
+393,3," ""2/18/2006"""," ""2/23/2006"""
+394,4," ""2/20/2006"""," ""2/22/2006"""
+395,5," ""2/24/2006"""," ""2/26/2006"""
+396,6," ""2/25/2006"""," ""2/26/2006"""
+397,7," ""2/10/2006"""," ""2/13/2006"""
+398,8," ""2/12/2006"""," ""2/14/2006"""
+399,9," ""2/15/2006"""," ""2/15/2006"""
+400,10," ""2/14/2006"""," ""2/18/2006"""
+401,1," ""2/15/2006"""," ""2/16/2006"""
+402,2," ""2/17/2006"""," ""2/20/2006"""
+403,3," ""2/18/2006"""," ""2/19/2006"""
+404,4," ""2/19/2006"""," ""2/19/2006"""
+405,5," ""2/18/2006"""," ""2/23/2006"""
+406,6," ""2/20/2006"""," ""2/22/2006"""
+407,7," ""2/24/2006"""," ""2/26/2006"""
+408,8," ""2/25/2006"""," ""2/26/2006"""
+409,9," ""2/10/2006"""," ""2/13/2006"""
+410,10," ""2/12/2006"""," ""2/14/2006"""
+411,1," ""2/15/2006"""," ""2/15/2006"""
+412,2," ""2/14/2006"""," ""2/18/2006"""
+413,3," ""2/15/2006"""," ""2/16/2006"""
+414,4," ""2/17/2006"""," ""2/20/2006"""
+415,5," ""2/18/2006"""," ""2/19/2006"""
+416,6," ""2/19/2006"""," ""2/19/2006"""
+417,7," ""2/18/2006"""," ""2/23/2006"""
+418,8," ""2/20/2006"""," ""2/22/2006"""
+419,9," ""2/24/2006"""," ""2/26/2006"""
+420,10," ""2/25/2006"""," ""2/26/2006"""
+421,1," ""2/10/2006"""," ""2/13/2006"""
+422,2," ""2/12/2006"""," ""2/14/2006"""
+423,3," ""2/15/2006"""," ""2/15/2006"""
+424,4," ""2/14/2006"""," ""2/18/2006"""
+425,5," ""2/15/2006"""," ""2/16/2006"""
+426,6," ""2/17/2006"""," ""2/20/2006"""
+427,7," ""2/18/2006"""," ""2/19/2006"""
+428,8," ""2/19/2006"""," ""2/19/2006"""
+429,9," ""2/18/2006"""," ""2/23/2006"""
+430,10," ""2/20/2006"""," ""2/22/2006"""
+431,1," ""2/24/2006"""," ""2/26/2006"""
+432,2," ""2/25/2006"""," ""2/26/2006"""
+433,3," ""2/10/2006"""," ""2/13/2006"""
+434,4," ""2/12/2006"""," ""2/14/2006"""
+435,5," ""2/15/2006"""," ""2/15/2006"""
+436,6," ""2/14/2006"""," ""2/18/2006"""
+437,7," ""2/15/2006"""," ""2/16/2006"""
+438,8," ""2/17/2006"""," ""2/20/2006"""
+439,9," ""2/18/2006"""," ""2/19/2006"""
+440,10," ""2/19/2006"""," ""2/19/2006"""
+441,1," ""2/18/2006"""," ""2/23/2006"""
+442,2," ""2/20/2006"""," ""2/22/2006"""
+443,3," ""2/24/2006"""," ""2/26/2006"""
+444,4," ""2/25/2006"""," ""2/26/2006"""
+445,5," ""2/10/2006"""," ""2/13/2006"""
+446,6," ""2/12/2006"""," ""2/14/2006"""
+447,7," ""2/15/2006"""," ""2/15/2006"""
+448,8," ""2/14/2006"""," ""2/18/2006"""
+449,9," ""2/15/2006"""," ""2/16/2006"""
+450,10," ""2/17/2006"""," ""2/20/2006"""
+451,1," ""2/18/2006"""," ""2/19/2006"""
+452,2," ""2/19/2006"""," ""2/19/2006"""
+453,3," ""2/18/2006"""," ""2/23/2006"""
+454,4," ""2/20/2006"""," ""2/22/2006"""
+455,5," ""2/24/2006"""," ""2/26/2006"""
+456,6," ""2/25/2006"""," ""2/26/2006"""
+457,7," ""2/10/2006"""," ""2/13/2006"""
+458,8," ""2/12/2006"""," ""2/14/2006"""
+459,9," ""2/15/2006"""," ""2/15/2006"""
+460,10," ""2/14/2006"""," ""2/18/2006"""
+461,1," ""2/15/2006"""," ""2/16/2006"""
+462,2," ""2/17/2006"""," ""2/20/2006"""
+463,3," ""2/18/2006"""," ""2/19/2006"""
+464,4," ""2/19/2006"""," ""2/19/2006"""
+465,5," ""2/18/2006"""," ""2/23/2006"""
+466,6," ""2/20/2006"""," ""2/22/2006"""
+467,7," ""2/24/2006"""," ""2/26/2006"""
+468,8," ""2/25/2006"""," ""2/26/2006"""
+469,9," ""2/10/2006"""," ""2/13/2006"""
+470,10," ""2/12/2006"""," ""2/14/2006"""
+471,1," ""2/15/2006"""," ""2/15/2006"""
+472,2," ""2/14/2006"""," ""2/18/2006"""
+473,3," ""2/15/2006"""," ""2/16/2006"""
+474,4," ""2/17/2006"""," ""2/20/2006"""
+475,5," ""2/18/2006"""," ""2/19/2006"""
+476,6," ""2/19/2006"""," ""2/19/2006"""
+477,7," ""2/18/2006"""," ""2/23/2006"""
+478,8," ""2/20/2006"""," ""2/22/2006"""
+479,9," ""2/24/2006"""," ""2/26/2006"""
+480,10," ""2/25/2006"""," ""2/26/2006"""
+481,1," ""2/10/2006"""," ""2/13/2006"""
+482,2," ""2/12/2006"""," ""2/14/2006"""
+483,3," ""2/15/2006"""," ""2/15/2006"""
+484,4," ""2/14/2006"""," ""2/18/2006"""
+485,5," ""2/15/2006"""," ""2/16/2006"""
+486,6," ""2/17/2006"""," ""2/20/2006"""
+487,7," ""2/18/2006"""," ""2/19/2006"""
+488,8," ""2/19/2006"""," ""2/19/2006"""
+489,9," ""2/18/2006"""," ""2/23/2006"""
+490,10," ""2/20/2006"""," ""2/22/2006"""
+491,1," ""2/24/2006"""," ""2/26/2006"""
+492,2," ""2/25/2006"""," ""2/26/2006"""
+493,3," ""2/10/2006"""," ""2/13/2006"""
+494,4," ""2/12/2006"""," ""2/14/2006"""
+495,5," ""2/15/2006"""," ""2/15/2006"""
+496,6," ""2/14/2006"""," ""2/18/2006"""
+497,7," ""2/15/2006"""," ""2/16/2006"""
+498,8," ""2/17/2006"""," ""2/20/2006"""
+499,9," ""2/18/2006"""," ""2/19/2006"""
+500,10," ""2/19/2006"""," ""2/19/2006"""
+501,1," ""2/18/2006"""," ""2/23/2006"""
+502,2," ""2/20/2006"""," ""2/22/2006"""
+503,3," ""2/24/2006"""," ""2/26/2006"""
+504,4," ""2/25/2006"""," ""2/26/2006"""
+505,5," ""2/10/2006"""," ""2/13/2006"""
+506,6," ""2/12/2006"""," ""2/14/2006"""
+507,7," ""2/15/2006"""," ""2/15/2006"""
+508,8," ""2/14/2006"""," ""2/18/2006"""
+509,9," ""2/15/2006"""," ""2/16/2006"""
+510,10," ""2/17/2006"""," ""2/20/2006"""
+511,1," ""2/18/2006"""," ""2/19/2006"""
+512,2," ""2/19/2006"""," ""2/19/2006"""
+513,3," ""2/18/2006"""," ""2/23/2006"""
+514,4," ""2/20/2006"""," ""2/22/2006"""
+515,5," ""2/24/2006"""," ""2/26/2006"""
+516,6," ""2/25/2006"""," ""2/26/2006"""
+517,7," ""2/10/2006"""," ""2/13/2006"""
+518,8," ""2/12/2006"""," ""2/14/2006"""
+519,9," ""2/15/2006"""," ""2/15/2006"""
+520,10," ""2/14/2006"""," ""2/18/2006"""
+521,1," ""2/15/2006"""," ""2/16/2006"""
+522,2," ""2/17/2006"""," ""2/20/2006"""
+523,3," ""2/18/2006"""," ""2/19/2006"""
+524,4," ""2/19/2006"""," ""2/19/2006"""
+525,5," ""2/18/2006"""," ""2/23/2006"""
+526,6," ""2/20/2006"""," ""2/22/2006"""
+527,7," ""2/24/2006"""," ""2/26/2006"""
+528,8," ""2/25/2006"""," ""2/26/2006"""
+529,9," ""2/10/2006"""," ""2/13/2006"""
+530,10," ""2/12/2006"""," ""2/14/2006"""
+531,1," ""2/15/2006"""," ""2/15/2006"""
+532,2," ""2/14/2006"""," ""2/18/2006"""
+533,3," ""2/15/2006"""," ""2/16/2006"""
+534,4," ""2/17/2006"""," ""2/20/2006"""
+535,5," ""2/18/2006"""," ""2/19/2006"""
+536,6," ""2/19/2006"""," ""2/19/2006"""
+537,7," ""2/18/2006"""," ""2/23/2006"""
+538,8," ""2/20/2006"""," ""2/22/2006"""
+539,9," ""2/24/2006"""," ""2/26/2006"""
+540,10," ""2/25/2006"""," ""2/26/2006"""
+541,1," ""2/10/2006"""," ""2/13/2006"""
+542,2," ""2/12/2006"""," ""2/14/2006"""
+543,3," ""2/15/2006"""," ""2/15/2006"""
+544,4," ""2/14/2006"""," ""2/18/2006"""
+545,5," ""2/15/2006"""," ""2/16/2006"""
+546,6," ""2/17/2006"""," ""2/20/2006"""
+547,7," ""2/18/2006"""," ""2/19/2006"""
+548,8," ""2/19/2006"""," ""2/19/2006"""
+549,9," ""2/18/2006"""," ""2/23/2006"""
+550,10," ""2/20/2006"""," ""2/22/2006"""
+551,1," ""2/24/2006"""," ""2/26/2006"""
+552,2," ""2/25/2006"""," ""2/26/2006"""
+553,3," ""2/10/2006"""," ""2/13/2006"""
+554,4," ""2/12/2006"""," ""2/14/2006"""
+555,5," ""2/15/2006"""," ""2/15/2006"""
+556,6," ""2/14/2006"""," ""2/18/2006"""
+557,7," ""2/15/2006"""," ""2/16/2006"""
+558,8," ""2/17/2006"""," ""2/20/2006"""
+559,9," ""2/18/2006"""," ""2/19/2006"""
+560,10," ""2/19/2006"""," ""2/19/2006"""
+561,1," ""2/18/2006"""," ""2/23/2006"""
+562,2," ""2/20/2006"""," ""2/22/2006"""
+563,3," ""2/24/2006"""," ""2/26/2006"""
+564,4," ""2/25/2006"""," ""2/26/2006"""
+565,5," ""2/10/2006"""," ""2/13/2006"""
+566,6," ""2/12/2006"""," ""2/14/2006"""
+567,7," ""2/15/2006"""," ""2/15/2006"""
+568,8," ""2/14/2006"""," ""2/18/2006"""
+569,9," ""2/15/2006"""," ""2/16/2006"""
+570,10," ""2/17/2006"""," ""2/20/2006"""
+571,1," ""2/18/2006"""," ""2/19/2006"""
+572,2," ""2/19/2006"""," ""2/19/2006"""
+573,3," ""2/18/2006"""," ""2/23/2006"""
+574,4," ""2/20/2006"""," ""2/22/2006"""
+575,5," ""2/24/2006"""," ""2/26/2006"""
+576,6," ""2/25/2006"""," ""2/26/2006"""
+577,7," ""2/10/2006"""," ""2/13/2006"""
+578,8," ""2/12/2006"""," ""2/14/2006"""
+579,9," ""2/15/2006"""," ""2/15/2006"""
+580,10," ""2/14/2006"""," ""2/18/2006"""
+581,1," ""2/15/2006"""," ""2/16/2006"""
+582,2," ""2/17/2006"""," ""2/20/2006"""
+583,3," ""2/18/2006"""," ""2/19/2006"""
+584,4," ""2/19/2006"""," ""2/19/2006"""
+585,5," ""2/18/2006"""," ""2/23/2006"""
+586,6," ""2/20/2006"""," ""2/22/2006"""
+587,7," ""2/24/2006"""," ""2/26/2006"""
+588,8," ""2/25/2006"""," ""2/26/2006"""
+589,9," ""2/10/2006"""," ""2/13/2006"""
+590,10," ""2/12/2006"""," ""2/14/2006"""
+591,1," ""2/15/2006"""," ""2/15/2006"""
+592,2," ""2/14/2006"""," ""2/18/2006"""
+593,3," ""2/15/2006"""," ""2/16/2006"""
+594,4," ""2/17/2006"""," ""2/20/2006"""
+595,5," ""2/18/2006"""," ""2/19/2006"""
+596,6," ""2/19/2006"""," ""2/19/2006"""
+597,7," ""2/18/2006"""," ""2/23/2006"""
+598,8," ""2/20/2006"""," ""2/22/2006"""
+599,9," ""2/24/2006"""," ""2/26/2006"""
+600,10," ""2/25/2006"""," ""2/26/2006"""
+601,1," ""2/10/2006"""," ""2/13/2006"""
+602,2," ""2/12/2006"""," ""2/14/2006"""
+603,3," ""2/15/2006"""," ""2/15/2006"""
+604,4," ""2/14/2006"""," ""2/18/2006"""
+605,5," ""2/15/2006"""," ""2/16/2006"""
+606,6," ""2/17/2006"""," ""2/20/2006"""
+607,7," ""2/18/2006"""," ""2/19/2006"""
+608,8," ""2/19/2006"""," ""2/19/2006"""
+609,9," ""2/18/2006"""," ""2/23/2006"""
+610,10," ""2/20/2006"""," ""2/22/2006"""
+611,1," ""2/24/2006"""," ""2/26/2006"""
+612,2," ""2/25/2006"""," ""2/26/2006"""
+613,3," ""2/10/2006"""," ""2/13/2006"""
+614,4," ""2/12/2006"""," ""2/14/2006"""
+615,5," ""2/15/2006"""," ""2/15/2006"""
+616,6," ""2/14/2006"""," ""2/18/2006"""
+617,7," ""2/15/2006"""," ""2/16/2006"""
+618,8," ""2/17/2006"""," ""2/20/2006"""
+619,9," ""2/18/2006"""," ""2/19/2006"""
+620,10," ""2/19/2006"""," ""2/19/2006"""
+621,1," ""2/18/2006"""," ""2/23/2006"""
+622,2," ""2/20/2006"""," ""2/22/2006"""
+623,3," ""2/24/2006"""," ""2/26/2006"""
+624,4," ""2/25/2006"""," ""2/26/2006"""
+625,5," ""2/10/2006"""," ""2/13/2006"""
+626,6," ""2/12/2006"""," ""2/14/2006"""
+627,7," ""2/15/2006"""," ""2/15/2006"""
+628,8," ""2/14/2006"""," ""2/18/2006"""
+629,9," ""2/15/2006"""," ""2/16/2006"""
+630,10," ""2/17/2006"""," ""2/20/2006"""
+631,1," ""2/18/2006"""," ""2/19/2006"""
+632,2," ""2/19/2006"""," ""2/19/2006"""
+633,3," ""2/18/2006"""," ""2/23/2006"""
+634,4," ""2/20/2006"""," ""2/22/2006"""
+635,5," ""2/24/2006"""," ""2/26/2006"""
+636,6," ""2/25/2006"""," ""2/26/2006"""
+637,7," ""2/10/2006"""," ""2/13/2006"""
+638,8," ""2/12/2006"""," ""2/14/2006"""
+639,9," ""2/15/2006"""," ""2/15/2006"""
+640,10," ""2/14/2006"""," ""2/18/2006"""
+641,1," ""2/15/2006"""," ""2/16/2006"""
+642,2," ""2/17/2006"""," ""2/20/2006"""
+643,3," ""2/18/2006"""," ""2/19/2006"""
+644,4," ""2/19/2006"""," ""2/19/2006"""
+645,5," ""2/18/2006"""," ""2/23/2006"""
+646,6," ""2/20/2006"""," ""2/22/2006"""
+647,7," ""2/24/2006"""," ""2/26/2006"""
+648,8," ""2/25/2006"""," ""2/26/2006"""
+649,9," ""2/10/2006"""," ""2/13/2006"""
+650,10," ""2/12/2006"""," ""2/14/2006"""
+651,1," ""2/15/2006"""," ""2/15/2006"""
+652,2," ""2/14/2006"""," ""2/18/2006"""
+653,3," ""2/15/2006"""," ""2/16/2006"""
+654,4," ""2/17/2006"""," ""2/20/2006"""
+655,5," ""2/18/2006"""," ""2/19/2006"""
+656,6," ""2/19/2006"""," ""2/19/2006"""
+657,7," ""2/18/2006"""," ""2/23/2006"""
+658,8," ""2/20/2006"""," ""2/22/2006"""
+659,9," ""2/24/2006"""," ""2/26/2006"""
+660,10," ""2/25/2006"""," ""2/26/2006"""
+661,1," ""2/10/2006"""," ""2/13/2006"""
+662,2," ""2/12/2006"""," ""2/14/2006"""
+663,3," ""2/15/2006"""," ""2/15/2006"""
+664,4," ""2/14/2006"""," ""2/18/2006"""
+665,5," ""2/15/2006"""," ""2/16/2006"""
+666,6," ""2/17/2006"""," ""2/20/2006"""
+667,7," ""2/18/2006"""," ""2/19/2006"""
+668,8," ""2/19/2006"""," ""2/19/2006"""
+669,9," ""2/18/2006"""," ""2/23/2006"""
+670,10," ""2/20/2006"""," ""2/22/2006"""
+671,1," ""2/24/2006"""," ""2/26/2006"""
+672,2," ""2/25/2006"""," ""2/26/2006"""
+673,3," ""2/10/2006"""," ""2/13/2006"""
+674,4," ""2/12/2006"""," ""2/14/2006"""
+675,5," ""2/15/2006"""," ""2/15/2006"""
+676,6," ""2/14/2006"""," ""2/18/2006"""
+677,7," ""2/15/2006"""," ""2/16/2006"""
+678,8," ""2/17/2006"""," ""2/20/2006"""
+679,9," ""2/18/2006"""," ""2/19/2006"""
+680,10," ""2/19/2006"""," ""2/19/2006"""
+681,1," ""2/18/2006"""," ""2/23/2006"""
+682,2," ""2/20/2006"""," ""2/22/2006"""
+683,3," ""2/24/2006"""," ""2/26/2006"""
+684,4," ""2/25/2006"""," ""2/26/2006"""
+685,5," ""2/10/2006"""," ""2/13/2006"""
+686,6," ""2/12/2006"""," ""2/14/2006"""
+687,7," ""2/15/2006"""," ""2/15/2006"""
+688,8," ""2/14/2006"""," ""2/18/2006"""
+689,9," ""2/15/2006"""," ""2/16/2006"""
+690,10," ""2/17/2006"""," ""2/20/2006"""
+691,1," ""2/18/2006"""," ""2/19/2006"""
+692,2," ""2/19/2006"""," ""2/19/2006"""
+693,3," ""2/18/2006"""," ""2/23/2006"""
+694,4," ""2/20/2006"""," ""2/22/2006"""
+695,5," ""2/24/2006"""," ""2/26/2006"""
+696,6," ""2/25/2006"""," ""2/26/2006"""
+697,7," ""2/10/2006"""," ""2/13/2006"""
+698,8," ""2/12/2006"""," ""2/14/2006"""
+699,9," ""2/15/2006"""," ""2/15/2006"""
+700,10," ""2/14/2006"""," ""2/18/2006"""
+701,1," ""2/15/2006"""," ""2/16/2006"""
+702,2," ""2/17/2006"""," ""2/20/2006"""
+703,3," ""2/18/2006"""," ""2/19/2006"""
+704,4," ""2/19/2006"""," ""2/19/2006"""
+705,5," ""2/18/2006"""," ""2/23/2006"""
+706,6," ""2/20/2006"""," ""2/22/2006"""
+707,7," ""2/24/2006"""," ""2/26/2006"""
+708,8," ""2/25/2006"""," ""2/26/2006"""
+709,9," ""2/10/2006"""," ""2/13/2006"""
+710,10," ""2/12/2006"""," ""2/14/2006"""
+711,1," ""2/15/2006"""," ""2/15/2006"""
+712,2," ""2/14/2006"""," ""2/18/2006"""
+713,3," ""2/15/2006"""," ""2/16/2006"""
+714,4," ""2/17/2006"""," ""2/20/2006"""
+715,5," ""2/18/2006"""," ""2/19/2006"""
+716,6," ""2/19/2006"""," ""2/19/2006"""
+717,7," ""2/18/2006"""," ""2/23/2006"""
+718,8," ""2/20/2006"""," ""2/22/2006"""
+719,9," ""2/24/2006"""," ""2/26/2006"""
+720,10," ""2/25/2006"""," ""2/26/2006"""
+721,1," ""2/10/2006"""," ""2/13/2006"""
+722,2," ""2/12/2006"""," ""2/14/2006"""
+723,3," ""2/15/2006"""," ""2/15/2006"""
+724,4," ""2/14/2006"""," ""2/18/2006"""
+725,5," ""2/15/2006"""," ""2/16/2006"""
+726,6," ""2/17/2006"""," ""2/20/2006"""
+727,7," ""2/18/2006"""," ""2/19/2006"""
+728,8," ""2/19/2006"""," ""2/19/2006"""
+729,9," ""2/18/2006"""," ""2/23/2006"""
+730,10," ""2/20/2006"""," ""2/22/2006"""
+731,1," ""2/24/2006"""," ""2/26/2006"""
+732,2," ""2/25/2006"""," ""2/26/2006"""
+733,3," ""2/10/2006"""," ""2/13/2006"""
+734,4," ""2/12/2006"""," ""2/14/2006"""
+735,5," ""2/15/2006"""," ""2/15/2006"""
+736,6," ""2/14/2006"""," ""2/18/2006"""
+737,7," ""2/15/2006"""," ""2/16/2006"""
+738,8," ""2/17/2006"""," ""2/20/2006"""
+739,9," ""2/18/2006"""," ""2/19/2006"""
+740,10," ""2/19/2006"""," ""2/19/2006"""
+741,1," ""2/18/2006"""," ""2/23/2006"""
+742,2," ""2/20/2006"""," ""2/22/2006"""
+743,3," ""2/24/2006"""," ""2/26/2006"""
+744,4," ""2/25/2006"""," ""2/26/2006"""
+745,5," ""2/10/2006"""," ""2/13/2006"""
+746,6," ""2/12/2006"""," ""2/14/2006"""
+747,7," ""2/15/2006"""," ""2/15/2006"""
+748,8," ""2/14/2006"""," ""2/18/2006"""
+749,9," ""2/15/2006"""," ""2/16/2006"""
+750,10," ""2/17/2006"""," ""2/20/2006"""
+751,1," ""2/18/2006"""," ""2/19/2006"""
+752,2," ""2/19/2006"""," ""2/19/2006"""
+753,3," ""2/18/2006"""," ""2/23/2006"""
+754,4," ""2/20/2006"""," ""2/22/2006"""
+755,5," ""2/24/2006"""," ""2/26/2006"""
+756,6," ""2/25/2006"""," ""2/26/2006"""
+757,7," ""2/10/2006"""," ""2/13/2006"""
+758,8," ""2/12/2006"""," ""2/14/2006"""
+759,9," ""2/15/2006"""," ""2/15/2006"""
+760,10," ""2/14/2006"""," ""2/18/2006"""
+761,1," ""2/15/2006"""," ""2/16/2006"""
+762,2," ""2/17/2006"""," ""2/20/2006"""
+763,3," ""2/18/2006"""," ""2/19/2006"""
+764,4," ""2/19/2006"""," ""2/19/2006"""
+765,5," ""2/18/2006"""," ""2/23/2006"""
+766,6," ""2/20/2006"""," ""2/22/2006"""
+767,7," ""2/24/2006"""," ""2/26/2006"""
+768,8," ""2/25/2006"""," ""2/26/2006"""
+769,9," ""2/10/2006"""," ""2/13/2006"""
+770,10," ""2/12/2006"""," ""2/14/2006"""
+771,1," ""2/15/2006"""," ""2/15/2006"""
+772,2," ""2/14/2006"""," ""2/18/2006"""
+773,3," ""2/15/2006"""," ""2/16/2006"""
+774,4," ""2/17/2006"""," ""2/20/2006"""
+775,5," ""2/18/2006"""," ""2/19/2006"""
+776,6," ""2/19/2006"""," ""2/19/2006"""
+777,7," ""2/18/2006"""," ""2/23/2006"""
+778,8," ""2/20/2006"""," ""2/22/2006"""
+779,9," ""2/24/2006"""," ""2/26/2006"""
+780,10," ""2/25/2006"""," ""2/26/2006"""
+781,1," ""2/10/2006"""," ""2/13/2006"""
+782,2," ""2/12/2006"""," ""2/14/2006"""
+783,3," ""2/15/2006"""," ""2/15/2006"""
+784,4," ""2/14/2006"""," ""2/18/2006"""
+785,5," ""2/15/2006"""," ""2/16/2006"""
+786,6," ""2/17/2006"""," ""2/20/2006"""
+787,7," ""2/18/2006"""," ""2/19/2006"""
+788,8," ""2/19/2006"""," ""2/19/2006"""
+789,9," ""2/18/2006"""," ""2/23/2006"""
+790,10," ""2/20/2006"""," ""2/22/2006"""
+791,1," ""2/24/2006"""," ""2/26/2006"""
+792,2," ""2/25/2006"""," ""2/26/2006"""
+793,3," ""2/10/2006"""," ""2/13/2006"""
+794,4," ""2/12/2006"""," ""2/14/2006"""
+795,5," ""2/15/2006"""," ""2/15/2006"""
+796,6," ""2/14/2006"""," ""2/18/2006"""
+797,7," ""2/15/2006"""," ""2/16/2006"""
+798,8," ""2/17/2006"""," ""2/20/2006"""
+799,9," ""2/18/2006"""," ""2/19/2006"""
+800,10," ""2/19/2006"""," ""2/19/2006"""
+801,1," ""2/18/2006"""," ""2/23/2006"""
+802,2," ""2/20/2006"""," ""2/22/2006"""
+803,3," ""2/24/2006"""," ""2/26/2006"""
+804,4," ""2/25/2006"""," ""2/26/2006"""
+805,5," ""2/10/2006"""," ""2/13/2006"""
+806,6," ""2/12/2006"""," ""2/14/2006"""
+807,7," ""2/15/2006"""," ""2/15/2006"""
+808,8," ""2/14/2006"""," ""2/18/2006"""
+809,9," ""2/15/2006"""," ""2/16/2006"""
+810,10," ""2/17/2006"""," ""2/20/2006"""
+811,1," ""2/18/2006"""," ""2/19/2006"""
+812,2," ""2/19/2006"""," ""2/19/2006"""
+813,3," ""2/18/2006"""," ""2/23/2006"""
+814,4," ""2/20/2006"""," ""2/22/2006"""
+815,5," ""2/24/2006"""," ""2/26/2006"""
+816,6," ""2/25/2006"""," ""2/26/2006"""
+817,7," ""2/10/2006"""," ""2/13/2006"""
+818,8," ""2/12/2006"""," ""2/14/2006"""
+819,9," ""2/15/2006"""," ""2/15/2006"""
+820,10," ""2/14/2006"""," ""2/18/2006"""
+821,1," ""2/15/2006"""," ""2/16/2006"""
+822,2," ""2/17/2006"""," ""2/20/2006"""
+823,3," ""2/18/2006"""," ""2/19/2006"""
+824,4," ""2/19/2006"""," ""2/19/2006"""
+825,5," ""2/18/2006"""," ""2/23/2006"""
+826,6," ""2/20/2006"""," ""2/22/2006"""
+827,7," ""2/24/2006"""," ""2/26/2006"""
+828,8," ""2/25/2006"""," ""2/26/2006"""
+829,9," ""2/10/2006"""," ""2/13/2006"""
+830,10," ""2/12/2006"""," ""2/14/2006"""
+831,1," ""2/15/2006"""," ""2/15/2006"""
+832,2," ""2/14/2006"""," ""2/18/2006"""
+833,3," ""2/15/2006"""," ""2/16/2006"""
+834,4," ""2/17/2006"""," ""2/20/2006"""
+835,5," ""2/18/2006"""," ""2/19/2006"""
+836,6," ""2/19/2006"""," ""2/19/2006"""
+837,7," ""2/18/2006"""," ""2/23/2006"""
+838,8," ""2/20/2006"""," ""2/22/2006"""
+839,9," ""2/24/2006"""," ""2/26/2006"""
+840,10," ""2/25/2006"""," ""2/26/2006"""
+841,1," ""2/10/2006"""," ""2/13/2006"""
+842,2," ""2/12/2006"""," ""2/14/2006"""
+843,3," ""2/15/2006"""," ""2/15/2006"""
+844,4," ""2/14/2006"""," ""2/18/2006"""
+845,5," ""2/15/2006"""," ""2/16/2006"""
+846,6," ""2/17/2006"""," ""2/20/2006"""
+847,7," ""2/18/2006"""," ""2/19/2006"""
+848,8," ""2/19/2006"""," ""2/19/2006"""
+849,9," ""2/18/2006"""," ""2/23/2006"""
+850,10," ""2/20/2006"""," ""2/22/2006"""
+851,1," ""2/24/2006"""," ""2/26/2006"""
+852,2," ""2/25/2006"""," ""2/26/2006"""
+853,3," ""2/10/2006"""," ""2/13/2006"""
+854,4," ""2/12/2006"""," ""2/14/2006"""
+855,5," ""2/15/2006"""," ""2/15/2006"""
+856,6," ""2/14/2006"""," ""2/18/2006"""
+857,7," ""2/15/2006"""," ""2/16/2006"""
+858,8," ""2/17/2006"""," ""2/20/2006"""
+859,9," ""2/18/2006"""," ""2/19/2006"""
+860,10," ""2/19/2006"""," ""2/19/2006"""
+861,1," ""2/18/2006"""," ""2/23/2006"""
+862,2," ""2/20/2006"""," ""2/22/2006"""
+863,3," ""2/24/2006"""," ""2/26/2006"""
+864,4," ""2/25/2006"""," ""2/26/2006"""
+865,5," ""2/10/2006"""," ""2/13/2006"""
+866,6," ""2/12/2006"""," ""2/14/2006"""
+867,7," ""2/15/2006"""," ""2/15/2006"""
+868,8," ""2/14/2006"""," ""2/18/2006"""
+869,9," ""2/15/2006"""," ""2/16/2006"""
+870,10," ""2/17/2006"""," ""2/20/2006"""
+871,1," ""2/18/2006"""," ""2/19/2006"""
+872,2," ""2/19/2006"""," ""2/19/2006"""
+873,3," ""2/18/2006"""," ""2/23/2006"""
+874,4," ""2/20/2006"""," ""2/22/2006"""
+875,5," ""2/24/2006"""," ""2/26/2006"""
+876,6," ""2/25/2006"""," ""2/26/2006"""
+877,7," ""2/10/2006"""," ""2/13/2006"""
+878,8," ""2/12/2006"""," ""2/14/2006"""
+879,9," ""2/15/2006"""," ""2/15/2006"""
+880,10," ""2/14/2006"""," ""2/18/2006"""
+881,1," ""2/15/2006"""," ""2/16/2006"""
+882,2," ""2/17/2006"""," ""2/20/2006"""
+883,3," ""2/18/2006"""," ""2/19/2006"""
+884,4," ""2/19/2006"""," ""2/19/2006"""
+885,5," ""2/18/2006"""," ""2/23/2006"""
+886,6," ""2/20/2006"""," ""2/22/2006"""
+887,7," ""2/24/2006"""," ""2/26/2006"""
+888,8," ""2/25/2006"""," ""2/26/2006"""
+889,9," ""2/10/2006"""," ""2/13/2006"""
+890,10," ""2/12/2006"""," ""2/14/2006"""
+891,1," ""2/15/2006"""," ""2/15/2006"""
+892,2," ""2/14/2006"""," ""2/18/2006"""
+893,3," ""2/15/2006"""," ""2/16/2006"""
+894,4," ""2/17/2006"""," ""2/20/2006"""
+895,5," ""2/18/2006"""," ""2/19/2006"""
+896,6," ""2/19/2006"""," ""2/19/2006"""
+897,7," ""2/18/2006"""," ""2/23/2006"""
+898,8," ""2/20/2006"""," ""2/22/2006"""
+899,9," ""2/24/2006"""," ""2/26/2006"""
+900,10," ""2/25/2006"""," ""2/26/2006"""
+901,1," ""2/10/2006"""," ""2/13/2006"""
+902,2," ""2/12/2006"""," ""2/14/2006"""
+903,3," ""2/15/2006"""," ""2/15/2006"""
+904,4," ""2/14/2006"""," ""2/18/2006"""
+905,5," ""2/15/2006"""," ""2/16/2006"""
+906,6," ""2/17/2006"""," ""2/20/2006"""
+907,7," ""2/18/2006"""," ""2/19/2006"""
+908,8," ""2/19/2006"""," ""2/19/2006"""
+909,9," ""2/18/2006"""," ""2/23/2006"""
+910,10," ""2/20/2006"""," ""2/22/2006"""
+911,1," ""2/24/2006"""," ""2/26/2006"""
+912,2," ""2/25/2006"""," ""2/26/2006"""
+913,3," ""2/10/2006"""," ""2/13/2006"""
+914,4," ""2/12/2006"""," ""2/14/2006"""
+915,5," ""2/15/2006"""," ""2/15/2006"""
+916,6," ""2/14/2006"""," ""2/18/2006"""
+917,7," ""2/15/2006"""," ""2/16/2006"""
+918,8," ""2/17/2006"""," ""2/20/2006"""
+919,9," ""2/18/2006"""," ""2/19/2006"""
+920,10," ""2/19/2006"""," ""2/19/2006"""
+921,1," ""2/18/2006"""," ""2/23/2006"""
+922,2," ""2/20/2006"""," ""2/22/2006"""
+923,3," ""2/24/2006"""," ""2/26/2006"""
+924,4," ""2/25/2006"""," ""2/26/2006"""
+925,5," ""2/10/2006"""," ""2/13/2006"""
+926,6," ""2/12/2006"""," ""2/14/2006"""
+927,7," ""2/15/2006"""," ""2/15/2006"""
+928,8," ""2/14/2006"""," ""2/18/2006"""
+929,9," ""2/15/2006"""," ""2/16/2006"""
+930,10," ""2/17/2006"""," ""2/20/2006"""
+931,1," ""2/18/2006"""," ""2/19/2006"""
+932,2," ""2/19/2006"""," ""2/19/2006"""
+933,3," ""2/18/2006"""," ""2/23/2006"""
+934,4," ""2/20/2006"""," ""2/22/2006"""
+935,5," ""2/24/2006"""," ""2/26/2006"""
+936,6," ""2/25/2006"""," ""2/26/2006"""
+937,7," ""2/10/2006"""," ""2/13/2006"""
+938,8," ""2/12/2006"""," ""2/14/2006"""
+939,9," ""2/15/2006"""," ""2/15/2006"""
+940,10," ""2/14/2006"""," ""2/18/2006"""
+941,1," ""2/15/2006"""," ""2/16/2006"""
+942,2," ""2/17/2006"""," ""2/20/2006"""
+943,3," ""2/18/2006"""," ""2/19/2006"""
+944,4," ""2/19/2006"""," ""2/19/2006"""
+945,5," ""2/18/2006"""," ""2/23/2006"""
+946,6," ""2/20/2006"""," ""2/22/2006"""
+947,7," ""2/24/2006"""," ""2/26/2006"""
+948,8," ""2/25/2006"""," ""2/26/2006"""
+949,9," ""2/10/2006"""," ""2/13/2006"""
+950,10," ""2/12/2006"""," ""2/14/2006"""
+951,1," ""2/15/2006"""," ""2/15/2006"""
+952,2," ""2/14/2006"""," ""2/18/2006"""
+953,3," ""2/15/2006"""," ""2/16/2006"""
+954,4," ""2/17/2006"""," ""2/20/2006"""
+955,5," ""2/18/2006"""," ""2/19/2006"""
+956,6," ""2/19/2006"""," ""2/19/2006"""
+957,7," ""2/18/2006"""," ""2/23/2006"""
+958,8," ""2/20/2006"""," ""2/22/2006"""
+959,9," ""2/24/2006"""," ""2/26/2006"""
+960,10," ""2/25/2006"""," ""2/26/2006"""
+961,1," ""2/10/2006"""," ""2/13/2006"""
+962,2," ""2/12/2006"""," ""2/14/2006"""
+963,3," ""2/15/2006"""," ""2/15/2006"""
+964,4," ""2/14/2006"""," ""2/18/2006"""
+965,5," ""2/15/2006"""," ""2/16/2006"""
+966,6," ""2/17/2006"""," ""2/20/2006"""
+967,7," ""2/18/2006"""," ""2/19/2006"""
+968,8," ""2/19/2006"""," ""2/19/2006"""
+969,9," ""2/18/2006"""," ""2/23/2006"""
+970,10," ""2/20/2006"""," ""2/22/2006"""
+971,1," ""2/24/2006"""," ""2/26/2006"""
+972,2," ""2/25/2006"""," ""2/26/2006"""
+973,3," ""2/10/2006"""," ""2/13/2006"""
+974,4," ""2/12/2006"""," ""2/14/2006"""
+975,5," ""2/15/2006"""," ""2/15/2006"""
+976,6," ""2/14/2006"""," ""2/18/2006"""
+977,7," ""2/15/2006"""," ""2/16/2006"""
+978,8," ""2/17/2006"""," ""2/20/2006"""
+979,9," ""2/18/2006"""," ""2/19/2006"""
+980,10," ""2/19/2006"""," ""2/19/2006"""
+981,1," ""2/18/2006"""," ""2/23/2006"""
+982,2," ""2/20/2006"""," ""2/22/2006"""
+983,3," ""2/24/2006"""," ""2/26/2006"""
+984,4," ""2/25/2006"""," ""2/26/2006"""
+985,5," ""2/10/2006"""," ""2/13/2006"""
+986,6," ""2/12/2006"""," ""2/14/2006"""
+987,7," ""2/15/2006"""," ""2/15/2006"""
+988,8," ""2/14/2006"""," ""2/18/2006"""
+989,9," ""2/15/2006"""," ""2/16/2006"""
+990,10," ""2/17/2006"""," ""2/20/2006"""
+991,1," ""2/18/2006"""," ""2/19/2006"""
+992,2," ""2/19/2006"""," ""2/19/2006"""
+993,3," ""2/18/2006"""," ""2/23/2006"""
+994,4," ""2/20/2006"""," ""2/22/2006"""
+995,5," ""2/24/2006"""," ""2/26/2006"""
+996,6," ""2/25/2006"""," ""2/26/2006"""
+997,7," ""2/10/2006"""," ""2/13/2006"""
+998,8," ""2/12/2006"""," ""2/14/2006"""
+999,9," ""2/15/2006"""," ""2/15/2006"""
+1000,10," ""2/14/2006"""," ""2/18/2006"""
\ No newline at end of file
diff --git a/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.json b/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.json
new file mode 100644
index 0000000..041754b
--- /dev/null
+++ b/Projects/p3-skeleton/cs448p3/src/test/resources/ridesBig.json
@@ -0,0 +1,29 @@
+{
+ "schema": [
+ {
+ "no": 0,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "DriverId"
+ },
+ {
+ "no": 1,
+ "type": "INTEGER",
+ "length": 4,
+ "name": "GroupId"
+ },
+ {
+ "no": 2,
+ "type": "STRING",
+ "length": 10,
+ "name": "FromDate"
+ },
+ {
+ "no": 3,
+ "type": "STRING",
+ "length": 10,
+ "name": "ToDate"
+ }
+ ],
+ "key": 1
+}