[pdal] 04/08: Imported Upstream version 1.1.0

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sun Mar 20 03:18:29 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository pdal.

commit 54437b996d21373902892f160c1d133275bceeab
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Mar 15 21:01:02 2016 +0100

    Imported Upstream version 1.1.0
---
 CMakeLists.txt                                     |    6 +-
 ChangeLog                                          | 8091 ++++++++++++++++++++
 apps/pdal-config                                   |    2 +-
 cmake/geowave.cmake                                |    4 +-
 cmake/jace.cmake                                   |    4 +-
 cmake/jni.cmake                                    |   15 +-
 cmake/modules/FindGeoWave.cmake                    |    2 +-
 cmake/modules/FindJace.cmake                       |   13 +-
 doc/_templates/layout.html                         |   20 +
 doc/_themes/bootstrap/bootstrap.js                 | 2038 -----
 doc/_themes/bootstrap/bootstrap.min.js             |    7 -
 doc/_themes/bootstrap/indexsidebar.html            |   42 -
 doc/_themes/bootstrap/static/bootstrap-default.css | 5624 --------------
 .../bootstrap/static/bootstrap-default.min.css     |    9 -
 doc/_themes/bootstrap/static/bootstrap-dropdown.js |   81 -
 .../bootstrap/static/bootstrap-engineauth.css      | 5700 --------------
 .../bootstrap/static/bootstrap-engineauth.min.css  |  829 --
 .../bootstrap/static/bootstrap-responsive.css      | 1040 ---
 .../bootstrap/static/bootstrap-responsive.min.css  |    9 -
 doc/_themes/bootstrap/static/bootstrap-sapling.css | 6484 ----------------
 doc/_themes/bootstrap/static/jquery.js             |    4 -
 doc/_themes/bootstrap/static/sphinx-bootstrap.css  |  188 -
 doc/api/cpp/bounds.rst                             |    7 +-
 doc/api/cpp/{option.rst => filter.rst}             |    9 +-
 doc/api/cpp/index.rst                              |    2 +-
 doc/api/cpp/log.rst                                |    3 +-
 doc/api/cpp/metadata.rst                           |    8 +-
 doc/api/cpp/options.rst                            |    3 +-
 doc/api/cpp/pointtable.rst                         |    3 +-
 doc/api/cpp/pointview.rst                          |    3 +-
 doc/api/cpp/reader.rst                             |   41 +-
 doc/api/cpp/stage.rst                              |   10 +-
 doc/api/cpp/writer.rst                             |    3 +-
 doc/api/index.rst                                  |   19 +-
 doc/apps.rst                                       |    4 +-
 doc/community.rst                                  |   52 +-
 doc/compilation/dependencies.rst                   |   91 +-
 doc/compilation/index.rst                          |   10 +-
 doc/compilation/media/OSGeo4WInstallIConv.png      |  Bin 31629 -> 35153 bytes
 doc/compilation/unix.rst                           |  110 +-
 doc/compilation/windows.rst                        |   15 +
 doc/conf.py                                        |  115 +-
 doc/development/conventions.rst                    |   37 +-
 doc/development/docs.rst                           |  103 +-
 doc/development/errorhandling.rst                  |   24 +-
 doc/development/goals.rst                          |   35 +-
 doc/development/index.rst                          |   27 +-
 doc/development/testing.rst                        |  380 +-
 doc/development/usecases.rst                       |   99 -
 doc/docbuild/Dockerfile                            |   28 +
 doc/docbuild/run.sh                                |    8 +
 doc/docs.rst                                       |   34 -
 doc/download.rst                                   |   17 +-
 doc/faq.rst                                        |    7 +
 doc/index.rst                                      |   84 +-
 doc/metadata.rst                                   |    2 +-
 doc/stages/filters.attribute.rst                   |  165 +-
 doc/stages/filters.chipper.rst                     |   11 +-
 doc/stages/filters.colorization.rst                |  100 +-
 doc/stages/filters.dartsample.rst                  |   24 +
 doc/stages/filters.decimation.rst                  |   13 +-
 doc/stages/filters.divider.rst                     |   55 +
 doc/stages/filters.ferry.rst                       |   32 +-
 doc/stages/filters.greedyprojection.rst            |   20 +
 doc/stages/filters.gridprojection.rst              |   20 +
 doc/stages/filters.ground.rst                      |   42 +
 doc/stages/filters.height.rst                      |   12 +
 doc/stages/filters.hexbin.rst                      |   12 +-
 doc/stages/filters.merge.rst                       |    4 +-
 doc/stages/filters.mortonorder.rst                 |    2 +-
 doc/stages/filters.movingleastsquares.rst          |   22 +
 doc/stages/filters.poisson.rst                     |   23 +
 doc/stages/filters.predicate.rst                   |   39 +-
 doc/stages/filters.radiusoutlier.rst               |   31 +
 ...lters.mortonorder.rst => filters.randomize.rst} |   19 +-
 doc/stages/filters.range.rst                       |   43 +-
 doc/stages/filters.sort.rst                        |    2 +-
 doc/stages/filters.splitter.rst                    |    8 +-
 doc/stages/filters.statisticaloutlier.img1.png     |  Bin 0 -> 123326 bytes
 doc/stages/filters.statisticaloutlier.img2.png     |  Bin 0 -> 236137 bytes
 doc/stages/filters.statisticaloutlier.rst          |   53 +
 doc/stages/filters.stats.rst                       |    4 +-
 doc/stages/filters.transformation.rst              |   12 +-
 doc/stages/filters.voxelgrid.rst                   |   34 +
 doc/stages/index.rst                               |   89 +-
 doc/stages/ranges.rst                              |   57 +
 doc/stages/readers.bpf.rst                         |    7 +-
 doc/stages/readers.buffer.rst                      |    6 +-
 doc/stages/readers.gdal.rst                        |   78 +
 doc/stages/readers.geowave.rst                     |   36 +-
 doc/stages/readers.greyhound.rst                   |    4 +-
 doc/stages/readers.ilvis2.metadata.png             |  Bin 0 -> 284685 bytes
 doc/stages/readers.ilvis2.rst                      |   39 +
 doc/stages/readers.las.rst                         |   67 +-
 doc/stages/readers.ply.rst                         |    2 +-
 doc/stages/readers.tindex.rst                      |  125 +
 doc/stages/writers.bpf.rst                         |   20 +-
 doc/stages/writers.geowave.rst                     |   36 +-
 doc/stages/writers.las.rst                         |   40 +-
 doc/stages/writers.nitf.rst                        |   43 +-
 doc/stages/writers.null.rst                        |    2 +-
 doc/stages/writers.oci.rst                         |    2 +-
 doc/stages/writers.p2g.rst                         |   26 +-
 doc/stages/writers.text.rst                        |   18 +-
 doc/tutorial/autzen-elevation.png                  |  Bin 0 -> 576093 bytes
 doc/tutorial/autzen-height.png                     |  Bin 0 -> 594313 bytes
 doc/tutorial/autzen-shapes-clipped.png             |  Bin 0 -> 873023 bytes
 doc/tutorial/autzen-shapes-point-cloud.png         |  Bin 0 -> 2749626 bytes
 doc/tutorial/autzen-shapes-to-clip.png             |  Bin 0 -> 1306328 bytes
 doc/tutorial/calculating-normalized-heights.rst    |  192 +
 doc/tutorial/clipping-with-shapefile.rst           |  208 +
 doc/tutorial/dart-throwing.rst                     |   77 +
 doc/tutorial/index.rst                             |    4 +
 doc/tutorial/liblas_to_pdal.rst                    |   20 +-
 doc/tutorial/overview.rst                          |    7 +-
 doc/tutorial/pcl_ground.rst                        |    7 +-
 doc/tutorial/pcl_spec.rst                          |   44 +-
 doc/tutorial/reading.rst                           |  142 +-
 doc/tutorial/subsample-ex1.png                     |  Bin 0 -> 73699 bytes
 doc/tutorial/subsample-ex2.png                     |  Bin 0 -> 106284 bytes
 doc/tutorial/subsample-ex3.png                     |  Bin 0 -> 446842 bytes
 doc/tutorial/subsample-ex4.png                     |  Bin 0 -> 776586 bytes
 doc/tutorial/subsample-ex5.png                     |  Bin 0 -> 220476 bytes
 doc/tutorial/using.rst                             |    4 +
 doc/tutorial/writing-filter.rst                    |   98 +-
 doc/tutorial/writing-kernel.rst                    |   51 +-
 doc/tutorial/writing-reader.rst                    |  189 +-
 doc/tutorial/writing-writer.rst                    |  162 +-
 doc/tutorial/writing.rst                           |   16 +-
 doc/vagrant.rst                                    |   82 +-
 examples/writing-filter/MyFilter.cpp               |   41 +-
 examples/writing-filter/MyFilter.hpp               |   38 +-
 examples/writing-kernel/MyKernel.cpp               |  117 +-
 examples/writing-kernel/MyKernel.hpp               |   29 +-
 examples/writing-reader/MyReader.cpp               |  180 +-
 examples/writing-reader/MyReader.hpp               |   47 +-
 examples/writing-reader/pipeline-myreader.xml      |   16 +
 examples/writing-reader/test-reader-input.txt      |   16 +
 examples/writing-writer/MyWriter.cpp               |  158 +-
 examples/writing-writer/MyWriter.hpp               |   43 +-
 examples/writing-writer/pipeline-mywriter.xml      |   19 +
 examples/writing/tutorial.cpp                      |   24 +-
 filters/CMakeLists.txt                             |    2 +
 filters/colorization/ColorizationFilter.cpp        |  238 +-
 filters/colorization/ColorizationFilter.hpp        |   39 +-
 filters/crop/CropFilter.cpp                        |   72 +-
 filters/crop/CropFilter.hpp                        |    9 +-
 filters/divider/CMakeLists.txt                     |   14 +
 filters/divider/DividerFilter.cpp                  |  137 +
 .../RangeFilter.hpp => divider/DividerFilter.hpp}  |   56 +-
 filters/ferry/FerryFilter.cpp                      |   56 +-
 filters/ferry/FerryFilter.hpp                      |    1 +
 filters/merge/MergeFilter.cpp                      |   25 +
 filters/merge/MergeFilter.hpp                      |   13 +-
 filters/randomize/CMakeLists.txt                   |    5 +
 .../RandomizeFilter.cpp}                           |   15 +-
 .../RandomizeFilter.hpp}                           |   31 +-
 filters/range/RangeFilter.cpp                      |  219 +-
 filters/range/RangeFilter.hpp                      |   42 +-
 filters/reprojection/ReprojectionFilter.cpp        |  129 +-
 filters/reprojection/ReprojectionFilter.hpp        |    7 +-
 include/pdal/Compression.hpp                       |  171 +-
 include/pdal/FlexWriter.hpp                        |   17 +-
 include/pdal/GDALUtils.hpp                         |   89 +-
 include/pdal/Geometry.hpp                          |  146 +
 include/pdal/Kernel.hpp                            |   11 +-
 include/pdal/KernelSupport.hpp                     |    2 +-
 include/pdal/Metadata.hpp                          |    2 +-
 include/pdal/Options.hpp                           |  148 +-
 include/pdal/PDALUtils.hpp                         |   11 +-
 include/pdal/PipelineManager.hpp                   |    2 +-
 include/pdal/PointTable.hpp                        |   23 +-
 include/pdal/PointView.hpp                         |   24 +-
 include/pdal/SpatialReference.hpp                  |   19 +
 include/pdal/Stage.hpp                             |   18 +-
 include/pdal/StageWrapper.hpp                      |    5 +-
 include/pdal/util/Algorithm.hpp                    |   25 +
 include/pdal/util/Utils.hpp                        |   81 +-
 io/CMakeLists.txt                                  |    3 +
 io/bpf/BpfWriter.cpp                               |   38 +-
 io/bpf/BpfWriter.hpp                               |    5 +-
 io/derivative/DerivativeWriter.cpp                 |   18 +-
 io/derivative/DerivativeWriter.hpp                 |    3 +-
 io/faux/FauxReader.cpp                             |   47 +-
 io/gdal/CMakeLists.txt                             |   10 +
 io/gdal/GDALReader.cpp                             |  205 +
 .../FerryFilter.hpp => io/gdal/GDALReader.hpp      |   47 +-
 io/ilvis2/CMakeLists.txt                           |   21 +
 io/ilvis2/Ilvis2Reader.cpp                         |  225 +
 .../FerryFilter.hpp => io/ilvis2/Ilvis2Reader.hpp  |   35 +-
 io/las/LasError.hpp                                |    7 +-
 io/las/LasHeader.cpp                               |   29 +-
 io/las/LasHeader.hpp                               |    8 +
 io/las/LasReader.cpp                               |  172 +-
 io/las/LasReader.hpp                               |   12 +-
 io/las/LasUtils.cpp                                |   16 +
 io/las/LasUtils.hpp                                |   12 +
 io/las/LasWriter.cpp                               |  353 +-
 io/las/LasWriter.hpp                               |   26 +-
 io/ply/CMakeLists.txt                              |    4 +-
 io/ply/PlyReader.cpp                               |    2 -
 io/text/TextWriter.cpp                             |    6 +-
 io/tindex/CMakeLists.txt                           |   10 +
 io/tindex/TIndexReader.cpp                         |  343 +
 .../TIndexKernel.hpp => io/tindex/TIndexReader.hpp |   89 +-
 kernels/info/InfoKernel.cpp                        |    5 +-
 kernels/info/InfoKernel.hpp                        |    2 +-
 kernels/tindex/TIndexKernel.cpp                    |   36 +-
 kernels/tindex/TIndexKernel.hpp                    |    1 +
 kernels/translate/TranslateKernel.cpp              |    6 +
 pdal_defines.h.in                                  |    2 +
 plugins/attribute/CMakeLists.txt                   |    5 +
 plugins/attribute/filters/AttributeFilter.cpp      |  268 +-
 plugins/attribute/filters/AttributeFilter.hpp      |   69 +-
 plugins/attribute/test/AttributeFilterTest.cpp     |  186 +
 plugins/geowave/CMakeLists.txt                     |    2 -
 plugins/geowave/io/GeoWaveReader.cpp               |   71 +-
 plugins/geowave/io/GeoWaveReader.hpp               |    4 +-
 plugins/geowave/io/GeoWaveWriter.cpp               |   65 +-
 plugins/greyhound/io/GreyhoundReader.cpp           |    2 +-
 plugins/hexbin/filters/HexBin.cpp                  |   32 +
 plugins/hexbin/filters/HexBin.hpp                  |    1 +
 plugins/nitf/io/NitfReader.cpp                     |   10 +-
 plugins/nitf/io/NitfReader.hpp                     |    3 +-
 plugins/nitf/io/NitfWriter.cpp                     |   93 +-
 plugins/nitf/io/NitfWriter.hpp                     |    7 +-
 plugins/nitf/test/NitfReaderTest.cpp               |    2 +-
 plugins/nitf/test/NitfWriterTest.cpp               |   10 +-
 plugins/oci/io/OciReader.cpp                       |    5 +-
 plugins/oci/io/OciWriter.cpp                       |    8 +-
 plugins/p2g/io/P2gWriter.cpp                       |   29 +-
 plugins/p2g/io/P2gWriter.hpp                       |    1 +
 plugins/pcl/CMakeLists.txt                         |   39 +
 .../Plang.hpp => pcl/dartsample/dart_sample.cpp}   |   38 +-
 plugins/pcl/dartsample/dart_sample.h               |  112 +
 plugins/pcl/dartsample/dart_sample.hpp             |  116 +
 .../filters/{PCLBlock.cpp => DartSampleFilter.cpp} |   93 +-
 .../{GroundFilter.hpp => DartSampleFilter.hpp}     |   32 +-
 .../{PCLBlock.cpp => GreedyProjectionFilter.cpp}   |  104 +-
 ...GroundFilter.hpp => GreedyProjectionFilter.hpp} |   32 +-
 .../{PCLBlock.cpp => GridProjectionFilter.cpp}     |   99 +-
 .../{GroundFilter.hpp => GridProjectionFilter.hpp} |   32 +-
 plugins/pcl/filters/GroundFilter.cpp               |   42 +-
 plugins/pcl/filters/GroundFilter.hpp               |    3 +-
 plugins/pcl/filters/HeightFilter.cpp               |  180 +
 .../filters/{GroundFilter.hpp => HeightFilter.hpp} |   31 +-
 .../{PCLBlock.cpp => MovingLeastSquaresFilter.cpp} |   72 +-
 ...oundFilter.hpp => MovingLeastSquaresFilter.hpp} |   32 +-
 plugins/pcl/filters/PCLBlock.cpp                   |   21 +-
 .../filters/{PCLBlock.cpp => PoissonFilter.cpp}    |   99 +-
 .../{GroundFilter.hpp => PoissonFilter.hpp}        |   33 +-
 .../{GroundFilter.cpp => RadiusOutlierFilter.cpp}  |  116 +-
 .../{GroundFilter.hpp => RadiusOutlierFilter.hpp}  |   19 +-
 ...oundFilter.cpp => StatisticalOutlierFilter.cpp} |  116 +-
 ...oundFilter.hpp => StatisticalOutlierFilter.hpp} |   19 +-
 .../filters/{PCLBlock.cpp => VoxelGridFilter.cpp}  |   69 +-
 .../{GroundFilter.hpp => VoxelGridFilter.hpp}      |   32 +-
 plugins/pcl/kernel/GroundKernel.cpp                |   16 +-
 plugins/pcl/pipeline/PCLPipeline.hpp               |   10 +-
 plugins/pgpointcloud/io/PgReader.cpp               |    1 +
 .../pgpointcloud/test/PgpointcloudWriterTest.cpp   |   47 +-
 plugins/python/filters/ProgrammableFilter.cpp      |    1 -
 plugins/python/plang/CMakeLists.txt                |   34 -
 plugins/python/plang/Plang.cpp                     |   78 -
 plugins/rxp/io/RxpReader.hpp                       |    1 +
 scripts/ci/before_install.sh                       |   15 +
 scripts/ci/script.sh                               |    2 +
 scripts/linux-install-scripts/geowave              |    4 +-
 scripts/linux-install-scripts/geowave.sh           |   27 +-
 scripts/linux-install-scripts/packages.sh          |    3 +-
 scripts/linux-install-scripts/pdal.sh              |   13 +-
 src/CMakeLists.txt                                 |    2 +-
 src/GDALUtils.cpp                                  |  276 +
 src/Kernel.cpp                                     |  122 +-
 src/KernelSupport.cpp                              |    4 +-
 src/Options.cpp                                    |   69 +-
 src/PDALUtils.cpp                                  |    3 -
 src/PipelineReader.cpp                             |   20 -
 src/PluginManager.cpp                              |   29 +
 src/PointLayout.cpp                                |    2 +-
 src/PointTable.cpp                                 |   16 -
 src/PointView.cpp                                  |    2 -
 src/SpatialReference.cpp                           |   16 +-
 src/Stage.cpp                                      |   34 +-
 src/StageFactory.cpp                               |    7 +
 src/gitsha.cpp                                     |    2 +-
 src/plang/Environment.cpp                          |   18 +
 test/data/autzen/attributes.json                   |   11 +
 test/data/autzen/attributes.vrt                    |    9 +
 test/data/autzen/autzen-APMF.json                  |   19 +
 test/data/autzen/autzen-interpolate.xml            |   30 +
 test/data/autzen/hag.py                            |   53 +
 test/data/autzen/hag.xml.in                        |   34 +
 test/data/bpf/simple-extra.bpf                     |  Bin 0 -> 82180 bytes
 test/data/filters/colorize.xml.in                  |   34 +-
 test/data/filters/ferry.xml.in                     |   17 +-
 test/data/filters/merge2.xml.in                    |   20 +
 test/data/filters/merge3.xml.in                    |   18 +
 test/data/filters/range_classification.xml.in      |    7 +-
 test/data/filters/range_z.xml.in                   |    8 +-
 test/data/filters/range_z_classification.xml.in    |   14 +-
 test/data/hole/crop.xml.in                         |    4 +-
 .../ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT     | 1000 +++
 .../ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml |  780 ++
 test/data/ilvis2/ilvis.xml                         |   13 +
 test/data/las/autzen_trim.las                      |  Bin 0 -> 3742038 bytes
 test/data/las/test_epsg_4047.las                   |  Bin 0 -> 1666 bytes
 test/data/las/test_epsg_4326.las                   |  Bin 0 -> 1439 bytes
 test/data/las/test_epsg_4326x3.las                 |  Bin 0 -> 2119 bytes
 test/data/las/test_utm16.las                       |  Bin 0 -> 793 bytes
 test/data/las/test_utm17.las                       |  Bin 0 -> 1039 bytes
 test/data/laz/autzen_trim.laz                      |  Bin 0 -> 603353 bytes
 test/data/misc/opts2json.txt                       |   30 +-
 test/data/misc/opts2json_meta.txt                  |   30 +-
 test/data/pipeline/tindex.xml                      |   31 +
 test/data/pipeline/tindex.xml.in                   |   31 +
 test/unit/CMakeLists.txt                           |    7 +
 test/unit/MetadataTest.cpp                         |   31 +-
 test/unit/OptionsTest.cpp                          |   48 +-
 test/unit/PDALUtilsTest.cpp                        |   17 +-
 test/unit/PointViewTest.cpp                        |   11 +
 test/unit/SpatialReferenceTest.cpp                 |   67 +-
 test/unit/Support.cpp                              |   51 +
 test/unit/Support.hpp                              |    2 +
 test/unit/filters/ColorizationFilterTest.cpp       |   44 +-
 test/unit/filters/CropFilterTest.cpp               |   38 +-
 test/unit/filters/DividerFilterTest.cpp            |  204 +
 test/unit/filters/FerryFilterTest.cpp              |   50 +-
 test/unit/filters/MergeTest.cpp                    |   40 +
 .../{MergeTest.cpp => RandomizeFilterTest.cpp}     |   45 +-
 test/unit/filters/RangeFilterTest.cpp              |  182 +-
 test/unit/filters/StatsFilterTest.cpp              |   16 +-
 test/unit/io/bpf/BPFTest.cpp                       |   65 +
 test/unit/io/faux/FauxReaderTest.cpp               |   23 +
 .../ilvis2/Ilvis2ReaderTest.cpp}                   |   52 +-
 test/unit/io/las/LasReaderTest.cpp                 |   47 +
 test/unit/io/las/LasWriterTest.cpp                 |  194 +-
 vendor/{rply-1.1.3 => rply-1.1.4}/LICENSE          |    4 +-
 vendor/{rply-1.1.3 => rply-1.1.4}/etc/convert.c    |    0
 vendor/{rply-1.1.3 => rply-1.1.4}/etc/dump.c       |    0
 vendor/{rply-1.1.3 => rply-1.1.4}/etc/input.ply    |    0
 vendor/{rply-1.1.3 => rply-1.1.4}/etc/sconvert.c   |    0
 .../{rply-1.1.3 => rply-1.1.4}/manual/manual.html  |  365 +-
 .../manual/reference.css                           |    0
 vendor/{rply-1.1.3 => rply-1.1.4}/manual/rply.png  |  Bin
 vendor/{rply-1.1.3 => rply-1.1.4}/rply.c           |  267 +-
 vendor/{rply-1.1.3 => rply-1.1.4}/rply.h           |   60 +-
 vendor/rply-1.1.4/rplyfile.h                       |   68 +
 348 files changed, 19942 insertions(+), 26414 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 92a4e96..c439d7d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,14 +28,14 @@ mark_as_advanced(CMAKE_VERBOSE_MAKEFILE)
 
 # the next line is the ONLY place in the entire pdal system where
 # the version info is hard-coded
-set(PDAL_VERSION_STRING "1.0.1" CACHE STRING "PDAL version" FORCE)
+set(PDAL_VERSION_STRING "1.1.0" CACHE STRING "PDAL version" FORCE)
 
 DISSECT_VERSION()
 GET_OS_INFO()
 SET_INSTALL_DIRS()
 
 set(PDAL_API_VERSION "1")
-set(PDAL_BUILD_VERSION "1.0.0")
+set(PDAL_BUILD_VERSION "2.0.0")
 
 # Name of C++ library
 
@@ -252,7 +252,7 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
 
 include_directories(vendor/eigen-3.1.91)
 include_directories(vendor/nanoflann-1.1.8)
-include_directories(vendor/rply-1.1.3)
+include_directories(vendor/rply-1.1.4)
 
 #------------------------------------------------------------------------------
 # subdirectory controls
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..044451d
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,8091 @@
+2015-11-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set output view SRS on merge filter. Close #1049 (12:24:30)
+	* Howard Butler <howard at hobu.co> Implement readers.tindex #1052 (11:29:06)
+
+2015-11-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:49:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make VLR reading/writing more closely match LAS spec. (17:48:38)
+	* Howard Butler <howard at hobu.co> Merge pull request #1047 from scott-lewis-nsidc/update-tutorial-writing-writer (08:39:53)
+	* Howard Butler <howard at hobu.co> Merge pull request #1051 from redheli/pgreader_pcid (08:39:31)
+	* Max <zhiyong.weng at gmail.com> use pg_class.oid ,pg_attribute.attrelid to get correct pcid (04:25:29)
+
+2015-11-20
+	* Howard Butler <howard at hobu.co> doc updates (17:11:12)
+
+2015-11-19
+	* Scott Lewis <scott.lewis at nsidc.org> Fixed the filename for the input. (16:00:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (12:29:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Debug for testing. (07:36:35)
+
+2015-11-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix code for windows. (19:21:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:52:47)
+	* Scott Lewis <scott.lewis at nsidc.org> Minor addition to the tutorial documentation (17:17:50)
+	* Scott Lewis <scott.lewis at nsidc.org> Updating Writing a Writer tutorial. (17:15:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add missed comment. (11:20:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Explicitly load symbols from libpython when libplang gets loaded. Close #1010. (10:59:05)
+	* chambbj <brad.chambers at gmail.com> Dart sample radius should be a double (12:17:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (09:31:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:27:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update LAS reader doc. Close #1044 (09:27:19)
+
+2015-11-17
+	* Howard Butler <howard at hobu.co> more doc tweaks (22:07:27)
+	* Howard Butler <howard at hobu.co> predicate doc tweak (21:48:29)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (15:13:50)
+	* Howard Butler <howard at hobu.co> computing nominal point density for tessellated polygon in filters.hexbin (15:12:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Better comment on path elimination logic. Move init/finish to unnamed namespace in Geometry. (11:47:37)
+
+2015-11-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't include hexbin node twice. (19:38:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:07:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Smooth hexbin-generated boundaries. (17:07:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1039 from gadomski/point-view-bounds-checking (15:24:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Check point view size in `getFieldAs` (07:38:55)
+	* Howard Butler <howard at hobu.co> Merge pull request #1041 from PDAL/pcl-dartsample-filter (11:05:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1032 from PDAL/bpf-auto-xyz-offsets (07:35:11)
+
+2015-11-12
+	* Bradley J Chambers <brad.chambers at gmail.com> Add PCL DartSample filter, and a PDAL filter to wrap it (07:49:59)
+	* chambbj <brad.chambers at gmail.com> Fix italics in tutorial (21:23:01)
+	* chambbj <brad.chambers at gmail.com> Link the correct tutorial image (15:22:36)
+	* Howard Butler <howard at hobu.co> Merge pull request #1033 from scott-lewis-nsidc/update-write-kernel-tutorial (14:12:32)
+	* Scott Lewis <scott.lewis at nsidc.org> Changed library filename to be inline (13:36:58)
+	* Scott Lewis <scott.lewis at nsidc.org> Updating Kernel tutorial to work with new code. (13:33:58)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add doc note for BPF offset=auto (12:39:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> Make XYZ auto offset by default in BPF writer (11:27:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #1027 from PDAL/pdal-docs-docker (08:26:09)
+	* Howard Butler <howard at hobu.co> Merge pull request #1030 from PDAL/height-filter (08:25:58)
+
+2015-11-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1037 from gadomski/rivlib-cleanup (12:24:26)
+	* Pete Gadomski <pete.gadomski at gmail.com> Set default value for boolean in RxpReader (11:50:27)
+
+2015-11-13
+	* Howard Butler <howard at hobu.co> Merge pull request #1036 from scott-lewis-nsidc/update-writing-reader-tutorial (19:13:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix reporting check for nameValid(). (18:28:00)
+	* Scott Lewis <scott.lewis at nsidc.org> Updating reader tutorial. (17:27:03)
+
+2015-11-11
+	* chambbj <brad.chambers at gmail.com> Fix small typo in filter tutorial (19:13:02)
+	* chambbj <brad.chambers at gmail.com> Add labels for filter tutorial update (19:12:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add note about ASPRS/LAS point classifications (14:19:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> getDefaultOptions is unused, check for Classification dim when preparing filter (14:06:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add some error checking, examples, and finalize the tutorial (13:29:16)
+	* Bradley J Chambers <brad.chambers at gmail.com> Initial commit of PCL-based normalized height filter (12:44:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> Update the filter writing tutorial (08:14:13)
+
+2015-11-10
+	* Andrew Bell <andrew.bell.ia at gmail.com> gcc doesn't take declaration in argument, apparently. (17:52:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:39:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix option names in ground kernel. Add debug information in the case that a bad option name is found. Add a simple test for invalid option names. Close #1029 (17:38:16)
+	* chambbj <brad.chambers at gmail.com> Remove extra apostrophe in apps.rst (14:08:28)
+
+2015-11-09
+	* Howard Butler <howard at hobu.co> a note about using other dimensions besides classification (19:06:45)
+	* Howard Butler <howard at hobu.co> clipping doc tweaks (19:03:09)
+	* Howard Butler <howard at hobu.co> don't include fnctl if _WIN32 (18:51:02)
+	* Howard Butler <howard at hobu.co> clean up extra paragraph in tutorial (17:07:34)
+	* Howard Butler <howard at hobu.co> add a tutorial to describe clipping with shapefiles (16:59:23)
+	* Howard Butler <howard at hobu.co> fcntl.h no impliclitly included in later libc++ (15:55:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Print warning if we can't read GeoTiff VLR when one exists. Close #128 (12:44:05)
+
+2015-11-07
+	* Connor Manning <connor at hobu.co> Avoid possibly uninitialized value warning. (10:30:21)
+
+2015-11-06
+	* Howard Butler <howard at hobu.co> add Dockerfile that builds pdal.io (22:57:27)
+	* Howard Butler <howard at hobu.co> capitalization tweak from #1026 (10:16:47)
+	* Howard Butler <howard at hobu.co> Merge pull request #1026 from scott-lewis-nsidc/update-writing-tutorial (10:13:41)
+
+2015-11-05
+	* Scott Lewis <scott.lewis at nsidc.org> Updated Writing tutorial. (13:09:17)
+
+2015-11-03
+	* Howard Butler <howard at hobu.co> more doc tweaks (10:55:19)
+
+2015-11-02
+	* Howard Butler <howard at hobu.co> introductory material for stages (15:10:12)
+	* Howard Butler <howard at hobu.co> add PDAL logo back (15:00:30)
+	* Howard Butler <howard at hobu.co> point to OSGeo4W and Vagrant in windows compilation doc (11:50:20)
+	* Howard Butler <howard at hobu.co> point to vagrant in compilation doc (11:44:33)
+
+2015-11-01
+	* Howard Butler <howard at hobu.co> more doc tweaks (23:35:55)
+	* Howard Butler <howard at hobu.co> typos (23:03:13)
+	* Howard Butler <howard at hobu.co> document GDAL_CACHEMAX sensitivity in filters.colorization (22:58:51)
+	* Howard Butler <howard at hobu.co> output the PDAL plugin search path to stderr when PDAL_DEBUG environment variable is set (22:58:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #1018 from PDAL/issues/997-plugin-debug (20:36:32)
+
+2015-10-30
+	* Howard Butler <howard at hobu.co> update my example cmake to catch up to elcapitan (22:15:38)
+	* Howard Butler <howard at hobu.co> output docs to build directory (22:15:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move LAS metadata extraction to initialize(). (12:47:05)
+
+2015-10-29
+	* Howard Butler <howard at hobu.co> Merge pull request #1023 from PDAL/srs-prepare (16:38:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Test changes for SRS setting in prepare(). (15:12:06)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #1021 from PDAL/reprojection-filtering (14:31:24)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into reprojection-filtering (10:22:47)
+	* Connor Manning <connor at hobu.co> Oops, throw the error, not the string. (10:18:32)
+	* Connor Manning <connor at hobu.co> Correct reprojection culling by reverting to the original behavior.  Keep the reintroduced filter call. (10:15:04)
+	* Howard Butler <howard at hobu.co> Merge pull request #1020 from PDAL/reprojection-filtering (08:37:41)
+
+2015-10-28
+	* Connor Manning <connor at hobu.co> Reintroduce ReprojectionFilter::filter, used by FilterWrapper for standalone Views.  Some performance tweaks. (22:45:37)
+	* Howard Butler <howard at hobu.co> lard up PluginManager with debugging lint for when PDAL_DEBUG enviro variable is set #997 (16:12:18)
+	* Howard Butler <howard at hobu.co> update the doc-building doc (13:28:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix range doc. (11:53:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have range filter support multiple ranges for each dimension. Use simple and consistent logical arrangement of ranges. Close #1014 (11:19:46)
+	* Howard Butler <howard at hobu.co> cull top links for shorter heading on website (08:42:44)
+
+2015-10-27
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:35:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't divide by zero. Close #1015 (15:35:20)
+	* Howard Butler <howard at hobu.co> Documentation work. New theme and some organization. (15:13:48)
+
+2015-10-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:33:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Divider filter. (16:32:37)
+	* Connor Manning <connor at hobu.co> Add all dimensions for LAS QuickInfo. (11:35:31)
+
+2015-10-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> New rply version. (14:33:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Look for FauxReader in the right place. (13:41:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Randomize filter. (12:51:21)
+
+2015-10-21
+	* Howard Butler <howard at hobu.co> Merge pull request #1011 from PDAL/issues/1009-cull-bad-reprojection (15:05:22)
+	* Howard Butler <howard at hobu.co> make transform() call simpler when we want to cull bad points (13:41:01)
+
+2015-10-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change range negation character to '!' from '~'. (20:31:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow negation of ranges. Close #1001 (20:27:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> LasWriter doc update. (20:09:18)
+	* Howard Butler <howard at hobu.co> add capability to cull bad reprojection (11:24:58)
+
+2015-10-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove reference to dead inplacereprojection filter. (11:54:07)
+
+2015-10-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow digits in option names. (15:53:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix stuff for options changes caught in debug mode. (13:23:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Option names only lowercase and underscore. (11:33:50)
+
+2015-10-12
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for 'all' 'extra-dims' in LasWriter. (13:35:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix pipeline tests to work with new options. (10:47:47)
+
+2015-10-09
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't allow sub-options. (16:14:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> commit dc48725c1f54cb30649eea93691d8c5e0711c9c4 Author: Andrew Bell <andrew.bell.ia at gmail.com> Date:   Wed Oct 7 11:47:40 2015 -0500 (15:25:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (13:51:13)
+	* Howard Butler <howard at hobu.co> compare correct thing in readers.gdal (11:18:13)
+
+2015-10-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't use fixed format for doubles.  Use default format with significant precision. (11:30:25)
+
+2015-10-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Flat options for colorization. (10:01:19)
+
+2015-10-02
+	* Andrew Bell <andrew.bell.ia at gmail.com> Be more accepting of spaces in range specification. (09:50:32)
+
+2015-10-01
+	* Andrew Bell <andrew.bell.ia at gmail.com> Error feedback on parsing limits option. Handle various constant double formats. (20:40:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into range-options (15:56:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add extract(). (15:56:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Support output_dims options for BPF. (14:33:12)
+
+2015-09-30
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'linkop' (14:26:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'lasperf' (14:14:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Somewhat improved kernel option parsing. (12:19:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Eliminate nested option in ferry filter. (11:59:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (09:58:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1007 from rouault/fix_pdal_filters_stats_test (07:39:15)
+	* Even Rouault <even.rouault at spatialys.com> StatsFilterTest: Use EXPECT_DOUBLE_EQ (05:40:33)
+
+2015-09-29
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix stats test to handle metadata more flexibly. (15:35:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:23:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Used fixed format for string output. (15:22:35)
+	* Howard Butler <howard at hobu.co> Merge pull request #1005 from PDAL/ilvis2-reader (11:18:58)
+	* Howard Butler <howard at hobu.co> add ILVIS2 reader test (10:48:11)
+
+2015-09-28
+	* Howard Butler <howard at hobu.co> provide untested implementation of ILVIS2 ASCII reader #1004 (14:37:10)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (11:12:08)
+
+2015-09-25
+	* Howard Butler <howard at hobu.co> Merge pull request #1003 from jwomeara/geowave-update (14:30:49)
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave install script to use the latest version of GeoWave (12:54:47)
+	* Bradley J Chambers <brad.chambers at gmail.com> First cut at a revised set of options for RangeFilter (12:01:02)
+
+2015-05-28
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave CMake config (08:43:30)
+	* Connor Manning <connor at hobu.co> Destruct temporary layout. (19:12:08)
+	* Connor Manning <connor at hobu.co> Add some logging to BPF dimension parsing code. (14:07:53)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #929 from PDAL/close-streams (12:51:52)
+
+2015-05-15
+	* Whitney O'Meara <womeara at radiantblue.com> Updated linux-install-scripts to use precompiled geowave binaries (09:33:34)
+	* Howard Butler <howard at hobu.co> Merge pull request #918 from PDAL/p2g-zero-points (11:45:38)
+	* Howard Butler <howard at hobu.co> forward the PointTable SpatialReference() down to the raster output #917 (10:49:06)
+	* Howard Butler <howard at hobu.co> Handle P2G with zero points #914 and support collecting XYZ from all PointViews, not just the first one (10:27:55)
+	* Howard Butler <howard at hobu.co> Merge pull request #916 from PDAL/kernel-label-option (09:18:37)
+	* Howard Butler <howard at hobu.co> add option --label to kernel default arguments to allow people to tag processes (09:02:01)
+
+2015-05-06
+	* Whitney O'Meara <womeara at radiantblue.com> GeoWave package name updates (15:51:12)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for #895 (15:07:09)
+	* Michael P. Gerlek <mpg at flaxen.com> temp outputs (15:06:53)
+
+2015-09-24
+	* Howard Butler <howard at hobu.co> CMAKE_SOURCE_DIR typo (12:44:04)
+	* Howard Butler <howard at hobu.co> Provide a Height Above Ground example as processed with `pdal ground` APMF filter and `filters.programmable` (12:19:26)
+
+2015-09-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Support LazPerf for compression/decompression. (18:41:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:26:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> LazPerf test depends on LasZip. (17:25:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (17:20:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing (17:01:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing (16:04:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing (15:52:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing (15:20:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Test install of laszip (14:50:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set correct initial offset for proper chunk size. Remove debug. (13:54:57)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #999 from PDAL/remove-options (10:15:57)
+	* Bradley J Chambers <brad.chambers at gmail.com> Remove by key to remove all matching elements (10:13:51)
+	* Bradley J Chambers <brad.chambers at gmail.com> Implement Options::remove and Stage::removeOptions (08:18:42)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add screenshots for outlier removal (10:06:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> Change statistical outlier defaults (09:57:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing. (08:03:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Testing. (07:37:53)
+
+2015-09-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Formatting and comment fix. (15:39:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix compilation warning. (15:39:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (14:53:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:29:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove references to dead --xml option. Close #998 (14:21:11)
+	* Howard Butler <howard at hobu.co> no longer refer to XML output #998 (12:29:08)
+
+2015-09-18
+	* Howard Butler <howard at hobu.co> style tweaks (10:19:30)
+	* Howard Butler <howard at hobu.co> Merge pull request #992 from rouault/avoid_failures_on_pgpointcloudtest (10:17:56)
+	* Howard Butler <howard at hobu.co> readers.gdal reader for reading in raster data as point clouds #996 (10:13:46)
+
+2015-09-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix chunking of LazPerf writer. Add LazPerf writer test. Add documentation regarding compressor/decompressor selection. (08:15:45)
+
+2015-09-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (10:27:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> First-cut at LAZperf compression. (10:27:04)
+
+2015-09-15
+	* Howard Butler <howard at hobu.co> clean up a bunch of sphinx doc warnings (10:18:50)
+
+2015-09-14
+	* chambbj <brad.chambers at gmail.com> Merge pull request #995 from PDAL/pcl-stuff-as-filters (20:45:10)
+
+2015-09-03
+	* Bradley J Chambers <brad.chambers at gmail.com> Make some PCL functions accessible as filters (12:44:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for VLR forwarding. (17:18:16)
+
+2015-09-11
+	* Howard Butler <howard at hobu.co> Merge pull request #993 from rouault/fix_tutorial (16:32:02)
+	* Even Rouault <even.rouault at spatialys.com> Tutorial mentions rst and xml output (16:28:32)
+	* Even Rouault <even.rouault at spatialys.com> Fix failure on PgpointcloudWriterTest (15:50:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> No longer need cast. (15:27:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Replace raw pointer with unique_ptr. (15:24:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #990 from rouault/fix_kernel_memleaks (14:38:19)
+	* Even Rouault <even.rouault at spatialys.com> Add destructor to Kernel class to fix memleaks (14:34:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #989 from rouault/fix_pdal_info_help (14:22:23)
+	* Even Rouault <even.rouault at spatialys.com> Fix 'pdal info --help' regarding --all option (14:20:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Test for reading with LAZperf. Allow programmatic selection of LAZperf or LASzip. (12:16:20)
+	* Howard Butler <howard at hobu.co> point to 1.0.1 release (11:12:12)
+	* Howard Butler <howard at hobu.co> incrememnt version to 1.0.1 for release (11:09:41)
+	* Howard Butler <howard at hobu.co> add HOWTORELEASE doc (11:09:03)
+	* Howard Butler <howard at hobu.co> clean up usage() for pdal-config (11:05:48)
+	* Howard Butler <howard at hobu.co> make sure to 'make dist' in package.sh (10:45:52)
+	* Howard Butler <howard at hobu.co> add package.sh for release generation, use pdal-config for fetching version for packaging (10:44:02)
+	* Bradley J Chambers <brad.chambers at gmail.com> Fix main CMakeLists (08:25:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix #ifdefs. (08:14:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Decompress with LAZperf and v. 2 VLR item types. (06:47:56)
+
+2015-09-10
+	* Howard Butler <howard at hobu.co> point to 1.0.0 release (16:27:21)
+	* Howard Butler <howard at hobu.co> increment versions and add SOVERSION for 1.0.0 release (13:53:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #986 from PDAL/issues-961-xml-schema-version (13:12:41)
+	* Howard Butler <howard at hobu.co> Merge pull request #988 from PDAL/issue/987-pc2pc (13:08:38)
+	* Bradley J Chambers <brad.chambers at gmail.com> Be sure to set the compression flag when inferring LAZ (12:09:03)
+	* Howard Butler <howard at hobu.co> link to BPF specification in docs (10:24:51)
+	* Howard Butler <howard at hobu.co> add -std=c++11 to --cxxflags output for pdal-config #984 (09:59:30)
+
+2015-09-09
+	* Howard Butler <howard at hobu.co> python setup.py fixups (23:21:06)
+	* Howard Butler <howard at hobu.co> add --plugin-dir to pdal-config output (22:51:31)
+	* Howard Butler <howard at hobu.co> Add optional version number to XMLSchema output #961 (22:20:22)
+	* Howard Butler <howard at hobu.co> XSD/XML Schema version tweaking (15:59:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:58:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't overload add() with default arguments. Close #985 (14:57:35)
+	* Howard Butler <howard at hobu.co> Add version number to XMLSchema output #961 (14:53:20)
+	* Howard Butler <howard at hobu.co> fix up pkg-config and pdal-config scripts #984 (14:18:10)
+	* Howard Butler <howard at hobu.co> Python 2 compatible string handling (10:43:42)
+	* Howard Butler <howard at hobu.co> python3-compatible unicode handling (10:37:03)
+	* Howard Butler <howard at hobu.co> init plang environment in Invocation constructor (10:36:41)
+
+2015-09-08
+	* chambbj <brad.chambers at gmail.com> Merge pull request #980 from PDAL/omni-kernel-pipeline-manager (09:26:03)
+
+2015-08-17
+	* Bradley J Chambers <brad.chambers at gmail.com> Update the translate kernel (14:26:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change BOX3D to BOX2D in translate bounds option. (14:49:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Correct invalid SRS option. Don't explictly set scale -- allow writer to set. Close #971 (13:07:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Quiet compiler. (08:45:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead "register" hint. (08:32:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (08:19:24)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #974 from PDAL/derivative-writer (08:04:25)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #973 from PDAL/issue/972-ground-kernel-approx (07:40:33)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add approximate option, pass along debug and verbose options too (07:14:21)
+
+2015-09-05
+	* Howard Butler <howard at hobu.co> Merge pull request #983 from wenzeslaus/liblas-to-pdal-transition (07:38:25)
+
+2015-09-04
+	* Vaclav Petras <wenzeslaus at gmail.com> Improve transition guide heading and fix label (11:49:52)
+	* Vaclav Petras <wenzeslaus at gmail.com> Add error handling and mention other formats (11:43:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Metadata for python filters. (11:28:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove Utils::saturation_cast. (09:51:41)
+
+2015-09-02
+	* Vaclav Petras <wenzeslaus at gmail.com> Complete 3 libLAS related questions (14:09:42)
+	* Vaclav Petras <wenzeslaus at gmail.com> Text for from libLAS transition and toc entry (14:04:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use linker script to avoid linking two libraries. Linker scripts don't work on OSX :(  Use --reexport_library instead. Actually use custom PointTable in test. Close #977 (09:39:41)
+
+2015-09-01
+	* Vaclav Petras <wenzeslaus at gmail.com> Add questions about libLAS (20:51:25)
+	* Vaclav Petras <wenzeslaus at gmail.com> Main code samples for libLASC API to PDAL transition (20:50:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> reexport_library for libpdal_util (16:37:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Diagnostic fixes for old GCC. (12:39:54)
+
+2015-08-31
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:48:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> New forwarding syntax. (14:48:10)
+
+2015-08-25
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't run SRS tests without Geotiff. (13:44:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set and use m_srs variable in LasWriter. Add tests for set SRS. Close #981 (12:48:15)
+	* Howard Butler <howard at hobu.co> Update MrSID reader up to date with current PDAL (09:43:07)
+
+2015-08-24
+	* Howard Butler <howard at hobu.co> catch up CPD plugin to current PDAL master (09:06:53)
+
+2015-08-21
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for lost --polygon option in translate kernel. (12:06:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:01:54)
+
+2015-08-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (10:20:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make translate kernel more straightforward. (10:20:00)
+
+2015-08-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:15:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:15:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change BOX3D to BOX3D for tindex. (16:14:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Eliminates/suppress warnings. (12:41:48)
+	* Connor Manning <connor at hobu.co> Get rid of a couple GCC warnings. (11:46:48)
+
+2015-08-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> Replace ...contains... with ...covers... Close #976 (08:49:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix doc for pdal translate. (08:48:36)
+
+2014-07-03
+	* Bradley J Chambers <brad.chambers at gmail.com> Add DerivativeWriter (10:53:57)
+
+2015-08-12
+	* Howard Butler <howard at hobu.co> Merge pull request #970 from PDAL/release-gitdir-mode (20:40:47)
+	* Howard Butler <howard at hobu.co> DLL export transformWkt call (20:12:07)
+	* Howard Butler <howard at hobu.co> git/release version setting (19:56:14)
+
+2015-08-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Doc for a_srs option on tindex kernel. (19:12:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Handle file with missing SRS and --a_srs option. Close #969 (17:20:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge of lots of little changes. Support transformation of crop input geometry. (13:55:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (10:37:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change import_array() call to deal with python 3. (10:27:59)
+
+2015-08-09
+	* Howard Butler <howard at hobu.co> update AUTHORS (23:21:01)
+
+2015-08-07
+	* Howard Butler <howard at hobu.co> sort test output from python dict for stability (11:03:44)
+	* Howard Butler <howard at hobu.co> set host to localhost, not test for pgpointcloud test in my example config (10:43:59)
+	* Howard Butler <howard at hobu.co> add PGPOINTCLOUD_TEST_DB_HOST to my example config (10:29:18)
+	* Howard Butler <howard at hobu.co> add my OCI config for testing to my example file (10:21:29)
+	* Howard Butler <howard at hobu.co> libplang.so needs to do PDAL_ADD_LIBRARY for @rpath and such (08:45:05)
+
+2015-08-06
+	* Howard Butler <howard at hobu.co> Merge pull request #963 from PDAL/add-reclassification-example (13:53:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:49:47)
+	* Howard Butler <howard at hobu.co> update my example cmake configuration (13:48:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/python' into python (13:42:45)
+	* Howard Butler <howard at hobu.co> add tutorial links to main docs page (13:42:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Lost...? (13:42:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More MSVC fixes. (12:51:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fixes for MSVC. (09:48:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Explict cast in numericCast(). (08:02:41)
+
+2015-08-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/python' into python (21:48:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (21:33:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix link issues that allow python to be embedded in a dll with gcc. (20:13:55)
+
+2015-08-04
+	* Howard Butler <howard at hobu.co> add filters.programmable example that does classification reassignment (13:07:17)
+
+2015-07-31
+	* Howard Butler <howard at hobu.co> fix up greyhound compilation failure (15:15:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More tests for ColorizationFilter. (13:54:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have colorization filter add the dimensions it's going to write. (13:08:47)
+
+2015-07-29
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add bundle test files. (17:32:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support to write bundled files in BPF3. (17:10:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:49:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add getFilename() for FileUtils. (16:49:22)
+
+2015-07-27
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (16:40:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix output for non-GEOS case. (13:18:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update crop filter doc. (12:48:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:35:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have CropFilter take 2D bounds instead of 3D to be consistent with polygon. Use both bounds and polygons if both are specified. (12:34:58)
+
+2015-07-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make location scaling (auto conversion to/from scaled int) more generic to handle data that may have been written as scaled floats, etc. (21:53:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Explicitly link libdl.  Not sure why. (16:47:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (16:30:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Scale X,Y and Z, even if we're not doing ints. (16:29:55)
+
+2015-07-23
+	* Howard Butler <howard at hobu.co> tweak missing calculateBounds call (22:33:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't double-prepare a pipeline. (18:01:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't build HeightAboveGroundKernel for now. (17:53:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add Utils::hexDump(). (17:43:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Roll back change to library install location for now. (17:31:44)
+
+2015-07-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:10:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make BOX2D and adjust code and tests. Close #897 (16:53:10)
+	* Howard Butler <howard at hobu.co> Merge branch 'issues/871-CMAKE_INSTALL_LIBDIR-usage' (00:36:18)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into initial-hag-kernel (00:33:54)
+	* Howard Butler <howard at hobu.co> Add Brad's API reader/writer/filter usage tutorials. (00:03:38)
+
+2015-07-21
+	* Howard Butler <howard at hobu.co> Salvage #928 and keep SQLite error handling additions that were in that PR (23:59:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix to global_encoding bit. (13:58:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (13:57:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have crop filter create an output PointView for each box/poly set as an arg. Add Options::getValues(). (13:55:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Revert accidental commit. (13:36:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use our numericCast to get rid of boost::numeric_cast -- for now. (11:33:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Call done() on LazPerfCompressor if there's an exception. (10:19:37)
+
+2015-07-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Better debug for out-of-range data for packed DB ints. (18:18:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add comment. (10:27:20)
+
+2015-07-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:13:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> ifdef unix-only stuff. (09:13:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #959 from oscarmartinezrubiorg/master (08:56:28)
+	* “oscar.martinez.rubi” <omrubi at gmail.com> Add options for x and y origins and change data type of m_length option. Also include origin attributes when passing options to the Splitter filter (05:22:12)
+	* “oscar.martinez.rubi” <omrubi at gmail.com> Change m_lenght to double (as required by the Splitter filter) and add attributes for the x and y origins (also doubles) (05:20:38)
+	* “oscar.martinez.rubi” <omrubi at gmail.com> Make default value a double (1000.) (05:18:51)
+
+2015-07-16
+	* Howard Butler <howard at hobu.co> Merge pull request #957 from PDAL/revert-943-pcl-travis (16:43:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #958 from PDAL/inline-pdal-error (16:43:06)
+	* Howard Butler <howard at hobu.co> inline a few more exceptions (16:07:49)
+	* Howard Butler <howard at hobu.co> inline the definition of pdal_error in an attempt to shut up MSVC about exports (15:42:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add progress reporting for pipelines. (14:46:27)
+	* Howard Butler <howard at hobu.co> Revert "Turn PCL on in Travis as an optional component" (10:10:51)
+
+2015-07-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (16:14:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Put all utilities in the same namespace. (15:57:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move Utils.XX to util subdir. (14:16:18)
+
+2015-07-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update CompressionTest for new schema. (19:18:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix 1.4 scan angle. (18:05:41)
+
+2015-07-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix writing of point formats 6-10 to match spec. (15:03:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow info kernel to take extra command-line options. (13:34:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add "count" option to stats filter. Close #955 (13:08:32)
+
+2015-07-10
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (11:11:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix repro filter test now that GEOTIFF macro is fixed. (11:11:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix GEOTIFF include directive. (10:40:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix comment typo. (10:39:40)
+
+2015-07-08
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update NitfWriter documentation. Remove dead code. (11:54:52)
+
+2015-07-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add tests for NitfWriter as FlexWriter. (16:35:08)
+
+2015-07-06
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add documentation for LasWriter as FlexWriter. (19:56:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make LasWriter a FlexWriter. (18:58:55)
+
+2015-07-05
+	* Howard Butler <howard at hobu.co> Merge pull request #943 from PDAL/pcl-travis (15:17:35)
+
+2015-07-03
+	* Howard Butler <howard at hobu.co> bring forward inferred options from the writer (for compression) for tindex (14:50:22)
+	* Howard Butler <howard at hobu.co> trap for when we can't make the filters.hexbin stage in tindex (14:11:01)
+	* Howard Butler <howard at hobu.co> make sure to set filename when fetching file info in tindex (13:35:24)
+	* Howard Butler <howard at hobu.co> PclVisualizer typo (13:15:55)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (13:11:02)
+
+2015-07-02
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make BpfWriter a FlexWriter. (14:59:12)
+
+2015-07-01
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add back ctors. (11:05:05)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into grid-1.4.0 (09:36:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Minor clean-up. (08:20:47)
+
+2015-06-30
+	* Andrew Bell <andrew.bell.ia at gmail.com> BPF writer header_data option doc. (17:02:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing extra BPF header data. (16:57:27)
+
+2015-06-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove pdal_error. (19:35:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Simplify exception hierarchy. Close #12 (18:35:44)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #949 from gadomski/issues/907-matlab-writer (16:44:32)
+	* Connor Manning <connor at hobu.co> Remove extraneous quotation mark. (11:56:25)
+
+2015-05-20
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a matlab writer (09:30:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove outfile check in the hexbin test (09:36:28)
+	* Pete Gadomski <pete.gadomski at gmail.com> Enable hexbin tests on travis (09:35:08)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (15:16:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add --write_absolute_path option to tindex kernel. (15:13:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add dump() function for BPF Mueller matrix. (14:52:12)
+
+2015-06-25
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #948 from gadomski/hexboundary-on-travis (18:42:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow a count to be provided as part of `pdal info --query`. Close #922 (17:25:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove unimplemented function definition. Close #946 (16:03:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fixup pdal options. (15:53:21)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (14:17:48)
+
+2015-06-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Better fix for ply reader error. (15:12:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have kdtree_distance actually work. Use radius properly. Check for valid dimensions in KDIndex. (14:18:08)
+
+2015-06-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set dimensionality of KDIndex at compile time. (17:33:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More hardening of nanoflann/KDIndex. (13:49:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Cast user-data in callback to proper type to avoid test failures. (11:23:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (11:22:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Eliminte data corruption in KDIndex. Part of Issue 922. (08:49:29)
+
+2015-06-22
+	* chambbj <brad.chambers at gmail.com> Merge pull request #945 from PDAL/issue/944-ground-classify-broken (13:30:02)
+	* Bradley J Chambers <brad.chambers at gmail.com> Fix scope of ground filtered indices (13:29:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add test for KDIndex. (10:25:56)
+
+2015-06-20
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into grid-1.4.0 (14:14:38)
+
+2015-06-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:52:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow delta kernel to evaluate all dimensions. Close #640 (15:50:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set default build type to RelWithDebInfo. (08:52:49)
+
+2015-06-18
+	* Bradley J Chambers <brad.chambers at gmail.com> Turn PCL on in Travis as an optional component (12:41:42)
+	* Howard Butler <howard at hobu.co> don't throw an error when we see options we can't split for --reader.whatever (08:45:34)
+
+2015-06-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for conditional options on stages. Support extra stage options for tindex. (14:30:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Pass bounds box to crop filter if it exists. (11:17:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow bounding box specified as X,Y,Z as well as WKT for geometry filter. (10:31:54)
+
+2015-06-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Rework a bit of the info kernel to simplify and avoid multiple calls to prepare().  Allow multiple options to be specified in many cases. (16:42:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't use info kernel for tindex kernel. (15:49:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:22:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move portable_endian to util. (09:22:09)
+
+2015-06-15
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (20:26:30)
+	* Howard Butler <howard at hobu.co> public method to do --summary from code (20:26:26)
+	* Howard Butler <howard at hobu.co> --fast-boundary implementation based on --summary info (20:26:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Initialize pointers and check values on destruction. (16:55:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More doc fixes and updates for consistency. (11:56:46)
+
+2015-06-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:15:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Doc updates. (09:15:15)
+
+2015-06-10
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (20:53:32)
+	* Howard Butler <howard at hobu.co> protect initialization of LasReader stream from destruction (NITF driver interaction (20:25:25)
+	* Howard Butler <howard at hobu.co> don't use fancy deleter for OGRCT and OGRSpatialReferenceH (19:55:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (14:54:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix tests to go with correct GEOTIFF tag. Close #937 (14:49:05)
+	* Howard Butler <howard at hobu.co> doc typo (14:23:28)
+	* Howard Butler <howard at hobu.co> tweak mike's bash example (14:22:05)
+	* Howard Butler <howard at hobu.co> add mike's bash example to docs (14:20:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Correct record ID for GEOTIFF doubles records. (12:04:09)
+
+2015-06-07
+	* Howard Butler <howard at hobu.co> Merge pull request #936 from PDAL/fast-boundary-tindex (16:48:30)
+	* Howard Butler <howard at hobu.co> provide --fast-boundary method for pdal tindex to just use the bbox of the file instead of hexbin boundary (16:48:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #935 from PDAL/GDALUtils-spatialref-empty (16:47:15)
+	* Howard Butler <howard at hobu.co> add empty() method to check if a GDAL srs doesn't have anything (16:46:50)
+	* Howard Butler <howard at hobu.co> Merge pull request #934 from PDAL/no-default-hexbin (16:45:46)
+	* Howard Butler <howard at hobu.co> only do filters.hexbin boundary for pdal info if --boundary is given as an argument (16:41:37)
+	* Howard Butler <howard at hobu.co> a note about lidar2dems (10:53:12)
+	* Howard Butler <howard at hobu.co> Merge pull request #933 from PDAL/rialto-removal (10:24:05)
+
+2015-06-05
+	* Michael P. Gerlek <mpg at flaxen.com> removal of (old) Rialto from PDAL repo (14:33:20)
+	* Howard Butler <howard at hobu.co> check if we have already indexed a particular file and don't do it if we have (12:54:24)
+	* Howard Butler <howard at hobu.co> mark us as not initialized if we destroyStream (12:36:54)
+
+2015-06-04
+	* Howard Butler <howard at hobu.co> protect against multiple initialize() calls leaking streams (19:51:34)
+	* Howard Butler <howard at hobu.co> some tindex docs (09:55:35)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (09:31:02)
+	* Howard Butler <howard at hobu.co> Merge pull request #932 from PDAL/stdin-pdal-tindex-930 (09:30:23)
+	* Howard Butler <howard at hobu.co> support stdin as read mechanism for file list for  #930 (09:25:55)
+
+2015-05-29
+	* Connor Manning <connor at hobu.co> Attempted stopgap fix for BPF V1 header parsing. (09:59:56)
+
+2015-05-27
+	* Connor Manning <connor at hobu.co> Clean up streams. (17:01:40)
+	* Michael P. Gerlek <mpg at flaxen.com> pretty up the error strings (07:38:22)
+
+2015-05-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set valid flag on QuickInfo. (14:27:48)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (13:17:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Initialize data to 0. (09:51:01)
+	* Michael P. Gerlek <mpg at flaxen.com> explicitly scope the database read & write (09:41:30)
+	* Michael P. Gerlek <mpg at flaxen.com> better error handling, as per #927 (09:38:49)
+
+2015-05-21
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (14:52:58)
+	* Howard Butler <howard at hobu.co> Merge pull request #925 from PDAL/explicit-plugin-load (14:52:41)
+	* Howard Butler <howard at hobu.co> explicit plugin loading via option #924 (14:42:12)
+	* Howard Butler <howard at hobu.co> explicit loadPlugin function for filter Options specified in pipelines #924 (14:12:10)
+
+2015-05-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use feature instead of SRS for field string. (20:04:21)
+	* Howard Butler <howard at hobu.co> OGR_F_SetFieldString needs hFeature, not gdal::SpatialRef as first argument (16:26:59)
+
+2015-05-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> Windows work. (14:47:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Always register X, Y and Z for BPF as doubles. (14:05:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add missed call to fileTimes(). (12:20:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use _stat instead of stat for windows. (11:53:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix file time stuff for windows. (11:39:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix for Windows. (10:45:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge of tindex. (10:32:25)
+
+2015-05-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #913 from PDAL/stage-ownership (11:39:39)
+
+2015-05-12
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for owning stages in the StageFactory. (19:11:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #910 from PDAL/bbox_precisionloss (17:30:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #911 from PDAL/sqlite_improvements (17:29:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #912 from PDAL/lasreadertest-lint (17:28:52)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (16:24:56)
+	* Michael P. Gerlek <mpg at flaxen.com> boost removals (16:18:21)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaner LogPtr (16:17:43)
+	* Michael P. Gerlek <mpg at flaxen.com> misc refactoring and cleanups (15:05:16)
+	* Michael P. Gerlek <mpg at flaxen.com> Fix for bbox precision loss (#909) (14:29:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #903 from PDAL/approximate-pdal-ground (11:30:36)
+	* Howard Butler <howard at hobu.co> Merge pull request #904 from PDAL/detect-bad-las-files (11:29:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use a != a instead of isnan(). (09:46:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add cmath. (09:37:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:25:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix nan comparison. (09:25:06)
+
+2015-05-09
+	* Howard Butler <howard at hobu.co> clean up extra tabs in gitignore (15:26:17)
+	* Howard Butler <howard at hobu.co> Don't blindly read LAS files that don't have the first four magic 'LASF' bytes (14:38:55)
+
+2015-05-08
+	* Howard Butler <howard at hobu.co> Add --approximate option to 'pdal ground' for much faster computation #883 (14:52:46)
+	* Howard Butler <howard at hobu.co> Merge pull request #901 from PDAL/issue-897 (12:54:05)
+	* Howard Butler <howard at hobu.co> Merge pull request #902 from PDAL/las-header-incorrect-pointcount (12:53:54)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge pull request #896 from PDAL/issue-895 (12:08:18)
+	* Howard Butler <howard at hobu.co> Attempt to support mis-labeled LAS headers in the case where the header's size is larger than the actual number of bytes in the file would otherwise suggest. This supercedes #893. (11:20:29)
+	* Howard Butler <howard at hobu.co> Merge branch 'gadomski-las-header-incorrect-pointcount' into las-header-incorrect-pointcount (10:54:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #887 from PDAL/pm-consistency (10:43:04)
+	* Michael P. Gerlek <mpg at flaxen.com> committing again, this time without gratuitous actor fix (10:42:41)
+	* Michael P. Gerlek <mpg at flaxen.com> (fails on MSVC, see #897 and #900) (10:28:28)
+	* Howard Butler <howard at hobu.co> loadByPath should load DynamicLibrary if they're not already loaded (09:41:31)
+	* Howard Butler <howard at hobu.co> Merge pull request #899 from strk/pointcloud-docs (08:17:23)
+	* Howard Butler <howard at hobu.co> Merge pull request #898 from strk/patch-2 (08:17:16)
+	* Michael P. Gerlek <mpg at flaxen.com> added note and test case for #897 (07:20:56)
+	* Sandro Santilli <strk at keybit.net> Document "pcid" option of PgPointcloud writer plugin (03:16:27)
+	* Sandro Santilli <strk at keybit.net> Add website link to README file (03:01:49)
+
+2015-05-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:02:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add origin support for SplitterFilter. (13:01:51)
+	* Connor Manning <connor at hobu.co> Remove extraneous semicolons. (11:09:53)
+
+2015-05-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove boost from Log code. Remove dead code from GDALUtils. (21:10:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add doc for BPF reader/writer. Add description of "auto" scaling. (15:04:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:18:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix extra options for PCL kernels. (12:18:02)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #894 from gadomski/issues/878-ply-writer (07:29:59)
+
+2015-05-04
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a ply writer (09:48:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Failing test for invalid pointcount in las header (16:00:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #892 from gadomski/issues/878-ply-reader (13:34:21)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #891 from gadomski/fix-merge-test (10:25:55)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add space between filename and output redirection (09:59:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge kernel. (09:18:23)
+
+2015-05-01
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a ply reader (19:37:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (15:41:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add auto-scaling. (11:17:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #889 from PDAL/casting (10:17:24)
+
+2015-04-30
+	* Connor Manning <connor at hobu.co> Remove boost::numeric_cast. (15:51:45)
+
+2015-04-29
+	* Andrew <andrew at abell-vb2.(none)> Fixes for g++/Ubuntu compilation. (10:34:50)
+	* Andrew <andrew at abell-vb2.(none)> Fixes for g++/Ubuntu compilation. (10:34:50)
+
+2015-04-28
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (10:53:47)
+
+2015-04-27
+	* Andrew Bell <andrew.bell.ia at gmail.com> Const applies to type, in this case a reference, which makes no sense, so introduce a const type. (20:01:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Redo zone calculation based on several sources found elsewhere.  Eliminate bad abs() call and resulting confusion. (20:00:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Changes in python based on changes in master. (19:55:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into python (19:54:03)
+
+2015-04-26
+	* Connor Manning <connor at hobu.co> Merge remote-tracking branch 'gadomski/missing-plugin-cleanup' into pm-consistency (10:20:14)
+	* Connor Manning <connor at hobu.co> Plugin manager tweaks.  Avoid integer return codes and simplify a couple things. (10:19:34)
+
+2015-04-25
+	* Pete Gadomski <pete.gadomski at gmail.com> Load only one plugin when guessing plugin names (10:53:15)
+
+2015-04-24
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'enable-sqlite-on-travis' (08:00:52)
+
+2015-04-23
+	* Pete Gadomski <pete.gadomski at gmail.com> Enable sqlite on travis (15:31:52)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'enable-points2grid-on-travis' (15:17:02)
+	* Pete Gadomski <pete.gadomski at gmail.com> Enable points2grid testing on Travis (13:26:54)
+
+2015-04-22
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'icebridge-on-travis' (16:49:29)
+	* Pete Gadomski <pete.gadomski at gmail.com> Enable icebridge plugin on Travis (16:31:06)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #882 from PDAL/constify-stage-factory (11:31:08)
+	* Connor Manning <connor at hobu.co> Constify StageFactory functions. (10:49:49)
+
+2015-04-21
+	* Howard Butler <howard at hobu.co> support STDOUT or STOUT as spelling for stdout (10:23:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:08:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add doc for pdal split. (10:08:12)
+	* Howard Butler <howard at hobu.co> STDOUT output for --pointcloudschema hidden option #863 (09:56:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add split kernel. (09:37:59)
+
+2015-04-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (09:27:39)
+
+2015-04-18
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix up rxp reader and tests for new regime (16:32:09)
+
+2015-04-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for enumeration of statistics values. (13:06:37)
+
+2015-04-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add test for non-standard dimension names. (14:41:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make schema hold XMLdims so that names get output for non-standard dimensions. (14:13:04)
+
+2015-04-11
+	* Howard Butler <howard at hobu.co> Merge pull request #877 from jwomeara/geowave-vagrant-fix (09:24:04)
+
+2015-04-10
+	* Whitney O'Meara <womeara at radiantblue.com> Fixed documentation URL and line endings for geowave service script (19:19:35)
+	* Howard Butler <howard at hobu.co> use CMAKE_INSTALL_LIBDIR to catch lib64 on certain platforms for lib/ installation location #871 (15:36:28)
+	* Howard Butler <howard at hobu.co> Merge pull request #876 from PDAL/PointCloudSchema-update (15:26:45)
+	* Howard Butler <howard at hobu.co> increment version of PointCloudSchema XSD to 1.3 to include <metadata> for every dimension #872 (15:14:19)
+	* Howard Butler <howard at hobu.co> Merge pull request #875 from jwomeara/docs-update (15:00:37)
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave plugin config URL (14:51:24)
+	* Howard Butler <howard at hobu.co> Merge pull request #874 from jwomeara/geowave-update (11:46:42)
+	* Whitney O'Meara <womeara at radiantblue.com> Updated vagrant provisioning to use common GeoWave jace bindings (09:25:05)
+
+2015-04-09
+	* Howard Butler <howard at hobu.co> make sure to add base options to 'pdal info' in addition to hidden ones described in #863 (15:49:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Ensure sufficient precision for offset and scale in XMLSchema. (15:13:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove some dead code. Make call_once use consistent. (11:58:20)
+	* Howard Butler <howard at hobu.co> Merge pull request #863 from PDAL/sdo_pc (10:17:27)
+	* Howard Butler <howard at hobu.co> Refactor and cleanup of gdal::Debug => gdal::ErrorHandler #870 (10:12:13)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'more-optional-deps-from-ppa' (08:59:28)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into sdo_pc (08:35:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change LazPerfCompressor warning from exception to error output. (07:12:31)
+
+2015-04-06
+	* Pete Gadomski <pete.gadomski at gmail.com> Install laz-perf from our PPA (09:05:16)
+	* Connor Manning <connor at hobu.co> Remove unnecessary typedef declarations. (13:40:20)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #868 from PDAL/layout-ownership (12:28:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add compression to OCI. Add a simple buffer implementation to the Compression header. Make sure done() only gets called once for the LazPerf compressor. Have compression tests use new compression buffer. (12:19:26)
+	* Connor Manning <connor at hobu.co> Make the PointTable's Layout not be a shared pointer. (11:23:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #866 from gadomski/travis-cleanup (08:48:06)
+
+2015-04-08
+	* Andrew Bell <andrew.bell.ia at gmail.com> Duh. (14:10:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (13:10:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use custom comparator for PointViewSet. Test comparator for PointViewSet. (12:52:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:06:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add OCI test code. (09:06:27)
+
+2015-04-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (14:39:29)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #869 from PDAL/filter-reference (13:40:36)
+	* Connor Manning <connor at hobu.co> Take PointView reference instead of shared_ptr in filter(). (13:03:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/nitf-writer-igeolo-precision' (09:56:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'issues-854' (09:52:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (09:50:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change plugin.h to plugin.hpp. Modify the plugin structure to use std::string. (09:10:28)
+
+2015-04-05
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove unused cmake variables in CI script (14:23:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Reorganize apt-get installs (14:09:37)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use pdal's ppa for pgpointcloud (09:42:07)
+
+2015-03-27
+	* Pete Gadomski <pete.gadomski at gmail.com> Consolidate apt-get installs (16:40:57)
+	* Pete Gadomski <pete.gadomski at gmail.com> Install libgeotiff from apt instead of from source (16:39:46)
+	* Pete Gadomski <pete.gadomski at gmail.com> Bump required cmake version to 2.8.11 (15:43:41)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #852 from PDAL/geotiff-optional-cmake (19:40:10)
+	* Pete Gadomski <pete.gadomski at gmail.com> Allow fresh cmake builds w/o geotiff (16:32:05)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #844 from strk/test-built-plugins (16:11:09)
+
+2015-04-03
+	* Andrew Bell <andrew.bell.ia at gmail.com> commit aea7c9db37f3b30a3d035aa6559dc20609233ae5 Author: Andrew Bell <andrew.bell.ia at gmail.com> Date:   Fri Apr 3 14:02:09 2015 -0500 (16:03:24)
+	* Howard Butler <howard at hobu.co> apply patch from Todd Murphy to ensure valid boxes for small footprints in IGEOLO in writers.nitf (15:18:55)
+	* Howard Butler <howard at hobu.co> protect XMLSchema with PDAL_HAVE_LIBXML2 (08:09:00)
+
+2015-04-02
+	* Howard Butler <howard at hobu.co> add ability for pdal::Kernel to add hidden switches, use to implement --pointcloudschema output for pdal info and pdal pipeline (16:33:26)
+
+2015-04-01
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix point-major reads for OCI. Add point-major tests for OCI. (20:50:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make OCI tests work. Allow OCI connection string to be set in CMakeCache.txt or with     --connection=string on command line. (17:13:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add auto-offset support to OCI. (13:53:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove errant size set for location scaling. (13:32:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Force ordering of PointViews in sets to follow creation order. (07:34:19)
+
+2015-03-31
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (16:01:58)
+	* Howard Butler <howard at hobu.co> split up nitf tests (16:00:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Separate NITF reader/writer tests. (14:06:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Missed file. (13:43:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:35:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move test main from cmake to pdal code. (13:35:14)
+	* Howard Butler <howard at hobu.co> Merge pull request #856 from PDAL/add-boost-dirs-to-config (11:40:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #857 from PDAL/catch-up-geowave (11:33:17)
+	* Howard Butler <howard at hobu.co> catch up GeoWave to new plugin architecture #855 (10:32:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/reader-callbacks' (10:31:28)
+	* chambbj <brad.chambers at gmail.com> external projects using pdal will also need the boost include and library dirs (09:26:28)
+
+2015-03-30
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove unused pack option. Don't add size to total twice in point-major writes. (20:46:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:40:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix problems with reading/writing multiple tiles. Fix issue with positioning for dimension-major files. (18:39:54)
+
+2015-03-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:43:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Debug. (18:42:33)
+	* Connor Manning <connor at hobu.co> Fix warnings.  Add virtual destructor to PointView. (14:31:44)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #849 from PDAL/travis-optimization (14:15:57)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #850 from PDAL/export-toJSON (13:32:34)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #842 from PDAL/windows-warnings (13:32:03)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #846 from strk/travis (09:06:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #848 from gadomski/homepage-typo (08:46:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> export overloaded toJSON, make appveyor/windows happy (08:09:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> see if ninja works out of the box with the existing cmake ppa (07:41:55)
+
+2015-03-25
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix small typo in homepage index (23:17:34)
+	* Sandro Santilli <strk at keybit.net> Have Travis run pgpointcloud tests (04:31:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:38:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> emplace not supported on older 4.7 gcc. (09:38:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #847 from gadomski/2d-bounds-bug (09:05:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix maxy bug for 2D BOX3Ds (08:52:26)
+
+2015-03-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add NullWriter doc. (15:40:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:19:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add a NULL writer. (15:19:27)
+	* Connor Manning <connor at hobu.co> Layout members private->protected for derivers. (15:17:50)
+	* Sandro Santilli <strk at keybit.net> Request ctest to load plugins from the build dir (12:53:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:50:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add toMetadata to Options. (12:48:55)
+	* Howard Butler <howard at hobu.co> don't install bash-completion globally, put in CMAKE_INSTALL_PREFIX (10:29:34)
+
+2015-03-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for options -> JSON. (19:13:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Format changes. (10:48:34)
+
+2015-03-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #837 from strk/pgpointcloud-quotes (09:48:45)
+
+2015-03-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:10:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Rename StageTester -> StageWrapper (20:09:51)
+	* Connor Manning <connor at hobu.co> Allow Layout::update override. (15:19:22)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix typo in MortonOrderFilter (09:27:01)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix bad rebase with master (06:44:40)
+
+2015-03-18
+	* Bradley J Chambers <brad.chambers at gmail.com> revert some changes, use /W3 instead of /W4 (14:05:03)
+	* Connor Manning <connor at hobu.co> Add reader callbacks. (21:21:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:39:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (16:23:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #815 from strk/bash-completion (15:01:40)
+	* Howard Butler <howard at hobu.co> Merge pull request #814 from strk/check (15:01:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #841 from strk/pgpointcloud-capacity (10:21:22)
+	* Sandro Santilli <strk at keybit.net> Stop advertising unsupported "capacity" pgpointcloud writer option (10:15:49)
+	* Sandro Santilli <strk at keybit.net> Do not assume default column name in PgWriter::writeTile (08:30:30)
+	* Sandro Santilli <strk at keybit.net> Fix fetchPcid in presence of a schema option (08:20:49)
+	* Sandro Santilli <strk at keybit.net> Properly quote PG identifiers (05:09:46)
+	* Sandro Santilli <strk at keybit.net> Drop partial support for "capacity" option in pgpointcloud. (09:30:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Enhance replaceAll test. (08:46:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:27:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix Utils::replaceAll.  Add tests. (08:26:48)
+	* chambbj <brad.chambers at gmail.com> Update install.cmd (06:26:23)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #838 from strk/patch-1 (06:18:01)
+	* Sandro Santilli <strk at keybit.net> fix typo (06:13:09)
+	* chambbj <brad.chambers at gmail.com> Update appveyor.yml (05:54:51)
+
+2015-03-13
+	* Bradley J Chambers <brad.chambers at gmail.com> Windows clean-up (mostly warnings) (11:16:39)
+	* Sandro Santilli <strk at keybit.net> Install bash completion IFF /etc/bash_completion.d exists (05:09:04)
+	* Sandro Santilli <strk at keybit.net> Add bash completion script (04:43:29)
+	* Sandro Santilli <strk at keybit.net> Add a --list-commands switch to pdal app (04:23:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into issues-778 (16:57:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #817 from PDAL/issues-816 (16:49:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't access different lists in loop. (16:19:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (11:37:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove unused arguments. (11:37:24)
+	* Howard Butler <howard at hobu.co> update slack notification token (08:43:15)
+	* Bradley J Chambers <brad.chambers at gmail.com> use standard compiler macros (07:12:31)
+	* Bradley J Chambers <brad.chambers at gmail.com> silence two particularly noisy warnings on windows (c4244 and c4290) (07:09:50)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix the appveyor badge once again (06:04:01)
+	* Sandro Santilli <strk at keybit.net> Add "check" Makefile rule as an alias for "test" (03:27:03)
+
+2015-03-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for user-specified backing-buffers and reader callbacks. (13:03:08)
+
+2015-03-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #831 from PDAL/issues-821 (16:55:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #830 from PDAL/issues-812 (16:55:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove unused option "cloud_id" from OCI writer. (16:02:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't open LAZ file if we can't compress. (15:50:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #823 from PDAL/issues-778 (14:52:47)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #824 from gadomski/issues/820-laszip-and-lastools-cmake (12:14:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #828 from PDAL/issues-822 (11:43:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix text. (11:42:20)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #827 from PDAL/issues-822 (11:40:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (11:38:10)
+	* Pete Gadomski <pete.gadomski at gmail.com> Don't use PATH_PREFIXES in FindLASzip (10:36:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Handle bad filter stage on reading pipeline. Pass though specific errors detected on parsing. (09:51:56)
+
+2015-03-12
+	* Bradley J Chambers <brad.chambers at gmail.com> update url in appveyor badge (15:17:00)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix typo in README (14:49:57)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #813 from PDAL/appveyor (14:42:13)
+
+2015-03-11
+	* Bradley J Chambers <brad.chambers at gmail.com> Add initial appveyor configuration with status badge (13:27:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #809 from PDAL/hobu-doc-updates-3-2015 (21:22:10)
+	* Howard Butler <howard at hobu.co> a bunch of doc updates (16:57:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #808 from PDAL/issues-805 (13:43:45)
+	* Howard Butler <howard at hobu.co> Merge pull request #807 from PDAL/excise-float-equal (13:43:37)
+	* Howard Butler <howard at hobu.co> remove float-equal from test/ (11:48:03)
+	* Howard Butler <howard at hobu.co> turn off -Wfloat-equal (11:41:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make code match documentation. (10:59:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:35:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Quiet compiler. (10:34:45)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #804 from PDAL/catch-up-pcl-kernel-to-plugin-changes (10:34:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> consolidate the debug, verbosity, and log options as part of setCommonOptions (09:52:38)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #784 from PDAL/rialto-writer (09:39:16)
+	* Bradley J Chambers <brad.chambers at gmail.com> appease msvc once again, overload BOX3D::grow, and guard redefinition of MaximumNumberOfReturns, etc. in OptechReader (09:38:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> add RialtoWriter to StageFactory and sort sections by filters/readers/writers (09:24:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> getDefaultOptions is no longer static (09:14:42)
+	* Bradley J Chambers <brad.chambers at gmail.com> update RialtoWriter per the recent plugin changes, make sure it compiles on msvc (09:06:14)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #803 from PDAL/issue/802-unresolved-external-highest-lowest (08:22:51)
+
+2015-03-02
+	* Bradley J Chambers <brad.chambers at gmail.com> Add RialtoWriter (13:33:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Reset BPF stream on initialization. (19:57:24)
+
+2015-03-10
+	* Bradley J Chambers <brad.chambers at gmail.com> move grow from hpp to cpp (15:26:26)
+	* Bradley J Chambers <brad.chambers at gmail.com> move references to HIGHEST and LOWEST from .hpp to .cpp to make msvc happy (13:46:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> some missing includes and exports (14:45:50)
+	* Howard Butler <howard at hobu.co> catch up PCL kernels to new plugin changes #774 (14:19:50)
+	* Bradley J Chambers <brad.chambers at gmail.com> be explicit about type so that msvc does not complain (14:06:38)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #801 from PDAL/plugin-manager-fix (13:42:38)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #798 from PDAL/issue/792-isnan (12:56:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> provide default constructor for PluginInfo, no initializer lists on msvc (12:54:00)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #791 from gadomski/issues/783-purge-read-n (12:46:55)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #796 from PDAL/issues/793-795-windows (12:07:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> test if val was provided without use of nan at all (11:48:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #797 from PDAL/oci-wrapper-namespace (11:33:09)
+	* Bradley J Chambers <brad.chambers at gmail.com> provide fixes for MSVC2012 (11:31:20)
+	* Howard Butler <howard at hobu.co> oci wrapper stuff needs to live in pdal namespace -- there's a GDAL global version of same (11:30:34)
+	* Bradley J Chambers <brad.chambers at gmail.com> add missing include cstdint, sort includes (11:25:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Plugin framework refactoring (10:39:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:24:37)
+
+2015-03-07
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove read_n and read_field from Utils.hpp (10:30:46)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove read_n from Terrasolid reader (10:27:39)
+	* Pete Gadomski <pete.gadomski at gmail.com> Smarten up the Terrasolid return number (09:34:06)
+	* Pete Gadomski <pete.gadomski at gmail.com> Increment counter in TerrasolidReader (09:33:38)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add TerrasolidReaderTest (09:32:26)
+	* Pete Gadomski <pete.gadomski at gmail.com> Refactor the QFit reader to not use Utils::read_n (08:17:33)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add Switchable Extractor and IStream (08:16:15)
+	* Pete Gadomski <pete.gadomski at gmail.com> Seek to the end of an IStream (10:49:55)
+
+2015-03-06
+	* Howard Butler <howard at hobu.co> Merge pull request #790 from PDAL/issues/789-dataformat_id-metadata-output (19:13:35)
+	* Howard Butler <howard at hobu.co> output dataformat_id as metadata for LAS reader (19:12:30)
+
+2015-03-05
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #786 from PDAL/quad-tweak (16:37:24)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #787 from PDAL/compression-updates (16:36:31)
+	* Pete Gadomski <pete.gadomski at gmail.com> PDAL_DLL the OptechReader (15:12:40)
+	* Connor Manning <connor at hobu.co> Include pdal_internal to ensure ifdef is valid.  Constify input ptr. (15:08:49)
+	* Howard Butler <howard at hobu.co> Merge pull request #782 from gadomski/optech (15:03:45)
+	* Howard Butler <howard at hobu.co> point to PDAL RPM repo (13:50:12)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add reader for Optech csd files (03:42:50)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add georeference utility (03:42:50)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add missing includes to Extractor.hpp (03:42:50)
+
+2015-02-15
+	* Connor Manning <connor at hobu.co> Switch attribute filter to the changed QuadIndex interface. (13:52:54)
+	* Connor Manning <connor at hobu.co> Quad index interface changes. (13:17:19)
+
+2015-03-04
+	* Howard Butler <howard at hobu.co> PCL support needs PCL 1.7.2+, not pipeline branch anymore (16:28:10)
+	* Howard Butler <howard at hobu.co> Merge pull request #779 from PDAL/StageRunner-is-private (16:09:04)
+	* Howard Butler <howard at hobu.co> Merge pull request #780 from PDAL/move-to-util (16:08:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #776 from jwomeara/geowave-vagrant (16:04:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make getDimension private. (15:54:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move StageRunner.hpp to src dir. (15:53:10)
+
+2015-02-27
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:28:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add write tests for BPF. (10:28:14)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead option from OciReader. (10:27:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix duplicate backout of offset. (10:26:21)
+	* Bradley J Chambers <brad.chambers at gmail.com> move Charbuf, Extractor, Inserter, IStream, and OStream to util (09:26:34)
+
+2015-02-26
+	* Bradley J Chambers <brad.chambers at gmail.com> StageRunner is local to Stage and does not need to be part of the public interface (16:03:48)
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave plugin to check to see if the JVM is already running.  Also udpated GeoWaveReader to limit query results by count. (13:09:57)
+
+2015-02-13
+	* Whitney O'Meara <womeara at radiantblue.com> Initial attempt at setting GeoWave up as a plugin within Vagrant. (12:02:00)
+
+2015-02-25
+	* Connor Manning <connor at hobu.co> Update Vagrant's trusty image URL. (10:39:20)
+
+2015-02-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:57:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Replace getBytes() with getPackedPoint(). (15:56:27)
+	* Howard Butler <howard at hobu.co> Merge pull request #772 from PDAL/fix-make-clean (15:51:55)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #773 from PDAL/fix-hexbin-tesselation-output (15:25:53)
+	* Howard Butler <howard at hobu.co> put back tesselation output in hexbin test so tests pass (13:38:01)
+	* Howard Butler <howard at hobu.co> only nuke the files in ./lib on clean for 'make clean', not the lib directory itself (11:24:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #768 from PDAL/pointaccess (08:54:05)
+
+2015-02-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Support for LAS extra bytes VLR. A couple of fixes for reading/writing LAS files. (21:56:11)
+
+2015-02-22
+	* Howard Butler <howard at hobu.co> Merge pull request #770 from gadomski/yet-more-osx-linking (17:15:45)
+
+2015-02-21
+	* Pete Gadomski <pete.gadomski at gmail.com> Use @loader_path/../lib (11:25:14)
+
+2015-02-20
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #769 from gadomski/rxp-cleanup (18:27:43)
+
+2015-02-10
+	* Pete Gadomski <pete.gadomski at gmail.com> General cleanup of the rxp reader (16:55:09)
+	* womeara <womeara at radiantblue.com> Configured GeoWave drivers to run as plugins. (11:20:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #755 from PDAL/vagrant-updates (15:01:17)
+	* Howard Butler <howard at hobu.co> move package installation into a linux-install-scripts/packages.sh file instead of in Vagrantfile only (14:30:30)
+	* Howard Butler <howard at hobu.co> build and install laz-perf (14:29:50)
+	* Howard Butler <howard at hobu.co> Add wget to Vagrantfile (09:44:35)
+
+2015-02-18
+	* Howard Butler <howard at hobu.co> Merge pull request #767 from PDAL/reprojection-gdal-environment (18:20:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow raw point access. (14:41:06)
+	* Howard Butler <howard at hobu.co> Merge pull request #766 from matthewhanson/fix_p2g_radius (14:36:02)
+	* Matthew Hanson <mhanson at appliedgeosolutions.com> changed parameter m_RADIUS_SQ to m_RADIUS then pass in the square to OutCoreInterp (14:33:15)
+	* Howard Butler <howard at hobu.co> light up GDAL environment for reprojection filter #764 (14:27:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #763 from matthewhanson/fix_p2gwriter_gtiff (13:47:55)
+	* Matthew Hanson <mhanson at appliedgeosolutions.com> fixed half pixel x and y offset in GeoTransform (p2g plugin) (11:05:55)
+
+2015-02-12
+	* Howard Butler <howard at hobu.co> Merge pull request #759 from jwomeara/geowave-doc (13:22:19)
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave documentation to specify which srs to use when writing data.  Also, updated the index with GeoWave entries. (13:14:49)
+
+2015-02-11
+	* chambbj <brad.chambers at gmail.com> Merge pull request #752 from jwomeara/geowave-io (12:53:28)
+	* womeara <womeara at radiantblue.com> Added documentation for the GeoWave plugin. (12:08:25)
+	* Howard Butler <howard at hobu.co> Merge pull request #758 from PDAL/issues/756-cmake-boost-required (12:20:01)
+	* Howard Butler <howard at hobu.co> Adapt @vmora's patch from #756 to make find_package for Boost REQUIRED (11:48:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:22:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Strange performance thing. (11:22:22)
+
+2015-02-06
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave driver to support FeatureCollectionDataAdapter.  Also, updated writer to use AccumuloIndexWriter. (10:16:33)
+
+2015-02-02
+	* Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave cmake scripts (14:59:09)
+	* Whitney O'Meara <womeara at radiantblue.com> Initial checkin of GeoWave PDAL driver (13:48:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:53:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Register LAS dimensions with their actual size. (20:53:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Small optimizations. (20:52:26)
+
+2015-02-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:13:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add test for output_dims option. (15:13:40)
+	* Howard Butler <howard at hobu.co> Merge pull request #751 from PDAL/hexbin-no-tesselation (12:45:46)
+	* Howard Butler <howard at hobu.co> Merge pull request #750 from PDAL/all-output-mode-for-pdal-info (12:45:37)
+	* Howard Butler <howard at hobu.co> add filename to 'pdal info' output (12:22:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:51:07)
+	* Howard Butler <howard at hobu.co> add '--all' output mode for 'pdal info' (11:19:09)
+	* Howard Butler <howard at hobu.co> default to not outputting tesselation in Metadata with output_tesselation option (11:18:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #738 from gadomski/postgres-off-by-default (11:02:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #737 from PDAL/issues/733-cmake-osx-rpath (11:02:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #743 from PDAL/add-passthrough-filter (11:01:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:36:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add output_dims support. (10:35:34)
+
+2015-01-30
+	* Bradley J Chambers <brad.chambers at gmail.com> Add range filter (11:26:42)
+	* Pete Gadomski <pete.gadomski at gmail.com> Disable pgpointcloud plugin if no postgres found (15:38:17)
+	* Howard Butler <howard at hobu.co> In relation to #733, turn on @loader_path and @executable_path for rpath on OSX. (15:29:38)
+	* Howard Butler <howard at hobu.co> Merge pull request #732 from PDAL/dont-throw-error-for-empty-geotiff-keys (15:28:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add better diagnostic output for ReprojectionFilter. (15:26:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:09:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead constructors. (14:09:20)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #735 from gadomski/cpd (14:06:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:45:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Semi-decent error message for bad pipeline XML. (12:42:53)
+	* Howard Butler <howard at hobu.co> Merge pull request #736 from PDAL/pipelinemgr (12:28:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into pipelinemgr (11:47:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove m_lastWriter from PipelineManager. (11:13:08)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add kernel plugin for Coherent Point Drift (08:37:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #734 from gadomski/pipeline-manager-bug-fix (10:46:09)
+	* Howard Butler <howard at hobu.co> Merge pull request #733 from gadomski/rpath-on-osx (10:44:00)
+	* Pete Gadomski <pete.gadomski at gmail.com> Update m_lastStage in PipelineManager::addWriter (10:00:15)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE for OSX (08:29:25)
+
+2015-02-04
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #748 from PDAL/issues-746-747 (17:03:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add test for writing scaled X,Y,Z values. (16:04:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make sure that hexrep is properly sized before appending to insertion buffer. Close #746 Close #747 (15:26:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Actually commit changes to removeTrailing/Leading blanks. Support options -> vector of strings. (13:45:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add removeLeadingBlanks.  Fix removeTrailingBlanks. (13:00:07)
+	* Howard Butler <howard at hobu.co> don't try to trap for missing connections, let gtest catch them in pgpointcloud tests #744 (10:11:09)
+	* Howard Butler <howard at hobu.co> Merge pull request #744 from strk/libpq (09:58:32)
+
+2015-02-03
+	* Andrew Bell <andrew.bell.ia at gmail.com> Small optimizations/Explicit types for LAS dims. (11:49:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Rollback. (09:29:20)
+	* Sandro Santilli <strk at keybit.net> Allow running pgpointcloud tests against non-default installs (03:24:37)
+
+2015-01-21
+	* Bradley J Chambers <brad.chambers at gmail.com> WIP - drafts of tutorial for writing filters, kernels, readers, and writers, with accompanying sample code (13:35:40)
+	* Howard Butler <howard at hobu.co> read our custom dimension out of ProgrammableFilter (17:34:10)
+	* Howard Butler <howard at hobu.co> default my build to building with python (17:33:54)
+	* Howard Butler <howard at hobu.co> manual merge (16:49:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #714 from PDAL/PDALConfig (16:46:09)
+	* Howard Butler <howard at hobu.co> Merge pull request #716 from PDAL/issue/689-ground-filter (16:46:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #721 from PDAL/use-real-dimension-name-for-filtering (16:45:53)
+	* Howard Butler <howard at hobu.co> We were using the default dimension name rather than the actual dimension name for filtering. Custom dimensions ended up being '' (11:04:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:46:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (10:45:50)
+	* Howard Butler <howard at hobu.co> Merge pull request #720 from gadomski/with-python (10:42:07)
+	* Pete Gadomski <pete.gadomski at gmail.com> BUILD_PLUGIN_PYTHON should not depend (09:41:26)
+
+2015-02-01
+	* Howard Butler <howard at hobu.co> don't do RPATH install on linux, just OSX (10:44:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #739 from gadomski/pdal-config-version (10:36:01)
+	* Howard Butler <howard at hobu.co> Merge pull request #740 from gadomski/translate-crop-null-stage-ptr (10:35:50)
+
+2015-01-31
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix NULL pointer in `pdal translate --polygon` (21:52:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use correct cmake version variable in pdal-config (20:58:40)
+
+2015-01-27
+	* Bradley J Chambers <brad.chambers at gmail.com> Add PCL kernel to compute Height Above Ground (12:35:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Avoid numeric cast if possible. (21:48:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't create copy of collection when finding. (21:31:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Create/use classes to insert/extract byte-ordered data from a buffer. (19:20:30)
+	* Howard Butler <howard at hobu.co> Merge pull request #725 from PDAL/issue/723-nuke-pkgconfig (13:28:55)
+	* Howard Butler <howard at hobu.co> Merge pull request #727 from PDAL/make-kernel-public (13:28:48)
+	* Howard Butler <howard at hobu.co> Merge pull request #728 from PDAL/move-to-utils (13:22:40)
+	* Howard Butler <howard at hobu.co> min/max/mean typo in delta kernel (09:07:19)
+
+2015-01-29
+	* Howard Butler <howard at hobu.co> Don't throw an error with empty GeoTIFF keys, instead just set it as an empty SRS (10:47:50)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #731 from PDAL/json-quotes (10:21:36)
+
+2015-01-28
+	* Connor Manning <connor at hobu.co> Escape quotes in JSON string values. (22:05:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix memcpy to vector. (13:02:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:48:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Minimize stream writes. Eliminate unnecessary numeric casts. (12:47:19)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #730 from PDAL/kdindex-forward-declares-nanoflann (12:01:49)
+	* Connor Manning <connor at hobu.co> Smart ptr instead of raw, move some implementations into cpp. (11:51:05)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #729 from PDAL/gcc (11:24:29)
+	* Connor Manning <connor at hobu.co> Merge branch 'gcc' into kdindex-forward-declares-nanoflann (11:22:27)
+	* Connor Manning <connor at hobu.co> Prefix standard classes with std::, fix const qualifier warning. (11:20:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> forward declare nanoflann in KDIndex, so that nanoflann does not need to be installed (11:06:14)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:42:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't call clearTemps() each time a point is added. Read LAS points in blocks. (10:37:07)
+	* Howard Butler <howard at hobu.co> Rollup of version-related tweaks #719 (08:21:26)
+
+2015-01-26
+	* Bradley J Chambers <brad.chambers at gmail.com> Move Kernel* back to "public interface" and fix the include paths (14:21:12)
+
+2015-01-12
+	* Bradley J Chambers <brad.chambers at gmail.com> Move Algorithm, Endian, and FileUtils to the util library (11:15:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:30:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move all python stuff to plugin directory. (16:29:58)
+	* Howard Butler <howard at hobu.co> Merge pull request #674 from PDAL/cpack-packaging (14:44:47)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (14:40:51)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #702 from PDAL/issue/701-greyhound-lazperf (12:19:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:10:20)
+	* Howard Butler <howard at hobu.co> Merge pull request #703 from PDAL/issue/700-third-vs-vendor (11:51:58)
+	* Bradley J Chambers <brad.chambers at gmail.com> move nanoflann from ./include/pdal/third to ./vendor/nanoflann-1.1.8 (11:39:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (10:51:48)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove unused CMake variables/commented code (10:51:16)
+	* Bradley J Chambers <brad.chambers at gmail.com> disable entire ReadCompressed class when LAZPERF is not present (10:39:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #701, check that PDAL has LAZPERF support (10:30:34)
+	* Connor Manning <connor at hobu.co> Initialization order warning. (10:27:00)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (08:43:15)
+	* Howard Butler <howard at hobu.co> Merge pull request #697 from PDAL/greyhound-compression (08:43:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #698 from PDAL/remove-dead-cmake (08:42:50)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (08:42:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Plang update. (08:30:44)
+
+2015-01-25
+	* Bradley J Chambers <brad.chambers at gmail.com> boost -> std thread, clean up bad merge (21:43:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't access summary objects through shared pointers. (20:45:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:28:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change vector to deque for PointBuffer index. (20:27:49)
+
+2015-01-24
+	* Howard Butler <howard at hobu.co> need <ostream> include (11:17:44)
+
+2015-01-23
+	* Bradley J Chambers <brad.chambers at gmail.com> Remove package config (22:31:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More testing. (18:37:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Debug Travis. (17:36:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into python (17:04:16)
+
+2015-01-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix transformation math according to revised document. (15:49:36)
+
+2015-01-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add scaling to BPF writer. (20:56:37)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #718 from gadomski/rivlib-tests (16:17:12)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix rivlib test's cmakelists (15:15:52)
+	* Howard Butler <howard at hobu.co> add gcc-multilib and g++-multilib to the Vagrant config (14:52:01)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove redundant export of pdal_util (13:15:04)
+	* Bradley J Chambers <brad.chambers at gmail.com> we can specify multiple targets on the export line (12:55:29)
+	* Howard Butler <howard at hobu.co> Merge pull request #713 from PDAL/issues/699-move-bounds (13:09:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:06:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add UTM option for BpfWriter. Add default options for BpfWriter. Remove stream() from BpfWriter. Correct options description for LAS writer. (12:05:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Verify we have X, Y and Z and they're the first three dimensions. (11:23:45)
+	* Howard Butler <howard at hobu.co> move bounds to include/pdal/util #699 (11:14:22)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (10:03:28)
+	* Howard Butler <howard at hobu.co> remove @executable_path install_name for OSX (10:03:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:55:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move more fancy compression stuff to the compressor.  Add comments. (08:54:33)
+
+2015-01-16
+	* Bradley J Chambers <brad.chambers at gmail.com> Add `filters.ground` and `kernels.ground` (13:49:19)
+	* Howard Butler <howard at hobu.co> set PDAL_DRIVER_PATH for vagrant invocation (10:20:06)
+	* Howard Butler <howard at hobu.co> Merge pull request #709 from PDAL/compute-utm-zone (09:57:25)
+
+2015-01-14
+	* Bradley J Chambers <brad.chambers at gmail.com> initial commit of PDALConfig.cmake (13:19:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> First cut at BPF writer. (19:16:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #705 from PDAL/issue/704-make-buffer-reader-public (11:00:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> make BufferReader a public header (09:21:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Actually add all the files. (08:06:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Finish movement of plang to plugin-land. (07:47:47)
+
+2015-01-19
+	* Howard Butler <howard at hobu.co> only CMAKE_BUILD_WITH_INSTALL_RPATH when APPLE (16:32:10)
+	* Howard Butler <howard at hobu.co> don't recursively install pdalutil headers (16:12:21)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (16:01:52)
+	* Howard Butler <howard at hobu.co> another whack at rpath -- don't install plugins in a special directory (16:01:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:17:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for byte-segregated data. (14:16:53)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:09:51)
+	* Howard Butler <howard at hobu.co> working dev and install rpath on OSX (13:42:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing dimension-major data. (10:13:50)
+
+2015-01-17
+	* Howard Butler <howard at hobu.co> rpath kind of working (17:26:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:41:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add compression to BPF writer. (08:40:56)
+
+2015-01-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix Mueller matrix initialization/math.  Add test. (19:21:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Apply transformation to BPF points as read. (14:07:16)
+	* Howard Butler <howard at hobu.co> Add SpatialReference::computeUTMZone(const BOX3D& box) const to calculate the UTM zone when you have a box in another coordinate system (13:45:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Properly initialize Mueller matrix. Check for X, Y and Z dimensions as now required by specification. (13:38:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> dimension max in bpf header never gets updated (11:38:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #708 from PDAL/remove-iconv (11:00:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #706 from PDAL/bpfwriter (10:55:30)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (10:40:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> MSVC complains about multiply defined symbols, same workaround provided previously in LasHeader.cpp (10:38:52)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into remove-iconv (10:35:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:35:12)
+	* Howard Butler <howard at hobu.co> remove iconv #707 (10:35:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove lambda with default arg. (10:34:44)
+	* Bradley J Chambers <brad.chambers at gmail.com> if we do not want to rely on PDAL (pdal_export.hpp) to build the Utils library, then we need to define PDAL_DLL locally (10:16:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> pdal_export will always need pdal_defines (rather than hoping the including file took care of it first) (10:10:50)
+	* Bradley J Chambers <brad.chambers at gmail.com> PDALUtils needs to export toJSON (10:10:03)
+	* Bradley J Chambers <brad.chambers at gmail.com> TransformationFilter needs to export transformationMatrixFromString (10:09:28)
+
+2015-01-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into python (19:03:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Provide file metadata option in info kernel. Clean up JSON output. (14:27:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Simplify JSON output of metadata. (13:05:43)
+
+2015-01-11
+	* Howard Butler <howard at hobu.co> decrufting (22:58:35)
+	* Howard Butler <howard at hobu.co> remove dead cmake Find* modules (22:53:14)
+	* Connor Manning <connor at hobu.co> Read compressed data from Greyhound when possible. (15:34:19)
+	* Connor Manning <connor at hobu.co> Update schema format expectations, restructure slightly to begin decompression work. (11:31:17)
+
+2015-01-10
+	* Connor Manning <connor at hobu.co> Expected schema response from Greyhound was out of date. (23:31:23)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (22:01:51)
+	* Howard Butler <howard at hobu.co> Merge pull request #695 from PDAL/pgpointcloud-test-db-failure (22:00:31)
+	* Howard Butler <howard at hobu.co> Fail pgpointcloud test more gracefully when you can't connect to db (21:56:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #694 from PDAL/issue/687-translate-segfault (21:36:49)
+	* Howard Butler <howard at hobu.co> Merge pull request #693 from PDAL/remove-uuid-global-environment (21:36:41)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove md5 and string_ref per discussions with hobu (21:30:10)
+	* Howard Butler <howard at hobu.co> remove <random> and friends from GlobalEnvironment -- it was needed for UUIDs which we don't do anymore (21:10:15)
+	* Bradley J Chambers <brad.chambers at gmail.com> avoid segfault in translate kernel (20:32:16)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (19:16:54)
+	* Howard Butler <howard at hobu.co> Big bunch of cmake-related fixes to get Vagrant config going #684 (19:15:47)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into greyhound-compression (16:57:32)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into greyhound-compression (13:43:11)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #692 from PDAL/make-install (13:31:03)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #691 from PDAL/gcc-lasdump (13:29:15)
+	* Connor Manning <connor at hobu.co> Get installer working with new directory structure. (13:09:13)
+	* Connor Manning <connor at hobu.co> Break greyhound exchanges into hpp/cpp instead of all header. (09:45:43)
+
+2015-01-09
+	* Connor Manning <connor at hobu.co> Allow build on GCC. (17:50:58)
+	* Connor Manning <connor at hobu.co> Update lazperf include. (16:54:02)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #686 from PDAL/find-lazperf (14:54:44)
+	* Connor Manning <connor at hobu.co> Remove FindLazperf.cmake module. (14:37:34)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'filters/transformation' (13:29:13)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add transformation filter (09:55:29)
+	* Howard Butler <howard at hobu.co> std:: prefix cout for dumper (11:27:53)
+	* Connor Manning <connor at hobu.co> Add greyhound reader doc. (09:33:20)
+
+2015-01-08
+	* Howard Butler <howard at hobu.co> Merge pull request #683 from PDAL/hdf5-linux-updates (15:54:57)
+	* Howard Butler <howard at hobu.co> need <iostream> in Dumper for std::cout (15:40:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add lasdump and separate build dependencies. (15:08:24)
+	* Howard Butler <howard at hobu.co> make IceBridge work on Vagrant (14:45:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> Rename FindPoints2Grid to FindP2G so that FeatureSummary will behave correctly. (14:42:31)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (13:26:43)
+	* Bradley J Chambers <brad.chambers at gmail.com> We generally do not need a copy when using auto. (08:54:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Initialize position with something reasonable so that sorting works. (12:48:46)
+	* Howard Butler <howard at hobu.co> ADDITIONAL_MAKE_CLEAN_FILES directory property for lib/ to wipe plugins on 'make clean' (12:48:20)
+
+2015-01-07
+	* Bradley J Chambers <brad.chambers at gmail.com> Cleanup Drivers.hpp (13:36:04)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (17:13:25)
+	* Howard Butler <howard at hobu.co> Merge pull request #679 from PDAL/issue/549-plugin-version (17:11:48)
+	* Howard Butler <howard at hobu.co> Merge pull request #681 from PDAL/pdal-app-driver-options-listing (17:11:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #682 from gadomski/rxp-include-directories (17:11:24)
+	* Pete Gadomski <pete.gadomski at gmail.com> Update rxp plugin's include directories (11:24:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> Modify pdal app outputs (10:47:38)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #680 from PDAL/with-compression-flag (10:46:54)
+	* Connor Manning <connor at hobu.co> Update travis/example config compression flag. (10:34:00)
+	* Connor Manning <connor at hobu.co> Fix last GCC warning, and minor tweaks. (10:16:21)
+	* Connor Manning <connor at hobu.co> Change WITH_COMPRESSION cmake flag to WITH_LAZPERF for consistency (10:13:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> only print plugin version if it is set (06:55:48)
+
+2015-01-06
+	* Bradley J Chambers <brad.chambers at gmail.com> record plugin version as part of stage info (21:42:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #678 from PDAL/issue/673-remove-set-stage-enabled (13:48:45)
+
+2015-01-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove Metadata -> JSON test (moved to PDALUtils). (16:08:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Verify we handle Non-ASCII UTF-8 characters properly in Metadata/XMLSchema. (15:19:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> Remove SET_STAGE_ENABLED and SET_KERNEL_ENABLED (13:02:09)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (11:50:43)
+	* Howard Butler <howard at hobu.co> change LICENSE.txt pointer to (11:50:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #677 from edigonzales/master (08:11:28)
+
+2015-01-04
+	* Stefan Ziegler <edi.gonzales at gmail.com> db schema support when appending data to an existing table (11:56:30)
+
+2015-01-03
+	* Howard Butler <howard at hobu.co> Merge branch 'cpack-packaging' of git://github.com/PDAL/PDAL into cpack-packaging (10:00:46)
+	* Howard Butler <howard at hobu.co> add TGZ generator, point to license (10:00:44)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (09:31:55)
+	* Howard Butler <howard at hobu.co> set SOVERSION (09:31:45)
+
+2015-01-02
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #676 from PDAL/byte-order (13:15:49)
+	* Connor Manning <connor at hobu.co> Alleviate flood of type-punned pointer warnings on GCC. (12:43:56)
+	* Connor Manning <connor at hobu.co> Write OStream floating point vals in little-endian. (12:28:35)
+
+2015-01-01
+	* Bradley J Chambers <brad.chambers at gmail.com> clean up commented lines in test/unit/CMakeLists.txt, dead unit tests, etc. (19:54:52)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #675 from PDAL/quad (17:10:25)
+	* Connor Manning <connor at hobu.co> Don't segfault with PointBuffer stream constructor. (15:45:16)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into quad (12:46:13)
+
+2014-12-31
+	* Andrew Bell <andrew.bell.ia at gmail.com> DTD requires orientation to precede metadata. (17:07:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Provide access to QuickInfo through pdal info --summary. Remove dead code.  Remove ptree from InfoKernel. (15:56:14)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make sure log is set before passing to BpfHeader. (14:34:28)
+	* Howard Butler <howard at hobu.co> Merge branch 'cpack-packaging' of git://github.com/PDAL/PDAL into cpack-packaging (14:28:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:12:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move metadata -> JSON translation to PDALUtils. (11:33:53)
+
+2014-12-30
+	* Howard Butler <howard at hobu.co> LICENSE.txt link no good for CPACK_RESOURCE_FILE_LICENSE (15:29:40)
+	* Howard Butler <howard at hobu.co> source packaging regex mods (15:11:10)
+	* Howard Butler <howard at hobu.co> source packaging regex mods (15:10:28)
+	* Howard Butler <howard at hobu.co> bump version to 1.0.0b1 in preparation for release (10:46:42)
+	* Howard Butler <howard at hobu.co> tweak version regex (10:46:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead ptree code. (10:40:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't test for stage descriptions.  Don't default to app bundle on OSX. (10:08:43)
+
+2014-12-29
+	* Howard Butler <howard at hobu.co> add some light docs to the SET_STAGE_NAME macro for many drivers. (15:45:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (10:46:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add metadata test file. (10:30:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix template args. (09:51:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:10:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Changes to support preview of stages and general stats filter changes. (09:10:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Enhance support tests to handle streams. (08:39:28)
+
+2014-12-26
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:24:55)
+	* Howard Butler <howard at hobu.co> pipeline doc updates (09:24:47)
+
+2014-12-23
+	* Howard Butler <howard at hobu.co> Merge pull request #672 from PDAL/issues/666-kernel-plugins (14:08:46)
+	* Howard Butler <howard at hobu.co> Merge pull request #670 from PDAL/update-tests-using-deprecated-filters (14:08:37)
+	* Howard Butler <howard at hobu.co> Merge pull request #671 from PDAL/cmake-tweaks (14:08:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove unused stats support from pdal info. (10:51:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Simple split on char. (08:52:10)
+
+2014-12-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove cruft from stats filter.  Fix tests. (18:07:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> test binary directory may differ from the pdal app directory (if PDAL_BUNDLE=ON), test names may also change, so just use pdal app instead of a specific test (13:39:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add split() and split2() to replace boost::split. (13:36:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> use KernelFactory and KernelInfo to display list of available kernels and determine if the provided kernel is valid in PDAL application (13:34:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix two more paths to configured pipelines (10:31:01)
+	* Bradley J Chambers <brad.chambers at gmail.com> tidying up, fixing paths to XMLs in the unit tests (10:16:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> configure tests to more reliably locate test data, beef up pcpipelineTest to test the sample pipelines (09:49:36)
+
+2014-12-19
+	* Bradley J Chambers <brad.chambers at gmail.com> Widespread CMake updates (12:47:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add a test for compression of all types. (20:56:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Enhance XMLSchema test. (16:32:30)
+
+2014-12-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use DimType in XMLDim.  Minimize use of XMLDim. (16:50:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (08:39:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:36:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Cache location scaling. (08:35:44)
+
+2014-11-19
+	* Bradley J Chambers <brad.chambers at gmail.com> Clean up tests that invoked deprecated filters (15:05:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Chipper filter (13:55:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> move attribute sources and fix typos (20:07:14)
+	* Bradley J Chambers <brad.chambers at gmail.com> attribute filter depends on geos, so it should be a plugin filter (19:50:52)
+	* Howard Butler <howard at hobu.co> more cleanups due to #616 (15:49:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into dbintwriter (15:46:50)
+	* Howard Butler <howard at hobu.co> Merge pull request #616 from PDAL/remove-deprecated-filters (15:10:28)
+	* Howard Butler <howard at hobu.co> Merge pull request #609 from PDAL/move-terrasolid-driver (15:10:19)
+	* Howard Butler <howard at hobu.co> catch up Terrasolid PR to master (15:10:05)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into move-terrasolid-driver (15:09:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> nuke deprecated filters (14:43:38)
+	* Howard Butler <howard at hobu.co> Merge pull request #615 from PDAL/move-attribute-filter (14:40:21)
+	* Howard Butler <howard at hobu.co> Merge pull request #614 from PDAL/updated-ci-script (14:40:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #612 from pramsey/master (14:36:53)
+	* Howard Butler <howard at hobu.co> Merge pull request #610 from PDAL/move-las-driver (14:34:00)
+	* Howard Butler <howard at hobu.co> catch up LAS reorg to master (14:12:06)
+	* Howard Butler <howard at hobu.co> Catch up LAS reorg to master (14:11:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> First steps to write ints instead of doubles for DB drivers. (13:26:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> all plugins explicitly turned off, all optional components toggled with flag (GEOS and COMPRESSION were missing) (13:15:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> stubs have been gone for a while now (13:14:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> WITH_CARIS no longer used (13:05:07)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Move connection setup to initialize() (13:04:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> update api docs to match reality (13:02:24)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Allow connection for addDimension to get access to the database (12:49:40)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (12:12:09)
+	* Paul Ramsey <pramsey at cleverelephant.ca> More useful message during failure to connect (12:09:14)
+	* Howard Butler <howard at hobu.co> build terrasolid (10:51:53)
+	* Howard Butler <howard at hobu.co> Catch up TerraSolid PR to current master (10:47:10)
+	* Howard Butler <howard at hobu.co> update PCL plugin to deal with BufferReader rename (10:17:20)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove unused definitions from pdal_defines (09:36:45)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove caris driver (it will be posted to PDAL/Caris) (09:31:20)
+	* Howard Butler <howard at hobu.co> Merge pull request #611 from PDAL/move-buffer-driver (09:09:26)
+	* Bradley J Chambers <brad.chambers at gmail.com> update tutorial that uses BufferReader (09:05:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Buffer driver (08:59:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #606 from PDAL/move-qfit-driver (09:01:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #607 from PDAL/move-bpf-driver (09:01:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #608 from PDAL/move-text-driver (09:01:35)
+
+2014-12-17
+	* Bradley J Chambers <brad.chambers at gmail.com> replacing more boost with c++11 where appropriate; moment and density accumulators are unused (15:16:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:27:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Eliminate ExtDimType in favor of enhanced DimType. (17:26:17)
+	* Connor Manning <connor at hobu.co> Add include. (15:00:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> PDAL_EMBED_BOOST no longer exists (14:23:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove Application.hpp - unused (14:08:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> use Support::temppath to create temp files in temp directory (12:56:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> on windows, boost filesystem current directory ends in backslash, and does not need a trailing slash appended (12:52:48)
+	* Bradley J Chambers <brad.chambers at gmail.com> replace boost::shared_ptr with std::shared_ptr, update docs to reflect what we actually use from Boost (11:55:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make proper temporary PointRef objects. Close #631 (10:50:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (09:23:26)
+
+2014-12-16
+	* Bradley J Chambers <brad.chambers at gmail.com> create typedefs for FilterPtr, ReaderPtr, and WriterPtr (12:24:54)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove dependency on boost random (14:08:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove dependency on boost threads, fixing pclvisualizer linker issue (windows only) along the way (13:46:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix extra brace. (13:29:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #664 from PDAL/issues-631 (11:55:46)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #663 from PDAL/plugin-cmake-macro-update (11:08:51)
+	* Bradley J Chambers <brad.chambers at gmail.com> no longer using Boost unit_test_framework (10:40:49)
+	* Andrew <andrew at abell-vb2.(none)> Use custom swap_iter for sorting PointBufferIter. (10:22:02)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #662 from PDAL/stage-creation-tweak (09:36:02)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #659 from PDAL/move-python-filters (08:51:09)
+
+2014-12-15
+	* Bradley J Chambers <brad.chambers at gmail.com> Update PDAL_ADD_PLUGIN to use FILES and LINK_WITH keywords for passing multiple arguments (11:23:15)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #661 from PDAL/pcl-visualizer-improvements (15:39:21)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix broken SupportTest and python plugin options (11:29:00)
+	* Bradley J Chambers <brad.chambers at gmail.com> accidently deleted wrong line in macro, fix it (10:37:02)
+	* Bradley J Chambers <brad.chambers at gmail.com> use CMakeParseArguments in PDAL_ADD_TEST (10:16:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't link in PDAL source files in plugin. (12:54:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #660 from PDAL/issues-658 (12:30:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (12:01:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make build work with and without LAZperf. (11:35:33)
+
+2014-12-01
+	* Bradley J Chambers <brad.chambers at gmail.com> PCLVisualizer now has x, y, z, rgb, and intensity color handlers (10:23:36)
+
+2014-12-10
+	* Bradley J Chambers <brad.chambers at gmail.com> use create<Reader|Writer|Filter> methods when creating driver stages, especially for plugins, use unique_ptr's for stages (13:19:53)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use OPTIONAL_COMPONENT_SWITCH for attribute plugin (14:30:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> make the crop filter a builtin filter once again (19:18:56)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #648 from PDAL/clean-up-crop (13:03:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove comments, WITH_GEOS has no meaning anymore (12:34:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> CropFilter should be built with or without GEOS (12:08:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> add_test needs WORKING_DIRECTORY set on linux (11:33:20)
+	* Bradley J Chambers <brad.chambers at gmail.com> help find plugins in build location (10:37:40)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix the crop filter tests (10:13:24)
+	* Howard Butler <howard at hobu.co> Merge pull request #647 from PDAL/move-crop-filter (09:19:59)
+	* Howard Butler <howard at hobu.co> Merge pull request #646 from PDAL/move-stats-filter (08:51:16)
+
+2014-12-08
+	* Bradley J Chambers <brad.chambers at gmail.com> Port of python filters (predicate and programmable) to plugins; separate test executables (10:58:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> SQLite checked with compression and integrated into int I/O. (19:55:57)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix typo in name of ZVelocity dimension (08:36:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> Move Reprojection filter (08:25:47)
+
+2014-12-12
+	* Bradley J Chambers <brad.chambers at gmail.com> LasReader is unused in XMLSchemaTest (23:28:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> need to export XMLSchema (23:08:52)
+	* Bradley J Chambers <brad.chambers at gmail.com> set CMAKE_PREFIX_PATH to help locate PCL in OSGeo4W default location (23:08:05)
+	* Howard Butler <howard at hobu.co> Merge pull request #657 from PDAL/tweak-windows-definitions (21:49:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> fvisibility-inlines-hidden not relevant on windows, pdal_dll_export can probably be defined project wide (15:39:07)
+	* Howard Butler <howard at hobu.co> Merge pull request #652 from PDAL/objects-needed-in-msvc (20:55:25)
+	* Howard Butler <howard at hobu.co> Merge pull request #645 from PDAL/issues-599 (20:55:06)
+	* Connor Manning <connor at hobu.co> Allow quad-tree to represent a subtree. (15:37:18)
+	* Connor Manning <connor at hobu.co> Various tweaks. (14:47:18)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #656 from PDAL/issues/653-dependent-tests (14:22:08)
+	* Connor Manning <connor at hobu.co> Need iostream include for std::ios::pos_type. (14:14:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (11:39:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #655 from PDAL/issues/654-windows-plugin-search-path (10:15:15)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix default for dependent tests, also check for WITH_TESTS before adding plugin tests (10:10:51)
+	* Bradley J Chambers <brad.chambers at gmail.com> add bin dir for windows users and add default paths to KernelFactory (09:32:06)
+
+2014-12-11
+	* Howard Butler <howard at hobu.co> Merge pull request #649 from gadomski/optional-component-switch-on-plugins (11:07:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #650 from PDAL/make-crop-builtin-filter (09:30:09)
+	* Howard Butler <howard at hobu.co> Merge pull request #651 from PDAL/gtest-fix-msvc (09:29:58)
+	* Bradley J Chambers <brad.chambers at gmail.com> _VARIADIC_MAX must be increased on msvc for gtest (08:38:28)
+
+2014-12-04
+	* Bradley J Chambers <brad.chambers at gmail.com> Only Windows needs to have the object libraries included in apps/tests (11:40:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> DbReader for OCI. (11:09:52)
+
+2014-11-21
+	* Bradley J Chambers <brad.chambers at gmail.com> Move Crop filter (09:59:12)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Stats filter (21:11:12)
+	* Howard Butler <howard at hobu.co> hammer NUMTHREADS in travis build to 1 to see if first build stops getting killed (23:44:44)
+	* Howard Butler <howard at hobu.co> catch up drivers->io rename to master (23:27:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port MortonOrder filter (19:57:33)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Splitter filter (20:23:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #626 from PDAL/move-ferry-filter (23:10:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Ferry filter (19:33:45)
+	* Howard Butler <howard at hobu.co> Merge pull request #625 from PDAL/move-decimation-filter (19:53:10)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Decimation filter (16:08:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix tests for missing LIBGEOTIFF. (15:37:00)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #624 from PDAL/pgpointcloud-vagrant (15:26:47)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #623 from PDAL/linux-issues (15:26:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> pgpointcloud xmls in vagrant need updating (15:25:10)
+	* Bradley J Chambers <brad.chambers at gmail.com> we do not need to include the object libs in the app (13:53:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Replace stuff I shouldn't have removed. (13:27:27)
+	* Howard Butler <howard at hobu.co> A bunch of windows warnings and cleanups #622 (11:42:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (11:23:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #621 from PDAL/issues-617 (08:26:25)
+
+2014-12-09
+	* Howard Butler <howard at hobu.co> Merge pull request #644 from PDAL/convert-boost-test-to-google-test (21:25:25)
+	* Howard Butler <howard at hobu.co> gtest unsigned comparison cleanups (21:03:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (16:38:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Write scale into XMLSchema. (16:08:40)
+	* Bradley J Chambers <brad.chambers at gmail.com> optional plugin tests should also be dependent on WITH_TESTS (11:40:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> malformed test in GDALUtilsTest (10:27:01)
+	* Bradley J Chambers <brad.chambers at gmail.com> update tests to address warnings, most of which were signed/unsigned or int/float comparisons (09:56:06)
+	* Howard Butler <howard at hobu.co> Merge pull request #643 from PDAL/move-reprojection-filter (09:04:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #642 from gadomski/zvelocity-name-typo (09:04:33)
+
+2014-12-02
+	* Bradley J Chambers <brad.chambers at gmail.com> Convert unit tests from Boost Test to Google Test (14:08:32)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove remaining refernces to boost standard integer types (14:31:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> Remove dangling references to drivers, mostly in the plugins (11:11:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make DbReader.  Hook to pgpointcloud. (20:03:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove XMLSchema from Info.hpp. (11:27:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove PDAL_HAVE_LIBXML2 from XMLSchema files.  Use build system instead. (10:58:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Ignore float equality warning. (10:05:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove cruft, fPIC seems to be required for Kernel common object library (10:05:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> missed rename of Support to KernelSupport (09:39:30)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove extraneous clearing of PDAL_TARGET_OBJECTS (09:27:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove XML schema reader/writer. Remove exceptions from XML schema. Remove pointer wrappers. Remove storage of DimTypes (use XMLDims instead) (09:13:55)
+
+2014-12-05
+	* Howard Butler <howard at hobu.co> Merge pull request #639 from PDAL/move-merge-and-sort-filters (10:58:57)
+	* Bradley J Chambers <brad.chambers at gmail.com> Moving merge and sort filters (10:05:55)
+
+2014-12-03
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (20:14:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (20:12:20)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (17:48:19)
+	* Howard Butler <howard at hobu.co> cleanups related to #637 (17:48:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Writer support for scaled 32-bit ints in OCI. (17:08:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #638 from PDAL/remove-boost-cstdint (13:16:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> still need sudo for make install though (12:19:47)
+	* Bradley J Chambers <brad.chambers at gmail.com> sudo the ctest call to avoid segfault on travis (12:01:02)
+	* Howard Butler <howard at hobu.co> Merge pull request #637 from PDAL/plugin-renames (10:30:21)
+	* Howard Butler <howard at hobu.co> Merge pull request #636 from PDAL/move-kernels (08:42:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #635 from PDAL/move-colorization-filter (08:42:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #632 from gadomski/red-hat-build-fixes (08:39:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (07:23:47)
+
+2014-11-14
+	* Bradley J Chambers <brad.chambers at gmail.com> Port ALL kernels (15:04:45)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Attributes Filter (14:56:44)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Terrasolid Reader (14:25:41)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Text Writer (14:17:04)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port BPF driver (11:31:51)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port QFIT Reader (14:46:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port SBET Reader and Writer (13:22:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #593 from PDAL/cast (15:29:11)
+	* Pete Gadomski <pete.gadomski at gmail.com> Allow text writer precision to be configured (14:50:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add base64-encoding of header extra data. (13:57:52)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (13:47:34)
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #591 from PDAL/issues/583-pgpointcloud-ignore (10:33:57)
+	* Connor Manning <connor at hobu.co> Ignore generated Pgtest-Support file. (10:31:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Never build OCI on travis (09:44:57)
+	* Pete Gadomski <pete.gadomski at gmail.com> Simplify oci's CMakeLists.txt (09:21:54)
+	* Pete Gadomski <pete.gadomski at gmail.com> Default BUILD_WITH_OCI=OFF if no ORACLE_HOME (09:21:17)
+	* Pete Gadomski <pete.gadomski at gmail.com> Change case in FindOracle.cmake (09:15:43)
+	* Pete Gadomski <pete.gadomski at gmail.com> Install during travis's script (08:32:38)
+
+2014-11-20
+	* Bradley J Chambers <brad.chambers at gmail.com> Port Colorization filter (08:33:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> rename drivers as io (20:29:30)
+	* Bradley J Chambers <brad.chambers at gmail.com> rename drivers as io (20:29:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Warnings for bad return numbers and number of returns. (17:22:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Utils to namespace. (15:46:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Replace removed function. (12:11:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:37:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix Nitf test include. (11:35:39)
+	* Howard Butler <howard at hobu.co> adjust plugin tests to reflect Chipper move (11:35:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:24:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from Utils. (11:23:36)
+	* Howard Butler <howard at hobu.co> Merge pull request #618 from PDAL/move-chipper-filter (08:37:10)
+	* Howard Butler <howard at hobu.co> Merge pull request #619 from PDAL/convert-attribute-to-plugin (08:32:12)
+
+2014-11-26
+	* Pete Gadomski <pete.gadomski at gmail.com> Metadata.hpp needs a <memory> include (12:20:49)
+	* Pete Gadomski <pete.gadomski at gmail.com> Specify languages in cmake project (12:19:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing int32's to DbWriter.  Schema mods still needed. (11:08:32)
+
+2014-11-25
+	* Bradley J Chambers <brad.chambers at gmail.com> pclvisualizer is a writer, not a reader (19:45:41)
+	* Howard Butler <howard at hobu.co> Merge pull request #630 from PDAL/move-morton-filter (12:30:35)
+	* Howard Butler <howard at hobu.co> Merge pull request #620 from PDAL/drivers-to-io (12:30:24)
+
+2014-11-22
+	* Howard Butler <howard at hobu.co> try NUMTHREADS=2 (08:53:59)
+
+2014-11-24
+	* Paul Ramsey <pramsey at cleverelephant.ca> Fix cross-references (18:32:07)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Groups readers w/ readers, writers w/ writers (17:43:32)
+	* Bradley J Chambers <brad.chambers at gmail.com> if no point indices provided in view kernel, visualize all points (14:59:00)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #628 from PDAL/pcl-visualize-tweaks (14:48:35)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #629 from pramsey/doc_filter_rename (14:32:12)
+	* Bradley J Chambers <brad.chambers at gmail.com> add ability to visualize a range of points in view kernel (13:37:58)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Fix mistaken touch of kernel names (13:30:22)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Fix readers/readres typos (13:27:21)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Rename all drivers.*.reader to readers.* and rename all drivers.*.writer to writers.* (13:21:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> view kernel need not be built without PCL_VISUALIZATION_FOUND, it can also use the visualize method to invoke the visualizer (10:56:48)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove unused includes in Random.hpp (trips up Windows) (08:28:34)
+
+2014-11-23
+	* Howard Butler <howard at hobu.co> Merge pull request #627 from PDAL/move-splitter-filter (22:53:32)
+
+2014-11-18
+	* Bradley J Chambers <brad.chambers at gmail.com> capitalization matters (22:25:28)
+	* Howard Butler <howard at hobu.co> Implement stream-based PointBuffer constructor and byte fetching #604 (20:55:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #603 from PDAL/issues/581-system-identifier (18:49:04)
+	* Howard Butler <howard at hobu.co> Merge pull request #597 from PDAL/move-sbet-drivers (18:48:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #605 from PDAL/run-plugin-tests (18:48:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> try using ctest to run all tests on Travis again (14:07:49)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #602 from PDAL/fix-pc2pc-on-windows (13:03:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix test/unit/CMakeLists (13:01:28)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #601 from PDAL/no-initializer-lists (12:14:19)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix exename on windows, should be noop otherwise (12:09:47)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #600 from PDAL/open-binary-mode (11:53:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> cannot use initializer lists with the vector of strings on msvc2012 (11:38:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> need to make sure we open in binary mode (11:30:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't attempt to read extra header info if there is none. (11:19:07)
+	* Howard Butler <howard at hobu.co> Merge pull request #598 from PDAL/test-path-update (10:24:50)
+	* Bradley J Chambers <brad.chambers at gmail.com> slightly alter path to test executable in macro (09:42:01)
+
+2014-11-17
+	* Bradley J Chambers <brad.chambers at gmail.com> Port LAS drivers (16:04:52)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (18:47:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make tests pass if there's no GEOTIFF. (16:53:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add inspect() to BPF. (15:33:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:18:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> preview() infrastructure and las implementation. (14:17:51)
+	* Bradley J Chambers <brad.chambers at gmail.com> order matters, driver object libs need to be created before test (13:17:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove bad comment. (11:44:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:21:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #596 from PDAL/register-tre-handler (11:15:46)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (11:10:35)
+	* Howard Butler <howard at hobu.co> point to new location of Faux reader in OCITest (11:10:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> use PluginRegistry C API instead, as C++ symbols are not exported on windows (11:10:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:58:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Get spatial reference, rather than storing directly into metadata. (10:57:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> nitf plugin needs gitsha (10:41:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #595 from PDAL/option-empty (10:31:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> empty does not need to be guarded on windows (10:27:15)
+	* Howard Butler <howard at hobu.co> Merge pull request #592 from gadomski/text-writer-precision (09:57:11)
+	* Howard Butler <howard at hobu.co> Merge pull request #586 from PDAL/auto-load-update (09:53:36)
+	* Howard Butler <howard at hobu.co> Merge pull request #589 from gadomski/default-oracle-off (09:53:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #587 from PDAL/faux-rename-reorg (09:53:06)
+	* Howard Butler <howard at hobu.co> Merge pull request #588 from gadomski/ci-test-install (09:52:55)
+
+2014-11-12
+	* Bradley J Chambers <brad.chambers at gmail.com> this is a bit of a hack, but it clears up the issue of the static variable not being exported with the DLL on MSVC (13:35:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add non-const data() (19:26:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Two types of data. (17:11:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More cast fun. (16:31:43)
+	* Howard Butler <howard at hobu.co> pgpointcloud test cleanup (15:52:52)
+	* Howard Butler <howard at hobu.co> _TESTS of corresponding _PLUGIN cmake_dependent_option should default to ON (15:52:35)
+	* Howard Butler <howard at hobu.co> default my config to use the new BUILD_PLUGIN syntax (15:51:55)
+	* Howard Butler <howard at hobu.co> un-break master due to #562 compression stuff (15:22:35)
+	* Howard Butler <howard at hobu.co> Implement laz-perf compression #562 (15:14:20)
+	* Howard Butler <howard at hobu.co> Merge pull request #582 from gadomski/nitf-default-off (14:35:47)
+	* Pete Gadomski <pete.gadomski at gmail.com> Turn off NITF by default (14:13:00)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #514 from PDAL/issues/514-charbuf-export (12:07:41)
+	* Howard Butler <howard at hobu.co> Charbuf uses std::ios::pos_type, not Charbuf::pos_type #512 (11:26:00)
+
+2014-11-15
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (08:15:26)
+	* Howard Butler <howard at hobu.co> change the 'spatialreference' metadata item to be eHorizontalOnly and add a 'comp_spatialreference' metadata item for compount (vertical + horizontal) SRSs #571 (08:15:23)
+
+2014-11-13
+	* Bradley J Chambers <brad.chambers at gmail.com> Port FauxReader (09:18:31)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #584 from PDAL/cmake-2.8.12-on-travis (21:27:38)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #585 from PDAL/issues/583-pgpointcloud-include (21:25:33)
+	* Bradley J Chambers <brad.chambers at gmail.com> auto directory_iterator works on OSX not linux (21:24:15)
+	* Bradley J Chambers <brad.chambers at gmail.com> default to reasonable plugin locations if PDAL_DRIVER_PATH not set (15:10:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> include pgpointcloud bin directory (20:48:06)
+	* Bradley J Chambers <brad.chambers at gmail.com> install cmake 2.8.12 from PPA (20:45:09)
+
+2014-11-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (12:58:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'issues/554-port-all-plugins' (12:11:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Missed file. (12:04:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into issues/554-port-all-plugins (12:04:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add tests for LAS metadata/option handling. (10:41:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #579 from PDAL/issues/563-base64-metadata (08:13:09)
+
+2014-11-10
+	* Andrew Bell <andrew.bell.ia at gmail.com> Change PointRef to PtRef to work around MSVC problem. (21:53:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues/563-base64-metadata (16:18:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Provide type conversion for metadata. Provide automatic base 64 decoding for metadata. (15:43:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:36:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for stream redirection/restoration. (15:35:59)
+	* Howard Butler <howard at hobu.co> Merge pull request #578 from PDAL/issues/576-typename-outside-template (09:16:06)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove typename keyword in PointBufferIter.hpp (08:53:04)
+
+2014-11-06
+	* Pete Gadomski <pete.gadomski at gmail.com> Change case of SQLiteTest.cpp (10:15:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> link plugin libraries to plugin tests by default (16:02:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add dimension documentation. (13:38:37)
+
+2014-11-04
+	* Bradley J Chambers <brad.chambers at gmail.com> still need to include directories (21:19:57)
+	* Bradley J Chambers <brad.chambers at gmail.com> simplify the original pdal unit tests, using the new cmake macro, also regrouping sources to make it a little easier to read/find things (18:06:40)
+	* Bradley J Chambers <brad.chambers at gmail.com> names must match, this is too easy to mess up, need to make it foolproof (17:12:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> nitf::Writer is now nitf::NitfWriter (17:02:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> cannot pass unique_ptr to setInput (15:43:58)
+	* Howard Butler <howard at hobu.co> link PCL_LIBRARIES for PCL plugins after tweak in #573 (10:28:36)
+	* Howard Butler <howard at hobu.co> Merge pull request #573 from gadomski/plugin-marco-changes (07:18:51)
+	* Howard Butler <howard at hobu.co> Merge pull request #568 from PDAL/issues/568-desdata-offset-length (07:18:41)
+
+2014-11-02
+	* Bradley J Chambers <brad.chambers at gmail.com> typo in file extension (20:29:52)
+	* Howard Butler <howard at hobu.co> put DESDATA_LENGTH and DESDATA_OFFSET in metadata #568 (22:28:27)
+
+2014-11-01
+	* Bradley J Chambers <brad.chambers at gmail.com> set lib names within macro, quote variables so lists stay intact (21:58:05)
+
+2014-10-29
+	* Bradley J Chambers <brad.chambers at gmail.com> remove all the USE_PDAL_PLUGIN_FOO refs (21:55:27)
+	* Bradley J Chambers <brad.chambers at gmail.com> not expecting nitro to be present on travis, so pin BUILD_PLUGIN_NITRO=OFF (21:52:12)
+	* Bradley J Chambers <brad.chambers at gmail.com> update recently added NitfReader test (13:43:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> lint (13:21:46)
+	* Bradley J Chambers <brad.chambers at gmail.com> cleaning up (12:50:48)
+	* Bradley J Chambers <brad.chambers at gmail.com> drop find_package REQUIRED, let FOO_FOUND do all the work and only be a stickler about version if it becomes an issue (12:24:00)
+	* Bradley J Chambers <brad.chambers at gmail.com> renamed hexer as hexbin, should not necessarily name the plugins after their dependencies (12:00:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port HexBin driver to plugin framework, fix BUILD_PLUGIN_NITF (11:56:54)
+	* Bradley J Chambers <brad.chambers at gmail.com> reflect renamed options, update vagrant scripts (11:35:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> WITH_ changed to BUILD_PLUGIN_ for plugin options, add dependent options for whether or not to build certain tests (e.g., certain databases may not be available for testing) (11:23:51)
+
+2014-10-27
+	* Bradley J Chambers <brad.chambers at gmail.com> Port NITF driver to plugin framework, having trouble with PDALRegister symbols being exported (15:12:42)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port MrSID driver to plugin framework (10:59:20)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port pgpointcloud driver to plugin framework (21:05:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove icebridge from Drivers.hpp (21:07:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port p2g driver to plugin framework (14:29:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> handle status of missing dependencies uniformly in plugins (14:15:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port oci drivers to plugin framework (13:59:40)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port icebridge driver to plugin framework (13:07:00)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:57:45)
+	* Howard Butler <howard at hobu.co> ignore .pyc files (14:17:48)
+	* Howard Butler <howard at hobu.co> Merge pull request #561 from PDAL/issues/553-greyhound-plugin (13:01:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> initial greyhound plugin (11:45:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:45:37)
+	* Howard Butler <howard at hobu.co> Merge pull request #551 from PDAL/pcl-ground-doc (10:45:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #552 from PDAL/issues/551-pcl-visualization-check (10:45:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'las1.4' (10:45:03)
+	* Bradley J Chambers <brad.chambers at gmail.com> PCL_VISUALIZATION_FOUND will be TRUE if it is supported, only build the PCLVisualization driver if that is the case (10:35:14)
+	* Howard Butler <howard at hobu.co> Merge pull request #532 from PDAL/pcl-submodule (09:51:44)
+
+2014-10-28
+	* Bradley J Chambers <brad.chambers at gmail.com> move plugin tests to plugins folder, add macro for adding plugin tests (20:22:00)
+	* Bradley J Chambers <brad.chambers at gmail.com> only link PDAL in PDAL_ADD_DRIVER, link deps in the plugin CMakeLists file (12:01:48)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix some typos, add PDAL_LINKAGE within pdal_macros and the pcl CMakeLists (09:08:09)
+	* Bradley J Chambers <brad.chambers at gmail.com> Port sqlite driver to plugin framework (07:32:31)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (22:50:15)
+	* Howard Butler <howard at hobu.co> default my cmake config to Debug (22:50:12)
+	* Howard Butler <howard at hobu.co> put back hackish code to set global_encoding/reserved from base64 Metadata/Option (22:50:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:40:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add test for NITF spatial reference option override. (17:40:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Simplify test names. (17:37:58)
+	* Howard Butler <howard at hobu.co> Merge pull request #548 from PDAL/issues/548-oci-connection-filename (15:05:55)
+	* Howard Butler <howard at hobu.co> support reading oracle connection string from a filename in addition to simply using the string #548 (14:40:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:05:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add type registration tests. (11:05:19)
+	* Howard Butler <howard at hobu.co> drivers.oci.reader: override XYZ dimensions to <double> before reading them from XML schema (11:03:28)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:46:57)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix title/section delineation in ground tutorial (09:45:17)
+
+2014-11-03
+	* Howard Butler <howard at hobu.co> fix copy/paste bug in drivers.las.writer for CreationDOY/CreationYear (16:42:13)
+	* Pete Gadomski <pete.gadomski at gmail.com> Update PDAL_ADD_PLUGIN target_link_libraries (15:13:20)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add PDAL_ADD_TEST cmake macro (15:12:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #566 from PDAL/windows-fixes (14:50:11)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:pramsey/PDAL (12:52:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix setting header system ID. (10:41:02)
+	* Howard Butler <howard at hobu.co> add filters.attribute to stage list (08:56:45)
+
+2014-10-30
+	* Bradley J Chambers <brad.chambers at gmail.com> Fix Windows linker errors (LNK2005, LNK2019) (11:58:14)
+	* Howard Butler <howard at hobu.co> Merge pull request #564 from PDAL/forward (18:51:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (17:12:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Handle forwarded metadata regardless of case. (16:45:39)
+
+2014-10-31
+	* Andrew <andrew at abell-vb2.(none)> Use fewer threads for g++ to conserve memory. (14:28:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix initialization order. (13:03:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #565 from PDAL/iter (11:50:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix bad merge. (11:18:35)
+
+2014-10-22
+	* Bradley J Chambers <brad.chambers at gmail.com> Add a more detailed ground filtering tutorial (13:36:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> use unique_ptr with createKernel (21:33:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> do the macro thing (21:14:31)
+	* Bradley J Chambers <brad.chambers at gmail.com> update Sort from Application to Kernel (21:01:09)
+	* Bradley J Chambers <brad.chambers at gmail.com> Query is OBE (20:58:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> port over visualization fix from master (20:48:57)
+	* Howard Butler <howard at hobu.co> include tweak #532 (14:52:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> addressing abell's comments (14:07:19)
+	* Bradley J Chambers <brad.chambers at gmail.com> oops, still need the guard for now (20:28:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> will not even try to visualize if PDAL_HAVE_PCL_VISUALIZATION not present (15:09:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use read instead of get for strings to avoid problems with embedded newlines. (22:26:04)
+	* Howard Butler <howard at hobu.co> Support setting spatialite module name via options #539 (16:23:31)
+	* Howard Butler <howard at hobu.co> Merge pull request #533 from PDAL/issues/533-attribute-filter (15:26:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #537 from PDAL/add-morton-order-sort (15:25:47)
+	* Howard Butler <howard at hobu.co> LAS 1.4 Support. Refactoring of LAS/LAZ reader/writer #534 (15:19:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (14:53:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (14:50:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Working sort filter. (14:50:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #536 from PDAL/issues/535-write-fixed-point-count (14:29:14)
+	* Howard Butler <howard at hobu.co> rearrange some includes #533 (14:26:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> change m_limit to point_count_t and remove template types, which are inferred (13:41:03)
+	* Howard Butler <howard at hobu.co> handle GDAL <= 1.10 #533 (13:33:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (13:11:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More swap work. (12:55:39)
+	* Howard Butler <howard at hobu.co> #include <ogr_api.h> for OGRRegisterAll() in GDALUtils.hpp #533 (12:55:36)
+	* Howard Butler <howard at hobu.co> Implement filters.attribute -- setting of point dimension using Polygons and OGR #533 (12:13:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix some documentation typos (08:53:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add option to limit number of points written in Translate, using Decimation filter modification. Remove count from all other kernels (except Random, where it us used in the FauxReader). (08:35:35)
+
+2014-10-15
+	* Bradley J Chambers <brad.chambers at gmail.com> Isolate plugins and their dependencies, starting with PCL. Create Kernel class for kernel plugins. (11:12:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add empty for PointBuffer. (15:30:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead tests. (14:36:57)
+
+2014-10-26
+	* Howard Butler <howard at hobu.co> Merge pull request #538 from PDAL/remove-cannot-visualize-error (11:05:19)
+	* Howard Butler <howard at hobu.co> Merge pull request #539 from PDAL/issues/539-spatialite-module-name (11:04:59)
+
+2014-10-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #546 from gadomski/cmake-zlib (17:24:57)
+	* Pete Gadomski <pete.gadomski at gmail.com> Clean up zlib's cmake logic (17:08:44)
+
+2014-10-23
+	* Bradley J Chambers <brad.chambers at gmail.com> check if visualization requested in Sort and Random as well (14:13:09)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #545 from PDAL/issues/542-numeric-limits-const (13:17:04)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #544 from PDAL/issues/541-static-const-init (13:16:16)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #543 from PDAL/issues/540-demangler-windows-test (13:14:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> another reference to MAX_DATA_SIZE (12:21:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> move MAX_DATA_SIZE to anonymous namespace too (12:08:44)
+	* Bradley J Chambers <brad.chambers at gmail.com> move consts to anonymous namespace rather than static member vars (12:02:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> use cxxabi ifndef windows (12:00:24)
+
+2014-10-21
+	* Bradley J Chambers <brad.chambers at gmail.com> Add filter to sort points by Morton order, and kernel to expose this as an app (08:46:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More Travis fixes. (11:27:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (11:13:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Iterator test. (11:13:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fixes for builds without libgeotiff. Fix assertion bound. (10:51:17)
+
+2014-10-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 Fix NULL spatial reference for NITF clipping. Change PDAL_HAVE_SRS to PDAL_HAVE_LIBGEOTIFF (15:31:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> LAS auto-offset computation. Fix record signature for 1.0 LAS VLRs. (12:20:56)
+
+2014-10-19
+	* Howard Butler <howard at hobu.co> Implement IGEOLO support #531 (17:18:27)
+	* Howard Butler <howard at hobu.co> Merge pull request #529 from PDAL/yosemite-lint (09:54:46)
+
+2014-10-18
+	* Howard Butler <howard at hobu.co> Merge pull request #528 from PDAL/PointBuffer-constness (22:03:28)
+	* Howard Butler <howard at hobu.co> Work to regularize PDAL's dependencies and clarify what is really required vs. what is optional #523 (22:01:31)
+	* Howard Butler <howard at hobu.co> Merge pull request #524 from PDAL/issues/524-aimidb-afctb-nitf-output (16:15:36)
+
+2014-10-17
+	* Michael P. Gerlek <mpg at flaxen.com> added common header to all unit test files (10:59:28)
+	* Michael P. Gerlek <mpg at flaxen.com> added "-isystem /usr/local/include" (10:59:04)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'PointBuffer-constness' into yosemite-lint (09:44:27)
+
+2014-10-16
+	* Bradley J Chambers <brad.chambers at gmail.com> random kernel needs to set options on the faux reader now (20:19:53)
+	* Howard Butler <howard at hobu.co> Add support for NITF ACFTB and AIMIDB TREs (15:13:24)
+	* Michael P. Gerlek <mpg at flaxen.com> constify the PointBuffer::append() functions (15:03:04)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #526 from PDAL/greyhound (13:46:07)
+	* Connor Manning <connor at hobu.co> Update FindJsoncpp cmake file and Greyhound driver. (12:22:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix error in assertion. (12:00:42)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from LAS reader. (11:59:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (11:50:34)
+
+2014-10-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add auto-fields to xform structure. (13:56:36)
+
+2014-10-12
+	* Howard Butler <howard at hobu.co> Merge pull request #522 from chambbj/fix-ground-pcl-kernels (21:51:34)
+
+2014-10-10
+	* Bradley J Chambers <brad.chambers at gmail.com> fix makeReader in Ground and PCL kernels (19:59:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (14:25:58)
+	* Howard Butler <howard at hobu.co> doc tweak FAQ -- add note about PCL (14:16:49)
+	* Howard Butler <howard at hobu.co> tweak front page (14:11:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:05:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't build with stubs. (14:03:11)
+	* Howard Butler <howard at hobu.co> Merge pull request #521 from chambbj/set-options-for-view (13:35:07)
+	* Howard Butler <howard at hobu.co> Merge pull request #520 from chambbj/namespace-fix-for-pcl (13:31:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> options changes ripple down to PCLVisualizer and View (13:29:31)
+	* Bradley J Chambers <brad.chambers at gmail.com> PDALtoPCD now lives in the pclsupport namespace (13:13:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add default point sizes for 1.4 point types. Other small changes. (11:27:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Missed options fix. (10:25:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into las1.4 (10:19:04)
+	* Howard Butler <howard at hobu.co> Remove the passing of Options from the Stage constructor #482. Instead use Stage::setOptions() at a time of your choosing before Stage::prepare() is called to control when Options should be passed into a stage. (09:09:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (08:50:37)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (08:48:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #518 from PDAL/pbset-bounds (08:47:09)
+	* Howard Butler <howard at hobu.co> update hobu's cmake invocation (08:27:45)
+	* Michael P. Gerlek <mpg at flaxen.com> fixes and improvements to Bounds (08:01:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'las1.4' of https://github.com/PDAL/PDAL into las1.4 (07:49:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Move initialization of zipper/zip point inside ifdef. (07:47:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (07:47:31)
+
+2014-10-09
+	* Andrew <andrew at abell-vb2.(none)> Small build fixes. (21:08:26)
+	* Michael P. Gerlek <mpg at flaxen.com> added helper: calculateBounds(PointBufferSet) (14:29:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make LAZ really work. (14:04:53)
+	* Howard Butler <howard at hobu.co> Merge branch 'pcl-tests' #513 (10:15:14)
+
+2014-10-08
+	* Howard Butler <howard at hobu.co> Merge pull request #508 from chambbj/PCLVisualizer (16:32:00)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix memory issue (14:34:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> move the visualization code to the Application class (12:56:14)
+	* Bradley J Chambers <brad.chambers at gmail.com> visualize both input and output (11:48:06)
+	* Howard Butler <howard at hobu.co> put back docs for (09:40:30)
+	* Howard Butler <howard at hobu.co> point to filters.ferry in stages doc (09:28:47)
+	* Michael P. Gerlek <mpg at flaxen.com> PCL doc updates (09:04:34)
+	* Michael P. Gerlek <mpg at flaxen.com> namespace fix (08:34:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> getVisualize should return false if PCLVisualize not available (08:03:20)
+	* Bradley J Chambers <brad.chambers at gmail.com> add --visualize flag at the Application level that will cause Ground, PCL, Random, and Translate kernels to spawn a PCLVisualizer after writing the result to disk (07:48:54)
+
+2014-10-06
+	* Bradley J Chambers <brad.chambers at gmail.com> fix the PCL stubs for PCLVisualizer (09:40:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for BPF version 1 and 2. (19:46:02)
+	* Michael P. Gerlek <mpg at flaxen.com> remove debugging (15:14:04)
+	* Michael P. Gerlek <mpg at flaxen.com> tighten up the namespaces (14:53:09)
+	* Michael P. Gerlek <mpg at flaxen.com> import PCL pipeline files from the PCL repo (14:52:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (13:33:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't allow waveform point formats. (13:33:21)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'clang-warnings' into pcl-tests (10:12:01)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'pdal-info-summary' into pcl-tests (10:10:48)
+	* Michael P. Gerlek <mpg at flaxen.com> added --summary, for a less verbose output (09:52:10)
+	* Michael P. Gerlek <mpg at flaxen.com> added ptree-to-reST dump support (09:50:18)
+
+2014-10-03
+	* Bradley J Chambers <brad.chambers at gmail.com> add PCLVisualizer writer and View kernel (14:58:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make ZIP stuff work again. (18:10:34)
+	* Howard Butler <howard at hobu.co> convertAndSet doesn't work on int8_t/uint8_t (14:43:51)
+	* Howard Butler <howard at hobu.co> put back PointSourceId setting option for drivers.oci.reader (13:53:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Bug fixes and warning cleanup. (12:57:43)
+	* Michael P. Gerlek <mpg at flaxen.com> fix various clang warnings (09:44:42)
+	* Michael P. Gerlek <mpg at flaxen.com> correct/clarify test runner doc (09:44:14)
+
+2014-10-07
+	* Howard Butler <howard at hobu.co> Merge pull request #506 from gadomski/pipeline-commandline-options (14:25:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #507 from PDAL/clang-warnings (14:25:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #509 from PDAL/pdal-info-summary (14:23:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (14:18:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Support point formats 6-10. (14:17:41)
+	* Michael P. Gerlek <mpg at flaxen.com> all the PCL filter unit tests now working (13:58:19)
+	* Michael P. Gerlek <mpg at flaxen.com> added debugging support (13:55:35)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:55:08)
+	* Michael P. Gerlek <mpg at flaxen.com> PCL test cleanup (11:22:23)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaned up PCL docs (11:21:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use a different EPSG reference for UTM north zones. (08:22:17)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups on PCL tutorial (07:42:43)
+
+2014-10-02
+	* Andrew Bell <andrew.bell.ia at gmail.com> More compilation fixes. (20:23:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Try to make the compiler happy. (19:16:07)
+	* Howard Butler <howard at hobu.co> sanitize [ and ] in metadata names (16:43:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Eliminate compiler warnings. (12:52:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (12:42:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Reading and writing LAS seems to work. (11:27:53)
+
+2014-10-01
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove spurious options dump (16:20:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Allow extra command line options for pdal pipeline (16:06:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Delay filename requirement until processOptions (16:01:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #505 from gadomski/remove-jenkins (15:41:02)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (15:37:57)
+	* Howard Butler <howard at hobu.co> fix BOX3D::clear() to properly clear bounds and add a test to validate it (15:37:14)
+	* Howard Butler <howard at hobu.co> Merge pull request #502 from gadomski/mention-tif-in-p2g-docs (13:05:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #503 from PDAL/issues/503-laszip-flush (13:05:14)
+	* Howard Butler <howard at hobu.co> add LAZ-writing NITF example (12:06:51)
+	* Howard Butler <howard at hobu.co> add ::flush() method to LAS writer so that LASzip stuff gets written in NITF writer #503 (12:06:04)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add "tif" to p2g docs (09:58:53)
+
+2014-09-30
+	* Connor Manning <connormanning at users.noreply.github.com> Merge pull request #501 from PDAL/genericRaster (11:03:31)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into genericRaster (09:37:24)
+	* Connor Manning <connor at hobu.co> Add a splatted query with custom bounds/resolution. (09:36:41)
+
+2014-09-29
+	* Howard Butler <howard at hobu.co> Merge pull request #500 from PDAL/issues/500-horiz-vert-srs-fetch (16:27:17)
+	* Howard Butler <howard at hobu.co> Add SpatialReference::getVertical and SpatialReference::getHorizontal methods #500 (15:03:14)
+
+2014-09-26
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove leftover Jenkins files (22:41:11)
+	* Howard Butler <howard at hobu.co> Merge pull request #498 from PDAL/issues/496-bring-back-buffer-reader (13:37:21)
+	* Howard Butler <howard at hobu.co> put PDAL_HAVE_GDAL guard around setSpatialReference call in BPF reader (13:16:26)
+	* Howard Butler <howard at hobu.co> fix up BPF SRS support (13:05:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix signature of addBuffer (from add_buffer) (12:39:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Simplify BufferReader.  Add test. (11:22:14)
+	* Howard Butler <howard at hobu.co> put back drivers.buffer.reader #496 (09:44:50)
+
+2014-09-25
+	* Howard Butler <howard at hobu.co> Merge pull request #496 from PDAL/issues/496-naked-write (16:51:21)
+	* Howard Butler <howard at hobu.co> remove unused variable in filters.chipper (16:45:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #435 from PDAL/issues/435-ferry-filter (15:56:50)
+	* Howard Butler <howard at hobu.co> Support naked PointBufferPtr writing #496, and update tutorial to reflect capability (15:54:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #495 from chambbj/MetadataNodeImpl (15:11:30)
+	* Howard Butler <howard at hobu.co> Merge pull request #494 from PDAL/reprojection-driver-updates (14:24:39)
+	* Howard Butler <howard at hobu.co> a little bit more clean up of dead code #435 (14:24:19)
+	* Bradley J Chambers <brad.chambers at gmail.com> clean up unresolved externals in MetadataNodeImpl on MSVC (14:08:21)
+	* Howard Butler <howard at hobu.co> reprojection doc updates #494 (14:06:28)
+	* Howard Butler <howard at hobu.co> Some doc updates for filters.reprojection and others (14:01:04)
+	* Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into issues/435-ferry-filter (13:42:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #493 from chambbj/issues/490-win-constant-expression (13:42:24)
+	* Howard Butler <howard at hobu.co> Merge pull request #486 from PDAL/json (13:42:17)
+	* Howard Butler <howard at hobu.co> turn off ferry reprojection test when there's no GDAL #435 (13:39:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> addressing multiple windows issues (12:55:46)
+	* Howard Butler <howard at hobu.co> Finish implementation of ferry filter, with docs #435 (12:35:43)
+	* Connor Manning <connor at hobu.co> Fix botched conflict fix. (11:57:07)
+	* Connor Manning <connor at hobu.co> Fix conflict with master. (10:46:32)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/435-ferry-filter (10:20:01)
+	* Howard Butler <howard at hobu.co> Merge pull request #484 from PDAL/issues/484-refactor-bounds (10:17:19)
+	* Howard Butler <howard at hobu.co> basic test of #435 failure scenario (10:10:46)
+	* Howard Butler <howard at hobu.co> Merge pull request #485 from PDAL/ghUpdate (10:08:57)
+	* Howard Butler <howard at hobu.co> Merge pull request #492 from chambbj/issues/489-windows-round (10:07:08)
+	* Bradley J Chambers <brad.chambers at gmail.com> use Utils::sround rather than std::round to fix #489 (08:59:37)
+
+2014-09-23
+	* Connor Manning <connor at hobu.co> Don't add empty fields to JSON output.  Make escapeJSON() not modify the input string. (17:22:27)
+	* Connor Manning <connor at hobu.co> Don't add empty fields to JSON output.  Make escapeJSON() not modify the input string. (17:22:27)
+	* Connor Manning <connor at hobu.co> Remove reader iterator from Greyhound driver. (14:32:02)
+
+2014-09-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (20:03:59)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't use C++ that breaks VS. Add test for sanitize. (20:03:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #488 from PDAL/empty-chipper-buffer (19:53:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't run the chipper if we have no points. Test for this case. (19:08:45)
+	* Howard Butler <howard at hobu.co> make tests pass (17:24:57)
+	* Howard Butler <howard at hobu.co> ferry filter scaffolding #435 (16:55:27)
+	* Howard Butler <howard at hobu.co> final removal of Range and Vector to complete refactor of Bounds->BOX3D #484 (15:36:26)
+	* Howard Butler <howard at hobu.co> switch off Bounds (15:20:20)
+	* Howard Butler <howard at hobu.co> refactor calculateBounds #484 (14:46:05)
+	* Howard Butler <howard at hobu.co> start excising Bounds in favor of a BOX3D (11:16:08)
+
+2014-09-22
+	* Connor Manning <connor at hobu.co> Merge branch 'master' into indexing (13:51:18)
+	* Connor Manning <connor at hobu.co> Tweak rastering index. (13:49:57)
+	* Howard Butler <howard at hobu.co> Merge pull request #479 from chambbj/issues/478-bus-error (12:04:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> add fvisibility-inlines-hidden when compiling with PCL support (11:47:32)
+
+2014-09-19
+	* Howard Butler <howard at hobu.co> Merge pull request #477 from PDAL/nitro-reader3 (15:15:17)
+	* Howard Butler <howard at hobu.co> NITF test now depends on WITH_NITRO, not WITH_GDAL #477 (14:28:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #475 from PDAL/issues/475-sanitize-metadata-names (13:53:35)
+	* Connor Manning <connor at hobu.co> Merge branch 'master' of https://github.com/PDAL/PDAL into indexing (13:52:02)
+	* Howard Butler <howard at hobu.co> Sanitize pdal::Metadata key names to remove some special characters #475 (13:27:19)
+	* Howard Butler <howard at hobu.co> add bpf2nitf example pipeline (11:53:52)
+	* Michael P. Gerlek <mpg at flaxen.com> missed a GDAL->NITRO ifdef (11:11:07)
+	* Michael P. Gerlek <mpg at flaxen.com> replace GDAL-based NITF reader with a Nitro-based one (10:55:18)
+	* Michael P. Gerlek <mpg at flaxen.com> replace GDAL-based NITF reader with a Nitro-based one (10:54:29)
+
+2014-09-18
+	* Howard Butler <howard at hobu.co> Merge pull request #472 from pramsey/pgdoc (16:57:39)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Add undoc'ed options for pgpointcloud writer (16:21:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #469 from chambbj/doc-updates (15:24:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #471 from pramsey/boost56 (15:24:32)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Allow build on Boost 1.56 (15:07:36)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (13:00:10)
+	* Howard Butler <howard at hobu.co> add additional classifcation field option to drivers.nitf.writer (12:14:51)
+	* Howard Butler <howard at hobu.co> update example to point-context-schema (no filters.scaling anymore) (12:14:35)
+	* Howard Butler <howard at hobu.co> clean up oci warning nit (10:58:47)
+
+2014-09-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (13:27:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add LAS header test. Fix scale bug in LAS header copy ctor. (13:27:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> update a number of documents (PCL, deprecated filters, etc.) (13:17:23)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #468 from gadomski/travis-notify-slack (12:40:49)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add secure slack notifications to travis (10:19:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #467 from gadomski/travis-stubs-only (10:36:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add stubs_only mode to Travis (10:07:56)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove rxp driver (09:57:11)
+	* Howard Butler <howard at hobu.co> Merge pull request #466 from gadomski/run-tests-without-path (09:52:05)
+	* Pete Gadomski <pete.gadomski at gmail.com> Default tests' data path to repo's data (09:39:15)
+	* Howard Butler <howard at hobu.co> Merge pull request #465 from gadomski/test-without-stubs (09:18:17)
+	* Pete Gadomski <pete.gadomski at gmail.com> Always test WITH_STUBS=OFF (09:12:02)
+	* Pete Gadomski <pete.gadomski at gmail.com> Factor out rxp moving average to a free function (09:05:06)
+	* Howard Butler <howard at hobu.co> Merge pull request #464 from gadomski/ground-depends-on-pcl (08:32:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Include ground kernel app only if we have PCL (07:54:05)
+
+2014-09-16
+	* Bradley J Chambers <brad.chambers at gmail.com> add PCL version to full version string (if present) (21:39:35)
+	* Howard Butler <howard at hobu.co> Merge pull request #463 from chambbj/ground-kernel (15:32:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix PCL stub for setJSON in pipeline (14:56:38)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix another rxp docs typo (11:14:25)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix typo in rxp docs (10:19:29)
+
+2014-03-27
+	* Bradley J Chambers <brad.chambers at gmail.com> add a new kernel to directly invoke ground filtering algorithms from the command line (currently only PMF, which requires PCL) (17:00:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> apply astyle to recent PCLBlock and Splitter updates (17:44:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #267 from PDAL/no-stage-in-iter (17:27:05)
+	* Bradley J Chambers <brad.chambers at gmail.com> in PCLBlock, setJSON still exists, but is now used to pass the GeoJSON object as a string; setFilename is used to pass the filename (17:23:19)
+	* Bradley J Chambers <brad.chambers at gmail.com> vagrant will now checkout PCL "pipeline" branch (17:20:52)
+	* Andrew Bell <andrew.bellia at gmail.com> Remove dependence on stage for some iterators. Remove access to stage in iterator. (14:53:41)
+	* Andrew Bell <andrew.bellia at gmail.com> Add NullPointBuffer. Modify PointBuffer to behave correctly when used as a NullPointBuffer. (14:03:30)
+	* Andrew Bell <acbell at blaze.hobu.biz> Don't use stage in iterator. (08:44:53)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #265 from PDAL/issues/261-guard-linking-libxml2 (09:35:03)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #261, only link libxml2 if WITH_LIBXML2 is TRUE (09:34:02)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #263 from PDAL/i262 (09:20:18)
+	* Andrew Bell <acbell at blaze.hobu.biz> Fix typo. (08:41:58)
+	* Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'origin/use-options-command' (05:14:11)
+	* Howard Butler <hobu.inc at gmail.com> use make generator by default (05:13:56)
+	* Howard Butler <hobu.inc at gmail.com> small cleanups to filters.tiler (05:13:45)
+
+2014-09-15
+	* Howard Butler <howard at hobu.co> Merge pull request #462 from PDAL/ctxchunk (19:27:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (19:00:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Test to exercise large point buffers. Test random access to filled point buffer. (18:57:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #461 from chambbj/issues/445-scale-offset (16:25:05)
+	* Howard Butler <howard at hobu.co> Merge pull request #458 from gadomski/guard-pcl-include (14:43:08)
+	* Howard Butler <howard at hobu.co> Merge pull request #459 from gadomski/remove-unused-variable (14:24:04)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove m_useREST from kernel/Info (14:22:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Catch bad_numeric_cast, rethrow better (13:32:03)
+	* Pete Gadomski <pete.gadomski at gmail.com> Guard a PCLConversions include (13:25:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #457 from chambbj/pcl-kernel-bug (13:14:27)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix small bug with pcl kernel, move pcl stage out of makeReader (13:08:53)
+	* Howard Butler <howard at hobu.co> Merge pull request #456 from gadomski/rxp-driver (10:44:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #454 from chambbj/voxel-grid-ctx (10:44:33)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove a duplicate include from PointBuffer.hpp (08:27:40)
+
+2014-09-12
+	* Bradley J Chambers <brad.chambers at gmail.com> scale/offset now in Application.cpp (14:06:07)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into ptctxref (23:07:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> PointContext -> PointContextRef (23:07:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> BPF spatial reference in metadata. (14:35:28)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove leftover embedded boost cruft (13:49:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #447 from gadomski/programmable-add-dimension (09:32:17)
+	* Howard Butler <howard at hobu.co> Merge pull request #450 from chambbj/random-ctx (09:32:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #452 from PDAL/bpfmeta (09:31:44)
+
+2014-09-09
+	* Bradley J Chambers <brad.chambers at gmail.com> add PCL VoxelGrid as a decimation option (not the default) (20:23:28)
+	* Connor Manning <connor at hobu.co> Update Greyhound driver. (21:31:15)
+	* Pete Gadomski <pete.gadomski at gmail.com> Programmable filter can add dimensions to context (16:09:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove StageIterator. Remove iterator use from reader. (16:13:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into noiter (15:53:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from terrasolid driver. (15:48:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from SQLite driver. (12:28:20)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #446 from PDAL/scaleinit (11:26:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't set default values for scale/offset - already set in xform object ctor. (11:08:33)
+
+2014-08-14
+	* Pete Gadomski <pete.gadomski at gmail.com> Add the rxp reader (14:19:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix icebridge offset time & test. Use getFieldAs for icebridge tests. (13:01:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Differently modified colorization filter, as discussed. (12:32:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove un-useful schema test. (12:23:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (11:46:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix XMLSchema write test. (11:46:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #408 from cuitingting01/patch-1 (10:19:06)
+	* Howard Butler <hobu.inc at gmail.com> get reprojection crop filter test passing again (10:16:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix sbet, stats, pointbuffer tests for new dimension scheme. (10:00:27)
+	* Connor Manning <connor at hobu.co> Fix output from Schema::toPTree() to be valid JSON without duplicate keys. (09:37:31)
+	* cuitingting01 <cuitingting01 at baidu.com> Fix Fetchpcid bug (00:03:14)
+
+2014-09-13
+	* Howard Butler <howard at hobu.co> Merge pull request #453 from gadomski/remove-embedded-boost-cruft (10:50:43)
+	* Howard Butler <howard at hobu.co> Merge pull request #455 from PDAL/ptctxref (10:50:33)
+
+2014-09-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Stick embedded BPF ULEM files into metadata. (21:38:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #451 from PDAL/bpfmeta (17:47:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix dumping of dimensions from point context. (17:44:41)
+	* Connor Manning <connor at hobu.co> Add partial and not fully tested support for raster indexing from the QuadIndex. (15:23:58)
+	* Connor Manning <connor at hobu.co> Update method used to get dimensions. (13:22:05)
+	* Howard Butler <howard at hobu.co> output std::endl for each pt in --detail of 'pdal delta' (12:43:16)
+	* Howard Butler <howard at hobu.co> Merge pull request #449 from gadomski/extract-chunk-size (10:50:14)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove chunk size (10:24:36)
+
+2014-03-31
+	* Bradley J Chambers <brad.chambers at gmail.com> add random kernel (09:15:45)
+
+2014-09-10
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix RST. (15:44:43)
+	* Howard Butler <howard at hobu.co> Reorganize test data #441 (15:08:12)
+	* Connor Manning <connor at hobu.co> Add tree depth query to QuadIndex. (12:29:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:18:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update overview for readers. Add missing image. (12:18:12)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #448 from PDAL/noiter (11:43:06)
+
+2014-09-08
+	* Howard Butler <howard at hobu.co> Merge pull request #444 from PDAL/issues/442-las-scaling (20:49:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #443 from PDAL/issues/307-badinfo (20:49:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set scale to .01 for las writer. (19:34:28)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add ptree nodes for all selected points. (19:22:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into noiter Remove iterator from PCD driver. (15:59:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from sbet driver. Fix sbet/qfit test. (15:30:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> group pcd driver files for msvc (14:07:21)
+	* Howard Butler <howard at hobu.co> Merge pull request #440 from chambbj/issues/428-stubs-on-rebased (13:53:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from qfit driver. (13:20:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from pgpointcloud driver. (12:14:26)
+	* Howard Butler <howard at hobu.co> remove lint (11:58:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from oci driver. (11:14:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #439 from chambbj/stubs-resolution (10:08:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> stubs default off in cmake, on in travis (10:04:45)
+	* Howard Butler <howard at hobu.co> Merge pull request #438 from chambbj/pcl-docs (10:00:32)
+	* Bradley J Chambers <brad.chambers at gmail.com> add PCL to the PDAL dependencies documentation, create documentation for the PCD drivers (09:24:46)
+	* Howard Butler <howard at hobu.co> Merge pull request #437 from chambbj/remove-pcview (09:41:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove pcview from apps (09:34:10)
+	* Bradley J Chambers <brad.chambers at gmail.com> back down the boost version requirement to 1.54 (09:25:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #436 from PDAL/issues/436-pcequal-pcpipeline-gone (08:43:19)
+	* Howard Butler <howard at hobu.co> remove no longer valid pcequal/pcpipeline (now in 'pdal' utility) #436 (08:23:28)
+
+2014-09-04
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix stubs for new PCD driver. (15:56:39)
+	* Howard Butler <howard at hobu.co> doc work by Andrew (20:44:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #430 from PDAL/issues/430-txt-to-rst-rename (11:20:37)
+	* Howard Butler <howard at hobu.co> rename .txt to .rst #430 (11:06:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #429 from gadomski/duplicate-before-install-line (10:17:41)
+	* Howard Butler <howard at hobu.co> Merge pull request #427 from PDAL/issues/427-no-boost-embed (10:17:30)
+	* Howard Butler <howard at hobu.co> more EMBED excision #427 (09:48:54)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate line from Travis before_install (09:39:48)
+	* Howard Butler <howard at hobu.co> switch off EMBED boost usage in Travis #427 (09:25:46)
+	* Howard Butler <howard at hobu.co> remove embedded boost #427 (09:22:40)
+
+2014-09-07
+	* Howard Butler <howard at hobu.co> fix up doc link (16:56:56)
+	* Howard Butler <howard at hobu.co> fix compression enum mixup in pgpointcloud writer (15:27:04)
+	* Howard Butler <howard at hobu.co> fix insertion bug (num_points was defined as int64_t vs. the supported int32_t (14:30:26)
+
+2014-09-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. Fix type of zip objects when we're not zipping. (21:30:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from las/nitf. (17:36:50)
+	* Howard Butler <howard at hobu.co> Merge pull request #432 from gadomski/nuke-swig (11:28:57)
+	* Howard Butler <howard at hobu.co> Merge pull request #434 from gadomski/require-boost (11:28:50)
+	* Pete Gadomski <pete.gadomski at gmail.com> Require boost when finding package (11:17:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix new IStream ctor(). Fix decimation and stats tests for new faux reader interface. (11:07:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove all c# and python swig (07:07:58)
+
+2014-09-03
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from icebridge. (16:39:17)
+	* Howard Butler <howard at hobu.co> Vagrant: need libglew-dev for OpenGL for PCL now (16:34:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #424 from gadomski/fix-faux-reader-bug (15:58:51)
+	* Howard Butler <howard at hobu.co> Merge pull request #423 from chambbj/pcd-driver (15:58:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #422 from PDAL/issues/422-toJSON-toPTree (15:58:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from faux reader. (15:35:19)
+	* Pete Gadomski <pete.gadomski at gmail.com> Actually use numberOfReturns (15:17:17)
+	* Howard Butler <howard at hobu.co> add missing include (14:45:41)
+	* Howard Butler <howard at hobu.co> clean up typo #422 (14:19:50)
+	* Howard Butler <howard at hobu.co> move most toPTree() methods of PDAL objects out to static functions in PDALUtils.hpp #422 (13:10:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> First workings of reading without an iterator. BPF works. CARIS should work :) (11:43:08)
+
+2014-04-04
+	* Bradley J Chambers <brad.chambers at gmail.com> first cut at a dedicated pcd reader/writer (21:33:40)
+	* Andrew Bell <andrew.bellia at gmail.com> Change return type of getField from reference to value. (17:54:02)
+	* Howard Butler <howard at hobu.co> Merge pull request #281 from gadomski/pdal-info-s-flag (16:16:42)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove -s flag for --schema option in `pdal info` (13:58:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #280 from abellgithub/format (13:58:19)
+	* Andrew Bell <andrew.bellia at gmail.com> Make things in the las Writer fit in 80 columns. Remove a few superfluous "return" statements. A couple of other small fixes to simplify code - no functional change. (13:17:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #279 from PDAL/fixup (10:31:03)
+	* Andrew Bell <andrew.bellia at gmail.com> Fix point count in las iterators. (09:24:51)
+	* Howard Butler <howard at hobu.co> Merge pull request #274 from gadomski/pipeline-mosaic-without-python (08:36:21)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #276 from PDAL/issues/272-rel-filenames (08:18:29)
+
+2014-08-29
+	* Howard Butler <howard at hobu.co> Merge branch 'point-context-schema' (12:11:07)
+	* Connor Manning <connor at hobu.co> Constify a parameter reference. (10:47:40)
+
+2014-08-28
+	* Bradley J Chambers <brad.chambers at gmail.com> toJSON and toPTree are unresolved otherwise (20:04:34)
+	* Bradley J Chambers <brad.chambers at gmail.com> using WIN32_LEAN_AND_MEAN to avoid redefinition of symbols in winsock.h (20:03:05)
+	* Howard Butler <howard at hobu.co> more JSON output for pdal info (13:25:53)
+	* Howard Butler <howard at hobu.co> quote object name in toJSON() method (13:25:31)
+	* Howard Butler <hobu.inc at gmail.com> remove dead Dimension.cpp file (10:25:51)
+	* Howard Butler <hobu.inc at gmail.com> implement JSON escaping for Metadata::toJSON() (10:03:14)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (09:19:40)
+	* Howard Butler <hobu.inc at gmail.com> a little bit of doc work (09:19:36)
+	* Bradley J Chambers <brad.chambers at gmail.com> also changing case in the logtest text files (08:26:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> changing case of the remainder of the LogLevels (08:06:26)
+
+2014-08-27
+	* Bradley J Chambers <brad.chambers at gmail.com> LogLevels are no longer all caps - ERROR and INFO were colliding with Windows defines (13:04:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Provide a ctor for BandInfo. (12:02:27)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (11:47:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Disallow direct access of PointContext from PointBuffer. (11:46:54)
+	* Howard Butler <howard at hobu.co> Merge pull request #418 from PDAL/issues/417-emplace-back (11:33:52)
+	* Bradley J Chambers <brad.chambers at gmail.com> use emplace_back and dump the initializer list (11:29:57)
+	* Howard Butler <howard at hobu.co> Merge pull request #415 from chambbj/issues/414-pdal-macros (10:49:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> move pdal_macros include to pdal_internal (10:48:27)
+
+2014-08-26
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (16:19:25)
+	* Howard Butler <hobu.inc at gmail.com> support setting options via command line for 'pdal translate' (16:19:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use Metadata::addList for arrays. Make sure stage metadata parent has a name. (14:51:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:19:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Metadata lists. (14:17:29)
+	* Howard Butler <hobu.inc at gmail.com> whoops, missed a file (13:33:17)
+	* Howard Butler <hobu.inc at gmail.com> get rid of getPrevStages in favor of getInputs (13:15:54)
+	* Howard Butler <hobu.inc at gmail.com> remove Stage::getPrevStage (11:43:35)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (10:01:24)
+	* Howard Butler <howard at hobu.co> Merge pull request #413 from gadomski/las-skip-high-return-numbers (10:00:52)
+
+2014-08-25
+	* Pete Gadomski <pete.gadomski at gmail.com> Skip, don't fail, when writing high return num las (18:03:36)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add number_of_returns option to FauxReader (17:31:45)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (15:02:59)
+	* Connor Manning <connor at hobu.co> Fix KD index typo. (14:51:24)
+	* Howard Butler <hobu.inc at gmail.com> turn off debug (14:45:57)
+	* Howard Butler <hobu.inc at gmail.com> auto'up the Iterator typedefs (11:51:09)
+	* Howard Butler <hobu.inc at gmail.com> throw an exception if pipeline does not have a writer and it is called with 'pdal pipeline' (11:24:14)
+	* Howard Butler <hobu.inc at gmail.com> move splitter/chipper into filters (11:08:22)
+	* Howard Butler <hobu.inc at gmail.com> chipper example rearranges data and simply writes out las file (11:07:53)
+	* Howard Butler <hobu.inc at gmail.com> remove dead cache filter (09:45:53)
+
+2014-08-24
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (21:09:33)
+	* Howard Butler <hobu.inc at gmail.com> drivers.oci.{reader|writer} fixups (21:09:27)
+	* Connor Manning <connor at hobu.co> Expose Dimension type (baseType and size) and fix a warning. (18:55:35)
+
+2014-08-22
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (11:55:50)
+	* Howard Butler <hobu.inc at gmail.com> cleanup of oci test a little bit (still fails when manually run though) (11:55:48)
+	* Howard Butler <hobu.inc at gmail.com> write orientation into XML (11:54:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Use toJSON in Info. Fix NULL top-level node in Metadata JSON output. (11:42:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from PipelineWriter. Clean up PipelineWriter. (10:45:08)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove test output. (10:17:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:14:21)
+	* Howard Butler <hobu.inc at gmail.com> support applyin scaling info to XYZ for dimension-major data (10:10:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:04:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add Metadata::toJSON. (10:04:18)
+	* Howard Butler <hobu.inc at gmail.com> update manual oracle test pipelines (08:27:07)
+
+2014-08-21
+	* Connor Manning <connor at hobu.co> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:04:36)
+	* Connor Manning <connor at hobu.co> Advertise Dimension info via JSON. (14:04:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (13:52:06)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (13:44:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Get rid of very old TODOs and such. (13:44:10)
+	* Howard Butler <hobu.inc at gmail.com> Classification is Unsigned8, not 16 (12:55:08)
+	* Howard Butler <hobu.inc at gmail.com> useREST still exists, just not switched back on yet (12:54:52)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (12:53:21)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' into point-context-schema (10:59:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:56:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (10:55:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context-schema (09:20:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix various todos. (09:03:05)
+	* Howard Butler <hobu.inc at gmail.com> Classification should be a Unsigned16, not 8 (08:49:11)
+	* Howard Butler <howard at hobu.co> Merge pull request #411 from gadomski/backport-travis-fix (08:30:38)
+	* Howard Butler <hobu.inc at gmail.com> Intensity should be an Unsigned16, not an Unsigned8 (08:20:11)
+	* Howard Butler <hobu.inc at gmail.com> getField now getFieldAs in sqlite driver test (08:14:28)
+
+2014-08-20
+	* Howard Butler <howard at hobu.co> Merge pull request #410 from gadomski/linux-rpath (16:21:35)
+	* Pete Gadomski <pete.gadomski at gmail.com> Backport some Travis fixes from point-context (15:04:46)
+	* Pete Gadomski <pete.gadomski at gmail.com> Revert RPATH to cmake's recommended setup (14:46:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove more FIXMEs. (13:29:44)
+	* Howard Butler <hobu.inc at gmail.com> only create index in drivers.oci.writer when we've created a block table (13:27:09)
+	* Howard Butler <hobu.inc at gmail.com> put back old Schema::toPTree() method (13:01:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix some FIXMEs. (12:21:18)
+	* Howard Butler <hobu.inc at gmail.com> fix up --sdo_pc metadata for 'pdal info' (12:11:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:57:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow user-defined scaling for LAS output. (10:56:28)
+
+2014-08-19
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (16:09:55)
+	* Howard Butler <hobu.inc at gmail.com> more work on 'pdal info' stats, metadata, and json output (16:09:52)
+	* Howard Butler <hobu.inc at gmail.com> add local spatial ref (16:09:29)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (16:09:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> No bounds unless calculated. (15:48:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (15:14:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove getField<> in favor of getFieldAs<> (15:13:55)
+	* Andrew <andrew at abell-vb2.(none)> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:08:19)
+	* Andrew <andrew at abell-vb2.(none)> Fix spatial reference for pgpointcloud. (14:06:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix pgpointcloud spatial ref. (14:01:36)
+	* Howard Butler <hobu.inc at gmail.com> Merge point-context down to point-context-schema (11:03:36)
+	* Howard Butler <hobu.inc at gmail.com> only commit in done(), not ~ (10:37:06)
+	* Howard Butler <hobu.inc at gmail.com> put back pipeline-serialization (10:24:59)
+
+2014-08-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (16:44:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix non-static initialization. Clean-up. (16:43:07)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix lambda in PCLConversions.hpp (11:59:43)
+	* Bradley J Chambers <brad.chambers at gmail.com> protect against rounding errors in PCL/PDAL conversions by computing and using bounds to offset data (10:57:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:18:59)
+	* Howard Butler <hobu.inc at gmail.com> remove dead Writer.cpp file in sqlite driver (09:20:49)
+	* Connor Manning <connor at hobu.co> Check for quadtree validity before querying. (09:03:38)
+	* Connor Manning <connor at hobu.co> Add bbox query to quad tree index. (08:54:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (07:47:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. Make Selector, InPlaceReprojection and Scaling NOOP filters. (07:47:19)
+
+2014-08-17
+	* Connor Manning <connor at hobu.co> SQLite capitalization. (09:33:17)
+	* Howard Butler <hobu.inc at gmail.com> getFieldAs instaed of getField for fetching values (08:38:18)
+
+2014-08-16
+	* Howard Butler <hobu.inc at gmail.com> port SQLite driver over to point-context-schema (19:57:06)
+	* Connor Manning <connor at hobu.co> Add quad tree index. (17:34:25)
+	* Howard Butler <hobu.inc at gmail.com> fix up p2g writer (17:13:23)
+
+2014-08-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update OCI to write schema. (21:03:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix delta. (20:40:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Diff cleanup. (20:35:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> PCL app cleanup. (20:27:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Cleanup. (19:52:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (16:41:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge filter and test. Modify PipelineReader to support merge filter. Remove old MultiFilter handling. Remove Schema, MultiFilter, MultiFilterIterator (16:34:42)
+	* Bradley J Chambers <brad.chambers at gmail.com> bring p2g driver into the PointContext world and make it aware of the GTIFF output capability of points2grid (14:34:46)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (13:46:57)
+	* Howard Butler <hobu.inc at gmail.com> start re-implementing 'pdal info' (13:46:52)
+	* Howard Butler <hobu.inc at gmail.com> toPTree methods (13:46:37)
+	* Howard Butler <hobu.inc at gmail.com> getMetadata method for PipelineManager (13:45:56)
+	* Howard Butler <hobu.inc at gmail.com> remove dead variable (13:45:27)
+	* Howard Butler <hobu.inc at gmail.com> add() for Metadata, toPTree methods (13:44:51)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (09:43:16)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix arg list in conditional compilation. (09:10:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix programmable tests. Comment out pdal info test. (07:36:46)
+
+2014-08-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix bug(type) in splitter. getField to getFieldAs in PointBufferTest. (20:28:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix Dimension::base(). (16:50:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix types on BufferedInvocation. (16:15:13)
+
+2014-08-12
+	* Andrew Bell <andrew.bell.ia at gmail.com> Allow upgrade of dimension type on conflicts. Use consistent buffer for BPF byte-major. Use getFieldAs instead of getField. (14:59:52)
+
+2014-08-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix bugs in PointBuffer, RawPtBf, PointContext. Use local buffer for BPF byte-major reads. (22:03:24)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set offsets in dimensions. (17:48:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Tests to new dimension scheme. (16:46:53)
+	* Connor Manning <connor at hobu.co> Constify and tweak for readability. (15:21:37)
+	* Connor Manning <connor at hobu.co> Give KDIndex a const reference to its PointBuffer since it doesn't/shouldn't modify it. (09:48:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Tests to new dimension scheme. (07:08:02)
+
+2014-08-09
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make main app link. (22:50:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (08:11:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> More changes for new dimension scheme. (08:09:09)
+
+2014-08-08
+	* Howard Butler <hobu.inc at gmail.com> fix up filters.pcl to work with schema-less stuff (15:45:24)
+	* Howard Butler <hobu.inc at gmail.com> finish porting over 'pdal delta' and 'pdal info' (14:33:01)
+	* Howard Butler <hobu.inc at gmail.com> partially port over 'pdal diff' (14:18:06)
+	* Howard Butler <hobu.inc at gmail.com> add autzen-thin-srs to add srs info (13:49:20)
+	* Howard Butler <hobu.inc at gmail.com> plang compiles (13:48:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> cache filter no longer needed in PCL kernel (13:22:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> closes #407 (13:13:46)
+	* Howard Butler <hobu.inc at gmail.com> plang work (11:37:42)
+	* Howard Butler <hobu.inc at gmail.com> port filters.colorization to new dimension mechanism (09:38:38)
+	* Howard Butler <hobu.inc at gmail.com> LogLevel rename (09:38:21)
+	* Howard Butler <hobu.inc at gmail.com> LogLevel rename (09:38:05)
+	* Howard Butler <hobu.inc at gmail.com> fetch X, Y for HexBin using new mechanism (09:37:25)
+
+2014-08-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update filters to new dimension scheme. (17:19:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Icebridge to new dimension scheme. (14:52:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Sbet to new dimension scheme. (14:40:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead headers. (14:27:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> pgpointcloud to new dimension scheme. Move setField to PointBuffer in lieu of setRawField. (14:24:06)
+	* Howard Butler <hobu.inc at gmail.com> more travis (14:03:01)
+	* Howard Butler <hobu.inc at gmail.com> more travis (13:19:54)
+	* Howard Butler <hobu.inc at gmail.com> more travis (12:00:15)
+	* Howard Butler <hobu.inc at gmail.com> more travis (11:31:27)
+	* Howard Butler <hobu.inc at gmail.com> more travis (11:05:07)
+	* Howard Butler <hobu.inc at gmail.com> more travis (10:52:32)
+	* Howard Butler <hobu.inc at gmail.com> more travis (09:48:29)
+	* Howard Butler <hobu.inc at gmail.com> more travis (09:27:03)
+	* Howard Butler <hobu.inc at gmail.com> more travis (08:59:06)
+	* Howard Butler <hobu.inc at gmail.com> more travis (08:47:46)
+	* Howard Butler <hobu.inc at gmail.com> more travis (08:32:56)
+
+2014-08-06
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (17:42:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Qfit and Text changes. (16:50:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Text and qfit changes. (16:49:37)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:44:49)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:37:35)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:24:05)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:56:01)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:43:01)
+	* Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:37:14)
+	* Howard Butler <hobu.inc at gmail.com> try debiangis-unstable for Travis packages (13:32:18)
+	* Howard Butler <hobu.inc at gmail.com> try debiangis-unstable for Travis packages (13:23:31)
+	* Howard Butler <hobu.inc at gmail.com> another swing at getting travis going (12:52:49)
+	* Howard Butler <hobu.inc at gmail.com> attempt to get Travis going again (11:39:31)
+	* Howard Butler <hobu.inc at gmail.com> default to osgeo4w64 for library path on windows (11:33:21)
+	* Howard Butler <hobu at hobu.co> better-defined PointId typedef and clean up of aftermath (11:19:39)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Temporary commit - new Dimension code. (10:27:48)
+	* Howard Butler <hobu.inc at gmail.com> fix up readBufferImpl virtual to return point_count_t (09:40:44)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (09:16:16)
+
+2014-08-05
+	* Howard Butler <hobu at hobu.co> more MSVC warnings cleanups (21:22:41)
+	* Howard Butler <hobu at hobu.co> some MSVC warnings cleanups (21:16:57)
+	* Howard Butler <hobu at hobu.co> windows tweaks to my config file (21:16:37)
+	* Howard Butler <hobu at hobu.co> a whole bunch of windows-related fixups. compiles with osgeo4w64 on msvc2013 (16:48:04)
+
+2014-08-03
+	* Howard Butler <hobu.inc at gmail.com> @rpath support for OSX (only) (16:51:43)
+
+2014-07-29
+	* Bradley J Chambers <brad.chambers at gmail.com> be a little more explicit about what PCL modules are built (14:14:21)
+	* Bradley J Chambers <brad.chambers at gmail.com> remove VTK dependency (11:43:06)
+
+2014-07-28
+	* Andrew Bell <andrew.bell.ia at gmail.com> Changes for schema (08:07:09)
+
+2014-07-27
+	* Howard Butler <hobu.inc at gmail.com> turn off sqlite3_enable_load_extension which isn't quite working yet (12:21:06)
+	* Howard Butler <hobu.inc at gmail.com> working drivers.sqlite.reader with tests (12:12:10)
+	* Howard Butler <hobu.inc at gmail.com> more drivers.sqlite.reader -- still not quite working (09:52:12)
+	* Howard Butler <hobu.inc at gmail.com> some cleanups, more logs (09:52:02)
+	* Howard Butler <hobu.inc at gmail.com> ask ABELL about what happens when appendPoint is given bad input (09:51:13)
+
+2014-07-25
+	* Howard Butler <hobu.inc at gmail.com> put some more logging in, shutdown/initialize for sqlite3 (16:52:56)
+	* Howard Butler <hobu.inc at gmail.com> almost working drivers.sqlite.reader (13:55:04)
+
+2014-07-24
+	* Howard Butler <hobu.inc at gmail.com> handle situation where a query doesn't return any rows. insert schema correctly into cloud table (12:29:58)
+	* Howard Butler <hobu.inc at gmail.com> fix ups for drivers.sqlite.writer to actually work (12:02:51)
+	* Howard Butler <hobu.inc at gmail.com> add sqlite to StageFactory (12:02:33)
+	* Howard Butler <hobu.inc at gmail.com> rename drivers.sqlite to SQLiteWriter/SQLiteReader (10:54:39)
+	* Howard Butler <hobu.inc at gmail.com> drivers.sqlite.writer based on sqlite3 C API. remove SOCI dependency (10:26:50)
+
+2014-07-23
+	* Howard Butler <hobu.inc at gmail.com> the actual buffer size of the xmlBuffer is b->use, not b->size. you're so obvious libxml2 (16:34:22)
+	* Howard Butler <hobu.inc at gmail.com> update my config (10:18:56)
+	* Howard Butler <hobu.inc at gmail.com> no need to explicitly find libtiff. libgeotiff is already linked against it (10:18:43)
+
+2014-07-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Changes to support new schema configuration. (21:21:30)
+	* Howard Butler <hobu.inc at gmail.com> only do policy check for CMAKE > 2.x (11:24:29)
+	* Howard Butler <hobu.inc at gmail.com> silence annoying cmake policies for now (11:07:20)
+
+2014-07-18
+	* Howard Butler <hobu.inc at gmail.com> rehabilitate 'pdal delta' command (11:59:22)
+
+2014-07-17
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:11:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove color filter as discussed. (12:08:04)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (12:00:05)
+	* Howard Butler <hobu.inc at gmail.com> remove Stage::m_bounds (12:00:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:46:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove ThreadEnvironment. Hide random number generator. Fix plang test. Fix stream factory test. (10:45:34)
+	* Howard Butler <hobu.inc at gmail.com> new hex_to_binary method for drivers.pgpointcloud.reader (09:14:49)
+	* Howard Butler <hobu.inc at gmail.com> remove bounds from filters.inplacereprojection (08:46:38)
+
+2014-07-16
+	* Howard Butler <hobu.inc at gmail.com> add missing pgpointcloud file (17:06:05)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (16:34:15)
+	* Howard Butler <hobu.inc at gmail.com> fix up drivers.pgpointcloud (16:34:10)
+
+2014-07-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from PointBuffer. (17:14:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Point buffer tests. (16:48:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Reenable pipeline manager test. (15:43:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (15:29:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Icebridge to point context. (15:24:47)
+	* Howard Butler <hobu.inc at gmail.com> pdal::Write returns the PointBufferSet of data it has written (11:55:27)
+	* Howard Butler <hobu.inc at gmail.com> re-enable drivers.pgpointcloud tests (11:42:26)
+	* Howard Butler <hobu.inc at gmail.com> allow drivers.sqlite.reader to compile (not working yet) (10:57:04)
+	* Howard Butler <hobu.inc at gmail.com> tweak sqlite reader to be able to compile (10:08:25)
+	* Howard Butler <hobu.inc at gmail.com> use homebrew hexer for hobu's config (09:56:56)
+	* Howard Butler <hobu.inc at gmail.com> fix up icebridge driver so it compiles (doesn't work) (09:56:32)
+
+2014-07-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (21:39:31)
+	* Connor Manning <connor at hobu.co> Fix build when Greyhound capabilities are off. (17:02:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (16:18:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Enable user callback test. (16:17:48)
+	* Connor Manning <connor at hobu.co> Merge point-context updates into Greyhound branch. (16:01:16)
+	* Connor Manning <connor at hobu.co> Change GH reader to use setField since the remote schema is not necessarily the same as the final local schema. (15:52:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix some tests. (14:31:27)
+	* Connor Manning <connor at hobu.co> Fix boundary error when points are split between multiple websocket receptions. (14:04:24)
+
+2014-07-11
+	* Connor Manning <connor at hobu.co> Simplify Reader and make PointBuffer population (mostly) work.  Points at the end of the WebSocket MTU boundary that are split between response frames will not be added correctly or double added. (18:39:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove more dead code. (14:49:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:40:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove more dead code. (12:39:52)
+	* Connor Manning <connor at hobu.co> Simplify exchange variables in Reader. (10:45:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (10:36:42)
+	* Connor Manning <connor at hobu.co> Make GH exchanges more robust to simplify the Reader. (09:48:44)
+	* Howard Butler <hobu.inc at gmail.com> port drivers.sqlite.writer to point-context -- not really tested yet because OSX sucks (09:20:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix build with no hexer. (08:02:17)
+
+2014-07-10
+	* Connor Manning <connor at hobu.co> Some light cleanup. (21:49:29)
+	* Connor Manning <connor at hobu.co> Get Greyhound driver commands set up.  PointBuffer is not yet properly populated on a read, but the communication flow with Greyhound occurs. (21:36:29)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add hexbin output file with consistent origin. (21:20:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (16:17:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (14:01:43)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make a simple hexbin test. (14:01:19)
+
+2014-07-09
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (16:56:20)
+	* Howard Butler <hobu.inc at gmail.com> port drivers.pgpointcloud.writer to point-context (16:56:17)
+	* Howard Butler <hobu.inc at gmail.com> tweak my cmake example (16:55:55)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix pipeline files as input to pdal info. Fix stats output for pdal info. Fix point listing output for pdal info. (14:08:51)
+
+2014-07-08
+	* chambbj <brad.chambers at gmail.com> Merge pull request #404 from chambbj/pcl-doc-update (19:57:44)
+	* Bradley J Chambers <brad.chambers at gmail.com> update the pcl documentation to include ground filtering example and explanation of parameters (19:50:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add configuration ifdef guard. (12:31:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:36:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> HexBin to point context. (10:34:18)
+
+2014-07-07
+	* Connor Manning <connor at hobu.co> Add bare WebSocketClient class and plumb it it with CMakeLists. (17:28:09)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove schema from stage. (15:12:22)
+	* Connor Manning <connor at hobu.co> Get Jsoncpp and Websocketpp hooked into CMake.  Stub out the Greyhound Reader a little more thoroughly. (14:13:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:40:44)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Purge old copying code from PointBuffer.  Remove depedent calls(). (12:24:18)
+	* Connor Manning <connor at hobu.co> Initial file structure and compilation additions. (11:15:01)
+
+2014-07-06
+	* Andrew Bell <andrew.bell.ia at gmail.com> Changes to support translate app. (20:36:46)
+
+2014-07-02
+	* Howard Butler <hobu.inc at gmail.com> don't chop off classification bits #403 (09:03:00)
+
+2014-06-30
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (13:14:56)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove buffer driver. Remove PointBufferCache filter. Remove remaining references to FauxWriter. Fix Nitf copy/assignment ctor/operator. (13:11:24)
+	* Connor Manning <connor at hobu.co> Get gcc 4.8.2 building, fix a warning. (10:53:13)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Work around broken VS compiler. (09:18:02)
+
+2014-06-27
+	* Andrew Bell <andrew.bell.ia at gmail.com> Sbet writer to point context. (17:16:32)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (12:31:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Sbet reader to point context. (12:31:27)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #398 from chambbj/issues/397-msvc-version-handling (12:11:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove faux writer - use stats filter instead. Remove dead includes from PCL block tests. (07:52:21)
+
+2014-05-01
+	* Bradley J Chambers <brad.chambers at gmail.com> rework the MSVC version logic slightly, add possibility of VC2012/2013 to pdal_defines (21:58:19)
+	* Howard Butler <howard at hobu.co> Merge pull request #341 from gadomski/feature/split-infer-writer-driver (16:48:38)
+	* Pete Gadomski <pete.gadomski at gmail.com> Split inferWriterDriver into two (14:40:14)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove two-argument version of inferReaderDriver (11:54:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #338 from gadomski/issue/337-test-case-return (12:49:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove returns from BOOST_AUTO_TEST_CASEs (12:30:15)
+	* Pete Gadomski <pete.gadomski at gmail.com> Without reader type, infer from filename (11:00:08)
+	* Pete Gadomski <pete.gadomski at gmail.com> Infer the reader driver, no options required (10:58:12)
+
+2014-06-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> PCLBlock to point context. (14:57:14)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Predicate to point context. (08:56:08)
+
+2014-06-25
+	* Andrew Bell <andrew.bell.ia at gmail.com> Programmable to point context. (13:49:04)
+
+2014-06-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make scaling filter do point context. (14:24:07)
+
+2014-06-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Splitter to point context. Finish deprecating ByteSwap and Cache filters. (13:02:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Deprecate ByteSwap and Cache filters. (13:01:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:38:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Decimation filter to point context. (09:37:23)
+
+2014-06-22
+	* Howard Butler <howard at hobu.co> Merge pull request #396 from connormanning/vagrantUpdate (09:19:47)
+
+2014-06-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Re-enable stats tests. (22:15:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Faux reader to point context. (14:27:47)
+	* Connor Manning <connor at hobu.co> Merge upstream and fix conflict. (10:44:51)
+	* Connor Manning <connor at hobu.co> Update vagrant config. (10:11:00)
+
+2014-06-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix crop filter for point context. (15:13:47)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:55:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Colorization filter update. (11:54:39)
+
+2014-06-16
+	* Howard Butler <hobu.inc at gmail.com> put the interpretation name into the toPTree() output of pdal::Dimension (14:30:11)
+	* Howard Butler <hobu.inc at gmail.com> put the dimensions under a 'schema' object so the xml that --schema outputs is valid (14:29:50)
+
+2014-06-13
+	* Andrew Bell <andrew.bell.ia at gmail.com> Uncomment code. (20:16:19)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix stats metadata. (20:15:44)
+
+2014-06-12
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix nested las metadata in nitf file (20:27:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Namespace for istringstream. (16:25:45)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove PointContext argument from initialize() (15:52:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix findVlr.  Add vlr metadata test. (15:29:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> New metadata implementation. (14:47:34)
+
+2014-06-11
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:24:03)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Update to allow merge. (11:40:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Clean up SpatialReference. (11:16:11)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Reenable SpatialReference test. (10:41:28)
+
+2014-06-10
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have NITF use PointContext. (19:32:38)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fixup nitf writer. (11:15:38)
+
+2014-06-05
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (13:06:22)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:12:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix stats filter. (12:11:54)
+
+2014-06-04
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (15:20:32)
+	* Howard Butler <hobu.inc at gmail.com> cumulate bounds with new grow() method (15:20:06)
+	* Howard Butler <hobu.inc at gmail.com> add grow() method that takes in a simple xyz double triplet (15:19:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix info --schema. (14:25:19)
+	* Pete Gadomski <pete.gadomski at gmail.com> Re-enable Ninja, but set the thread count (12:43:20)
+	* Pete Gadomski <pete.gadomski at gmail.com> Disable Ninja builds for clang (12:35:15)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Actually set the fetched flag in OciReader. (11:28:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:09:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Don't double Fetch() the first row. (11:09:09)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #389 from gadomski/travis-clang-ninja (10:56:12)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use ninja when building with clang (10:02:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use elseif not else in CMakeLists.txt (09:28:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (09:17:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Initialize Block::m_num_remaining. (09:17:10)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #388 from gadomski/clang (08:29:53)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (07:29:45)
+	* Howard Butler <hobu.inc at gmail.com> remove capacity from schema fetch (07:29:31)
+	* Howard Butler <hobu.inc at gmail.com> fetch SDO_PC instead of SDO_PC_BLK_TYPE (07:29:01)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set block's num_remaining when a block is read. (06:08:59)
+
+2014-06-03
+	* Pete Gadomski <pete.gadomski at gmail.com> Build with clang and g++-4.8 on travis (10:40:04)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Set dimensions. (21:48:36)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make sure variable is in scope. (15:50:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Get normalization flag to iterator. (15:30:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (15:26:34)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Minor writer change/question. Fix test? to work with new reader. (15:07:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (14:34:35)
+	* Andrew Bell <andrew.bell.ia at gmail.com> OCI reader with PointContext. (14:33:55)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #372 from gadomski/travis-build-without-optionals (09:36:21)
+
+2014-05-20
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a second Travis build config (12:35:32)
+	* Pete Gadomski <pete.gadomski at gmail.com> Conditionally exclude python-dependent filters (15:13:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Conditionally exclude PCL (15:04:26)
+	* Pete Gadomski <pete.gadomski at gmail.com> Exclude colorization filter if we don't have GDAL (14:42:38)
+	* Pete Gadomski <pete.gadomski at gmail.com> Guard tests that require srs support (14:21:15)
+	* Pete Gadomski <pete.gadomski at gmail.com> Build and test bpf without zlib (13:55:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix setRawField for new PointBuffer behavior. (12:11:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:00:40)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:00:33)
+	* Howard Butler <hobu.inc at gmail.com> Revert "Remove unused variable m_pclblockFilter" (08:43:47)
+	* Howard Butler <howard at hobu.co> Merge pull request #360 from chambbj/issues/358-explicitly-deleted-fcns (08:38:29)
+	* Howard Butler <howard at hobu.co> Merge pull request #369 from gadomski/issue/292-postgres-segfault (08:38:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #370 from gadomski/pcl-block-unused-member-var (08:37:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Modify reprojection filter for new infrastructure. Remove template on applyScaling/removeScaling. Have setField automatically transform data to proper type for dimension. Add setFieldUnscaled to invoke removeScaling automatically. (08:33:44)
+
+2014-06-02
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #374 from gadomski/build-without-optional-components (14:00:55)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #385 from chambbj/issues/384-fix-vagrant-pdal-script (10:55:47)
+	* Bradley J Chambers <brad.chambers at gmail.com> PCL block is in master now, Vagrant users are missing out on other improvements in master (10:42:34)
+	* Howard Butler <hobu.inc at gmail.com> fix up OCI writer to be able to write data (10:03:13)
+	* Howard Butler <hobu.inc at gmail.com> start porting OCITest to PointContext (09:41:53)
+
+2014-05-30
+	* Howard Butler <hobu.inc at gmail.com> add smb-shared folder for win32 clients (15:27:23)
+
+2014-05-29
+	* chambbj <brad.chambers at gmail.com> Merge pull request #383 from chambbj/issues/382-include-pdal_macros (07:38:46)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #381 from chambbj/issues/380-apps-documentation-update (07:38:26)
+	* Bradley J Chambers <brad.chambers at gmail.com> Add missing include required by lround. Closes #382 (07:21:20)
+
+2014-05-28
+	* Bradley J Chambers <brad.chambers at gmail.com> Update documentation for apps. Closes #380 (14:11:41)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make OCI writer use PointContext. (13:47:55)
+
+2014-05-26
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix Travis build? (20:15:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> First chipper test. (17:46:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Chipper uses PointContext. (17:13:45)
+
+2014-05-23
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:05:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:05:00)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #376 from chambbj/more-explicitly-deleted-fcns (11:02:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (10:57:10)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Have InPlaceReprojection use PointBuffer. (10:56:49)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #377 from chambbj/template-parameter-names (10:30:49)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #379 from PDAL/issues/378-lround (10:30:14)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #375 from chambbj/brace-enclosed-initializer-list (10:24:31)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add lround for windows. (10:04:15)
+
+2014-05-22
+	* Bradley J Chambers <brad.chambers at gmail.com> explicitly deleted functions are not supported in MSVC2012 (06:50:57)
+	* Bradley J Chambers <brad.chambers at gmail.com> IN and OUT are already defined on Windows, use a different template parameter name; also missing include for set (06:53:10)
+	* Bradley J Chambers <brad.chambers at gmail.com> MSVC2012 does not like brace-enclosed initializer-lists (neither did gcc4.6.3 as discussed in 41b15068 (06:48:08)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #365 from chambbj/issues/335-cxxabi (06:05:57)
+
+2014-05-21
+	* Andrew Bell <andrew.bell.ia at gmail.com> Forgot to add test. (12:17:18)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Reprojection filter fix and test. (11:55:53)
+
+2014-05-19
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove unused variable m_pclblockFilter (16:29:49)
+
+2014-05-14
+	* Pete Gadomski <pete.gadomski at gmail.com> Check for null pointers when using pg_query_once (10:25:11)
+
+2014-05-18
+	* Andrew Bell <andrew.bell.ia at gmail.com> More LAS writer tests work. (21:39:05)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Pipelines are no longer a stage.  Use PipelineManager. (20:51:36)
+
+2014-05-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (16:56:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make selector filter work with point context.  Fix selector test. (16:55:56)
+	* Bradley J Chambers <brad.chambers at gmail.com> use try_compile to see if we can demangle (11:45:54)
+	* Bradley J Chambers <brad.chambers at gmail.com> offer alternative if cxxabi.h is not available (08:24:55)
+	* Howard Butler <howard at hobu.co> Merge pull request #362 from chambbj/issues/355-prevent-macro-expansion (11:15:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #361 from chambbj/issues/334-IN-OUT (11:15:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #363 from chambbj/issues/359-sys-param (11:14:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #364 from chambbj/issues/356-malloc-char-buf (11:14:35)
+	* Howard Butler <howard at hobu.co> Merge pull request #366 from chambbj/issues/357-boost-rounding (11:09:15)
+	* Howard Butler <howard at hobu.co> Merge pull request #368 from chambbj/issues/367-find-zlib (11:08:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #354 from PDAL/issues/354-pdal-delta-json-output (11:08:40)
+	* Bradley J Chambers <brad.chambers at gmail.com> unique_ptr (09:59:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> check for presence of zlib to support bpf compression (09:14:55)
+	* Howard Butler <hobu.inc at gmail.com> implement xml and json output for pdal delta #354 (09:45:34)
+	* Bradley J Chambers <brad.chambers at gmail.com> prevent expansion of min and max on windows (08:33:41)
+	* Bradley J Chambers <brad.chambers at gmail.com> IN and OUT are already defined on windows, replace with T_IN and T_OUT (08:31:49)
+	* Bradley J Chambers <brad.chambers at gmail.com> revert the explicitly deleted behavior of these functions, unavailable on MSVC2012 (08:27:58)
+	* Bradley J Chambers <brad.chambers at gmail.com> use boost for lround, as it is not available on MSVC2012 (08:26:15)
+	* Bradley J Chambers <brad.chambers at gmail.com> sys/param.h is unavailable and unneeded on windows (08:22:59)
+	* Bradley J Chambers <brad.chambers at gmail.com> malloc the char buffer because size is not constant (08:19:10)
+
+2014-05-15
+	* Andrew Bell <andrew.bell.ia at gmail.com> Enable the LAS writer tests that pass. (12:43:25)
+	* Andrew Bell <andrew.bell.ia at gmail.com> We now write LAS points through a pipeline. (11:47:06)
+
+2014-05-13
+	* Andrew Bell <andrew.bellia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (21:28:02)
+	* Andrew Bell <andrew.bellia at gmail.com> More pipeline work. (21:27:42)
+	* Andrew Bell <andrew.bellia at gmail.com> Fixes for gcc 4.6. (19:36:03)
+
+2014-05-12
+	* Andrew Bell <andrew.bellia at gmail.com> Make BPF/LAS work with PointContext changes. (16:55:41)
+	* Howard Butler <howard at hobu.co> Merge pull request #352 from PDAL/issues/352-silence-run_shell_command (12:28:12)
+
+2014-05-08
+	* Andrew Bell <andrew.bellia at gmail.com> Replace public: initialize() with prepare(). (20:25:16)
+	* Howard Butler <hobu.inc at gmail.com> fix doc complaint listed in #353 (20:36:19)
+
+2014-05-07
+	* Andrew Bell <andrew.bellia at gmail.com> Rename Init() to Construct() (15:14:24)
+	* Andrew Bell <andrew.bellia at gmail.com> Don't use delegating constructors. (13:07:54)
+	* Andrew Bell <andrew.bellia at gmail.com> Modify initialization sequence. (09:37:24)
+
+2014-05-06
+	* Andrew Bell <andrew.bellia at gmail.com> Don't use delegating contrustors. (13:19:25)
+	* Howard Butler <hobu.inc at gmail.com> Fix #352 to shut up CPL_DEBUG (14:32:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #340 from gadomski/feature/remove-two-arg-infer-reader (13:28:51)
+	* Howard Butler <hobu.inc at gmail.com> add hdf5 to my config (13:27:54)
+	* Howard Butler <hobu.inc at gmail.com> fix up sqlite driver after m_options update #346 (13:27:44)
+	* Howard Butler <howard at hobu.co> Merge pull request #350 from connormanning/hdf5 (13:09:23)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #348 from chambbj/issues/346-nitf-error (13:08:48)
+	* Howard Butler <howard at hobu.co> Merge pull request #351 from gadomski/issue/277-inval-file-sig (13:08:33)
+	* Pete Gadomski <pete.gadomski at gmail.com> Improve the las reader's file signature error (11:51:43)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into feature/remove-two-arg-infer-reader (10:39:07)
+	* Howard Butler <howard at hobu.co> Merge pull request #336 from gadomski/issue/278-infer-reader-type (10:21:00)
+
+2014-05-02
+	* Andrew Bell <andrew.bellia at gmail.com> Add point context stuff. Modify stage ctor to take PointContext. (09:29:12)
+	* Bradley J Chambers <brad.chambers at gmail.com> a more straightforward way of setting the nitf writer options (15:20:35)
+	* Howard Butler <howard at hobu.co> Merge pull request #342 from PDAL/issues/342-no-more-top-level-config.sh (12:15:56)
+	* Howard Butler <hobu.inc at gmail.com> remove user-specific config scripts into cmake/examples to clean up root directory #342 (11:45:45)
+	* Howard Butler <howard at hobu.co> Merge pull request #345 from chambbj/issues/43-pdal-translate-decimation (10:10:44)
+	* Bradley J Chambers <brad.chambers at gmail.com> add decimation option to pdal translate (09:48:23)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #344 from PDAL/no-stage-base (09:26:36)
+	* Andrew Bell <andrew.bellia at gmail.com> Merge StageBase into Stage. (09:05:31)
+
+2014-05-05
+	* Connor Manning <connor at hobu.co> Remove todo (16:46:22)
+	* Connor Manning <connor at hobu.co> Added an HDF5 include guard around an icebridge include. (16:26:00)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into feature/remove-two-arg-infer-reader (11:55:30)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into issue/278-infer-reader-type (11:46:59)
+
+2014-05-04
+	* Connor Manning <connor at hobu.co> Updates for changes concurrent with this branch. (15:16:52)
+	* Connor Manning <connor at hobu.co> Merge remote-tracking branch 'upstream/master' into hdf5 (14:49:40)
+
+2014-04-30
+	* Connor Manning <connor at hobu.co> Add icebridge reader. (21:29:37)
+	* Howard Butler <howard at hobu.co> Merge pull request #328 from gadomski/feature/faux-reader-unknown-point-count (14:38:07)
+	* Howard Butler <howard at hobu.co> Merge pull request #324 from gadomski/sbet-writer (14:37:50)
+	* Howard Butler <hobu.inc at gmail.com> add a shell script to cleanup cmake junk (10:08:31)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:07:20)
+
+2014-04-29
+	* Pete Gadomski <pete.gadomski at gmail.com> Allow faux::Reader to report 0 for getNumPoints (10:35:38)
+	* Howard Butler <howard at hobu.co> Merge pull request #330 from gadomski/issue/329-remove-pointcounttype (14:25:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #331 from gadomski/issue/doc-warnings (14:03:51)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix some warnings during doc building (13:40:27)
+	* Howard Butler <hobu.inc at gmail.com> add --detail to 'pdal delta' doc (13:33:44)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove m_pointCountType and references (11:54:23)
+	* Pete Gadomski <pete.gadomski at gmail.com> Update doxygen.conf (10:59:26)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #327 from PDAL/issues/326-missing-case (09:24:04)
+
+2014-04-23
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a sbet writer (16:49:50)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #322 from PDAL/issues/317-naive-skip (16:36:00)
+
+2014-04-28
+	* Howard Butler <hobu.inc at gmail.com> use RPATH on OSX by default now (16:49:44)
+	* Howard Butler <hobu.inc at gmail.com> update my config (16:49:26)
+	* Howard Butler <hobu.inc at gmail.com> don't link to ourselves for libpdalcpp.so (16:49:04)
+	* Howard Butler <hobu.inc at gmail.com> ignore ./lib directory (16:48:42)
+	* Howard Butler <hobu.inc at gmail.com> clean up some cast warnings that gcc 4.8 found (16:46:25)
+	* Andrew Bell <andrew.bellia at gmail.com> Add default statement to fix busted GCC implementation. (14:10:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #325 from PDAL/issues/325-stage-enabled-status (10:33:51)
+	* Howard Butler <hobu.inc at gmail.com> implement an enabled static flag for Stage:: #325 (10:03:09)
+
+2014-04-25
+	* Howard Butler <hobu.inc at gmail.com> put bakc c++0x flag for gcc (15:53:43)
+	* Howard Butler <hobu.inc at gmail.com> point to PCL (15:47:55)
+	* Howard Butler <hobu.inc at gmail.com> step back to allowing boost 1.52, force a re-find_package of boost when PCL is enabled (its CMake mucks up the components (15:47:42)
+	* Howard Butler <howard at hobu.co> Merge pull request #323 from gadomski/contributing (11:08:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add CONTRIBUTING.md (10:56:33)
+
+2014-04-17
+	* Andrew Bell <andrew.bellia at gmail.com> Don't use naiveSkipImpl. (13:50:27)
+
+2014-04-22
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #320 from PDAL/format (13:02:35)
+	* Andrew Bell <andrew.bellia at gmail.com> Formatting.  No functional changes. (11:28:21)
+
+2014-04-16
+	* Howard Butler <howard at hobu.co> Merge pull request #315 from gadomski/sbet-reader-random-iterator (15:55:10)
+	* Howard Butler <howard at hobu.co> Merge pull request #314 from PDAL/issues/314-las-writer-pointformat (15:55:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #316 from PDAL/issues/296-las-write (15:54:43)
+	* Howard Butler <hobu.inc at gmail.com> fix #314 -- respecting 'format' option instead of forwarding metadata if set (14:02:12)
+	* Andrew Bell <andrew.bellia at gmail.com> Use getFieldAs to properly convert values from a PointBuffer when writing output. (12:31:31)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:39:06)
+	* Howard Butler <hobu.inc at gmail.com> point to my local PCL install (12:38:57)
+	* Howard Butler <howard at hobu.co> Merge pull request #313 from PDAL/issues/311-configure-vagrant-with-envvars (12:20:53)
+	* Pete Gadomski <pete.gadomski at gmail.com> Customize Vagrantfile with environment variables (10:04:57)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #309 from PDAL/bpf (10:06:05)
+	* Howard Butler <howard at hobu.co> Merge pull request #312 from PDAL/pointlist (10:02:34)
+
+2014-04-15
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a random iterator for the sbet reader (15:39:59)
+	* Andrew Bell <andrew.bellia at gmail.com> More flexible point list parsing for "pdal info" (21:02:25)
+	* Andrew Bell <andrew.bellia at gmail.com> Fix seek for compressed BPF files. (15:54:49)
+	* Howard Butler <howard at hobu.co> Merge pull request #308 from gadomski/vagrant-ssh-forward-agent (15:35:17)
+	* Pete Gadomski <pete.gadomski at gmail.com> Provide switch to turn on Vagrant's ssh forwarding (15:26:18)
+
+2014-04-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #305 from abellgithub/bpftest (20:22:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #304 from abellgithub/bpf (17:17:06)
+	* Andrew Bell <andrew.bellia at gmail.com> A little more testing. (17:16:02)
+	* Andrew Bell <andrew.bellia at gmail.com> Merge branch 'bpf' into bpftest (16:35:12)
+	* Andrew Bell <andrew.bellia at gmail.com> Add working BPF test and test files. (11:56:20)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #301 from abellgithub/skip-sequential (15:16:58)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #298 from PDAL/add-pcl-kernel (09:45:53)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #300 from abellgithub/scaling (09:44:17)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #303 from PDAL/alt-way-to-get-field (09:42:19)
+
+2014-04-13
+	* Andrew Bell <andrew.bellia at gmail.com> Fix overfull dimension array. Always write points starting at index 0. (15:18:48)
+	* Andrew Bell <andrew.bellia at gmail.com> Allow point dump with sequential iterators. (12:26:56)
+
+2014-04-11
+	* Bradley J Chambers <brad.chambers at gmail.com> add getFieldAs method to PointBuffer to allow retrieval of properly cast and scaled data (11:14:44)
+	* Andrew Bell <andrew.bellia at gmail.com> Format cleanup and so on for scaling filter. (15:42:51)
+
+2014-04-10
+	* Bradley J Chambers <brad.chambers at gmail.com> Add: PCL kernel for the PDAL app (17:38:28)
+	* Howard Butler <howard at hobu.co> Merge pull request #297 from PDAL/issues/264-pdal-linkage (11:42:56)
+	* Howard Butler <howard at hobu.co> Merge pull request #294 from gadomski/sbet-reader (11:40:30)
+	* Howard Butler <howard at hobu.co> Merge pull request #295 from abellgithub/dimension (11:27:54)
+	* Howard Butler <hobu.inc at gmail.com> turn off clang builds for now (10:04:33)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #293 from abellgithub/bpf (08:12:14)
+
+2014-04-09
+	* Andrew Bell <andrew.bellia at gmail.com> Simplify some code in dimension. Make things fit in 80 columns. (17:55:28)
+
+2014-04-07
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a sbet reader (13:56:29)
+	* Howard Butler <hobu.inc at gmail.com> upgrade Vagrant to use boost 1.55 too (17:36:36)
+	* Howard Butler <hobu.inc at gmail.com> use boost-latest ppa's to upgrade travis config (17:19:52)
+	* Howard Butler <howard at hobu.co> Merge pull request #275 from gadomski/exclude-pcl-test-cpp (16:57:11)
+	* Howard Butler <hobu.inc at gmail.com> some more cleanups related to #285 (16:22:56)
+	* Andrew Bell <andrew.bellia at gmail.com> Add BPF files. (14:19:37)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #286 from abellgithub/iostream (14:16:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #285 from abellgithub/schema-ref (13:28:36)
+	* Howard Butler <hobu.inc at gmail.com> add an example LAS file with one missing point and incorrect header count (13:15:29)
+	* Andrew Bell <andrew.bellia at gmail.com> Add binary byte-ordering streams. (12:48:44)
+	* Howard Butler <hobu.inc at gmail.com> tweak 'pdal delta' output a little, clean up docs (12:06:31)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/264-pdal-linkage (11:26:41)
+	* Howard Butler <howard at hobu.co> Merge pull request #284 from gadomski/typo-fixes (10:47:36)
+	* Andrew Bell <andrew.bellia at gmail.com> Make stage's m_schema protected. (10:11:03)
+
+2014-04-08
+	* Andrew Bell <andrew.bellia at gmail.com> Very simple decompression for BPF. (10:26:46)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #287 from abellgithub/bpf (09:02:33)
+
+2014-04-01
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix small comment typo (15:27:03)
+	* Andrew Bell <andrew.bellia at gmail.com> Turn on C++11 support. (18:01:58)
+
+2014-04-06
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #283 from abellgithub/getfield (12:32:36)
+
+2014-04-03
+	* Andrew Bell <andrew.bellia at gmail.com> Add word expansion (shell syntax handling) for filenames in pipelines on non-Windows systems. Use some C++11 and use the boost::property_tree namespace to simplify code in Options.* (17:04:33)
+	* Howard Butler <hobu.inc at gmail.com> Rename 'pdal query' to 'pdal diff' and add some simple XYZ delta statistics for default output #273 (15:00:28)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:59:46)
+	* Howard Butler <hobu.inc at gmail.com> more fixups to filters.hexbin for 24828059066a77f56be6bec002a605c5d95af266 (14:59:40)
+	* Howard Butler <hobu.inc at gmail.com> more cleanups for 24828059066a77f56be6bec002a605c5d95af266 for filters.hexbin (14:51:55)
+	* Howard Butler <hobu.inc at gmail.com> fixups related to the big change in acbellgithub's 24828059066a77f56be6bec002a605c5d95af266 (14:30:04)
+	* Pete Gadomski <pete.gadomski at gmail.com> Exclude PCLBlockFilterTest when building w/o PCL (12:02:00)
+	* Pete Gadomski <pete.gadomski at gmail.com> Exclude pipeline_mosaic test when built w/o Python (11:38:06)
+	* Bradley J Chambers <brad.chambers at gmail.com> only use PUBLIC in PDAL_LINKAGE if CMake supports it, otherwise stick with LINK_PUBLIC (08:23:14)
+
+2014-04-02
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #269 from abellgithub/cpp11 (08:17:12)
+
+2014-03-26
+	* Bradley J Chambers <brad.chambers at gmail.com> Begin using 'option' rather than 'set' for PDAL options (12:18:40)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #258 from PDAL/filter-create-tiles-alt2 (09:18:52)
+
+2014-03-14
+	* Bradley J Chambers <brad.chambers at gmail.com> Add: splitter filter to generate spatially contiguous point buffers of fixed size (09:28:43)
+	* Carl Simonson <simonsonc at gmail.com> CMake: Fix case sensitivity of SWIG package (22:53:23)
+	* Carl Simonson <simonsonc at gmail.com> CMake: make sure python library is in 2.x series (22:34:41)
+
+2014-03-24
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #257 from PDAL/no-supports-iter (15:18:12)
+	* Andrew Bell <acbell at blaze.hobu.biz> Remove supportsIterator().  Never called. (15:10:59)
+
+2014-03-21
+	* Howard Butler <hobu.inc at gmail.com> Support reading PointBuffers that have no XYZ on them #123 (10:48:55)
+
+2014-03-20
+	* Bradley J Chambers <brad.chambers at gmail.com> numPointsNeeded in PCLBlock should be updated by the number of points read, not the number remaining after filtering (18:04:13)
+	* Howard Butler <hobu.inc at gmail.com> Add 'pdal diff' utility #255 (16:16:16)
+	* Howard Butler <hobu.inc at gmail.com> Implement Python 3 support #256 (16:08:13)
+
+2014-03-16
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #254 from simonsonc/separate-build-dir (13:56:35)
+	* Carl Simonson <simonsonc at gmail.com> CMake: Fix building with separate build dir (12:29:27)
+	* Andrew Bell <acbell at blaze.hobu.biz> Make more stuff fit in 80 columns. Remove dead code. (11:46:47)
+	* Howard Butler <howard at hobu.co> Merge pull request #252 from simonsonc/python-ver (08:54:17)
+
+2014-03-13
+	* Andrew Bell <acbell at blaze.hobu.biz> Make lots of stuff fit in 80 columns, since we're almost there already. Remove the silly "const" in front of native types. Use the std namespace in some cpp files. Remove NOOP return statements at the end of functions. Consolidate code where it make sense. (12:23:31)
+	* Andrew Bell <acbell at blaze.hobu.biz> Find absolute path for test binary. (09:52:20)
+
+2014-03-15
+	* Howard Butler <hobu.inc at gmail.com> make sure to pass in chunk_size argument to writer (17:51:00)
+	* Howard Butler <hobu.inc at gmail.com> make sure to pass in chunk_size argument to writer (17:50:13)
+	* Howard Butler <howard at hobu.co> Merge pull request #253 from simonsonc/swig-casing (10:40:35)
+
+2014-03-10
+	* Howard Butler <hobu.inc at gmail.com> add BPF example data (11:26:30)
+
+2014-02-26
+	* chambbj <brad.chambers at gmail.com> Merge pull request #251 from PDAL/issue/250-no-pcd-offsets (14:40:27)
+	* Bradley J Chambers <brad.chambers at gmail.com> adding more PCL block examples and updating paths in tutorial (14:20:28)
+	* Bradley J Chambers <brad.chambers at gmail.com> as referenced in #250, do not apply offsets in conversion to PCD, but pass them along to the PCL Pipeline (13:58:30)
+
+2014-02-24
+	* Howard Butler <howard at hobu.co> Merge pull request #249 from PDAL/issue/248-pcl-block-improvements (16:16:06)
+	* Bradley J Chambers <brad.chambers at gmail.com> improving PCLBlock filter for #248 (12:00:37)
+
+2014-02-21
+	* Bradley J Chambers <brad.chambers at gmail.com> move the PCL Block XML files to the filter folder, create subfolder for the JSON files, remove some deprecated PCL Block examples (15:48:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> updating PCL-related documentation (15:23:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> adding test pipeline and pcl block for grid minimum (15:22:28)
+
+2014-02-20
+	* Bradley J Chambers <brad.chambers at gmail.com> back off the default VM requirements (23:05:15)
+
+2014-02-19
+	* Howard Butler <howard at hobu.co> Merge pull request #247 from PDAL/feature/pcl-block (14:19:32)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' into feature/pcl-block (13:46:26)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #246 from PDAL/issue/245-pdal-translate (12:59:22)
+	* Bradley J Chambers <brad.chambers at gmail.com> resolve #245, pdal translate recognizes PCD format by extension (12:50:11)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #244 from PDAL/issue/243-pcd-writer (12:37:42)
+	* Bradley J Chambers <brad.chambers at gmail.com> resolve #243, missing PCD header (12:14:36)
+
+2014-02-14
+	* Howard Butler <hobu.inc at gmail.com> add missing data (12:01:15)
+	* Howard Butler <hobu.inc at gmail.com> make filters.mosaic work more better. Provide an example of a mosaic that creates new dimensions, filters data, and updates one leg of the filters.mosaic with Python (11:48:32)
+	* Howard Butler <hobu.inc at gmail.com> beef up error detection in cases where Python array types don't match PDAL dimension types (11:41:55)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE so we can get some output when failures happen (11:38:59)
+	* Howard Butler <hobu.inc at gmail.com> fix up exception throwing to actually throw useful exceptions (11:38:17)
+	* Howard Butler <hobu.inc at gmail.com> throw exceptions when random iterators are not found for filters.programmable and filters.predicate (11:37:28)
+
+2014-02-12
+	* Bradley J Chambers <brad.chambers at gmail.com> Initial implementation of the PCL Filter Block with sample pipelines, draft documentation, and representative unit tests. Vagrantfile is updated to also load and build PCL (required). (11:48:31)
+
+2014-02-10
+	* Howard Butler <hobu.inc at gmail.com> clean up a bunch of leaks (12:23:19)
+
+2014-02-08
+	* Howard Butler <hobu.inc at gmail.com> clean up cast alignment warnings by reinterpret_cast'ing the pointers to the appropriate type (21:56:52)
+	* Howard Butler <hobu.inc at gmail.com> fixup hexer define (21:28:51)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (21:13:39)
+	* Howard Butler <hobu.inc at gmail.com> update hexer detection code (21:13:24)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (21:02:18)
+	* Howard Butler <hobu.inc at gmail.com> more drivers.oci.writer testing (20:55:24)
+
+2014-02-05
+	* Howard Butler <hobu.inc at gmail.com> add more filters.chipper test (17:38:34)
+	* Howard Butler <hobu.inc at gmail.com> use std::stable_sort intead of std::sort to attempt to preserve ordering (17:37:50)
+	* Howard Butler <hobu.inc at gmail.com> forward getNumPoints() from previous stage for filters.chipper (17:35:34)
+	* Howard Butler <hobu.inc at gmail.com> clean up sign comparison warnings shown by external boost build (09:57:47)
+	* Howard Butler <hobu.inc at gmail.com> put PDAL_EMBED_BOOST ahead of pdal_options so it can be used to determine boost linkage #242 (09:20:59)
+
+2014-02-04
+	* Howard Butler <hobu.inc at gmail.com> do LINK_PUBLIC in situations where PDAL_EMBED_BOOST isn't on (11:20:43)
+
+2014-02-03
+	* Howard Butler <howard at hobu.co> Merge pull request #241 from PDAL/issues/241-fixup-mrsid (16:28:51)
+	* Howard Butler <hobu.inc at gmail.com> fixup drivers.mrsid.reader for #241 -- don't know if actually works though, no tests (15:15:21)
+	* Howard Butler <hobu.inc at gmail.com> put back 23dbaf to silence annoying warnings (15:14:45)
+
+2014-01-31
+	* Howard Butler <howard at hobu.co> Merge pull request #239 from dakcarto/swig-fix (10:45:44)
+	* Howard Butler <hobu.inc at gmail.com> rename EPS variable to prevent a name collision (08:37:35)
+
+2014-01-30
+	* Larry Shaffer <larrys at dakotacarto.com> Fix swig module naming and include path (16:46:10)
+	* Howard Butler <hobu.inc at gmail.com> wtf is with the ` at the beginning and end of the file? -- fixed (14:06:40)
+	* Howard Butler <hobu.inc at gmail.com> update to latest nanoflan (13:57:01)
+
+2014-01-28
+	* Howard Butler <hobu.inc at gmail.com> add crop and hole example (12:37:29)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (10:22:18)
+	* Howard Butler <howard at hobu.co> Merge pull request #238 from PDAL/issues/238-pkg-config-for-pdal (10:21:49)
+
+2014-01-27
+	* Howard Butler <hobu.inc at gmail.com> a passable pgk-config for PDAL #238 (15:44:09)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (13:32:17)
+	* Howard Butler <howard at hobu.co> Merge pull request #228 from PDAL/issues/228-common-include (13:31:46)
+	* Howard Butler <hobu.inc at gmail.com> only include base stuff in <pdal/pdal.hpp>, not Drivers, Filters, and Kernel, which a user can include separately as needed (13:29:38)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/228-common-include (12:52:10)
+	* Howard Butler <howard at hobu.co> Merge pull request #237 from PDAL/tweaking-cmake-files (12:35:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> linking PDAL_UTILITY against Boost appears to have been the source of all the havoc (11:52:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> if (NOT PDAL_BUILD_STATIC) seemed a little confusing; also seeing if the boost linkage is the problem with the build (10:44:01)
+	* Bradley J Chambers <brad.chambers at gmail.com> tests don't fail locally, perhaps this has something to do with the unit tests being installed, or linked with boost libraries multiple times, let's try without the macro (09:56:14)
+	* Bradley J Chambers <brad.chambers at gmail.com> related to #234 and #235, CMake "improvements" (09:10:43)
+
+2014-01-26
+	* Howard Butler <hobu.inc at gmail.com> don't alloc a new std::string copy of the patch's hex data (22:23:30)
+	* Howard Butler <hobu.inc at gmail.com> fix up vector resize() to 0 so that we can push_back the new bytes as we decode them (21:38:21)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/228-common-include (11:26:28)
+	* Howard Butler <hobu.inc at gmail.com> don't do as much work when copying hex data from pg (11:21:58)
+	* Howard Butler <hobu.inc at gmail.com> memoize the encoded offset vector into schema::DimensionMap so it is updated every time a pair is inserted rather than every time copyLikeDimensions is called (10:31:52)
+
+2014-01-25
+	* Uday Verma <uday.karan at gmail.com> Get rid of std::vector in copyLikeDimenions, use a local array instead (14:10:35)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:27:58)
+	* Howard Butler <howard at hobu.co> Merge pull request #236 from verma/master (13:27:50)
+	* Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'verma/master' (13:20:30)
+	* Uday Verma <uday.karan at gmail.com> copyLikeDimension fast paths and special cases with elaborate unit tests (13:08:28)
+
+2014-01-24
+	* Howard Butler <howard at hobu.co> Merge pull request #235 from PDAL/issues/234-missing-lib-directory (15:39:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> build/install directories are still a bit of mess, but should be working on windows now (15:30:56)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:55:02)
+	* Howard Butler <hobu.inc at gmail.com> use boost::shared_array to back PointBuffer (14:54:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> make CMake aware of possible OSGeo4W64 installation path (14:35:05)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #233 from PDAL/issues/231-conditional-linkage (14:32:45)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #232 from PDAL/issues/230-missing-export (14:32:18)
+	* Bradley J Chambers <brad.chambers at gmail.com> only link LASzip and python when selected #231 (12:44:55)
+	* Bradley J Chambers <brad.chambers at gmail.com> add PDAL_DLL to Query and IndexedPointBuffer #230 (12:39:04)
+	* Howard Butler <hobu.inc at gmail.com> output correct number in error reporting in descaling ops (10:27:28)
+
+2014-01-23
+	* Howard Butler <hobu.inc at gmail.com> use static PointBuffer::pack method and reuse buffer so as to not keep alloc'ing it over and over (17:26:07)
+	* Howard Butler <hobu.inc at gmail.com> provide new static implementation of PointBuffer::pack that doesn't always create a new PointBuffer, use that for class method call (17:25:43)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Syntax error (13:47:29)
+
+2014-01-21
+	* Howard Butler <hobu.inc at gmail.com> cleanup #229 to output correct hex and always construct insert statement in the same string (13:30:10)
+	* Howard Butler <hobu.inc at gmail.com> update 'make publish' target of docs (11:56:39)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (11:50:57)
+
+2014-01-20
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge pull request #229 from PDAL/issues/229-speedup-pgpointcloud (23:06:58)
+	* Howard Butler <hobu.inc at gmail.com> optimize pgpointcloud insert #229 (22:53:35)
+	* Howard Butler <hobu.inc at gmail.com> remove unnecessary includes (17:05:05)
+	* Howard Butler <hobu.inc at gmail.com> start on a common #include <pdal/pdal.hpp> for external  usage #228 (17:02:16)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (11:49:08)
+	* Howard Butler <hobu.inc at gmail.com> publish to gh-pages instead of master for pdal.github.io (11:26:52)
+	* Howard Butler <hobu.inc at gmail.com> doc update to writer tutorial (09:06:37)
+
+2014-01-19
+	* Howard Butler <hobu.inc at gmail.com> attempt to go back to publishing to pdal.github.io.git repo (12:20:46)
+
+2014-01-18
+	* Howard Butler <hobu.inc at gmail.com> another publish attempt (18:50:33)
+	* Howard Butler <hobu.inc at gmail.com> another attempt at getting a gh-pages workflow working on a cron (17:22:29)
+	* Howard Butler <hobu.inc at gmail.com> Revert "checkout as orphan for gh-pages" (17:17:00)
+	* Howard Butler <hobu.inc at gmail.com> Revert "put checkout on clone target for doc building" (17:16:51)
+	* Howard Butler <hobu.inc at gmail.com> put checkout on clone target for doc building (16:42:57)
+	* Howard Butler <hobu.inc at gmail.com> checkout as orphan for gh-pages (16:31:35)
+	* Howard Butler <hobu.inc at gmail.com> fix copy/paste error in 1e64d3fcef78c8f3fbd0cd9aa8aeaa7d3d5385d4 (16:28:40)
+	* Howard Butler <hobu.inc at gmail.com> throw an error about finding pcid==0 (10:30:59)
+	* Howard Butler <hobu.inc at gmail.com> support RGB values that have dimension sizes other than uint16_t (10:30:35)
+	* Howard Butler <hobu.inc at gmail.com> fix typo in 88b0666c6823b70ea9f32119f4611106d7a91627 (08:22:08)
+	* Howard Butler <hobu.inc at gmail.com> add Dimension::getInterpretationName() test (08:20:57)
+
+2014-01-14
+	* Howard Butler <hobu.inc at gmail.com> update testoutput (16:51:08)
+	* Howard Butler <hobu.inc at gmail.com> ::toRST() tweaks (16:39:28)
+	* Howard Butler <hobu.inc at gmail.com> use Schema::toRST to output the --schema information (16:31:50)
+	* Howard Butler <hobu.inc at gmail.com> implement pdal::Schema::toRST() to output the Schema object as reStructuredText (16:31:20)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:30:48)
+	* Howard Butler <hobu.inc at gmail.com> doc updates (10:32:17)
+	* Howard Butler <hobu.inc at gmail.com> select time as 2, 4, or 8 byte value in drivers.las.writer (09:34:12)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:08:43)
+	* Howard Butler <hobu.inc at gmail.com> provide do_normalize_xyz option, on by default, to normalize drivers.oci.reader xyz data when the scales are changing (09:08:31)
+
+2014-01-13
+	* Howard Butler <hobu.inc at gmail.com> attempt to silence #pragma warnings for gcc < 4.6 (22:59:24)
+
+2014-01-12
+	* Howard Butler <hobu.inc at gmail.com> set namespace for any dimensions created by filters.selector (23:10:05)
+	* Howard Butler <hobu.inc at gmail.com> update doc publishing for pdal.github.io (14:31:59)
+
+2014-01-10
+	* Howard Butler <hobu.inc at gmail.com> turn off localse support in boost::filesystem due to https://svn.boost.org/trac/boost/ticket/9131 (10:43:04)
+	* Howard Butler <hobu.inc at gmail.com> add a more rigorous drivers.oci.reader/writer test (08:50:37)
+	* Howard Butler <hobu.inc at gmail.com> manage schema::DimensionMap* as a boost::shared_ptr (08:50:20)
+	* Howard Butler <hobu.inc at gmail.com> select correct data type in filters.scaling test (08:49:42)
+	* Howard Butler <hobu.inc at gmail.com> select appropriate data types from nitf file in test (08:48:54)
+	* Howard Butler <hobu.inc at gmail.com> if requested data type is greater than the Dimension::getByteSize(), throw an error for setField (08:48:25)
+	* Howard Butler <hobu.inc at gmail.com> add GEOS C++ headers to install list (08:47:38)
+
+2014-01-09
+	* Howard Butler <hobu.inc at gmail.com> use a shared_ptr to keep track of DimensionMap stuff (17:11:09)
+	* Howard Butler <hobu.inc at gmail.com> clean up dimension maps in drivers.oci.reader (17:05:37)
+	* Howard Butler <hobu.inc at gmail.com> force destruction of iterator (17:01:10)
+	* Howard Butler <hobu.inc at gmail.com> clean up some memory leaks in drivers.oci (16:55:31)
+	* Howard Butler <hobu.inc at gmail.com> use pdal::GlobalEnvironment GDAL object for logging instead of custom one in stage (16:33:46)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:17:23)
+	* Howard Butler <hobu.inc at gmail.com> First phase of #224 reST for PDAL (16:16:30)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/224-rest-for-pdal-info (16:11:24)
+	* Howard Butler <hobu.inc at gmail.com>     upgrade to boost 1.55 #226     clean up warnings related to boost upgrade     fix up CMake PUBLIC/PRIVATE linkage (16:07:37)
+	* Howard Butler <hobu.inc at gmail.com> more oracle example (09:45:15)
+	* Howard Butler <hobu.inc at gmail.com> trap descaling overflow errors (09:45:01)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:44:47)
+
+2014-01-08
+	* Howard Butler <hobu.inc at gmail.com> update f470bf81eb736e68d88bb8e250bcf5bce83b6daa to put inside a if statement (13:01:15)
+	* Howard Butler <hobu.inc at gmail.com> throw an exception if we might overflow capacity. Set PointSourceId to uint16_t or uint32_t depending on the dimension's size (11:22:59)
+	* Howard Butler <hobu.inc at gmail.com> don't setField with T's that don't match the dim.getByteSize() (11:22:06)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:21:40)
+	* Howard Butler <hobu.inc at gmail.com> set the PointBuffer's point count when reading data in the filters.chipper (08:50:40)
+
+2014-01-07
+	* Howard Butler <hobu.inc at gmail.com> add start of tutorial doc (16:58:24)
+	* Howard Butler <hobu.inc at gmail.com> default to 0.001 for the scale for drivers.qfit.reader.Z and apply the scaling appropriately when setting values in the reader (16:48:12)
+	* Howard Butler <hobu.inc at gmail.com> don't trust the PointBuffer's point count, as some stages may not have it set yet (14:40:04)
+	* Howard Butler <hobu.inc at gmail.com> try updating befor fetching packages (12:38:50)
+	* Howard Butler <hobu.inc at gmail.com> add software-properties-common before python ones (12:35:10)
+	* Howard Butler <hobu.inc at gmail.com> add filters.stats to read example (11:33:58)
+	* Howard Butler <hobu.inc at gmail.com> clean up exact count vs explicit dimension stuff a little bit and fix what was broken in 14ffc86132f09a375d01d216513f6793827fd9f7 (11:33:46)
+	* Howard Butler <hobu.inc at gmail.com> update to point at http://pdal.io (09:55:28)
+
+2014-01-06
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:15:02)
+	* Howard Butler <hobu.inc at gmail.com> set global_encoding to 0 if the data.size() is 0 too (14:14:53)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into issues/224-rest-for-pdal-info (08:43:46)
+	* Howard Butler <hobu.inc at gmail.com> don't segfault when a pcid cannot be selected in drivers.pgpointcloud.reader (08:08:36)
+
+2014-01-03
+	* Howard Butler <hobu.inc at gmail.com> drivers/options doesn't hang on main app (13:59:50)
+	* Howard Butler <hobu.inc at gmail.com> output to stream, not std::cout (13:59:30)
+	* Howard Butler <hobu.inc at gmail.com> update stage links (13:59:13)
+	* Howard Butler <hobu.inc at gmail.com> reorganize --options and --drivers output (13:24:28)
+	* Howard Butler <hobu.inc at gmail.com> add libgeos++-dev to travis (09:20:10)
+
+2014-01-02
+	* Howard Butler <hobu.inc at gmail.com> add libgeos to travis (20:15:18)
+	* Howard Butler <hobu.inc at gmail.com> use different GEOS include location (20:09:53)
+	* Howard Butler <hobu.inc at gmail.com> make filters.stats use dimension::applyScaling like everything else (20:06:12)
+	* Howard Butler <hobu.inc at gmail.com> beef up --report-debug info to include all linked libraries and some of their version information (20:00:43)
+	* Howard Butler <hobu.inc at gmail.com> update test output (18:50:27)
+	* Howard Butler <hobu.inc at gmail.com> provide reST output for point summaries -- pdal info myfile.las -p 10-20 (16:40:14)
+	* Howard Butler <hobu.inc at gmail.com> move wordWrap into Utils:: (16:39:43)
+	* Howard Butler <hobu.inc at gmail.com> forward the prevStage random iterator for filters.stats (16:38:51)
+	* Howard Butler <hobu.inc at gmail.com> don't do copyPointFast for DIMENSION_INTERLEAVED data (16:38:28)
+	* Howard Butler <hobu.inc at gmail.com> support setting integer global_encoding values for #218 (09:05:20)
+
+2014-01-01
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/207-1.0.0-doc-updates (10:01:29)
+
+2013-12-31
+	* Howard Butler <hobu.inc at gmail.com> update (c) date (15:26:54)
+	* Howard Butler <hobu.inc at gmail.com> add CMake configuration to find MessagePack library (13:29:24)
+	* Howard Butler <hobu.inc at gmail.com> add publish method for publishing website to pdal.github.io (12:24:17)
+
+2013-12-30
+	* Howard Butler <hobu.inc at gmail.com> fix up filters.stats to do selection of dimensions upon first buffer read rather than at initialize() time (14:10:11)
+
+2013-12-29
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'issues/216-flip-orientation' (14:20:42)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:33)
+	* Howard Butler <hobu.inc at gmail.com> fix up vagrant configuration a bit to protect my machine-specific and osx-specific stuff (14:20:28)
+	* Howard Butler <howard at hobu.co> Merge pull request #223 from tigerfoot/master (14:02:07)
+	* Bruno Friedmann <bruno at ioda-net.ch> Update conf.py fix issue 222 (13:44:25)
+	* Howard Butler <howard at hobu.co> Merge pull request #221 from tigerfoot/master (11:53:18)
+	* Bruno Friedmann <bruno at ioda-net.ch> Update pdal-config.in (11:51:29)
+
+2013-12-22
+	* Howard Butler <hobu.inc at gmail.com> use namespace-aware lookups for mapDimensions (15:06:46)
+	* Howard Butler <hobu.inc at gmail.com> add selector filters to drivers.oci examples (15:06:22)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (15:05:31)
+	* Howard Butler <hobu.inc at gmail.com> use boost type_traits instead of std:: which requires c++11 (15:05:03)
+
+2013-12-20
+	* Howard Butler <hobu.inc at gmail.com> filters.inplacereprojection reorganization (22:40:30)
+	* Howard Butler <hobu.inc at gmail.com> clean up asserts for getField/setField (22:40:03)
+	* Howard Butler <hobu.inc at gmail.com> clean up formatting (11:06:00)
+	* Howard Butler <hobu.inc at gmail.com> throw std::out_of_range error when removeScaling causes a value that's out of bounds for the given data type (09:44:29)
+
+2013-12-18
+	* Howard Butler <hobu.inc at gmail.com> properly calculate blob length for oracle's internal PointBuffer when data are DIMENSION_INTERLEAVED (11:22:13)
+	* Howard Butler <hobu.inc at gmail.com> use correct dimensions when testing flipping (11:19:10)
+	* Howard Butler <hobu.inc at gmail.com> use correct buffer when calculating point_data_length in non-packing scenario (11:18:52)
+	* Howard Butler <hobu.inc at gmail.com> add populate_pointsourceid to drivers.oci.reader example (11:17:33)
+	* Howard Butler <hobu.inc at gmail.com> properly pack/ignore dimensions in pack() (10:59:52)
+	* Howard Butler <hobu.inc at gmail.com> provide method to return raw starting point of m_data buffer (10:59:10)
+	* Howard Butler <hobu.inc at gmail.com> clean up filters.chipper to not require BlockID and PointID dimensions, respect the requested number of points read, and streamline GetIDs/GetBuffer (10:58:42)
+
+2013-12-17
+	* Howard Butler <hobu.inc at gmail.com> ByteSwap doesn't need chipper (13:32:34)
+
+2013-12-16
+	* Howard Butler <hobu.inc at gmail.com> update queries for drivers.oci tests (15:11:25)
+	* Howard Butler <hobu.inc at gmail.com> more filters.chipper test update for new chipper code (15:11:11)
+	* Howard Butler <hobu.inc at gmail.com> significant cleanups in filters.chipper (15:07:53)
+	* Howard Butler <hobu.inc at gmail.com> pack() method optionally removes ignored dimensions by default (15:07:35)
+	* Howard Butler <hobu.inc at gmail.com> assert we're not outside the buffer's bounds in setDataStride (10:19:10)
+
+2013-12-13
+	* Howard Butler <hobu.inc at gmail.com> more filters.chipper cleanups (19:29:50)
+	* Howard Butler <hobu.inc at gmail.com> resize the internal buffer if it isn't big enough. cleanups and use copyLikeDimensions (18:15:18)
+	* Howard Butler <hobu.inc at gmail.com> filters.chipper cleanups (18:04:00)
+	* Howard Butler <hobu.inc at gmail.com> support writing non-chipped data, use the appropriate blob length for DIMENSION_INTERLEAVED data in all scenarios (13:48:56)
+	* Howard Butler <hobu.inc at gmail.com> assert same orientations for copyPoint*Fast methods (12:55:34)
+
+2013-12-12
+	* Howard Butler <hobu.inc at gmail.com> more test of copyLikeDimensions (11:14:59)
+
+2013-12-11
+	* Howard Butler <hobu.inc at gmail.com> more testing of flipping (17:18:04)
+
+2013-12-10
+	* Paul Ramsey <pramsey at cleverelephant.ca> Minor config changes (11:37:29)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (10:25:52)
+
+2013-12-09
+	* Howard Butler <hobu.inc at gmail.com> because of DIMENSION_INTERLEAVED data, we must read the whole blob into the m_oracle_buffer #216 (14:18:43)
+
+2013-12-06
+	* Howard Butler <hobu.inc at gmail.com> provide implementation of drivers.oci.reader that can read DIMENSION_INTERLEAVED data #216 (23:28:53)
+	* Howard Butler <hobu.inc at gmail.com> test all values in flipped dimension example (23:27:01)
+	* Howard Butler <hobu.inc at gmail.com> properly calculate positions when doing setDataStride and copyLikeDimensions (23:25:22)
+	* Howard Butler <hobu.inc at gmail.com> add option to ignore namespace when doing dimension matching #216 (23:24:50)
+	* Howard Butler <hobu.inc at gmail.com> make cleanup.sql actually wipe sdo_geom_metadata entry (11:02:50)
+	* Howard Butler <hobu.inc at gmail.com> more thorough test of copyLikeDimensions to include orientation (09:54:42)
+	* Howard Butler <hobu.inc at gmail.com> fix up setDataStride to do the right thing in the face of differing orientations. Make copyLikeDimensions agnostic to the PointBuffer's orientation (09:54:20)
+
+2013-12-05
+	* Howard Butler <hobu.inc at gmail.com> add dimension flipping to drivers.oci.writer #216 (16:22:27)
+	* Howard Butler <hobu.inc at gmail.com> write orientation into XML for #216 (13:55:17)
+	* Howard Butler <hobu.inc at gmail.com> provide implemention for #216 to flip the orientation of both dimension- and point-interleaved data (11:47:18)
+
+2013-12-04
+	* Howard Butler <hobu.inc at gmail.com> used PointBuffer::pack instead of custom packing stuff (12:13:16)
+	* Howard Butler <hobu.inc at gmail.com> PointBuffer::pack returns heap-allocated buffer now (12:12:50)
+	* Howard Butler <hobu.inc at gmail.com> use scoped_ptr to manage packed buffer lifetime (12:12:30)
+	* Howard Butler <hobu.inc at gmail.com> PointBuffer::pack() should return heap-allocated buffer so multiple copies aren't made (10:56:05)
+
+2013-12-03
+	* Howard Butler <hobu.inc at gmail.com> provide patch for #217 to set the dimension count for the schema appropriately (22:41:34)
+
+2013-12-02
+	* Howard Butler <hobu.inc at gmail.com> put copyLikeDimensions behavior back to not updating point count #215 (17:03:05)
+	* Howard Butler <hobu.inc at gmail.com> code de-crufting (17:02:12)
+	* Howard Butler <hobu.inc at gmail.com> typo in pgpointcloud reader (16:34:43)
+	* Howard Butler <hobu.inc at gmail.com> Pack out ignored dimensions when inserting data into pgpointcloud. Turn down debugging lint on drivers.pgpointcloud.reader PointBuffer::pack() packs down to the getNumPoints of a PointBuffer (15:51:53)
+
+2013-11-27
+	* Howard Butler <hobu.inc at gmail.com> attempt to resolve #214, where override offsets are not being used (12:54:55)
+
+2013-11-25
+	* Howard Butler <hobu.inc at gmail.com> copyLikeDimensions updates the dest_buffer getNumPoints #209 (14:37:28)
+	* Howard Butler <hobu.inc at gmail.com> warning fixes (14:29:18)
+	* Howard Butler <hobu.inc at gmail.com> more vagrant fixes for #212 (14:29:03)
+	* Howard Butler <howard at hobu.co> Merge pull request #212 from PDAL/issues/212-vert-datum-vagrant (13:47:25)
+	* Howard Butler <hobu.inc at gmail.com> Add support for fetching vertical datum information for proj #212 (13:19:19)
+
+2013-11-24
+	* Howard Butler <howard at hobu.co> Merge pull request #210 from PDAL/issues/210-drivers.oci.reader-OCILobRead2 (14:39:33)
+	* Howard Butler <hobu.inc at gmail.com> move CompressionType into pdal::schema rather than in the pgpointcloud driver by itself #211 (14:39:14)
+	* Howard Butler <hobu.inc at gmail.com> Implement proper call for OCILobRead2 #210 (14:11:45)
+
+2013-11-22
+	* Howard Butler <hobu.inc at gmail.com> PointBuffer/Schema orientation  #209. A PointBuffer may be POINT_INTERLEAVED or DIMENSION_INTERLEAVED with the default being POINT_INTERLEAVED. (18:58:33)
+	* Howard Butler <howard at hobu.co> Merge pull request #208 from PDAL/issues/208-stats-sample-suppression (12:42:59)
+
+2013-11-18
+	* Howard Butler <hobu.inc at gmail.com> --sample needed to get a sample for stats #208 (15:53:21)
+	* Howard Butler <hobu.inc at gmail.com> add a --sample option to 'pdal info', which is off by default for data output #208 (15:44:23)
+	* Howard Butler <hobu.inc at gmail.com> clang'ify warning suppression (15:34:53)
+	* Howard Butler <hobu.inc at gmail.com> update AUTHORS with current listing (15:34:38)
+	* Howard Butler <hobu.inc at gmail.com> try to silence some more warnings in prep for 1.0.0 (14:37:55)
+	* Howard Butler <hobu.inc at gmail.com> big warning cleanup in preparation for 1.0.0 (14:14:18)
+	* Howard Butler <hobu.inc at gmail.com> remove unused variable, initialize xyz values outside the loop (11:52:00)
+	* Howard Butler <hobu.inc at gmail.com> remove unused variable (11:45:31)
+	* Howard Butler <hobu.inc at gmail.com> Documentation updates in prep for 1.0.0 #207 (11:02:50)
+	* Howard Butler <hobu.inc at gmail.com> add laszip note to dependencies (10:19:18)
+
+2013-11-15
+	* Howard Butler <hobu.inc at gmail.com> doc updates for #207 (23:28:00)
+	* Howard Butler <howard at hobu.co> Merge pull request #196 from PDAL/issues/196-las-global_encoding (15:42:17)
+	* Howard Butler <hobu.inc at gmail.com> provide implementation to resolve #196 by using binary encoding instead of integers for global_encoding (15:34:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #206 from PDAL/issues/206-libgeotiff-cpl_serv (14:37:36)
+	* Howard Butler <hobu.inc at gmail.com> #define CPL_SERV_H_INCLUDED before including geotiff headers to make #206 work (14:20:16)
+	* Howard Butler <hobu.inc at gmail.com> Implement #205 to turn on most common options by default (09:46:40)
+
+2013-11-13
+	* Howard Butler <howard at hobu.co> Merge pull request #204 from PDAL/issues/204-cpack-configuration (14:05:13)
+	* Howard Butler <hobu.inc at gmail.com> fix up cpack configuration to have a 'make dist' command after configuration #204 (13:47:39)
+	* Howard Butler <howard at hobu.co> Merge pull request #203 from PDAL/issues/203-pipeline-serialization-info (10:02:42)
+	* Howard Butler <hobu.inc at gmail.com> make pdal info --stats myfile.xml --pipeline-serialization work #203 (09:09:23)
+	* Howard Butler <hobu.inc at gmail.com> make registerPluginIfExists private (09:07:45)
+
+2013-11-12
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (17:57:56)
+	* Howard Butler <howard at hobu.co> Merge pull request #202 from PDAL/issues/202-add-md5ing (08:42:35)
+	* Howard Butler <hobu.inc at gmail.com> add md5'ing algorithm for #202 (08:33:15)
+
+2013-11-10
+	* Howard Butler <howard at hobu.co> Merge pull request #201 from PDAL/issues/201-rename-soci-driver (11:26:30)
+	* Howard Butler <hobu.inc at gmail.com> move drivers.soci.* to drivers.sqlite for #201 (10:56:02)
+
+2013-11-08
+	* Howard Butler <hobu.inc at gmail.com> just pass in argv with a count instead of our own copy of arguments (11:19:08)
+
+2013-11-07
+	* Howard Butler <hobu.inc at gmail.com> #ifdef libxml2 stuff for when we don't have it (16:14:19)
+	* Howard Butler <hobu.inc at gmail.com> fetch as vagrant user too (13:04:43)
+	* Howard Butler <hobu.inc at gmail.com> fix up pdal::drivers::las::SummaryData (13:01:08)
+	* Howard Butler <hobu.inc at gmail.com> run load command as vagrant user (13:00:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add test case for subtle bounds change (09:34:16)
+
+2013-11-06
+	* Howard Butler <hobu.inc at gmail.com> create extension as vagrant user for vagrant install (15:22:07)
+	* Howard Butler <hobu.inc at gmail.com> more vagrant updates (14:55:56)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:08:55)
+
+2013-11-05
+	* Howard Butler <hobu.inc at gmail.com> more doc updates (16:57:23)
+
+2013-11-04
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:50:31)
+	* Howard Butler <hobu.inc at gmail.com> output first read point (16:50:20)
+	* Howard Butler <hobu.inc at gmail.com> vagrant doc tweaks (15:46:39)
+	* Howard Butler <hobu.inc at gmail.com> fix up pgpointcloud build, add read xml example (15:25:16)
+	* Howard Butler <hobu.inc at gmail.com> add doc about Vagrant (15:25:03)
+	* Howard Butler <hobu.inc at gmail.com> add pgpointcloud to Vagrant config (14:45:59)
+	* Howard Butler <hobu.inc at gmail.com> fix Vagrantfile typo (14:11:37)
+	* Howard Butler <hobu.inc at gmail.com> add pgpointcloud to vagrant buildout (14:00:00)
+
+2013-10-30
+	* Paul Ramsey <pramsey at opengeo.org> Clean up example config a little (11:52:32)
+
+2013-10-24
+	* Howard Butler <howard at hobu.co> Merge pull request #199 from PDAL/issues/199-las-version (15:33:59)
+	* Howard Butler <hobu.inc at gmail.com> increment version to 0.9.9 (15:23:42)
+	* Howard Butler <hobu.inc at gmail.com> output a proper PDAL version number with git sha by default for software id (15:23:34)
+
+2013-10-21
+	* Howard Butler <hobu.inc at gmail.com> Add a Vagrant configuration and rename the 'pcinfo', 'pcpipeline', and 'pc2pc' applications into a single, git-style 'pdal' command #192 (16:01:52)
+
+2013-10-11
+	* Howard Butler <hobu.inc at gmail.com> filters.index is no more. Use the IndexedPointBuffer instead (15:22:16)
+	* Howard Butler <hobu.inc at gmail.com> fix up dimensionality so both 2d and 3d indexes work properly (14:58:28)
+	* Howard Butler <hobu.inc at gmail.com> make IndexedPointBuffer based on nanoflann instead of FLANN to remove external dependency #176 (14:08:48)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:56:25)
+	* Howard Butler <hobu.inc at gmail.com> update blocksize parameter (09:56:18)
+	* Howard Butler <hobu.inc at gmail.com> remove ticks (09:52:56)
+	* Howard Butler <hobu.inc at gmail.com> update nanoflann (09:52:13)
+
+2013-10-10
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (13:29:09)
+	* Paul Ramsey <pramsey at opengeo.org> drivers.text.writer (13:28:00)
+	* Howard Butler <hobu.inc at gmail.com> don't throw in filters.hexer's destructor (11:38:51)
+	* Howard Butler <hobu.inc at gmail.com> Fix #194, default to specified offsets instead of throwing an exception when their reprojection fails (11:30:26)
+	* Howard Butler <howard at hobu.co> Merge pull request #193 from PDAL/issues/193-populate-pointsourceid (11:50:32)
+	* Howard Butler <howard at hobu.co> Merge pull request #195 from PDAL/issues/195-reproject-offsets (11:39:19)
+	* Howard Butler <hobu.inc at gmail.com> don't throw in filters.hexer's destructor (11:38:51)
+	* Howard Butler <hobu.inc at gmail.com> Fix #194, default to specified offsets instead of throwing an exception when their reprojection fails (11:30:26)
+
+2013-10-09
+	* Paul Ramsey <pramsey at opengeo.org> drivers.qfit.reader (17:25:02)
+	* Paul Ramsey <pramsey at opengeo.org> p2g writer (17:12:57)
+	* Howard Butler <hobu.inc at gmail.com> do a proper check to find out of PointSourceId dimension is available for #193 (15:52:57)
+	* Paul Ramsey <pramsey at opengeo.org> drivers.qfit.reader (17:25:02)
+	* Paul Ramsey <pramsey at opengeo.org> p2g writer (17:12:57)
+	* Paul Ramsey <pramsey at opengeo.org> OCI writer (16:40:32)
+	* Howard Butler <hobu.inc at gmail.com> do a proper check to find out of PointSourceId dimension is available for #193 (15:52:57)
+	* Paul Ramsey <pramsey at opengeo.org> OCI reader (15:49:57)
+	* Paul Ramsey <pramsey at opengeo.org> NITF reader/writer (15:35:02)
+	* Paul Ramsey <pramsey at opengeo.org> Faux reader/writer (15:02:26)
+	* Paul Ramsey <pramsey at opengeo.org> CARIS readers (14:46:09)
+	* Paul Ramsey <pramsey at opengeo.org> Hexbin and pics for colorization (14:30:35)
+	* Paul Ramsey <pramsey at opengeo.org> Format programmable (14:03:09)
+	* Paul Ramsey <pramsey at opengeo.org> Splng error (13:42:09)
+	* Paul Ramsey <pramsey at opengeo.org> Note on chipper/cache combo (13:38:44)
+	* Paul Ramsey <pramsey at opengeo.org> Formatting fixes (13:37:01)
+	* Paul Ramsey <pramsey at opengeo.org> Add filters.scaling (13:14:40)
+	* Paul Ramsey <pramsey at opengeo.org> Add filters.colorization (12:51:09)
+
+2013-10-08
+	* Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'docs' (23:31:41)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Add filters.color (16:27:48)
+	* Paul Ramsey <pramsey at cleverelephant.ca> Add Cache filter (16:16:14)
+	* Howard Butler <howard at hobu.co> Merge pull request #191 from PDAL/issues/191-remove-pcquery (15:48:32)
+	* Howard Butler <howard at hobu.co> move pcquery capability into pcinfo, remove pcquery for #191 (13:41:32)
+	* Howard Butler <howard at hobu.co> move pcquery capability into pcinfo, remove pcquery for #191 (13:32:24)
+	* Howard Butler <howard at hobu.co> Merge pull request #190 from PDAL/issues/190-rename-pcinfo (11:41:38)
+	* Howard Butler <howard at hobu.co> rename pcinfo to pdalinfo #190 (11:34:30)
+	* Howard Butler <howard at hobu.co> Merge pull request #189 from PDAL/issues/189-move-dimensionmap (11:29:14)
+	* Howard Butler <howard at hobu.co> remove cruft (11:11:00)
+	* Howard Butler <howard at hobu.co> missed a mapDimensions call (11:07:48)
+	* Howard Butler <howard at hobu.co> move mapDimensions to pdal::Schema #189 (11:01:59)
+	* Howard Butler <howard at hobu.co> put FLANN stuff inside the guard to fix #188 (08:56:10)
+
+2013-10-07
+	* Howard Butler <howard at hobu.co> more dox (17:59:28)
+	* Howard Butler <howard at hobu.co> doc churn (17:59:20)
+	* Howard Butler <howard at hobu.co> support --2d method for pcequal #176 (14:25:03)
+	* Howard Butler <howard at hobu.co> use the IndexedPointBuffer to provide indexing to pcequal #176 (14:09:31)
+	* Howard Butler <howard at hobu.co> make sure to initialize IndexPointBuffer constructors to 0 (13:41:21)
+	* Howard Butler <howard at hobu.co> Cleanup destructor issues described in #183 (13:09:10)
+	* Howard Butler <howard at hobu.co> remove Stage::toPTree(). Not really used, and it is a ton of redundant fluff throughout the codebase (13:00:54)
+	* Howard Butler <howard at hobu.co> dox work (12:20:47)
+	* Howard Butler <howard at hobu.co> const& normalization (12:20:39)
+	* Howard Butler <howard at hobu.co> more dox work (12:20:12)
+	* Howard Butler <howard at hobu.co> pdal::Writer documentation and cleanups (10:45:35)
+	* Howard Butler <howard at hobu.co> whitespace normalization, documentation, and cleanups of pdal::Writer (10:24:49)
+	* Howard Butler <howard at hobu.co> whitespace normalization (09:59:05)
+	* Howard Butler <howard at hobu.co> return a const& instead of a copy of the pdal::Schema for Reader::getSchema (09:37:19)
+	* Howard Butler <howard at hobu.co> turn off debug noise in soci test (09:08:21)
+	* Howard Butler <howard at hobu.co> turn off indexing test for now (09:08:08)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/176-PointBuffer-index (08:38:13)
+
+2013-10-05
+	* Howard Butler <howard at hobu.co> ifdef guard FLANN stuff for #185 (15:51:23)
+
+2013-10-04
+	* Howard Butler <howard at hobu.co> turn off flann test for now because travis isn't up to date yet (10:24:08)
+	* Howard Butler <howard at hobu.co> clean up destructor (10:15:36)
+	* Howard Butler <howard at hobu.co> ifdef guard FLANN, add destructor to PointBuffer (10:07:15)
+
+2013-10-03
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/176-PointBuffer-index (15:55:56)
+	* Howard Butler <howard at hobu.co> Merge pull request #184 from PDAL/issues/184-required-numpy (13:07:10)
+	* Howard Butler <howard at hobu.co> make numpy required when WITH_PYTHON is selected #184 (11:38:34)
+	* Howard Butler <howard at hobu.co> lingering sqlite writer fixups (11:17:38)
+	* Howard Butler <howard at hobu.co> Merge pull request #180 from PDAL/issues/180-sqlite-driver (11:16:44)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/180-sqlite-driver (10:49:42)
+	* Howard Butler <howard at hobu.co> Merge pull request #182 from PDAL/issues/182-cmake-cleanup (10:24:37)
+
+2013-10-02
+	* Howard Butler <howard at hobu.co> typo'd 08fbaf4d839c6a52014e3b12d8823a41922e737f (16:58:41)
+	* Howard Butler <howard at hobu.co> fix pdal::poitncloud::DimensionMap member variable for rename in #181 (16:40:59)
+	* Howard Butler <howard at hobu.co> include_directories can't have empty strings, so unquote those for now (16:30:21)
+	* Howard Butler <howard at hobu.co> quote path names for #182 (13:24:39)
+	* Howard Butler <howard at hobu.co> a map to keep track of globally allocated memory segments (11:51:13)
+
+2013-10-01
+	* Howard Butler <howard at hobu.co> put DimensionMap and PointBufferByteSize into a pointbuffer:: namespace (16:01:40)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/181-boost-interprocess-pointbuffer (13:42:54)
+	* Howard Butler <howard at hobu.co> make sure to use 64bit math for calculating buffer position when reading data (13:05:24)
+	* Howard Butler <howard at hobu.co> tighten up the 64bit calculations for PointBuffer offsets (13:04:57)
+
+2013-09-27
+	* Howard Butler <howard at hobu.co> never add to cache from random iterator (14:58:38)
+	* Howard Butler <howard at hobu.co> some interprocess scaffolding, nothing done yet (08:36:15)
+
+2013-09-29
+	* Mateusz Loskot <mateusz at loskot.net> Do not ignore non-existent variables (17:01:17)
+
+2013-09-26
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/180-sqlite-driver (15:26:12)
+	* Howard Butler <howard at hobu.co> add large cache example (but mostly turned off for now due to the memory allocation taking forever (14:39:18)
+	* Howard Butler <howard at hobu.co> turn off radiusSearch because it is causing Travis to fail (14:33:59)
+
+2013-09-23
+	* Howard Butler <howard at hobu.co> can't call methods until we're actually constructed (19:18:49)
+	* Howard Butler <howard at hobu.co> clean up PointBuffer's byte size calculations to be more clear (08:59:47)
+	* Howard Butler <howard at hobu.co> turn off return number data checks for now (08:53:03)
+	* Howard Butler <howard at hobu.co> clean up dimension maps when destructing filters.cache iterator (08:52:37)
+
+2013-06-14
+	* Howard Butler <hobu.inc at gmail.com> merge 01c84eb5ebc2314c3afbae66e6c7db01a85b2c74 into master make sure to writeBufferBegin, even if we're not writing any points, so we can write 0-point files (15:39:24)
+	* Paul Ramsey <pramsey at opengeo.org> try to leak less on exception (18:55:20)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:31:33)
+	* Howard Butler <hobu.inc at gmail.com> return with what we've read if we read a new cloud (16:30:26)
+	* Paul Ramsey <pramsey at opengeo.org> Throw error messages using session (15:39:46)
+	* Howard Butler <hobu.inc at gmail.com> make sure to writeBufferBegin, even if we're not writing any points, so we can write 0-point files (15:39:24)
+
+2013-09-20
+	* Howard Butler <howard at hobu.co> clean up definition of buffer's byte sizes to use a single typedef instead of uint64_t's (11:50:56)
+
+2013-09-19
+	* Howard Butler <howard at hobu.co> Merge branch 'issues/177-scaling-filter' (12:01:36)
+
+2013-09-03
+	* Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+	* Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+	* Howard Butler <howard at hobu.co> some scaffolding for IndexedPointBuffer, including adding PointBuffer::applyScaling method to bring up from filters (15:06:14)
+	* Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+	* Howard Butler <howard at hobu.co> default to *not* doing sample for filters.stats -- too noisy and not useful for everyone (13:29:31)
+	* Howard Butler <howard at hobu.co> undo SYSTEM mark of boost include directories from #158 (13:00:36)
+	* Howard Butler <howard at hobu.co> undo SYSTEM mark of boost include directories from #158 (11:48:20)
+
+2013-09-17
+	* Howard Butler <hobu.inc at gmail.com> don't run soci test if no soci around (16:40:36)
+	* Howard Butler <hobu.inc at gmail.com> working drivers.soci.writer for #180 (16:29:43)
+
+2013-09-16
+	* Howard Butler <howard at hobu.co> properly size buffer when point count is large #123 (12:08:09)
+	* Howard Butler <howard at hobu.co> clean up used memory (12:07:23)
+
+2013-09-11
+	* Howard Butler <howard at hobu.co> Merge pull request #178 from klassenjs/master (13:56:05)
+	* James Klassen <klas0037 at umn.edu> Fix schema operator== comparing self with self and always returning true. (13:44:25)
+
+2013-09-06
+	* Howard Butler <howard at hobu.co> working radiusSearch implementation #176 (14:04:55)
+	* Howard Butler <howard at hobu.co> add note for #177 (13:25:34)
+	* Howard Butler <howard at hobu.co> FLANN-based index for nearest, not yet radius (13:16:34)
+
+2013-09-04
+	* Howard Butler <howard at hobu.co> remove dead getScaledValue code that has been put into PointBuffer::applyScaling so as to not copy it all over the place (07:53:07)
+
+2013-08-28
+	* Howard Butler <howard at hobu.co> turn off the sample if we explicitly list dimensions (12:31:35)
+	* Howard Butler <howard at hobu.co> support turning off the sample (12:31:25)
+	* Howard Butler <howard at hobu.co> support explicitly setting dimensions for stat filter (12:11:01)
+
+2013-08-27
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:24:18)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/124-p2g-intensity-interpolate (09:07:27)
+
+2013-08-26
+	* Howard Butler <howard at hobu.co> Merge pull request #173 from PDAL/issues/173-embed-string_ref (14:22:08)
+	* Howard Butler <howard at hobu.co> Use a pdal-namespaced string_ref instead of the one from system boost which is in flux right now #173 (12:00:13)
+
+2013-08-22
+	* Howard Butler <howard at hobu.co> fix up bad merge (15:23:23)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:19:44)
+	* Howard Butler <howard at hobu.co> put hex generation in destructor of iterator -- it has to happen after we've read all the points, and then it will update the metadata of the PointBuffer that was used to instantiate the interator (14:18:49)
+
+2013-08-21
+	* Howard Butler <howard at hobu.co> Merge pull request #171 from gadomski/astyle (14:52:22)
+	* Howard Butler <howard at hobu.co> Merge pull request #172 from gadomski/update-boost-version (14:34:19)
+	* Pete Gadomski <pete.gadomski at gmail.com> Update required boost version to 1.53 (14:05:33)
+
+2013-08-20
+	* Pete Gadomski <pete.gadomski at gmail.com> Run astyle on src/ and include/ files (15:40:25)
+
+2013-08-09
+	* Howard Butler <howard at hobu.co> don't pollute stdout (20:19:03)
+	* Howard Butler <howard at hobu.co> cumulate the entire bounds as we go through for the whole SDO_PC (19:39:06)
+
+2013-08-07
+	* Howard Butler <howard at hobu.co> optionally support chunk streaming -- inconclusive whether or not it is actually faster (09:21:47)
+	* Howard Butler <howard at hobu.co> remove cruft (08:45:03)
+	* Howard Butler <howard at hobu.co> move oracle_array example into test/unit/drivers/oci for safe (unused) keeping (08:43:34)
+
+2013-08-05
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/167-fixups-for-chipper (16:27:07)
+	* Howard Butler <hobu.inc at gmail.com> don't do conninfo parse if we don't have it (old libpq's). Fixes #169 (15:48:23)
+	* Howard Butler <hobu.inc at gmail.com> use PGPOINTCLOUD=ON in my default configuration (based on OSGeo4W (15:47:47)
+	* Howard Butler <hobu.inc at gmail.com> don't do perf tests on windows, some includes not available yet it seems (15:47:24)
+	* Howard Butler <hobu.inc at gmail.com> switch off gzip/zlib iostreams for now -- we're not using it (15:46:39)
+
+2013-08-01
+	* Howard Butler <howard at hobu.co> add blob_chunk_count option to drivers.oci.writer (13:24:44)
+	* Howard Butler <howard at hobu.co> Merge branch 'master' into issues/167-fixups-for-chipper (09:06:17)
+	* Howard Butler <howard at hobu.co> support chunk-based stream writing (09:06:01)
+
+2013-07-31
+	* Chris Foster <chris42f at gmail.com> Merge pull request #168 from c42f/pdal-static-build (23:26:52)
+	* Chris Foster <chris.foster at roames.com.au> Build system option for static PDAL build (21:58:50)
+	* Howard Butler <howard at hobu.co> try streaming-based LOB writing (15:26:30)
+	* Howard Butler <howard at hobu.co> include stdlib.h for exit() (13:29:30)
+
+2013-07-30
+	* Howard Butler <howard at hobu.co> put back writing to ONE_PIECE method (11:00:12)
+	* Howard Butler <howard at hobu.co> add oracle_array test util (10:59:56)
+
+2013-07-29
+	* Howard Butler <howard at hobu.co> start callback-based streaming method -- not yet implemented (21:11:02)
+	* Howard Butler <howard at hobu.co> clean up lint (21:10:32)
+	* Howard Butler <howard at hobu.co> write using OCILocator instead of data bind (19:53:35)
+	* Howard Butler <howard at hobu.co> add ability to control whether or not to create indices with 'create_index' option, allow user to turn on tracing with 'do_trace' option (15:20:20)
+
+2013-07-27
+	* Howard Butler <howard at hobu.co> revert to only supporting selecting the view and drop support for QUERY_SDO_PC query types (21:36:47)
+	* Howard Butler <howard at hobu.co> clean up binds (21:10:42)
+	* Howard Butler <howard at hobu.co> use OpenBlob/CloseBlob methods to reduce round-tripping to db (21:10:09)
+	* Howard Butler <howard at hobu.co> add OpenBlob/CloseBlob methods (21:09:45)
+
+2013-07-25
+	* Howard Butler <howard at hobu.co> don't allocate a vector for every point added to the loop in calculateBounds (21:05:43)
+	* Howard Butler <howard at hobu.co> use PointBuffer::calculateBounds instead of driver's version (20:57:16)
+	* Howard Butler <howard at hobu.co> oracle cleanup script tweak (19:50:39)
+	* Howard Butler <hobu.inc at gmail.com> allow specifying the 'Z' dimension name with an option for interpolation #124 (17:00:55)
+
+2013-07-08
+	* Howard Butler <hobu.inc at gmail.com> #ifdef the log output for filters.cache. This ends up being touched per-point and is expensive if you don't want it (16:32:39)
+
+2013-07-24
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'c42f-getDimension_optimization' (13:54:01)
+
+2013-07-22
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #165 from PDAL/issues/165-remove-chunk-size (10:04:45)
+
+2013-07-19
+	* Chris Foster <chris42f at gmail.com> Minor naming cleanups for clarity and consistency (21:41:01)
+	* Chris Foster <chris42f at gmail.com> Use string_ref in getDimensionOptional() for consistency (20:43:57)
+
+2013-07-18
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #166 from PDAL/issues/166-removeScaling-check (19:18:19)
+	* Howard Butler <hobu.inc at gmail.com> Turn off overflow checks in Dimension::removeScaling for now #166 (19:10:23)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/165-remove-chunk-size (15:41:25)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (15:41:05)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (09:21:52)
+	* Mateusz Loskot <mateusz at loskot.net> Enable Travis CI for pull requests (09:14:59)
+
+2013-07-17
+	* Howard Butler <hobu.inc at gmail.com> First attempt at removing Writer::chunk_size and instead making it a default argument to Writer::write() #146 @gadomski (18:55:00)
+	* Mateusz Loskot <mateusz at loskot.net> Invoke Travis scripts with bash -e (17:47:29)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:16:08)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #163 from gadomski/clean-up-after-geojson-test (11:15:52)
+	* Howard Butler <hobu.inc at gmail.com> remove bzip2 (unused) to fix #164 (11:15:25)
+	* Pete Gadomski <pete.gadomski at gmail.com> Delete temporary test file after use (10:46:21)
+	* Chris Foster <chris42f at gmail.com> Optimization: remove getDimension("<uuid-string>") (09:35:26)
+	* Chris Foster <chris42f at gmail.com> Fix bug which crept in when refactoring getDimension() (09:22:45)
+
+2013-07-16
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #161 from gadomski/remove-dup-cmake-code (12:37:24)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate lines from src/CMakeLists (12:27:19)
+
+2013-07-15
+	* Chris Foster <chris42f at gmail.com> getDimension perf tests + use string_ref for dimension names (10:35:18)
+
+2013-07-14
+	* Howard Butler <hobu.inc at gmail.com> remove ununsed ptr to environment, we can get this from the GlobalEnvironment anyway (09:07:31)
+	* Howard Butler <hobu.inc at gmail.com> point at local FLANN so warnings are gone (09:07:00)
+
+2013-07-13
+	* Chris Foster <chris42f at gmail.com> Merge remote-tracking branch 'upstream/master' into getDimension_optimization (20:07:04)
+
+2013-07-11
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #160 from PDAL/issues/160-upgrade-boost-154 (14:51:05)
+	* Howard Butler <hobu.inc at gmail.com> compile new additions for 1.54 (14:16:30)
+	* Howard Butler <hobu.inc at gmail.com> update script for bcp'ing 1.54 (13:03:21)
+	* Howard Butler <hobu.inc at gmail.com> increment boost to 1.54, add asio, string_ref, and regex (13:02:50)
+	* Chris Foster <chris42f at gmail.com> WIP optimizations to getDimension() (09:38:22)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #158 from c42f/cjf-warnings-fix (08:49:42)
+	* Chris Foster <chris42f at gmail.com> Avoid unnecessarily formatting in getDimension (08:49:22)
+	* Chris Foster <chris42f at gmail.com> Performance tests for chipper with & without cache (08:25:16)
+
+2013-07-04
+	* Chris Foster <chris42f at gmail.com> Fix various compiler warnings (07:50:42)
+
+2013-06-29
+	* Chris Foster <chris42f at gmail.com> Fix minor memory leak of stage factory (09:34:42)
+	* Chris Foster <chris42f at gmail.com> Allow SRS to be ignored in Mosaic filter (08:08:34)
+	* Chris Foster <chris42f at gmail.com> Fix segfault when reading from las into multiple buffers (00:35:50)
+
+2013-07-07
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #156 from gadomski/doc-fix (16:00:21)
+
+2013-07-06
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove note about pdal.hpp from docs — DNE (14:46:42)
+
+2013-07-05
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #155 from PDAL/issues/154-plugin-versioning (12:46:33)
+	* Howard Butler <hobu.inc at gmail.com> provide implementation for plugin versioning #154 (11:43:22)
+
+2013-07-03
+	* Mateusz Loskot <mateusz at loskot.net> Disable Travis CI notifications by e-mail (16:05:17)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #152 from PDAL/issues/152-is-embed-boost (15:52:37)
+	* Howard Butler <hobu.inc at gmail.com> Implement #152, denoting whether or not boost is built embedded (15:42:55)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #149 from pramsey/master (11:31:10)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #150 from PDAL/issues/150-RawByte (11:26:41)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #151 from gadomski/duplicate-lines-in-test-cmake (09:52:55)
+	* Howard Butler <hobu.inc at gmail.com> remove dimension::UnsignedByte and dimension::SignedByte and replace with dimension::RawByte (09:40:45)
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate lines from test CMakeLists (09:37:13)
+	* Howard Butler <hobu.inc at gmail.com> register driver info when we register Stages to factory (09:08:22)
+
+2013-07-02
+	* Paul Ramsey <pramsey at opengeo.org> In reprojection, sometimes the bounds dont follow min/max rules after the transform... (18:40:37)
+	* Howard Butler <hobu.inc at gmail.com> implement support for listing options/drivers from commandline #148 (14:11:24)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:11:48)
+	* Howard Butler <hobu.inc at gmail.com> remove unneeded includes (11:11:21)
+
+2013-07-01
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #146 from c42f/las_reader_cache_dim_fix (10:19:55)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #147 from c42f/mosaic_srs_ignore (09:48:00)
+
+2013-06-28
+	* Mateusz Loskot <mateusz at loskot.net> Always notify #pdal on successful build (17:22:59)
+	* Mateusz Loskot <mateusz at loskot.net> Update FindPostgreSQL.cmake definition (16:50:57)
+	* Mateusz Loskot <mateusz at loskot.net> Build with PostgreSQL Point Cloud support (16:07:04)
+	* Mateusz Loskot <mateusz at loskot.net> Build with FLANN support (14:06:48)
+	* Mateusz Loskot <mateusz at loskot.net> Replace deprecated command make_directory (13:59:43)
+
+2013-06-27
+	* Mateusz Loskot <mateusz at loskot.net> Create README.md (19:59:14)
+	* Mateusz Loskot <mateusz at loskot.net> Build libgeotiff from sources (19:33:41)
+	* Mateusz Loskot <mateusz at loskot.net> Test libtiff version (09:24:42)
+	* Mateusz Loskot <mateusz at loskot.net> Install libtiff4-dev (09:09:02)
+	* Mateusz Loskot <mateusz at loskot.net> Build only master (05:07:43)
+
+2013-06-26
+	* Mateusz Loskot <mateusz at loskot.net> Replace return 1 with exit 1 (19:37:10)
+	* Mateusz Loskot <mateusz at loskot.net> Return correct exit code on command failure (19:31:41)
+	* Mateusz Loskot <mateusz at loskot.net> Fix invalid find_path() option PATH_PREFIXES (19:26:00)
+	* Mateusz Loskot <mateusz at loskot.net> Install libgeotiff-dev (19:19:13)
+	* Mateusz Loskot <mateusz at loskot.net> Add missing value in -DWITH_LIBXML2=ON (19:14:31)
+	* Mateusz Loskot <mateusz at loskot.net> Call CMake with explicit dependencies (19:12:11)
+	* Mateusz Loskot <mateusz at loskot.net> Try libgdal from ubuntugis/ppa (18:25:54)
+	* Mateusz Loskot <mateusz at loskot.net> Enable verbose apt-get (17:18:01)
+	* Mateusz Loskot <mateusz at loskot.net> Install GDAL, PROJ.4 and libxml2 on Travis CI (17:04:39)
+	* Mateusz Loskot <mateusz at loskot.net> Disable timestamp echo. (15:50:20)
+	* Mateusz Loskot <mateusz at loskot.net> Enable make -j N (15:41:07)
+	* Mateusz Loskot <mateusz at loskot.net> Configure Travis CI for PDAL (14:45:14)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #144 from pramsey/offsetsrep (14:34:40)
+	* Mateusz Loskot <mateusz at loskot.net> Ignore mloskot's _build subdirectory (14:16:35)
+
+2013-06-25
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'pipelinedocs' (13:47:38)
+	* Paul Ramsey <pramsey at opengeo.org> Typo in filter name (13:46:15)
+	* Paul Ramsey <pramsey at opengeo.org> filters.byteswap (13:45:14)
+	* Paul Ramsey <pramsey at opengeo.org> Add filters.selector (13:29:26)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pipelinedocs (11:05:12)
+	* Howard Butler <hobu.inc at gmail.com> declare buffer as const (09:49:24)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:47:44)
+
+2013-06-24
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pipelinedocs (18:58:48)
+	* Paul Ramsey <pramsey at opengeo.org> Predicate and programmable filters (18:58:34)
+	* Paul Ramsey <pramsey at opengeo.org> Fix for #142, actually use the z_offset reference if requested (16:18:53)
+	* Paul Ramsey <pramsey at opengeo.org> Update options information for LAS writer (16:11:58)
+	* Paul Ramsey <pramsey at opengeo.org> Accept user offsets in the *output* SRS (15:47:37)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'offsets' (15:48:01)
+	* Paul Ramsey <pramsey at opengeo.org> Accept user offsets in the *output* SRS (15:47:37)
+	* Paul Ramsey <pramsey at opengeo.org> Fix reference names (15:42:35)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (14:18:47)
+	* Paul Ramsey <pramsey at opengeo.org> Bind reference into docs toc (14:18:13)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add notes about building the documentation (10:33:26)
+
+2013-06-21
+	* Paul Ramsey <pramsey at opengeo.org> Las format pages (18:33:32)
+
+2013-06-20
+	* Paul Ramsey <pramsey at opengeo.org> Add cropping (16:42:51)
+	* Paul Ramsey <pramsey at opengeo.org> Add decimation filter (16:32:39)
+	* Paul Ramsey <pramsey at opengeo.org> document pg reader (16:26:37)
+
+2013-06-19
+	* Paul Ramsey <pramsey at opengeo.org> Add in place reprojection filter (23:26:48)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' into pipelinedocs (23:07:54)
+	* Paul Ramsey <pramsey at opengeo.org> Chipper default size is 5000, not 0 (zero?) (23:06:45)
+	* Paul Ramsey <pramsey at opengeo.org> Update the chipper entry (23:05:13)
+	* Paul Ramsey <pramsey at opengeo.org> stage name as header? (18:12:20)
+	* Paul Ramsey <pramsey at opengeo.org> Cross referencing (18:07:35)
+	* Paul Ramsey <pramsey at opengeo.org> First new pipeline docs (18:03:44)
+	* Howard Butler <hobu.inc at gmail.com> add src/gitsha.cpp (16:55:16)
+	* Howard Butler <hobu.inc at gmail.com> try to remove gitsha.cpp (16:54:31)
+	* Howard Butler <hobu.inc at gmail.com> remove generated gitsha.cpp (16:47:23)
+	* Howard Butler <hobu.inc at gmail.com> increment sha (16:16:53)
+	* Howard Butler <hobu.inc at gmail.com> --drivers is only available in long form (16:16:43)
+	* Howard Butler <hobu.inc at gmail.com> make addDriver method public (16:16:26)
+	* Paul Ramsey <pramsey at opengeo.org> Read version string from un-split string version (15:54:46)
+
+2013-06-17
+	* Howard Butler <hobu.inc at gmail.com> support outputing registered driver list with --drivers for all apps (19:54:59)
+	* Howard Butler <hobu.inc at gmail.com> increment SHA (12:55:58)
+	* Howard Butler <hobu.inc at gmail.com> increment version to 0.9.8, add nitro defn's (12:54:45)
+	* Howard Butler <hobu.inc at gmail.com> remove unused warning (12:54:21)
+	* Howard Butler <hobu.inc at gmail.com> add nitro (12:54:04)
+	* Howard Butler <hobu.inc at gmail.com> link OCI (12:53:35)
+	* Howard Butler <hobu.inc at gmail.com> make sure to import NITRO API (12:53:19)
+	* Howard Butler <hobu.inc at gmail.com> clean up unused var warning (12:52:42)
+	* Howard Butler <hobu.inc at gmail.com> clean up assignment operator warning (12:52:09)
+	* Howard Butler <hobu.inc at gmail.com> remove chipper-specific nonsense from ByteSwap (11:40:35)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:49:09)
+	* Howard Butler <hobu.inc at gmail.com> don't version the include/ installation (10:48:41)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:42:18)
+
+2013-06-13
+	* Paul Ramsey <pramsey at opengeo.org> Update for pgpointcloud (18:11:42)
+	* Paul Ramsey <pramsey at opengeo.org> Merge from pdal/master Merge branch 'master' of github.com:PDAL/PDAL (18:03:55)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'libpq' (15:58:48)
+	* Paul Ramsey <pramsey at opengeo.org> Remove SOCI requirement for PgPointCloud (15:58:27)
+
+2013-06-12
+	* Paul Ramsey <pramsey at opengeo.org> Remove orphaned build fragment (15:49:03)
+	* Paul Ramsey <pramsey at opengeo.org> Update built to find PgSQL (15:48:01)
+	* Howard Butler <hobu.inc at gmail.com> clean up unused vars (15:27:16)
+	* Howard Butler <hobu.inc at gmail.com> initialize variables (15:17:11)
+	* Howard Butler <hobu.inc at gmail.com> don't write an exmaple file (14:50:52)
+
+2013-06-11
+	* Paul Ramsey <pramsey at opengeo.org> Change from soci prepared statement to one-time execution in block insertion (18:52:58)
+
+2013-06-10
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'chambbj-buffer-reader' (16:03:42)
+	* Howard Butler <hobu.inc at gmail.com> silence debug output (16:02:52)
+	* Howard Butler <hobu.inc at gmail.com> clean up json file (15:03:11)
+	* Howard Butler <hobu.inc at gmail.com> use mapDimensions and copyLikeDimensions to copy over buffer data instead of explicitly copying only X, Y, Z float dimensions (15:00:04)
+	* Howard Butler <hobu.inc at gmail.com> silence debug output (14:59:25)
+	* Paul Ramsey <pramsey at opengeo.org> Grammatical error message (12:12:55)
+
+2013-06-07
+	* Bradley J Chambers <brad.chambers at gmail.com> adding a buffer reader (11:35:21)
+	* chambbj <brad.chambers at gmail.com> Merge pull request #137 from chambbj/static-runtime-bug (11:30:33)
+
+2013-06-06
+	* Bradley J Chambers <brad.chambers at gmail.com> optional use of static runtime will be more helpful if it is tested (10:28:15)
+
+2013-06-03
+	* Howard Butler <hobu.inc at gmail.com> clean up some warnings (16:17:31)
+	* Howard Butler <hobu.inc at gmail.com> hobu config (14:00:53)
+	* Howard Butler <hobu.inc at gmail.com> clean warnings (14:00:36)
+	* Howard Butler <hobu.inc at gmail.com> build with embedded boost by default (14:00:10)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:29:50)
+	* Howard Butler <hobu.inc at gmail.com> link oracle libs to tests (13:29:37)
+	* Howard Butler <hobu.inc at gmail.com> hobu stuff (13:29:11)
+	* Bradley J Chambers <brad.chambers at gmail.com> NitfWriter can now only be tested if WITH_NITRO is true (07:15:11)
+
+2013-05-31
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into chambbj-add-mp-support-for-msvc (09:19:32)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'chambbj-use-static-runtime' (09:18:18)
+	* Howard Butler <hobu.inc at gmail.com> start using nanoflann for the soci loader to reorganize within-patch points as a kdtree (09:08:31)
+	* Bradley J Chambers <brad.chambers at gmail.com> compile time improved on MSVC with /MP flag (08:12:58)
+	* Bradley J Chambers <brad.chambers at gmail.com> add option to build PDAL using static runtime libraries on Windows (07:18:37)
+
+2013-05-29
+	* Howard Butler <hobu.inc at gmail.com> git sha reporting in version strings (09:31:40)
+
+2013-05-28
+	* Howard Butler <hobu.inc at gmail.com> remove *nix includes, not used apparantly #133 (12:29:38)
+
+2013-05-17
+	* Howard Butler <hobu.inc at gmail.com> use indicators for situations where we return nulls (16:16:41)
+
+2013-05-16
+	* Howard Butler <hobu.inc at gmail.com> 'binary' soci reader improvements to provide parity with the postgis-only soci writer. This could all go away now due to pramsey's efforts though (16:10:03)
+
+2013-05-15
+	* Howard Butler <hobu.inc at gmail.com> cleanups (15:20:39)
+	* Howard Butler <hobu.inc at gmail.com> fix up soci writer (15:20:35)
+
+2013-05-13
+	* Paul Ramsey <pramsey at opengeo.org> Remove patch count from metadata (18:15:31)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'pgnative' of github.com:pramsey/PDAL into pgnative (15:00:59)
+	* Paul Ramsey <pramsey at opengeo.org> Update (c) (14:02:19)
+	* Paul Ramsey <pramsey at opengeo.org> Fix readBuffer log msg to be clearer (13:17:11)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pgnative (14:33:54)
+	* Howard Butler <hobu.inc at gmail.com> guard nitf writer test for nitro availability (14:32:53)
+	* Paul Ramsey <pramsey at opengeo.org> Update to master Merge branch 'master' of github.com:PDAL/PDAL into pgnative (14:23:20)
+	* Paul Ramsey <pramsey at opengeo.org> Update (c) (14:02:19)
+	* Paul Ramsey <pramsey at opengeo.org> Fix readBuffer log msg to be clearer (13:17:11)
+	* Howard Butler <hobu.inc at gmail.com> revert (10:38:33)
+	* Howard Butler <hobu.inc at gmail.com> fixes to support compiling w/o GDAL (10:37:32)
+	* Howard Butler <hobu.inc at gmail.com> Fixups for situations where there's no libxml2 (09:39:44)
+
+2013-05-11
+	* Paul Ramsey <pramsey at opengeo.org> Remove old file (21:49:56)
+	* Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pgnative (21:50:21)
+	* Paul Ramsey <pramsey at opengeo.org> Remove old file (21:49:56)
+
+2013-05-10
+	* Paul Ramsey <pramsey at opengeo.org> Remove some old code and comments (17:44:14)
+	* Paul Ramsey <pramsey at opengeo.org> Complete reader draft! (17:39:25)
+	* Paul Ramsey <pramsey at opengeo.org> Remove some old code and comments (17:44:14)
+	* Paul Ramsey <pramsey at opengeo.org> Complete reader draft! (17:39:25)
+	* Howard Butler <hobu.inc at gmail.com> add example options (09:47:03)
+	* Howard Butler <hobu.inc at gmail.com> register drivers.nitf.writer, add pipeline example (09:42:22)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'nitf-write-support' (09:12:31)
+
+2013-05-09
+	* Paul Ramsey <pramsey at opengeo.org> Fix SQL query for getNumPoints (19:13:43)
+	* Paul Ramsey <pramsey at opengeo.org> Add reader to registry (19:11:13)
+	* Paul Ramsey <pramsey at opengeo.org> Building zero-functionality reader class (18:51:34)
+	* Paul Ramsey <pramsey at opengeo.org> Working writer for pgpointcloud (08:36:11)
+	* Paul Ramsey <pramsey at opengeo.org> Fix SQL query for getNumPoints (19:13:43)
+	* Paul Ramsey <pramsey at opengeo.org> Add reader to registry (19:11:13)
+	* Paul Ramsey <pramsey at opengeo.org> Building zero-functionality reader class (18:51:34)
+	* Howard Butler <hobu.inc at gmail.com> nitro configuration (18:19:47)
+	* Howard Butler <hobu.inc at gmail.com> set some metadata (15:06:31)
+	* Paul Ramsey <pramsey at opengeo.org> Working writer for pgpointcloud (08:36:11)
+
+2013-05-08
+	* Paul Ramsey <pramsey at opengeo.org> Copy soci driver into independent pgpointcloud driver (08:11:38)
+	* Howard Butler <hobu.inc at gmail.com> cleanups and set metadata (13:47:00)
+	* Paul Ramsey <pramsey at opengeo.org> Copy soci driver into independent pgpointcloud driver (08:11:38)
+
+2013-05-06
+	* Howard Butler <hobu.inc at gmail.com> write out dummy IM segment (15:10:18)
+	* Howard Butler <hobu.inc at gmail.com> throw an exception if IM segment isn't named (15:09:49)
+	* Howard Butler <hobu.inc at gmail.com> minimally functioning writer (12:23:14)
+
+2013-05-02
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #127 from chambbj/with_apps (09:08:00)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #128 from chambbj/pdal_defines_rebase (09:06:43)
+
+2013-04-26
+	* Bradley J Chambers <brad.chambers at gmail.com> Clearing up some of the issues with pdal_defines.h (11:53:03)
+	* Bradley J Chambers <brad.chambers at gmail.com> conditionally include tests for apps (11:50:37)
+
+2013-04-24
+	* Howard Butler <hobu.inc at gmail.com> more soci work (14:42:13)
+	* Bradley J Chambers <brad.chambers at gmail.com> now testing WITH_APPS prior to add_subdirectory(apps) (09:44:27)
+
+2013-04-23
+	* Howard Butler <hobu.inc at gmail.com> fixup defines for when no hexbin (13:54:13)
+
+2013-04-22
+	* Howard Butler <hobu.inc at gmail.com> register filters.hexbin (10:48:36)
+	* Howard Butler <hobu.inc at gmail.com> add working filters.hexbin implementation (10:48:24)
+
+2013-04-19
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:44:21)
+	* Howard Butler <hobu.inc at gmail.com> more soci writer stuff (16:44:03)
+	* Howard Butler <hobu.inc at gmail.com> add a binary_to_hex_stream method (16:43:51)
+	* Howard Butler <hobu.inc at gmail.com> try reprojecting with the old Z values if we failed with the current Z values (16:43:17)
+	* Howard Butler <hobu.inc at gmail.com> only ever output 2D WKT from Bounds (16:41:41)
+	* Howard Butler <hobu.inc at gmail.com> We can't toWKT 3D bounds, so you only get 2D. Add a toBox() method that creates a PostGIS-compatible BOX or BOX3D (16:28:04)
+	* Howard Butler <hobu.inc at gmail.com> XYZ isn't optional to calculateBounds (16:26:08)
+
+2013-04-18
+	* Howard Butler <hobu.inc at gmail.com> remove old hexer code from PDAL tree, now in its own thing at http://github.com/hobu/hexer (16:44:08)
+	* Howard Butler <hobu.inc at gmail.com> fixups for hexer (09:01:32)
+
+2013-04-17
+	* Howard Butler <hobu.inc at gmail.com> add reproject/crop example (10:36:52)
+	* Howard Butler <hobu.inc at gmail.com> add some more example metadata (10:31:41)
+	* Howard Butler <hobu.inc at gmail.com> add my script for setting up oracle env (10:27:32)
+	* Howard Butler <hobu.inc at gmail.com> clean up example file (10:17:10)
+	* Howard Butler <hobu.inc at gmail.com> add chipper example (09:52:48)
+
+2013-04-16
+	* Howard Butler <hobu.inc at gmail.com> fix up const_cast warning (14:44:51)
+	* Howard Butler <hobu.inc at gmail.com> fix up cast (14:37:52)
+	* Howard Butler <hobu.inc at gmail.com> fixup (14:27:26)
+	* Howard Butler <hobu.inc at gmail.com> add FindHexer module (13:18:25)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:30:25)
+	* Howard Butler <hobu.inc at gmail.com> add hexbin filter scaffolding http://github.com/hobu/hexer (12:30:11)
+	* Howard Butler <hobu.inc at gmail.com> add hexbin filter scaffolding http://github.com/hobu/hexer (12:29:44)
+
+2013-04-11
+	* Howard Butler <hobu.inc at gmail.com> what braindead microsoft idiot decided that min() and max() were good ideas for macro names? (16:08:32)
+	* Howard Butler <hobu.inc at gmail.com> silence warning about unreferenced parameter (16:00:19)
+	* Howard Butler <hobu.inc at gmail.com> fix up embedded boost on windows (15:59:59)
+	* Howard Butler <hobu.inc at gmail.com> Revert "use GDAL's NITFGetField instead of our own" (15:59:19)
+	* Howard Butler <hobu.inc at gmail.com> silence warning see https://svn.boost.org/trac/boost/ticket/7663 (15:42:10)
+	* Howard Butler <hobu.inc at gmail.com> usge a giant number for capacity to silence warning about truncation, not that this means anything anyway (15:32:31)
+	* Howard Butler <hobu.inc at gmail.com> boost:: prefix types (15:31:41)
+	* Howard Butler <hobu.inc at gmail.com> throw an exception if the capacity given for a PointBuffer is going to end up being larger than boost::uint32_t::max() (15:26:43)
+	* Howard Butler <hobu.inc at gmail.com> silence warning initializing rng (15:26:11)
+	* Howard Butler <hobu.inc at gmail.com> make OracleDriver PDAL_DLL exported because it is subclassed (15:25:50)
+	* Howard Butler <hobu.inc at gmail.com> silence bool conversion warning (15:18:16)
+	* Howard Butler <hobu.inc at gmail.com> silence uint64_t->size_t warnings with casts to appropriate types (15:14:01)
+	* Howard Butler <hobu.inc at gmail.com> cast the VSI stream offset to a std::streamoff (15:06:04)
+	* Howard Butler <hobu.inc at gmail.com> shut up int/unsigned warning complaint (15:04:55)
+	* Howard Butler <hobu.inc at gmail.com> turn off extra instant client libs for win32 (I build using OSGeo4W's copy (15:00:37)
+	* Howard Butler <hobu.inc at gmail.com> add my example OSGeo4W-themed windows config (14:58:22)
+	* Howard Butler <hobu.inc at gmail.com> Find the Python interpreter before the libs, bump the numpy version down to 1.5 to catch OSGeo4W's numpy (14:57:20)
+
+2013-04-09
+	* Howard Butler <hobu.inc at gmail.com> make sure to write Metadata correctly if set (11:46:57)
+
+2013-04-05
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (08:43:36)
+
+2013-04-04
+	* Andrew Bell <andrew.bell.ia at gmail.com> Separate driver from library as such. (21:19:23)
+
+2013-04-01
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (10:32:15)
+
+2013-03-29
+	* Howard Butler <hobu.inc at gmail.com> fix up scaling for DD example (13:26:56)
+
+2013-03-27
+	* Howard Butler <hobu.inc at gmail.com> output 14 decimals for printing scale factors to stdout (13:03:15)
+	* Howard Butler <hobu.inc at gmail.com> use a very large value (14) for the number of decimals to output for scale factors when written into XML (13:00:25)
+	* Howard Butler <hobu.inc at gmail.com> more debug noise (12:58:11)
+
+2013-03-25
+	* Howard Butler <hobu.inc at gmail.com> a correct SRS WKT of the Autzen data (12:02:49)
+	* Howard Butler <hobu.inc at gmail.com> fix autzen-dd file (12:02:26)
+
+2013-03-22
+	* Howard Butler <hobu.inc at gmail.com> add cache stats metadata to sequential filter (11:29:46)
+
+2013-03-21
+	* Howard Butler <hobu.inc at gmail.com> fix up test (13:28:59)
+	* Howard Butler <hobu.inc at gmail.com> provide correct stat (13:01:22)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'std-vector-PointBuffer' into vectorize-lasreader (12:54:43)
+	* Howard Butler <hobu.inc at gmail.com> build my debug config by default (11:00:24)
+	* Howard Butler <hobu.inc at gmail.com> Pass down a reference to the user's buffer when we Chip() the data so that when pulled through a cache, things actually get cached in a way that we want to use further down the road. (10:59:25)
+	* Howard Butler <hobu.inc at gmail.com> fix up quoting (10:58:01)
+	* Howard Butler <hobu.inc at gmail.com> Use copyPointsFast for situations where the schema size of the cache's blocks are the same size as the users's buffer. (10:56:24)
+	* Howard Butler <hobu.inc at gmail.com> don't request more cached blocks than necessary. random iterator can never reset the cache, only sequential (08:33:21)
+
+2013-03-20
+	* Howard Butler <hobu.inc at gmail.com> seek() needs to ask if cached, but not allocate and return a vector of blocks (15:49:41)
+	* Howard Butler <hobu.inc at gmail.com> keep track of currently used schema (15:49:12)
+	* Howard Butler <hobu.inc at gmail.com> keep a map of dimension maps for per-cached block lookups (14:14:16)
+	* Howard Butler <hobu.inc at gmail.com> reset dimension map every read() (14:13:44)
+	* Howard Butler <hobu.inc at gmail.com> fix up chpper to not create one_point every time through (11:04:59)
+	* Howard Butler <hobu.inc at gmail.com> nuke the map every block read -- will make a map of these for inserts (09:10:11)
+	* Howard Butler <hobu.inc at gmail.com> fix up table name (09:09:48)
+	* Howard Butler <hobu.inc at gmail.com> don't create the one_point PointBuffer for every point, initialize RandomIterator with it (09:09:30)
+
+2013-03-19
+	* Howard Butler <hobu.inc at gmail.com> stop here, cache filter tests pass at least (16:54:51)
+	* Howard Butler <hobu.inc at gmail.com> account for situations where you're requesting the very first point (14:26:59)
+	* Howard Butler <hobu.inc at gmail.com> random iterator mostly working (13:48:18)
+	* Howard Butler <hobu.inc at gmail.com> make IteratorBase class to contain common methods for filters.cache iterators (12:30:14)
+	* Howard Butler <hobu.inc at gmail.com> sequential filters.cache working for block-based reads (11:15:54)
+	* Howard Butler <hobu.inc at gmail.com> force a resize of the PointBuffer's capacity to the chipper's threshold when constructing the sequential filter (09:44:46)
+	* Howard Butler <hobu.inc at gmail.com> move cache testing into CacheFilterTeset (09:44:02)
+	* Howard Butler <hobu.inc at gmail.com> add method to return number of objects in cache (09:43:20)
+
+2013-03-17
+	* Howard Butler <hobu.inc at gmail.com> method to return chipper threshold (19:37:23)
+	* Howard Butler <hobu.inc at gmail.com> provide a defaulted optional 'exact' switch to resize to force a resize of the PointBuffer even if current capcity is larger than the requested capacity (18:40:19)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE instead of our own Compare function (13:31:17)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL (13:30:59)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL for checking in tests (13:24:57)
+
+2013-03-15
+	* Howard Butler <hobu.inc at gmail.com> move dimension comparision up a level (17:01:44)
+	* Howard Butler <hobu.inc at gmail.com> cache dimension positions before copying data form one PointBuffer to another (16:50:04)
+	* Howard Butler <hobu.inc at gmail.com> copy into the correct location (16:03:43)
+	* Howard Butler <hobu.inc at gmail.com> cleanup source/dest confusion (15:14:44)
+	* Howard Butler <hobu.inc at gmail.com> test cache with random iterator (14:52:34)
+	* Howard Butler <hobu.inc at gmail.com> If we have a cache it, copy its data into our buffer (14:52:21)
+	* Howard Butler <hobu.inc at gmail.com> test likewise copy (14:49:03)
+	* Howard Butler <hobu.inc at gmail.com> provide a method to copy like- dimensions from one PointBuffer to another (static) (14:48:07)
+	* Howard Butler <hobu.inc at gmail.com> make sure to purge (14:45:45)
+	* Howard Butler <hobu.inc at gmail.com> don't reset the cache upon iterator creation (09:32:35)
+	* Howard Butler <hobu.inc at gmail.com> reuse the buffer that reads point data out of the LAS file (09:32:17)
+
+2013-03-14
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support to fetch paths and hexes with density. Add support for hex centers. (21:56:21)
+	* Howard Butler <hobu.inc at gmail.com> don't allocate a vector every time through the loop (17:21:27)
+	* Howard Butler <hobu.inc at gmail.com> use stack-allocated std::vector<boost::uint8_t> instead of a heap allocated naked array to read data into (17:19:34)
+
+2013-03-13
+	* Howard Butler <hobu.inc at gmail.com> use std::vector as storage for PointBuffer instead of boost::scoped_array (16:43:31)
+	* Howard Butler <hobu.inc at gmail.com> fix up DD selection polygon for autzen. was misprojected (12:01:48)
+	* Howard Butler <hobu.inc at gmail.com> clean up dead code, remove unneeded test (12:00:36)
+	* Howard Butler <hobu.inc at gmail.com> cleanup dead code (12:00:18)
+	* Howard Butler <hobu.inc at gmail.com> clean up big buffer when we're done (11:10:42)
+	* Howard Butler <hobu.inc at gmail.com> trap test when we can't make a giant allocation (11:08:14)
+	* Howard Butler <hobu.inc at gmail.com> keep track of the PointBuffer's array separately from its capacity/count (10:40:28)
+	* Howard Butler <hobu.inc at gmail.com> make sure PointBuffer's data array doesn't overflow by using uint64_t instead of size_t to define its size (09:01:16)
+	* Howard Butler <hobu.inc at gmail.com> make sure PointBuffer's data array doesn't overflow by using uint64_t instead of size_t to define its size (09:00:57)
+
+2013-03-12
+	* Howard Butler <hobu.inc at gmail.com> PointSourceId setting was working incorrectly (16:48:47)
+	* Howard Butler <hobu.inc at gmail.com> some attempts at cleaning up filters.crop (14:44:24)
+	* Howard Butler <hobu.inc at gmail.com> clean up print statement (14:41:25)
+	* Howard Butler <hobu.inc at gmail.com> assert schema byte sizes are the same when copying a single point (11:42:38)
+	* Howard Butler <hobu.inc at gmail.com> use copy constructor (11:42:20)
+	* Howard Butler <hobu.inc at gmail.com> :reset() was using old schema bytesize instead of new one -- don't reset if they're the same anyway (10:28:18)
+
+2013-03-11
+	* Howard Butler <hobu.inc at gmail.com> turn off gcc pragmas for now (14:14:55)
+	* Howard Butler <hobu.inc at gmail.com> use scoped_array::reset to make sure previous buffer actually gets free'd (13:33:45)
+	* Howard Butler <hobu.inc at gmail.com> increase log noise (13:33:20)
+
+2013-02-27
+	* Howard Butler <hobu.inc at gmail.com> Revert "undo #115 again. Automatic regen with make is still busted for me when this lives in the top of the source tree" (09:55:25)
+	* Howard Butler <hobu.inc at gmail.com> more complete view query example for oracle (09:23:21)
+	* Howard Butler <hobu.inc at gmail.com> turn up the precision when doing debug log (09:22:46)
+	* Howard Butler <hobu.inc at gmail.com> undo #115 again. Automatic regen with make is still busted for me when this lives in the top of the source tree (09:21:54)
+	* Howard Butler <hobu.inc at gmail.com> fix up Define(long long*) (09:17:27)
+
+2013-02-26
+	* Howard Butler <hobu.inc at gmail.com> oracle is available in my default config now (13:09:04)
+	* Howard Butler <hobu.inc at gmail.com> PURGE to ensure that dumped tables don't end up in the recycling bin (13:08:48)
+	* Howard Butler <hobu.inc at gmail.com> dial up the ostream precision for high-noise debug (13:08:22)
+	* Howard Butler <hobu.inc at gmail.com> default the chipper threshold to the getNumPoints() available to the stage if none is specified as an option (13:07:12)
+	* Howard Butler <hobu.inc at gmail.com> default the capacity to the getNumPoints() available to the stage if none is specified (13:06:40)
+	* Howard Butler <hobu.inc at gmail.com> add oracle to test compilation (13:06:01)
+
+2013-02-25
+	* Howard Butler <hobu.inc at gmail.com> fix up cleanup script for oci driver (16:06:30)
+	* Howard Butler <hobu.inc at gmail.com> remove redundant declaration (14:23:19)
+	* Howard Butler <hobu.inc at gmail.com> libociei on OSX is no longer needed for the 11+ instant client (14:07:47)
+
+2013-02-22
+	* Howard Butler <hobu.inc at gmail.com> use the given statement, not m_initialQueryStatement for fetching the pc_id, etc in fetchSchema (16:28:58)
+	* Howard Butler <hobu.inc at gmail.com> update FindOracle.cmake to mloskot's latest (16:01:29)
+	* Howard Butler <hobu.inc at gmail.com> fix up debug info for filters.crop (15:53:58)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'branch-0.9.6' (15:43:46)
+	* Howard Butler <hobu.inc at gmail.com> make sure to use correct point count for setting pointsourceid (15:43:31)
+	* Howard Butler <hobu.inc at gmail.com> attempt to get the correct dimension for drivers.oci.reader (15:26:20)
+	* Howard Butler <hobu.inc at gmail.com> oracle compilation on osx (15:28:53)
+	* Howard Butler <hobu.inc at gmail.com> attempt to get the correct dimension for drivers.oci.reader (15:26:20)
+	* Howard Butler <hobu.inc at gmail.com> get point count correct for writing PointSourceId from oracle id (09:25:04)
+
+2013-02-20
+	* Howard Butler <hobu.inc at gmail.com> if no options are given to filters.cache, use the stage's entire point count as the cache (11:28:16)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:22:51)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:22:38)
+	* Howard Butler <hobu.inc at gmail.com> silence comparison warning (11:22:05)
+	* Howard Butler <hobu.inc at gmail.com> make pshape switchable for now (11:06:42)
+
+2013-02-19
+	* Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (21:36:48)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (21:36:30)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Fix code to calculate path parents. Add code to build tree of rings. Remove code to try to determine path orientation at creation time (can't be done). (21:25:57)
+
+2013-02-12
+	* Howard Butler <hobu.inc at gmail.com> basic filters.hexbin implementation based on existing codebase (17:31:43)
+	* Howard Butler <hobu.inc at gmail.com> scaffolding for HexBin filter (16:45:52)
+	* Howard Butler <hobu.inc at gmail.com> hobu's cleanups to support rendering SVG via cairo (16:17:17)
+
+2013-02-11
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:42:32)
+	* Howard Butler <hobu.inc at gmail.com> note about where FindCairo.cmake came from (10:42:23)
+	* Howard Butler <hobu.inc at gmail.com> silence an annoying boost warning (10:42:14)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:58:11)
+	* Howard Butler <hobu.inc at gmail.com> add a FindCairo cmake macro (09:57:05)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (09:51:26)
+
+2013-02-07
+	* Andrew Bell <andrew.bell.ia at gmail.com> We now find all shapes and holes. (22:00:03)
+	* Howard Butler <hobu.inc at gmail.com> Merge #117, upgrade embedded boost to 1.53 with unordered_map and some others (20:21:20)
+	* Howard Butler <hobu.inc at gmail.com> add new soci writing example (16:50:22)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:46:45)
+
+2013-02-06
+	* Andrew Bell <andrew.bell.ia at gmail.com> Make path following work again. (22:20:02)
+	* Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'main/issues/117-upgrade-boost-153' (16:55:09)
+
+2013-02-05
+	* Howard Butler <hobu.inc at gmail.com> add new 1.53 boost libs (16:41:31)
+	* Howard Butler <hobu.inc at gmail.com> updates to import script (16:40:37)
+	* Howard Butler <hobu.inc at gmail.com> first attempt to upgrade to boost 1.53 (15:39:56)
+	* Howard Butler <hobu.inc at gmail.com> fix up ifdef (14:30:08)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:33)
+
+2013-02-04
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add code to mark surrounded hexes. (20:30:45)
+
+2013-02-03
+	* Andrew Bell <andrew.bell.ia at gmail.com> Working hexbinning and traversal. (12:44:52)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add small build change. (12:28:54)
+	* Andrew Bell <andrew.bell.ia at gmail.com> Working hexbinning and outer path. (11:30:21)
+
+2013-02-01
+	* Howard Butler <hobu.inc at gmail.com> getNumPoints caches the previous stage's point count if it is expected to forward it instead of asking the entire pipeline every time for the point count (15:40:35)
+	* Howard Butler <hobu.inc at gmail.com> Don't resize the buffer for every chunk if its capacity is != the number of points to read per chunk (just make sure it is big enough. Allocate the size of the Writer's buffer to be the min(num_to_write, def_chunk_size) if num_to_write is not 0 (15:32:57)
+
+2013-01-31
+	* Howard Butler <hobu.inc at gmail.com> Attempt to resolve #116 by selecting dimensions with both the same name *and* namespace (21:07:35)
+
+2013-01-29
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #115 from PDAL/pdal_defines (09:32:44)
+
+2013-01-22
+	* Bradley J Chambers <brad.chambers at gmail.com> pdal_defines.h is added from PROJECT_BINARY_DIR and installed (#108) (11:50:07)
+
+2013-01-21
+	* Howard Butler <hobu.inc at gmail.com> more pdal_defines fixups (16:52:28)
+	* Howard Butler <hobu.inc at gmail.com> put back pdal_defines generation into ./include/pdal #108 (16:10:29)
+	* Howard Butler <hobu.inc at gmail.com> turn off 723ed9207c4447b043229e73c4f3fde1f0a6a1da (15:49:55)
+	* Howard Butler <hobu.inc at gmail.com> add p2g as a default config (15:27:01)
+	* Howard Butler <hobu.inc at gmail.com> Fix #108 by adding pdal_defines to the clean target (15:26:51)
+
+2013-01-20
+	* Andrew Bell <andrew.bell.ia at gmail.com> Add support for traversing single shape. (13:21:29)
+
+2013-01-18
+	* Howard Butler <hobu.inc at gmail.com> report an error message if the stream is unable to be opened or created when it is a filesystem stream (09:43:19)
+	* Howard Butler <hobu.inc at gmail.com> write_n and read_n should return error messages that reflect PDAL, not liblas (08:32:00)
+
+2013-01-15
+	* Howard Butler <hobu.inc at gmail.com> turn off gdal 1.10 check in colorization test (15:52:45)
+	* Howard Butler <hobu.inc at gmail.com> silence decimation random iterator test (13:35:48)
+
+2013-01-10
+	* Howard Butler <hobu.inc at gmail.com> turn of GDAL 1.10 check for now (10:13:12)
+	* Howard Butler <hobu.inc at gmail.com> playing around with nitf writer (09:45:41)
+	* Howard Butler <hobu.inc at gmail.com> ::reset actually does reset, even if schema sizes are the same (09:43:28)
+
+2013-01-07
+	* Howard Butler <hobu.inc at gmail.com> use GDAL's NITFGetField instead of our own (11:49:28)
+	* Howard Butler <hobu.inc at gmail.com> more drivers.nitf.writer tweaking (10:50:50)
+
+2012-12-28
+	* Andrew <abell at abell-OptiPlex-GX620.(none)> First working version of point placement in hexagons. (20:20:32)
+	* Andrew <abell at abell-OptiPlex-GX620.(none)> First working version of point placement in hexagons. (20:20:32)
+
+2013-01-06
+	* Andrew <abell at abell-OptiPlex-GX620.(none)> Modifications for build without GDAL. (11:46:26)
+
+2013-01-04
+	* Howard Butler <hobu.inc at gmail.com> test that GDAL == 1.10 and error if we don't for NITF driver (10:42:34)
+	* Howard Butler <hobu.inc at gmail.com> remove mpg-copied nitf stuff, we'll depend on gdal 1.10+ to provide it to us with our own header (10:33:40)
+	* Howard Butler <hobu.inc at gmail.com> decommission all local nitf-related stuff that mpg had copied over -- we'll depend on gdal 1.10+ to provide it with our own header (10:29:20)
+
+2013-01-03
+	* Howard Butler <hobu.inc at gmail.com> partially working random iterator for filters.decimation (12:56:01)
+	* Howard Butler <hobu.inc at gmail.com> start tweaking nitf stuff (12:55:43)
+	* Howard Butler <hobu.inc at gmail.com> find threads libraries because some platforms don't link them by default (10:53:47)
+	* Howard Butler <hobu.inc at gmail.com> fix up building in non-GDAL situations (10:53:25)
+	* Howard Butler <hobu.inc at gmail.com> don't explicitly link to Boost_LIBRARIES, because when we embed, we don't have that defined (10:10:10)
+
+2012-12-18
+	* Howard Butler <hobu.inc at gmail.com> random iterator implementation for filters.selector (15:53:20)
+	* Howard Butler <hobu.inc at gmail.com> random iterator implementation for filters.inplacereprojection (15:31:24)
+	* Howard Butler <hobu.inc at gmail.com> IteratorBase needs to life in ::scaling, not ::pdal :) (15:31:01)
+	* Howard Butler <hobu.inc at gmail.com> seeking off the end should throw an exception. (15:13:33)
+	* Howard Butler <hobu.inc at gmail.com> filters.scaling now supports random interator (10:52:30)
+	* Howard Butler <hobu.inc at gmail.com> use epsilon compares instead of direct == for floats (10:23:53)
+	* Howard Butler <hobu.inc at gmail.com> add random iterator implementation for filters.scaling (10:23:33)
+
+2012-12-17
+	* Howard Butler <hobu.inc at gmail.com> tweak configuration script (17:05:14)
+	* Howard Butler <hobu.inc at gmail.com> if the count for a cloud is > 32bit int, we'll overflow and get an error. if we use a int64_t here, in 32-bit land, the bind doesn't work properly (16:57:50)
+
+2012-12-10
+	* Howard Butler <hobu.inc at gmail.com> SQLT_NUM, not SQLT_INT (14:41:20)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of /Users/hobu/dev/git/pdal (09:10:17)
+	* Howard Butler <hobu.inc at gmail.com> fixups to support 32-bit compilation of PDAL (09:05:41)
+
+2012-12-06
+	* Howard Butler <hobu.inc at gmail.com> turn dimension overflow checking back on for filters.scaling and PointBuffer (17:17:45)
+
+2012-11-29
+	* Howard Butler <hobu.inc at gmail.com> don't allocate new buffers if resizing or resetting if we're not actually changing (16:06:09)
+	* Howard Butler <hobu.inc at gmail.com> account for changes in jpeg reading in GDAL 1.10 (16:05:28)
+	* Howard Butler <hobu.inc at gmail.com> cast byte-sized dims to ints before passing on to string output (15:37:34)
+	* Howard Butler <hobu.inc at gmail.com> shortcut to use integer output when we don't have scaling (15:27:00)
+	* Howard Butler <hobu.inc at gmail.com> make drivers.text.writer significantly faster for geojson (14:55:31)
+
+2012-11-26
+	* Howard Butler <hobu.inc at gmail.com> don't link to OSGeo4W (17:23:01)
+	* Howard Butler <hobu.inc at gmail.com> don't write extra commas at end of properties list for GeoJSON/csv to account for ignored dimensions (13:21:34)
+	* Howard Butler <hobu.inc at gmail.com> remove pcd driver from StageFactory (12:38:41)
+	* Howard Butler <hobu.inc at gmail.com> fix up terrasolid scaling/offset reading per https://github.com/libLAS/libLAS/pull/15 (10:33:08)
+
+2012-11-19
+	* Howard Butler <hobu.inc at gmail.com> merge the PCD writer in to drivers.text.writer, as it's just another output type, to eliminate a bunch of code duplication (11:33:22)
+
+2012-11-16
+	* Howard Butler <hobu.inc at gmail.com> comment out plugin, not used (15:03:35)
+
+2012-11-15
+	* Howard Butler <hobu.inc at gmail.com> make sure to include StageFactory (14:58:41)
+	* Howard Butler <hobu.inc at gmail.com> make sure to include StageFactory (14:57:06)
+	* Howard Butler <hobu.inc at gmail.com> reader, not writer for plugin (14:56:30)
+	* Howard Butler <hobu.inc at gmail.com> fix #113 (14:35:25)
+
+2012-11-13
+	* Howard Butler <hobu.inc at gmail.com> don't include for OCI driver when building plugin (17:10:23)
+	* Howard Butler <hobu.inc at gmail.com> don't use StageFactory for OCI driver when building plugin (17:08:02)
+	* Howard Butler <hobu.inc at gmail.com> fixups for Oracle plugin building (17:05:59)
+	* Howard Butler <hobu.inc at gmail.com> clean up macro warning (15:42:08)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'load-plugin-from-pipeline' (15:30:53)
+	* Howard Butler <hobu.inc at gmail.com> switches for plugins (15:30:38)
+	* Howard Butler <hobu.inc at gmail.com> provide example to demonstrate how to dynamically load plugin (15:30:15)
+	* Howard Butler <hobu.inc at gmail.com> add other plugin creation macros (15:09:31)
+	* Howard Butler <hobu.inc at gmail.com> macro'ize plugin function creation (14:44:50)
+	* Howard Butler <hobu.inc at gmail.com> there shouldn't be a global StageFactory (08:21:41)
+	* Howard Butler <hobu.inc at gmail.com> support loading stage plugin as it is read via PipelineReader (08:15:37)
+
+2012-11-12
+	* Howard Butler <hobu.inc at gmail.com> don't build tests for text driver if in plugin mode (19:07:11)
+	* Howard Butler <hobu.inc at gmail.com> don't link in text writer if we're building as a plugin (19:06:53)
+	* Howard Butler <hobu.inc at gmail.com> fix PCD plugin mode (19:06:30)
+	* Howard Butler <hobu.inc at gmail.com> get PCD and SOCI plugin modes working (19:06:17)
+	* Howard Butler <hobu.inc at gmail.com> pdal::StageFactory now lives in a per-ThreadEnvironment and can be gotten from the GlobalEnvironment. Use the global StageFactory for stage creation operations in apps (15:00:38)
+
+2012-11-09
+	* Howard Butler <hobu.inc at gmail.com> more plugin work (13:49:00)
+	* Howard Butler <hobu.inc at gmail.com> do a dummy read of the data when --validate is called (13:11:46)
+	* Howard Butler <hobu.inc at gmail.com> more plugin work (11:37:29)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into load-plugin-from-pipeline (09:59:17)
+	* Howard Butler <hobu.inc at gmail.com> Fix #112, support reporting build debug status via commandline apps (09:49:25)
+	* Howard Butler <hobu.inc at gmail.com> make the actual loading of the plugin #112 (09:30:35)
+
+2012-11-08
+	* Howard Butler <hobu.inc at gmail.com> getDefaultOptions is now a static method of pdal::StageBase. It defaults to returning a single pdal::Options instance describing the relevant options to the pdal::Stage. It is now possible to get a candidate list of Options from a stage without implementing the Stage itself (15:12:30)
+	* Howard Butler <hobu.inc at gmail.com> getDefaultDimensions() is now a static method of all pdal::Stage. It defaults to returning an empty vector unless implemented. It is now possible to get a candidate list of dimensions from a stage without implementing it (13:53:09)
+	* Howard Butler <hobu.inc at gmail.com> more doc'ing (11:27:57)
+	* Howard Butler <hobu.inc at gmail.com> more docs (10:57:33)
+	* Howard Butler <hobu.inc at gmail.com> remove ::dump() method (10:57:22)
+
+2012-11-07
+	* Howard Butler <hobu.inc at gmail.com> update (c) to 2012 (16:52:37)
+	* Howard Butler <hobu.inc at gmail.com> test the actual count value (16:52:31)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:36:48)
+	* Howard Butler <hobu.inc at gmail.com> add a 'exact_dimensions' option that allows you to specify a comma-separated list of dimensions that should be used to cumulate exact histogram information for (10:36:43)
+
+2012-11-06
+	* Howard Butler <hobu.inc at gmail.com> scope the iterator pointer so it cleans up in cases where we throw an exception because the user interrupted (12:00:35)
+	* Howard Butler <hobu.inc at gmail.com> INCREF the compiled script so we can properly DECREF it when we cleanup (11:24:11)
+	* Howard Butler <hobu.inc at gmail.com> remember to free dataset if created (10:13:11)
+	* Howard Butler <hobu.inc at gmail.com> fix crash bug in filters.index (09:58:35)
+
+2012-11-05
+	* Howard Butler <hobu.inc at gmail.com> always initialize the uuid for a dimension to something random -- can be reset using setUUID() later (20:51:07)
+	* Howard Butler <hobu.inc at gmail.com> throw pdal::duplicate_dimension_id if appendDimension is called with a non-unique dimension::id (20:05:57)
+	* Howard Butler <hobu.inc at gmail.com> check for duplicate uuids (19:51:59)
+	* Howard Butler <hobu.inc at gmail.com> make sure uuids are different for both dimensions in the testt (18:25:08)
+	* Howard Butler <hobu.inc at gmail.com> test for uuid collission with global RNG (16:29:39)
+	* Howard Butler <hobu.inc at gmail.com> *really* turn off index tests (16:09:53)
+	* Howard Butler <hobu.inc at gmail.com> use global RNG for dimension uuid creation (14:30:21)
+	* Howard Butler <hobu.inc at gmail.com> try to use more randomer seed for global RNG (14:29:10)
+	* Howard Butler <hobu.inc at gmail.com> switch off indexfilter tests for now (14:28:53)
+	* Howard Butler <hobu.inc at gmail.com> switch off indexfilter tests for now (14:27:14)
+	* Howard Butler <hobu.inc at gmail.com> add (14:25:51)
+	* Howard Butler <hobu.inc at gmail.com> clean up some leaks (14:20:18)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:04:49)
+	* Howard Butler <hobu.inc at gmail.com> add example of LAS file with no points in it (13:04:43)
+	* Howard Butler <hobu.inc at gmail.com> flip back to old RNG initialization (12:08:43)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:59:42)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:39:04)
+	* Howard Butler <hobu.inc at gmail.com> add new example for colorization with multiple rasters (09:26:22)
+	* Howard Butler <hobu.inc at gmail.com> some deck chair rearranging of the test suite data (09:25:53)
+
+2012-11-02
+	* Howard Butler <hobu.inc at gmail.com> keep a reference around to the bytecode so we can decref it later (17:45:38)
+	* Howard Butler <hobu.inc at gmail.com> whitespace norm (17:45:21)
+	* Howard Butler <hobu.inc at gmail.com> consolidate a getPythonTraceback function that imports traceback and does the work to fetch the error message (17:24:55)
+	* Howard Butler <hobu.inc at gmail.com> make getNumDimensions return a reference (17:23:52)
+	* Howard Butler <hobu.inc at gmail.com> turn off test that is supposed to fail as an example of what not to do (16:24:14)
+	* Howard Butler <hobu.inc at gmail.com> comment out unused date_time stuff (16:23:57)
+	* Howard Butler <hobu.inc at gmail.com> import fusion, date_time (16:20:34)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost-datetime-151' of github.com:PDAL/PDAL (16:09:10)
+	* Howard Butler <hobu.inc at gmail.com> make sure to initialize the RNG (16:08:55)
+	* Howard Butler <hobu.inc at gmail.com> more rng testing (16:07:55)
+	* Howard Butler <hobu.inc at gmail.com> check that the RNG being returned exists (16:07:33)
+	* Howard Butler <hobu.inc at gmail.com> use the global RNG (16:07:13)
+	* Howard Butler <hobu.inc at gmail.com> more boost libs, including a full date_time (16:06:29)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:47:21)
+	* Howard Butler <hobu.inc at gmail.com> normalize line endings (15:47:17)
+	* Howard Butler <hobu.inc at gmail.com> add uuid rng test (13:17:21)
+	* Howard Butler <hobu.inc at gmail.com> Fix #110 and add a test example of GeoJSON output (11:15:39)
+
+2012-11-01
+	* Howard Butler <hobu.inc at gmail.com> go back to old way which valgrind complains about uninitialized (15:28:06)
+	* Howard Butler <hobu.inc at gmail.com> support a 'dimensions' option, which is a comma/space-separated list of explicit dimensions to generate stats for #102 (10:34:12)
+	* Howard Butler <hobu.inc at gmail.com> remove unused include (10:17:59)
+	* Howard Butler <hobu.inc at gmail.com> add more completeness to the dimension test (10:17:38)
+	* Howard Butler <hobu.inc at gmail.com> attempt to use the global RNG again (10:10:22)
+	* Howard Butler <hobu.inc at gmail.com> move random uuid generation back into pdal::Dimension, don't do it ourselves (10:09:58)
+	* Howard Butler <hobu.inc at gmail.com> add parent/child fetching schema test (09:27:43)
+
+2012-10-31
+	* Howard Butler <hobu.inc at gmail.com>  turn tests back on (14:10:43)
+	* Howard Butler <hobu.inc at gmail.com> cumulate stats for all filters, including those that are ignored. add namespace as a metadata item to the summary so you can discriminate between different X's #102 (14:04:13)
+
+2012-10-30
+	* Howard Butler <hobu.inc at gmail.com> make sure to shutdown libxml when we're done (06:44:49)
+	* Howard Butler <hobu.inc at gmail.com> make sure to initialize m_numPointsWritten (06:13:15)
+	* Howard Butler <hobu.inc at gmail.com> use new PointBuffer::reset() method (05:32:15)
+	* Howard Butler <hobu.inc at gmail.com> clean up formatting of test (05:31:35)
+	* Howard Butler <hobu.inc at gmail.com> make sure to clean up iterator when we're done with it (05:30:55)
+	* Howard Butler <hobu.inc at gmail.com> add reset(schema) method to allow you to reset the PointBuffer instance. Make sure to initialize data arrays before we use them (05:06:55)
+	* Howard Butler <hobu.inc at gmail.com> trap for the condition when the number of points in the block is larger than the capacity of the oracle buffer we are reading it into is -- ie, the SDO_PC's attributes are smaller than the number of points actually in the block (02:26:47)
+	* Howard Butler <hobu.inc at gmail.com> rename m_buffer to m_writer_buffer for clarity (02:26:00)
+	* Howard Butler <hobu.inc at gmail.com> Revert "Revert "make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer"" (01:29:44)
+	* Howard Butler <hobu.inc at gmail.com> Revert "make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer" (01:27:48)
+	* Howard Butler <hobu.inc at gmail.com> put the hardworking bits into the iterator instead of holding them on the stage (00:13:10)
+	* Howard Butler <hobu.inc at gmail.com> reverse the tear down order so the GDAL error handler gets popped before the gdal env is tore down (10:30:51)
+	* Howard Butler <hobu.inc at gmail.com> use full constructor for random_uuid generator, as the shortcut seems to use something uninitalized (10:29:21)
+
+2012-10-29
+	* Howard Butler <hobu.inc at gmail.com> clean up some memory leaks (14:07:44)
+
+2012-10-25
+	* Howard Butler <hobu.inc at gmail.com> guard against returning null iterators (14:29:51)
+	* Howard Butler <hobu.inc at gmail.com> test random iterator for stats filter (09:18:30)
+
+2012-10-24
+	* Howard Butler <hobu.inc at gmail.com> add random iterator implementation for filters.stats -- need a default impl for a lot more drivers #101 (14:34:24)
+	* Howard Butler <hobu.inc at gmail.com> typo (14:10:17)
+	* Howard Butler <hobu.inc at gmail.com> only put GDAL debug in a single log per-stream (14:07:39)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:28:55)
+	* Howard Butler <hobu.inc at gmail.com> a rather dumb implementation of gdal::GlobalDebug, which supports adding pdal::Log instances to the global GDAL logger (13:28:47)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #108 (11:03:38)
+
+2012-10-23
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (22:15:19)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #103, #106, #107 (22:14:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #106 (21:50:18)
+	* Howard Butler <hobu.inc at gmail.com> remember to delete debug object for gdal (20:05:57)
+	* Howard Butler <hobu.inc at gmail.com> one more GDAL debug cleanup attempt (18:14:28)
+	* Howard Butler <hobu.inc at gmail.com> another attempt and organizing GDAL debug (17:57:27)
+	* Howard Butler <hobu.inc at gmail.com> only output closing braces if we're outputting geojson (15:53:28)
+	* Howard Butler <hobu.inc at gmail.com> try to test for log's existence before hitting callback (15:18:39)
+	* Bradley J Chambers <brad.chambers at gmail.com> fix #104, fix #105 (13:43:46)
+	* Bradley J Chambers <brad.chambers at gmail.com> testing for LIBXML2_FOUND rather than WITH_LIBXML2 to project against the case of the library just not being found (13:40:58)
+	* Howard Butler <hobu.inc at gmail.com> try to trap conditions where Debug* is no longer available (12:59:56)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost-151' (11:38:05)
+	* Howard Butler <hobu.inc at gmail.com> linefeeds (11:38:01)
+	* Howard Butler <hobu.inc at gmail.com> be able to provide generator via argument (11:27:03)
+	* Howard Butler <hobu.inc at gmail.com> tweaks to boost import script (11:25:34)
+
+2012-10-22
+	* Howard Butler <hobu.inc at gmail.com> tweaks of import boost script (19:33:25)
+	* Howard Butler <hobu.inc at gmail.com> import boost 1.51 (19:32:41)
+	* Howard Butler <hobu.inc at gmail.com> tweaks for 1.51 (18:50:42)
+	* Howard Butler <hobu.inc at gmail.com> support writing GeoJSON as a 'format' of the text writer (14:02:04)
+	* Howard Butler <hobu.inc at gmail.com> use the Writer's chunk_size option in preference to using the count if it was set by the user (14:01:35)
+	* Howard Butler <hobu.inc at gmail.com> no need for GDAL include guards, this file should not be included without GDAL being available (08:54:48)
+	* Howard Butler <hobu.inc at gmail.com> don't include GDAL stuff in soci driver (08:53:43)
+
+2012-10-20
+	* Howard Butler <hobu.inc at gmail.com> default to using a chunk size of the getNumPoints() if available for all apps/ unless otherwise specified. (15:40:58)
+	* Howard Butler <hobu.inc at gmail.com> flip around eca9e2ade9fe010ea12177a04df8175f23703987 so that --single-buffer is the default, and the user can provide a specified --buffer-capacity if they wish (11:14:11)
+
+2012-10-19
+	* Howard Butler <hobu.inc at gmail.com> add --single-buffer switch, which attempts to process the pipeline using the count in a single buffer instead of piecewise. (12:54:55)
+	* Howard Butler <hobu.inc at gmail.com> delete the debug instance before the GDALClose.  This still isn't kosher, but the GDALClose won't issue a debug message to nowhere land if the debug is gone because it pops the current error handler. The whole GDAL debug thing needs to be cleaned up and put into global scope and filters need to fetch it from there (12:39:48)
+
+2012-10-18
+	* Howard Butler <hobu.inc at gmail.com> provide getGDALEnvironment to wake up GDAL on-demand for things that need it while still preventing it from being tore down while others might still depend on it (10:22:45)
+	* Howard Butler <hobu.inc at gmail.com> update GDAL debug to work in cases where GDAL_MAJOR_VERSION >= 2 (10:21:58)
+
+2012-10-17
+	* Howard Butler <hobu.inc at gmail.com> GDAL wakeup/shutdown should be in GlobalEnvironment, not individual filters, because we can't know the startup/shutdown order (19:48:09)
+	* Howard Butler <hobu.inc at gmail.com> cruft cleanup (14:16:54)
+	* Howard Butler <hobu.inc at gmail.com> write JSON Metadata instead of custom format for stas (11:54:57)
+	* Howard Butler <hobu.inc at gmail.com> support writing PointBuffer Metadata for pipeline-serialization (11:54:42)
+	* Howard Butler <hobu.inc at gmail.com> update with new output (11:54:10)
+	* Howard Butler <hobu.inc at gmail.com> toMetadata() method, to support making pdal::Metadata instances out of stats (11:53:50)
+	* Howard Butler <hobu.inc at gmail.com> support writing information from a PointBuffer (like pdal::Metadata) into the PipelineXML (11:53:05)
+	* Howard Butler <hobu.inc at gmail.com> make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer (11:52:23)
+	* Howard Butler <hobu.inc at gmail.com> add setMetadata method, which overwrites an existing one with the same properties using deleteMetadata and addMetadata (11:45:19)
+
+2012-10-15
+	* Howard Butler <hobu.inc at gmail.com> histogram stuff is way slooooooooooooowwwwwww, and we'll turn it off for now (11:08:32)
+	* Howard Butler <hobu.inc at gmail.com> more soci reader (10:32:44)
+
+2012-10-05
+	* Howard Butler <hobu.inc at gmail.com> more soci reader (14:55:31)
+	* Howard Butler <hobu.inc at gmail.com> hex i/o utilities (14:55:03)
+
+2012-10-03
+	* Howard Butler <hobu.inc at gmail.com> srs fetching for soci driver (17:00:07)
+	* Howard Butler <hobu.inc at gmail.com> more soci (13:26:44)
+
+2012-10-01
+	* Howard Butler <hobu.inc at gmail.com> attempt to get a full traceback when numpy fails to import (22:34:22)
+	* Howard Butler <hobu.inc at gmail.com> more soci cleanups (15:44:34)
+	* Howard Butler <hobu.inc at gmail.com> make required numpy version be at least 1.6+ (12:37:19)
+	* Howard Butler <hobu.inc at gmail.com> attempt to fix current compilation issue in #72 (10:08:47)
+
+2012-09-28
+	* Howard Butler <hobu.inc at gmail.com> drivers.soci.reader scaffolding (16:13:36)
+	* Howard Butler <hobu.inc at gmail.com> fix ups for #72 because PDAL won't compile if GDAL not enabled (14:47:01)
+	* Howard Butler <hobu.inc at gmail.com> more soci (14:39:58)
+	* Howard Butler <hobu.inc at gmail.com> don't put ignored dimensions on the dimension list when order is not specified (14:22:04)
+
+2012-09-27
+	* Howard Butler <hobu.inc at gmail.com> more soci (17:30:43)
+	* Howard Butler <hobu.inc at gmail.com> have calculateBounds switch based on whether or not the user wants a 3d bbox (17:30:36)
+	* Howard Butler <hobu.inc at gmail.com> make toWKT actually return a proper POLYGON (17:29:50)
+	* Howard Butler <hobu.inc at gmail.com> more soci writer (09:34:35)
+	* Howard Butler <hobu.inc at gmail.com> more fix for #100 (09:34:26)
+
+2012-09-25
+	* Howard Butler <hobu.inc at gmail.com> cloud table creation/index creation for pg (17:07:58)
+	* Howard Butler <hobu.inc at gmail.com> a better fix for #100 (15:50:46)
+	* Howard Butler <hobu.inc at gmail.com> fix #100 -- drivers.text.writer seeing multiple dimensions of the same name (14:51:24)
+	* Howard Butler <hobu.inc at gmail.com> add toWKT() method to export bounds as WKT when requested (12:02:14)
+	* Howard Butler <hobu.inc at gmail.com> more drivers.soci.writer (11:09:29)
+
+2012-09-24
+	* Howard Butler <hobu.inc at gmail.com> fix up primary key creation (15:54:21)
+	* Howard Butler <hobu.inc at gmail.com> clean up filters.decimation a bit more (12:14:25)
+
+2012-09-23
+	* Howard Butler <hobu.inc at gmail.com> fix #99, add offset option to allow the user to specify a shift to go along with the step (17:09:13)
+
+2012-09-20
+	* Howard Butler <hobu.inc at gmail.com> add a calculateBounds method to PointBuffer for convenience of looping through and fetching a bounds of the buffer (16:40:19)
+	* Howard Butler <hobu.inc at gmail.com> add basic block table creation to drivers.soci.writer (16:23:20)
+	* Bradley J Chambers <brad.chambers at gmail.com> PCINFO was failing with WITH_LIBXML2 = FALSE (default). (12:50:53)
+	* Bradley J Chambers <brad.chambers at gmail.com> add a note about how to run tests (12:50:11)
+	* Howard Butler <hobu.inc at gmail.com> update test output (11:36:33)
+	* Howard Butler <hobu.inc at gmail.com> link pg plugin if there (11:33:38)
+	* Howard Butler <hobu.inc at gmail.com> add readFileAsString method to FileUtils to bring back from drivers.oci.reader (11:33:22)
+	* Howard Butler <hobu.inc at gmail.com> try to return exception information when numpy fails to import (11:32:48)
+
+2012-09-19
+	* Howard Butler <hobu.inc at gmail.com> scaffolding for drivers.soci.reader/drivers.soci.writer (16:08:47)
+	* Howard Butler <hobu.inc at gmail.com> Fix #98 -- add the ability to drivers.text.writer to specify column order, and whether or not to write unspecified dimensions (11:10:09)
+
+2012-07-25
+	* Howard Butler <hobu.inc at gmail.com> fix up for 8b40fd79162efd6b9fe609e3c0ee8ec79641f95d so it actually compiles (21:19:56)
+	* Howard Butler <hobu.inc at gmail.com> start refactoring the reader a little bit, add naiveSkipImpl support (21:19:27)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL where we can to get a report on the difference in values (21:18:54)
+	* Howard Butler <hobu.inc at gmail.com> tweak tests to point at local instance for oracle read/write (13:04:10)
+	* Howard Butler <hobu.inc at gmail.com>  basic getNumPoints working for drivers.oci.reader #91 -- something's not quite right yet though (13:03:55)
+	* Howard Butler <hobu.inc at gmail.com> add example of fetching a specific dimension (16:33:11)
+	* Howard Butler <hobu.inc at gmail.com> add x_dim, y_dim, and z_dim options to filters.crop to be able to specifiy *which* dimension should be read and used for each (16:32:49)
+	* Howard Butler <hobu.inc at gmail.com> getDimension now supports asking for dotted names in the name variable, ie, 'drivers.las.reader.X', and it will separate the name and namespace on the last . that's found if .'s exist in the name argument (16:32:07)
+
+2012-09-17
+	* Howard Butler <hobu.inc at gmail.com> undo d4edf3e39507085e3e41e9d4e3ff4d7b61544076 (11:40:22)
+	* Howard Butler <hobu.inc at gmail.com> add a stats pipeline example (11:23:41)
+	* Howard Butler <hobu.inc at gmail.com> drivers.pipeline.reader needs to serialize the stage it owns, not itself (11:23:28)
+	* Howard Butler <hobu.inc at gmail.com> add a primary key unique constraint to obj_id,blk_id instead of simply creating a composite index on them (11:23:04)
+	* Howard Butler <hobu.inc at gmail.com> consolidate metadata-setting code together (11:12:20)
+	* Howard Butler <hobu.inc at gmail.com> use copy constructor for metadata creation (11:11:48)
+
+2012-09-12
+	* Howard Butler <hobu.inc at gmail.com> stubs for drivers.oci.reader::getNumPoints -- no implementation yet though (15:37:07)
+	* Howard Butler <hobu.inc at gmail.com> fix file location (15:36:44)
+	* Howard Butler <hobu.inc at gmail.com> trap errors better, add example that has decimation and reprojection filters in the mix with colorization (14:17:54)
+	* Howard Butler <hobu.inc at gmail.com> provide a parent/child example xml doc for testing (13:29:18)
+	* Howard Butler <hobu.inc at gmail.com> support writing metadata in Schema::to_xml, add --sdo_pc option to pcinfo to output the pc_other_attrs XML with metadata. Still need to do read side of the fence yet (10:26:52)
+	* Howard Butler <hobu.inc at gmail.com> update PointCloudSchema to 1.1, add arbitrary metadata entry with xs:anyType (10:24:33)
+
+2012-09-11
+	* Howard Butler <hobu.inc at gmail.com> add overwrite_existing_dimesions option to filters.selector to specify whether or not to create a new dimension when one of the same name exists. add parent/child integrity when we do add a same-named dimension. (12:43:47)
+
+2012-09-10
+	* Howard Butler <hobu.inc at gmail.com> decruft filters.selector (13:37:12)
+	* Howard Butler <hobu.inc at gmail.com> get create option for filters.selector working properly, with test (13:20:19)
+	* Howard Butler <hobu.inc at gmail.com> initial 'create' dimension mode added to filters.selector which is likely to be renamed to filters.schema and be the clearinghouse filter for schema manipulation (12:02:35)
+	* Howard Butler <hobu.inc at gmail.com> move method for creating a dimension interpretation from the C-style definition to static pdal::Dimension method (12:01:37)
+
+2012-09-07
+	* Howard Butler <hobu.inc at gmail.com> tweak layout (11:08:31)
+	* Howard Butler <hobu.inc at gmail.com> fix #95 so it actually works (10:29:15)
+	* Howard Butler <hobu.inc at gmail.com> comment out drivers.oci.reader tweak for now (09:19:35)
+	* Howard Butler <hobu.inc at gmail.com> throw error if we can't open the GDAL datasource (09:18:30)
+
+2012-09-06
+	* Howard Butler <hobu.inc at gmail.com> attempt to control when GDAL is cleaned up better (16:39:52)
+	* Howard Butler <hobu.inc at gmail.com> attempt to shutdown GDAL debugging at the begininning of the stage's constructor (16:02:57)
+	* Howard Butler <hobu.inc at gmail.com> start on implementation for #95 (15:31:44)
+	* Howard Butler <hobu.inc at gmail.com> tweak progress output (15:28:03)
+	* Howard Butler <hobu.inc at gmail.com> add progress reporting to pcpipeline (14:11:27)
+	* Howard Butler <hobu.inc at gmail.com> add percentage updates to ShellScriptCallback (14:11:16)
+	* Howard Butler <hobu.inc at gmail.com> the default getNumPoints method should forward the count from the previous stage until there isn't a previous stage anymore. If a Stage:: has its own getNumPoints method, it would be explicitly called, of course (14:10:53)
+	* Howard Butler <hobu.inc at gmail.com> append percentage to the shell command as the last argument (12:59:39)
+	* Howard Butler <hobu.inc at gmail.com> rename variables (12:22:56)
+	* Howard Butler <hobu.inc at gmail.com> tweak braces (12:02:02)
+	* Howard Butler <hobu.inc at gmail.com> default to using the current day/year for those header entries instead of 0/0 (11:47:37)
+	* Howard Butler <hobu.inc at gmail.com> add ShellScriptCallback class to support calling a shell script during the major progress heartbeat. The output/outcome of the shell script is ignored, but it is invoked at every major percentage (11:36:46)
+	* Howard Butler <hobu.inc at gmail.com> include stdio.h (11:18:02)
+	* Howard Butler <hobu.inc at gmail.com> move shell utilities into pdal::Utils for more general use (10:07:38)
+	* Howard Butler <hobu.inc at gmail.com> initialize values (10:07:15)
+
+2012-09-05
+	* Howard Butler <hobu.inc at gmail.com> remove goog +1 thingy (13:07:09)
+	* Howard Butler <hobu.inc at gmail.com> add breathe.css (13:05:36)
+	* Howard Butler <hobu.inc at gmail.com> update disqus url (11:14:31)
+	* Howard Butler <hobu.inc at gmail.com> consolidate pipeline creation (10:43:56)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (10:37:23)
+	* Howard Butler <hobu.inc at gmail.com> tweak layout (10:36:56)
+	* Howard Butler <hobu.inc at gmail.com> start working on sphinx-bootstrap conversion for pointcloud.org (10:20:25)
+
+2012-08-24
+	* Howard Butler <hobu.inc at gmail.com> add LocationTech presentation (15:48:14)
+
+2012-08-22
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:58:06)
+	* Bradley J Chambers <brad.chambers at gmail.com> but the text files need to be lf (09:55:35)
+	* Bradley J Chambers <brad.chambers at gmail.com> add .gitattributes file (09:51:33)
+
+2012-08-21
+	* Bradley J Chambers <brad.chambers at gmail.com> moving inferReaderDriver and inferWriterDriver to public static member functions within StageFactory (14:08:48)
+	* Howard Butler <hobu.inc at gmail.com> update ignores and add a few example pipelines (16:02:51)
+	* Howard Butler <hobu.inc at gmail.com> update ignores and add a few example pipelines (16:02:51)
+
+2012-08-20
+	* Howard Butler <hobu.inc at gmail.com> don't make setting VLRs contingent on having metadata -- they can come from options too (16:14:52)
+	* Howard Butler <hobu.inc at gmail.com> hop out of setting metadata if we have no metadata entries to set (15:49:24)
+	* Howard Butler <hobu.inc at gmail.com> only set vlrs if metadata option exists (15:30:13)
+	* Howard Butler <hobu.inc at gmail.com> fix up test (15:09:01)
+	* Howard Butler <hobu.inc at gmail.com> always set any vlr metadata entries if they were set in the options (15:08:07)
+	* Howard Butler <hobu.inc at gmail.com> FORWARD option for metadata wasn't working properly -- it was 0'ing out the actual data (14:51:48)
+	* Howard Butler <hobu.inc at gmail.com> VLR options can just start with 'vlr' instead of only be equal to it for setting metadata (13:02:34)
+	* Howard Butler <hobu.inc at gmail.com> try to trigger a jenkins build (10:57:55)
+	* Howard Butler <hobu.inc at gmail.com> try to trigger a jenkins build (10:52:17)
+	* Howard Butler <hobu.inc at gmail.com> OCTTransform cannot take null Z's, default to using a dummpy value unless the do_offset_z option is set on the filter to take in and transform the real z value (08:57:08)
+
+2012-08-18
+	* Howard Butler <hobu.inc at gmail.com> let's remove CMakeCache.txt and make clean in a build step instead of as part of the script (09:57:03)
+
+2012-08-17
+	* Howard Butler <hobu.inc at gmail.com> classification & 31 <-- there's only 31 classification values (16:28:59)
+	* Howard Butler <hobu.inc at gmail.com> force a clean build (15:03:55)
+	* Howard Butler <hobu.inc at gmail.com> fix non-flann filters.index (15:03:00)
+	* Howard Butler <hobu.inc at gmail.com> cleanup pc2pc tests (14:48:12)
+	* Howard Butler <hobu.inc at gmail.com> add filters.predicate to reprojection example (14:19:22)
+	* Howard Butler <hobu.inc at gmail.com> filters.index cleanups (14:18:55)
+	* Howard Butler <hobu.inc at gmail.com> turn off boost::test system error capture (14:18:33)
+
+2012-08-16
+	* Howard Butler <hobu.inc at gmail.com> make sure to wipe the CMakeCache.txt (17:11:20)
+	* Howard Butler <hobu.inc at gmail.com> turn off ORACLE testing for now (17:07:41)
+	* Howard Butler <hobu.inc at gmail.com> tweak jenkins config to try and get it going again (17:03:41)
+	* Howard Butler <hobu.inc at gmail.com> trap when index is not initialized (11:17:35)
+	* Howard Butler <hobu.inc at gmail.com> support writing to specified output, make sure to actually build index (11:17:21)
+	* Howard Butler <hobu.inc at gmail.com> don't throw exception for point counts not being equal (10:02:14)
+
+2012-08-14
+	* Howard Butler <hobu.inc at gmail.com> go back to the slow way for uuid generation (14:26:09)
+	* Howard Butler <hobu.inc at gmail.com> more noise (14:19:09)
+	* Howard Butler <hobu.inc at gmail.com> more filters.inplacereprojection (14:08:31)
+	* Howard Butler <hobu.inc at gmail.com> try to manually copy dimension (11:54:56)
+	* Howard Butler <hobu.inc at gmail.com> try clearing uuid first (11:43:19)
+	* Howard Butler <hobu.inc at gmail.com> more lint (11:37:25)
+	* Howard Butler <hobu.inc at gmail.com> more debug log (11:22:49)
+	* Howard Butler <hobu.inc at gmail.com> wipe off parent/child relationships when packing dimensions (09:54:53)
+	* Howard Butler <hobu.inc at gmail.com> filters.scaling needs the ignore_old_dimensions default switch (09:11:40)
+
+2012-08-13
+	* Howard Butler <hobu.inc at gmail.com> default to dimension's scale if not set (16:02:20)
+	* Howard Butler <hobu.inc at gmail.com> use the dimension's numerical offset as the default instead of 0.0 (15:30:42)
+	* Howard Butler <hobu.inc at gmail.com> make filters.scaling work more like (and with) filters.inplacereprojection (15:10:32)
+	* Howard Butler <hobu.inc at gmail.com> filters.inplacereprojection shouldn't be setting guids for old dimensions, it should forward what was there (15:07:47)
+	* Howard Butler <hobu.inc at gmail.com> if we don't find a dimension with an explicit namespace, we should throw an exception (14:57:02)
+	* Howard Butler <hobu.inc at gmail.com> add uuid and parent uuid to Dimension ostream<< (14:56:42)
+
+2012-08-11
+	* Howard Butler <hobu.inc at gmail.com> more log noise, denote that we've written the log in the case where we don't care to write it (16:01:17)
+	* Howard Butler <hobu.inc at gmail.com> look for STDIN or STDOUT for special filenames, not *exactly* this names (16:00:50)
+	* Howard Butler <hobu.inc at gmail.com> STDOUT is a now a magical filename which should behave as expected (15:12:15)
+	* Howard Butler <hobu.inc at gmail.com> progress should be written to stderr, not stdout.  STDOUT is a now a magical filename which should behave as expected (15:12:01)
+	* Howard Butler <hobu.inc at gmail.com> we have to manually build the index instead of automatically building it at readEndImpl, because readEndImpl is called every buffer read (12:08:27)
+
+2012-08-09
+	* Howard Butler <hobu.inc at gmail.com> get pcquery working for a single point query (17:19:52)
+	* Howard Butler <hobu.inc at gmail.com> fix up test (17:19:40)
+	* Howard Butler <hobu.inc at gmail.com> use SingleIndex, rename to {set|get}NumDimensions to clarify what it returns (17:19:32)
+	* Howard Butler <hobu.inc at gmail.com> default chunksize to 2**20 (17:18:43)
+	* Howard Butler <hobu.inc at gmail.com> default to taking in the offset x/y in the *source* coordinate system and automatically reprojecting it into the target coordinate system (12:23:17)
+	* Howard Butler <hobu.inc at gmail.com> support setting --scale and --offset for reprojection (12:22:23)
+
+2012-08-08
+	* Howard Butler <hobu.inc at gmail.com> don't have space inbetween header names (15:21:30)
+
+2012-08-06
+	* Howard Butler <hobu.inc at gmail.com> remove unused function (15:06:49)
+	* Howard Butler <hobu.inc at gmail.com> isGeographic should return a value (13:12:44)
+	* Howard Butler <hobu.inc at gmail.com> add noise examples (10:40:08)
+	* Howard Butler <hobu.inc at gmail.com> pcequal now working -- outputs a simple delta{X|Y|Z} file per-point. (08:52:03)
+
+2012-08-03
+	* Howard Butler <hobu.inc at gmail.com> add scaffolding for pcequal utility (10:50:39)
+	* Howard Butler <hobu.inc at gmail.com> remember to close our reference to the wkt stream (10:50:23)
+	* Howard Butler <hobu.inc at gmail.com> use FLANN_LIBRARIES for linkage (10:43:40)
+
+2012-08-01
+	* Howard Butler <hobu.inc at gmail.com> fix case-sensitive include (21:20:22)
+	* Howard Butler <hobu.inc at gmail.com> add --t_srs, --a_srs, --bounds, and --polygon options to pc2pc #40 (13:52:09)
+	* Howard Butler <hobu.inc at gmail.com> a few cleanups (13:51:02)
+	* Howard Butler <hobu.inc at gmail.com> add isGeographic call (13:49:09)
+	* Howard Butler <hobu.inc at gmail.com> Fix #85, crop.cpp lint (10:19:36)
+	* Howard Butler <hobu.inc at gmail.com> update expected test output (09:19:32)
+	* Howard Butler <hobu.inc at gmail.com> make --schema return valid xml (08:22:58)
+
+2012-07-30
+	* Michael P. Gerlek <mpg at flaxen.com> CSAR reader contributed by CARIS (not yet working) (18:14:00)
+	* Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (14:28:57)
+	* Michael P. Gerlek <mpg at flaxen.com> test runner helper script thing (14:27:11)
+	* Michael P. Gerlek <mpg at flaxen.com> remove dead test files (14:26:09)
+	* Michael P. Gerlek <mpg at flaxen.com> updated tests for win32 runs (11:38:19)
+
+2012-07-29
+	* Howard Butler <hobu.inc at gmail.com> another attempt to fix #84 (22:23:54)
+	* Howard Butler <hobu.inc at gmail.com> missing semicolon (09:44:04)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:42:05)
+	* Howard Butler <hobu.inc at gmail.com> setNamespace for dimensions that do not have namespaces and UUIDs from the drivers.oracle.reader (09:39:48)
+	* Howard Butler <hobu.inc at gmail.com> Fix #84, setVLRsFromMetadata passing null pointer into VLR constructor (09:22:24)
+	* Howard Butler <hobu.inc at gmail.com> test requesting dotted names (09:20:55)
+	* Howard Butler <hobu.inc at gmail.com> example crop with reprojection (09:20:16)
+
+2012-07-28
+	* Michael P. Gerlek <mpg at flaxen.com> make filename match test name (17:50:01)
+	* Michael P. Gerlek <mpg at flaxen.com> make test suite name match filename (17:44:37)
+	* Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (17:41:52)
+	* Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (17:40:27)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:25:54)
+	* Michael P. Gerlek <mpg at flaxen.com> untabify; vs2010 lint (17:24:44)
+	* Michael P. Gerlek <mpg at flaxen.com> moved FLANN guards, for vs2010 lint (17:24:03)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:23:26)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:23:11)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint; add PDAL_HAVE_FLANN guards (17:22:36)
+
+2012-07-27
+	* Howard Butler <hobu.inc at gmail.com> even better debug output (14:29:19)
+	* Howard Butler <hobu.inc at gmail.com> more debug noise (14:26:11)
+	* Howard Butler <hobu.inc at gmail.com> silence unused warning (13:38:11)
+	* Howard Butler <hobu.inc at gmail.com> fix #83 -- potential clipping of intensity in las writer (13:35:34)
+	* Howard Butler <hobu.inc at gmail.com> include guard for GEOS stuff (12:11:20)
+	* Howard Butler <hobu.inc at gmail.com> NITF contingent on GDAL being around (11:40:46)
+
+2012-07-23
+	* Howard Butler <hobu.inc at gmail.com> don't test entire buffers for now (13:30:13)
+	* Howard Butler <hobu.inc at gmail.com> wkt validation was dumb (11:04:05)
+	* Howard Butler <hobu.inc at gmail.com> increase debug level of whole-buffer not intersecting (10:58:00)
+	* Howard Butler <hobu.inc at gmail.com> validate the GEOS geometry, put WKT that was exported out of GEOS into the log as extra validation of what might be coming through (10:18:55)
+
+2012-07-21
+	* Howard Butler <hobu.inc at gmail.com> increase precision of log output (21:52:09)
+	* Howard Butler <hobu.inc at gmail.com> add some super noisy logging (17:32:38)
+
+2012-07-20
+	* Howard Butler <hobu.inc at gmail.com> whoops. also guard against copying when we have no points to copy (21:18:53)
+	* Howard Butler <hobu.inc at gmail.com> attempt to fix accounting of buffer reading in filters.crop (12:16:03)
+
+2012-07-19
+	* Howard Butler <hobu.inc at gmail.com> missing include (10:49:21)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:41:50)
+	* Howard Butler <hobu.inc at gmail.com> add pcquery scaffolding (10:41:39)
+	* Howard Butler <hobu.inc at gmail.com> make filters.crop respect 2d WKT if given (10:41:31)
+
+2012-07-18
+	* Howard Butler <hobu.inc at gmail.com> make the filter be able to optionally do 2d vs 3d indexes (19:59:06)
+
+2012-07-17
+	* Bradley J Chambers <brad.chambers at gmail.com> for those of us not compiling with python (14:40:37)
+	* Howard Butler <hobu.inc at gmail.com> basic implementation of filters.index now working, can query for k nearest, or k nearest with a distance (09:51:04)
+	* Howard Butler <hobu.inc at gmail.com> typo'd metadata entry (09:50:42)
+
+2012-06-06
+	* Bradley J Chambers <brad.chambers at gmail.com> FindPoints2Grid was not finding the library in /usr/local (14:36:16)
+	* Howard Butler <hobu.inc at gmail.com> update the header *before* initialize (09:37:51)
+
+2012-07-16
+	* Howard Butler <hobu.inc at gmail.com> increase default sample size quite a bit (14:09:55)
+	* Howard Butler <hobu.inc at gmail.com> make filters.stats ignore ignored dimensions (14:00:00)
+	* Howard Butler <hobu.inc at gmail.com> make chunk_size available to all applications (13:59:39)
+
+2012-07-13
+	* Howard Butler <hobu.inc at gmail.com> update test output to reflect newline addition to pcinfo output in 9a0c5c9294cff1a21d8acd55b20b953765817bdb (10:46:15)
+	* Howard Butler <hobu.inc at gmail.com> drivers.pipeline.reader will strip off the writer on a pipeline if it exists rather than complain about not being able to use the pipeline. This fixes #82 and adds the ability of pcinfo to info'ize any pipeline file without manual modification (10:44:31)
+	* Howard Butler <hobu.inc at gmail.com> add a newline to final output (10:40:47)
+	* Howard Butler <hobu.inc at gmail.com> default to taking options' metadata if no drivers.las.reader metadata are available (10:11:47)
+
+2012-07-12
+	* Howard Butler <hobu.inc at gmail.com> update pcinfo tests now that --output is no longer supported -- use > for just dumping to stdout as you need (11:26:02)
+	* Howard Butler <hobu.inc at gmail.com> don't catch system errors for invocation (10:55:35)
+	* Howard Butler <hobu.inc at gmail.com> note aboute catch_system_errors (10:54:26)
+
+2012-07-11
+	* Howard Butler <hobu.inc at gmail.com> fix #76 to add exact count information for ReturnNumber and NumberOfReturns (14:52:24)
+	* Howard Butler <hobu.inc at gmail.com> --stdin is now available to both pcpipeline and pcinfo, and if they are set, they are used as the filename (14:43:34)
+	* Howard Butler <hobu.inc at gmail.com> STDIN is a special filename for pipeline xml and we'll return as such (14:42:46)
+	* Howard Butler <hobu.inc at gmail.com> STDIN is a special filename, and we'll accept it as valid and existing if someone wants to check or open it (14:42:06)
+	* Howard Butler <hobu.inc at gmail.com> fix up test to reflect keeping srs in metadata (11:33:32)
+	* Howard Butler <hobu.inc at gmail.com> include guard again (11:33:20)
+	* Howard Butler <hobu.inc at gmail.com> have setSpatialReference also update the srs entry in the metadata, where this should probably be by default instead as a special data member (11:33:11)
+	* Howard Butler <hobu.inc at gmail.com> make getMetadata throw a proper error if it can't find an entry with the requested path. add a deleteMetadata method to remove a requested entry (11:32:15)
+	* Howard Butler <hobu.inc at gmail.com> make Stage a friend of StageBase so they can interact with StageBase private data members (11:31:30)
+	* Howard Butler <hobu.inc at gmail.com> put --stage in a <stage> element so the output is valid xml (08:52:51)
+
+2012-07-10
+	* Howard Butler <hobu.inc at gmail.com> #ifdef PDAL_HAVE_FLANN guards around flann stuff so we can build without it (09:41:55)
+	* Howard Butler <hobu.inc at gmail.com> turn FLANN on by default for builds that hobu makes (09:14:19)
+	* Howard Butler <hobu.inc at gmail.com> add WITH_FLANN guard so FLANN is no longer a required dependency (09:14:06)
+
+2012-07-03
+	* Howard Butler <hobu.inc at gmail.com> more filters.index development (11:55:47)
+
+2012-06-29
+	* Howard Butler <hobu.inc at gmail.com> add stubs for FLANN-based spatial index (14:31:03)
+	* Howard Butler <hobu.inc at gmail.com> add detection of FLANN (14:16:16)
+	* Howard Butler <hobu.inc at gmail.com> cleanup file after done writing (14:16:06)
+	* Howard Butler <hobu.inc at gmail.com> add a chipper example test which exercises random iterators #81 (10:20:12)
+	* Howard Butler <hobu.inc at gmail.com> drivers.nitf.reader needs to forward random iterator from the las driver #81 (10:15:43)
+	* Howard Butler <hobu.inc at gmail.com> chipper should report an error if unable to create a random iterator from a previous stage #81 (10:14:54)
+
+2012-06-25
+	* Howard Butler <hobu.inc at gmail.com> import cstdarg for va_list, etc (12:14:43)
+	* Howard Butler <hobu.inc at gmail.com> whoops, nuke the point count (11:45:40)
+	* Howard Butler <hobu.inc at gmail.com> algebra is cool -- support 'outside' parameter to get anything *but* what's inside the clip polygon (11:36:57)
+	* Howard Butler <hobu.inc at gmail.com> add crop example (11:11:19)
+	* Howard Butler <hobu.inc at gmail.com> filters.crop now can take in a 'polygon' option as WKT and use GEOS (if available) to do precise-bounds clipping based on the geometry (10:58:39)
+	* Howard Butler <hobu.inc at gmail.com> fix up GEOS detection to make it completely optional (10:57:52)
+	* Howard Butler <hobu.inc at gmail.com> fix up includes for getPythonEnvironment (10:57:30)
+
+2012-06-21
+	* Howard Butler <hobu.inc at gmail.com> more GEOS (13:49:06)
+	* Howard Butler <hobu.inc at gmail.com> collect the PointBuffer's bounds as we read it in drivers.las.reader (12:13:11)
+	* Howard Butler <hobu.inc at gmail.com> add GEOS-finding machinery (12:12:29)
+	* Howard Butler <hobu.inc at gmail.com> remove unnecessary include (12:11:47)
+
+2012-06-14
+	* Howard Butler <hobu.inc at gmail.com> clean up some const_cast'able warnings (12:53:41)
+	* Howard Butler <hobu.inc at gmail.com> tell which function was not found in error for compile (12:53:24)
+	* Howard Butler <hobu.inc at gmail.com> don't make getPythonEnvironment method contingent on WITH_PYTHON being there -- throw an error instead when we can't initialize (11:45:10)
+	* Howard Butler <hobu.inc at gmail.com> because PointBuffer only allows a boost::uint32_t-sized array anyway, we should take this is as our position instead of std::size_t. (10:27:24)
+
+2012-06-13
+	* Howard Butler <hobu.inc at gmail.com> rename 'reserved' metadata for LAS to global_encoding to close #75 (21:59:33)
+	* Howard Butler <hobu.inc at gmail.com> fix up logging after #73 cleanup (21:58:43)
+	* Howard Butler <hobu.inc at gmail.com> apply pdal::Log fix for #73 (20:38:57)
+	* Howard Butler <hobu.inc at gmail.com> apply variations on fixes for #73 (16:08:48)
+	* Howard Butler <hobu.inc at gmail.com> add colorize example (15:36:38)
+	* Howard Butler <hobu.inc at gmail.com> add colorization pipeline example (14:25:07)
+	* Howard Butler <hobu.inc at gmail.com> support compiling GlobalEnvironment without -DWITH_PYTHON on (13:57:02)
+	* Howard Butler <hobu.inc at gmail.com> return const& for getField requests instead of copies for performance win (11:56:23)
+	* Howard Butler <hobu.inc at gmail.com> look for name+ns for all dimensions, not just xyz (11:55:52)
+	* Howard Butler <hobu.inc at gmail.com> move convert from PointBuffer to Dimension: (11:55:08)
+	* Howard Butler <hobu.inc at gmail.com> move saturation_cast out of PointBuffer into Utils:: (11:54:50)
+	* Howard Butler <hobu.inc at gmail.com> move convertDimension out to Dimension::, make getField return a const& instead of a copy for performance win (11:54:33)
+
+2012-06-12
+	* Howard Butler <hobu.inc at gmail.com> clean up warning (16:34:46)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (15:38:56)
+	* Howard Butler <hobu.inc at gmail.com> get PointBuffer::getField out of the coversion business -- too slow to do checks inside the critical path here anyway. (14:34:49)
+	* Howard Butler <hobu.inc at gmail.com> add a startingPosition default argument to Writer::write to set the starting point (used in pc2pc and pcpipeline as the --skip argument (14:34:10)
+	* Howard Butler <hobu.inc at gmail.com> only test if the stream is .good(), don't entirely cast to bool to check stream state (14:33:31)
+	* Howard Butler <hobu.inc at gmail.com> add skip parameter to pc2pc and pcpipeline to allow you to position where to start reading (14:24:58)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:45:37)
+	* Howard Butler <hobu.inc at gmail.com> don't do strcmp, instead just check the ordinal value of the character returned by typeid (09:45:16)
+
+2012-06-11
+	* Howard Butler <hobu.inc at gmail.com> add Z dimension to filtered text output example (07:34:22)
+
+2012-06-08
+	* Howard Butler <hobu.inc at gmail.com> add --count option to pcpipeline and pc2pc to specify how many points to write out for the given invocation (13:45:07)
+	* Howard Butler <hobu.inc at gmail.com> add text writing with dimension selection example (13:18:47)
+	* Howard Butler <hobu.inc at gmail.com> if the delimiter is nothing, use spaces by default. add option to skip writing the header (13:18:06)
+	* Howard Butler <hobu.inc at gmail.com> fix up bug where text writer wasn't handling ignored fields properly (13:11:27)
+	* Howard Butler <hobu.inc at gmail.com> support both packed and unpacked rgb values for PCD (09:10:48)
+	* Howard Butler <hobu.inc at gmail.com> write out color as individual fields (08:50:11)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:21:54)
+	* Howard Butler <hobu.inc at gmail.com> add a bigger autzen example (08:21:34)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:15:47)
+	* Howard Butler <hobu.inc at gmail.com> attempt to write RGB (wrongly) to PCD writer (08:15:20)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:13:18)
+
+2012-06-07
+	* Howard Butler <hobu.inc at gmail.com> add a rudimentary PCL PCD ASCII writer (13:37:15)
+
+2012-06-05
+	* Howard Butler <hobu.inc at gmail.com> update output (11:16:57)
+	* Howard Butler <hobu.inc at gmail.com> note to support selective scaling/descaling some day in text writer (11:00:06)
+	* Howard Butler <hobu.inc at gmail.com> more tutorial doc (10:59:41)
+	* Howard Butler <hobu.inc at gmail.com> more tutorial doc work (10:08:25)
+	* Howard Butler <hobu.inc at gmail.com> if we're returning data with scaling applied, we shouldn't truncate the output to an integer (10:08:12)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:07:34)
+	* Howard Butler <hobu.inc at gmail.com> fix up ..seealso:: formatting (09:07:15)
+	* Howard Butler <hobu.inc at gmail.com> add positional arguments support for input/output (09:06:57)
+	* Howard Butler <hobu.inc at gmail.com> assume .txt is the drivers.text.writer output (09:06:43)
+
+2012-06-04
+	* Michael P. Gerlek <mpg at flaxen.com> switch to just assume a filename option (23:43:14)
+	* Howard Butler <hobu.inc at gmail.com> fix up record_id warnings (22:56:36)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (22:52:55)
+	* Howard Butler <hobu.inc at gmail.com> clean up a few truncation warnings (22:43:11)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (22:39:19)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (22:33:50)
+	* Michael P. Gerlek <mpg at flaxen.com> more blunt-force-nitf work (22:33:40)
+	* Howard Butler <hobu.inc at gmail.com> clean up character literal comparison that didn't have tight enough parentheses to even work anyway (22:32:15)
+	* Michael P. Gerlek <mpg at flaxen.com> start of blunt-force-trauma approach to NITF writing via GDAL (21:57:49)
+	* Howard Butler <hobu.inc at gmail.com> add xml output to the pcinfo example (15:13:13)
+	* Howard Butler <hobu.inc at gmail.com> more tutorial (15:05:57)
+	* Howard Butler <hobu.inc at gmail.com> put the XML output of -p into a 'point' object so the xml is valid (15:05:48)
+	* Howard Butler <hobu.inc at gmail.com> note about multiple options (14:21:27)
+	* Howard Butler <hobu.inc at gmail.com> fix up the las writer to respect the ignored flag and add a test to the las writer test that uses it (13:47:01)
+	* Howard Butler <hobu.inc at gmail.com> update test (12:27:06)
+	* Howard Butler <hobu.inc at gmail.com> split apart metadata for reader/writer scenarios (12:26:57)
+	* Howard Butler <hobu.inc at gmail.com> regularize option/metadata names (12:26:33)
+	* Howard Butler <hobu.inc at gmail.com> support setting VLR metadata entries from 'metadata' option also -- provide a complete example of how to actually do so (11:17:00)
+	* Howard Butler <hobu.inc at gmail.com> add copyright/license notice (08:51:48)
+	* Howard Butler <hobu.inc at gmail.com> doc updates (08:19:18)
+
+2012-06-01
+	* Howard Butler <hobu.inc at gmail.com> remove unused variable (16:35:02)
+	* Howard Butler <hobu.inc at gmail.com> update the scaling filter to cache the dimensions themselves instead of only ids so that we don't have to do a dimension lookup per-point (16:31:53)
+	* Howard Butler <hobu.inc at gmail.com> the buffer size for the raw bytes for a single point doesn't need to be 1m big (15:01:49)
+	* Howard Butler <hobu.inc at gmail.com> gah, don't use iequals for testing inside the critical path -- it was acquiring locks for the locale (14:59:05)
+	* Howard Butler <hobu.inc at gmail.com> cache some variables so we don't have to look them up every point (14:33:57)
+	* Howard Butler <hobu.inc at gmail.com> we cache the schema's bytesize -- use it (14:04:53)
+	* Howard Butler <hobu.inc at gmail.com> dont create the Python environment until we actually ask for it the first time (14:04:29)
+	* Howard Butler <hobu.inc at gmail.com> no need to look up data record length after the header is written -- use our header's value instead (13:40:57)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL for better feedback when things fail (13:17:03)
+	* Howard Butler <hobu.inc at gmail.com> resize the PointBuffer instead of creating a new one for the last little bit (13:15:26)
+	* Howard Butler <hobu.inc at gmail.com> give PointBuffer the ability to be resized (13:15:10)
+	* Howard Butler <hobu.inc at gmail.com> no need to create a new buffer for the last little bit (12:10:12)
+	* Howard Butler <hobu.inc at gmail.com> more documentation reorganization and fleshing out of Pipeline docs into their own, high-level file (10:28:20)
+
+2012-05-31
+	* Howard Butler <hobu.inc at gmail.com> start documenting Pipeline (16:01:05)
+	* Howard Butler <hobu.inc at gmail.com> update metadata tests to use interesting.las which has more vlrs and header values set (14:34:38)
+	* Howard Butler <hobu.inc at gmail.com> metadata docs (14:34:12)
+	* Howard Butler <hobu.inc at gmail.com> add metadata descriptions from the LAS specification (14:34:04)
+	* Howard Butler <hobu.inc at gmail.com> use Metadata instead of Entry for XML sub-elements (14:33:42)
+	* Howard Butler <hobu.inc at gmail.com> metadata sub-entries should be under the 'metadata' lable, not 'entries' (12:20:48)
+
+2012-05-30
+	* Howard Butler <hobu.inc at gmail.com> start on a little metadata documentation (16:04:05)
+	* Howard Butler <hobu.inc at gmail.com> more pdal::Metadata cleanup, including documentation and removal of the integer-based type that instances were carrying (15:46:29)
+	* Howard Butler <hobu.inc at gmail.com> use new metadata fetching methods for cleaner code (13:16:50)
+	* Howard Butler <hobu.inc at gmail.com> a method for fetching a default or specified metadata option value -- this maybe should be on Options:: too (13:16:30)
+	* Howard Butler <hobu.inc at gmail.com> don't return optional to temporary reference (can I have these two hours back please?) (13:15:41)
+
+2012-05-29
+	* Howard Butler <hobu.inc at gmail.com> use new pdal::Options::getMetadataOption for dataformatid (16:36:47)
+	* Howard Butler <hobu.inc at gmail.com> shortcut method for asking Options whether or not it has entries for setting/getting Metadata (16:36:21)
+	* Howard Butler <hobu.inc at gmail.com> eliminate a copy in the option-fetching code to look up whether or not to forward metadata (15:42:22)
+	* Howard Butler <hobu.inc at gmail.com> StageBase::collectMetadata will put all of the stage's pdal::Metadata entries into a single Metadata instance in prefixed by their StageBase::getName().  You can then address individual pdal::Metadata entries using this name (a simple property_tree lookup) as shown in the LAS writer (15:17:08)
+	* Howard Butler <hobu.inc at gmail.com> have predicate filter copy in-place rather than creating a new PointBuffer and swapping it out (15:03:46)
+	* Howard Butler <hobu.inc at gmail.com> we can add the ptree directly when adding a metadata to a metadata (13:01:33)
+
+2012-05-26
+	* Howard Butler <hobu.inc at gmail.com> support copying specified VLR entries from metadata (13:33:21)
+	* Howard Butler <hobu.inc at gmail.com> we could have already set VLRs on the Writer's header, so we should use them (13:32:39)
+
+2012-05-25
+	* Howard Butler <hobu.inc at gmail.com> much metadata forwarding now working, VLRs almost done (16:10:27)
+	* Howard Butler <hobu.inc at gmail.com> needs to return const& for toPTree() (16:10:04)
+	* Howard Butler <hobu.inc at gmail.com> add a LAS with interesting header attributes for metadata testing (14:08:50)
+	* Michael P. Gerlek <mpg at flaxen.com> minor error checks (13:27:30)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (12:27:19)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (12:27:10)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (11:55:24)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:54:44)
+	* Howard Butler <hobu.inc at gmail.com> support writing Metadata from a 'forward' Metadata option (only works for software_id right now (11:54:41)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:54:11)
+	* Howard Butler <hobu.inc at gmail.com> add getValueOptional that reaches through the 'entries' tree to get entries with a given path (11:53:49)
+	* Michael P. Gerlek <mpg at flaxen.com> added first lock (11:48:39)
+	* Michael P. Gerlek <mpg at flaxen.com> Python env is global, not per-thread (11:31:49)
+	* Michael P. Gerlek <mpg at flaxen.com> somehow windows max() defn crept in again (10:22:20)
+	* Howard Butler <hobu.inc at gmail.com> discriminate between read and write modes when opening a LASzip instance so we don't accidentally apply a created LASzip VLR to an as-read file (09:31:02)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:30:37)
+	* Howard Butler <hobu.inc at gmail.com> we were not using the right test to determine whether or not a LASzip VLR was valid. It should be userid+recordid, not userid+description (08:17:18)
+
+2012-05-24
+	* Howard Butler <hobu.inc at gmail.com> put back some deck chairs from trying to investigate LASzip issue (16:16:54)
+	* Howard Butler <hobu.inc at gmail.com> better error message (16:15:27)
+	* Howard Butler <hobu.inc at gmail.com> clean up methods of drivers.las.reader that merely expose items in the LasHeader -- instead just expect the user to deal with the LasHeader themselves directly (14:45:40)
+	* Howard Butler <hobu.inc at gmail.com> fix up broken test (13:57:41)
+	* Howard Butler <hobu.inc at gmail.com> namespace the NITF metdata (13:31:32)
+	* Howard Butler <hobu.inc at gmail.com> replace .'s with _'s when doing add_child for addMetdata so as to not get hugely deep trees that require lots of walking (13:31:14)
+	* Howard Butler <hobu.inc at gmail.com> decruft (13:30:08)
+	* Howard Butler <hobu.inc at gmail.com> another big whack at pdal::Metadata -- now *backed* by a boost::property_rather than driving from one, and it now supports arbitrary depth entries (12:45:11)
+
+2012-05-21
+	* Howard Butler <hobu.inc at gmail.com> make pdal::ByteArray i/o through boost::property_tree and friends by providing istream and ostream methods (15:00:35)
+	* Howard Butler <hobu.inc at gmail.com> pdal::metadata::Entry is now a lightly-wrapped subclass of boost::property_tree (14:09:29)
+
+2012-05-18
+	* Howard Butler <hobu.inc at gmail.com> put stats inside a node to fix #77 (15:58:11)
+	* Howard Butler <hobu.inc at gmail.com> make pdal::metadata::Entry subclass from boost::property_tree (15:38:42)
+
+2012-05-16
+	* Howard Butler <hobu.inc at gmail.com> turn off pdal::Object for now (16:42:19)
+	* Howard Butler <hobu.inc at gmail.com> pdal::Object not used right now (16:30:10)
+	* Howard Butler <hobu.inc at gmail.com> more clean up of ByteArray (16:25:13)
+	* Howard Butler <hobu.inc at gmail.com> undo ByteArray subbing from Object for now (16:08:53)
+	* Howard Butler <hobu.inc at gmail.com> initialize metadata to blank (16:01:07)
+	* Howard Butler <hobu.inc at gmail.com> update metadata tests (15:56:11)
+	* Howard Butler <hobu.inc at gmail.com> use default variant assignment (15:56:00)
+	* Howard Butler <hobu.inc at gmail.com> make sure to set/addEntry (15:45:35)
+	* Howard Butler <hobu.inc at gmail.com> protect against shutdown() being called multiple times (15:30:40)
+	* Howard Butler <hobu.inc at gmail.com> explictly copy string of specified size (15:30:26)
+	* Howard Butler <hobu.inc at gmail.com> nullify member variables (15:30:05)
+	* Howard Butler <hobu.inc at gmail.com> make sure to add blank if we threw an exception (13:08:06)
+	* Howard Butler <hobu.inc at gmail.com> make sure to initialize our arrays (12:54:25)
+	* Howard Butler <hobu.inc at gmail.com> clean up comments (12:37:21)
+	* Howard Butler <hobu.inc at gmail.com> set las.header.uuid to nil_uuid by default instead of manually memset'ing the values to 0 (12:36:01)
+	* Howard Butler <hobu.inc at gmail.com> trap any exceptions that might happen when trying to add/set an entry so that they set blank values (12:30:18)
+	* Howard Butler <hobu.inc at gmail.com> the user might call shutdown multiple times (11:59:41)
+
+2012-05-15
+	* Michael P. Gerlek <mpg at flaxen.com> lint (17:57:07)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:39:46)
+	* Michael P. Gerlek <mpg at flaxen.com> adding thread test - checkpoint (17:39:28)
+	* Michael P. Gerlek <mpg at flaxen.com> fixed logging-by-stages (17:13:25)
+	* Bradley J Chambers <brad.chambers at gmail.com> python_env did not exist for those of us compiling without python (14:36:17)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master', remote-tracking branch 'origin/master' (14:10:02)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:43:59)
+	* Howard Butler <hobu.inc at gmail.com> clean up metadata::Entry a bit (13:43:49)
+	* Michael P. Gerlek <mpg at flaxen.com> removed Singleton.hpp (13:37:30)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:22:44)
+	* Michael P. Gerlek <mpg at flaxen.com> fixed the singleton GlobalEnv issue (13:21:55)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:03:52)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:02:58)
+	* Michael P. Gerlek <mpg at flaxen.com> remopved Singlton<>, now fails to link (13:02:40)
+	* Howard Butler <hobu.inc at gmail.com> add type for pdal::Metadata (12:58:17)
+	* Howard Butler <hobu.inc at gmail.com> add recursive_wrapper<Metadata> to Variant type to be stored inside of Metadata instances (12:56:20)
+	* Howard Butler <hobu.inc at gmail.com> increment version to closer reflect our current tag (12:26:08)
+	* Howard Butler <hobu.inc at gmail.com> static_cast instead of c-style casts (11:48:21)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:22:27)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (11:22:05)
+	* Howard Butler <hobu.inc at gmail.com> clean up type warning with a cast (11:06:25)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:57:45)
+	* Michael P. Gerlek <mpg at flaxen.com> singleton Environment (10:57:36)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (10:45:25)
+	* Howard Butler <hobu.inc at gmail.com> update test output (10:26:21)
+
+2012-05-14
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint, working on ThreadEnvironment and friends (20:05:18)
+	* Howard Butler <hobu.inc at gmail.com> exact counts for Classication (and other specified Dimension names if added to the options (19:57:33)
+	* Howard Butler <hobu.inc at gmail.com> overflow test would never be tripped (18:55:31)
+	* Howard Butler <hobu.inc at gmail.com> copy VLRs and add assignment operator (18:50:08)
+	* Howard Butler <hobu.inc at gmail.com> more tweaking of LAS stuff (18:42:42)
+	* Howard Butler <hobu.inc at gmail.com> turn off unused warnings for gcc (13:49:22)
+	* Howard Butler <hobu.inc at gmail.com> fix up reordering (13:49:07)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:35:39)
+	* Howard Butler <hobu.inc at gmail.com> back out 04cb7b05df0b7eae4c5505fa7342c20ed1e8cc0e because it breaks stuff on windows (11:35:28)
+	* Michael P. Gerlek <mpg at flaxen.com> testing (11:13:26)
+
+2012-05-13
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (17:00:17)
+
+2012-05-11
+	* Howard Butler <hobu.inc at gmail.com> test for options that define whether or not a metadata item is to be forwarded into the header (15:28:21)
+	* Howard Butler <hobu.inc at gmail.com> set values on header directly in preparation for removing public methods of driver.las.Writer that deal with the header in favor of giving user the ability to manipulate the header directly themselves (11:28:24)
+	* Howard Butler <hobu.inc at gmail.com> put back copy constructor, start reworking a bit to prep for LAS 1.4 (11:27:21)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master', remote-tracking branch 'origin/master' (11:18:06)
+
+2012-05-10
+	* Howard Butler <hobu.inc at gmail.com> support setting data record lengths for LAS that are not just the fixed set defined by the point formats (14:01:25)
+	* Howard Butler <hobu.inc at gmail.com> make sure to read the metadata (12:59:53)
+	* Howard Butler <hobu.inc at gmail.com> increase default chunk size to 2^20 instead of 2^15 (12:39:04)
+	* Howard Butler <hobu.inc at gmail.com> rename collectMetadata to not clash with StageBase::collectMetadata (12:38:13)
+	* Howard Butler <hobu.inc at gmail.com> default to clang for me (12:37:44)
+	* Howard Butler <hobu.inc at gmail.com> clean up const warning (12:37:30)
+	* Howard Butler <hobu.inc at gmail.com> silence unused warnings (12:37:11)
+	* Howard Butler <hobu.inc at gmail.com> add missing initializers (12:13:54)
+	* Howard Butler <hobu.inc at gmail.com> set project_id and reserved flag from metadata if asked (08:58:46)
+	* Howard Butler <hobu.inc at gmail.com> constructors shouldn't throw (08:46:34)
+
+2012-05-09
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (17:09:25)
+	* Howard Butler <hobu.inc at gmail.com> set defaults in constructor, not initialize() (17:09:20)
+	* Howard Butler <hobu.inc at gmail.com> move initialize() to after we set properties, not before (17:08:46)
+	* Howard Butler <hobu.inc at gmail.com> reorganize metadata setting a bit, add some log noise (16:55:13)
+	* Howard Butler <hobu.inc at gmail.com> default to 1.0 for scales rather than 0.01 (16:49:45)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:50:27)
+	* Michael P. Gerlek <mpg at flaxen.com> make Redirector be not static (15:50:09)
+	* Howard Butler <hobu.inc at gmail.com> we can't change properties of the writer after initialize() and expect to get what we want (14:57:12)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:40:41)
+	* Howard Butler <hobu.inc at gmail.com> test depends on python being around (13:27:15)
+	* Howard Butler <hobu.inc at gmail.com> return correct num points read (13:12:02)
+
+2012-05-08
+	* Michael P. Gerlek <mpg at flaxen.com> py redirection seems functional (22:36:32)
+	* Michael P. Gerlek <mpg at flaxen.com> getting ready to add python stdout redirection (21:58:42)
+	* Michael P. Gerlek <mpg at flaxen.com> fix leak in readPipeline logic (21:19:55)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (20:28:47)
+	* Michael P. Gerlek <mpg at flaxen.com> make test name match file name (20:05:43)
+	* Michael P. Gerlek <mpg at flaxen.com> fix creeping lambda build issue; better name the Env classes; stub in ThreadEnv (20:00:50)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc fix? (17:44:31)
+	* Michael P. Gerlek <mpg at flaxen.com> remove Python3 code; gratuitously refactor into a class (16:21:39)
+	* Michael P. Gerlek <mpg at flaxen.com> raw addition of Mateusz's redirector code (15:52:14)
+	* Howard Butler <hobu.inc at gmail.com> add a --validate option to pcpipeline that does initialize() of the pipeline but does not actually execute the write() of the points. This allows pipeline-serialization to fetch metadata and the user to check some things before running a big operation (15:44:37)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:36:04)
+	* Howard Butler <hobu.inc at gmail.com> a hacky forward_metadata option that sets metadata entries of some header values using the metadata that exists in the pipeline up to this stage (15:35:57)
+	* Howard Butler <hobu.inc at gmail.com> option to collectMetadata from all stages into a single pdal::Metadata instance (15:35:10)
+	* Michael P. Gerlek <mpg at flaxen.com> add multi-file option test (15:00:37)
+	* Michael P. Gerlek <mpg at flaxen.com> start staging in directed logging for py (13:54:56)
+	* Michael P. Gerlek <mpg at flaxen.com> lint, unused (13:52:35)
+	* Howard Butler <hobu.inc at gmail.com> shut off unused (13:33:02)
+
+2012-05-07
+	* Howard Butler <hobu.inc at gmail.com> update test to reflect current conditions (20:16:22)
+	* Howard Butler <hobu.inc at gmail.com> update to do operations on Stage creation, not buffer creation (20:15:57)
+	* Howard Butler <hobu.inc at gmail.com> switch off buffer copy shortcut for now (20:15:19)
+	* Howard Butler <hobu.inc at gmail.com> oracle test updates (16:20:40)
+	* Howard Butler <hobu.inc at gmail.com> try to make the data copying a little faster when packing the dimensions together by caching the dimension details rather than fetching them from the multi_index for each point (16:20:31)
+	* Howard Butler <hobu.inc at gmail.com> lint (16:18:55)
+	* Howard Butler <hobu.inc at gmail.com> alterSchema needs to happen at first read, not instantiation (16:18:24)
+	* Howard Butler <hobu.inc at gmail.com> a few small cleanups, tighten up a dimension equality test for copyOracleData (16:16:53)
+	* Howard Butler <hobu.inc at gmail.com> continue reading cloud instances until we are done if we have them (13:19:19)
+
+2012-05-05
+	* Howard Butler <hobu.inc at gmail.com> update drivers.oracle.reader to set data for dimensions that are requested through the PointBuffer rather than dictating the PointBuffer, which was wrong (08:22:15)
+	* Howard Butler <hobu.inc at gmail.com> pull data scaling in from filters.scaling to a static method of PointBuffer -- note that not all transformations are supported yet (08:20:56)
+	* Howard Butler <hobu.inc at gmail.com> decrufting (08:13:12)
+	* Howard Butler <hobu.inc at gmail.com> set a GUID for dimensions that end up having none (08:12:42)
+	* Howard Butler <hobu.inc at gmail.com> InPlaceReprojectionFilter will set guids for dimensions that it is reprojecting that have none (08:12:19)
+	* Howard Butler <hobu.inc at gmail.com> add reprojection to the big-read oracle example (08:11:35)
+
+2012-05-02
+	* Howard Butler <hobu.inc at gmail.com> update oci driver to use PointBuffer schema rather than Stage schema (15:01:58)
+	* Howard Butler <hobu.inc at gmail.com> more testing (15:00:37)
+	* Howard Butler <hobu.inc at gmail.com> update for new output (15:00:17)
+	* Howard Butler <hobu.inc at gmail.com> turn off for now (14:59:47)
+	* Howard Butler <hobu.inc at gmail.com> update for new test output (14:58:59)
+	* Howard Butler <hobu.inc at gmail.com> allow xml_schema_dump option of drivers.oci.reader to specify the filename (14:58:47)
+	* Howard Butler <hobu.inc at gmail.com> fix up inplacereprojection filter to set ignored dimensions if ignore_old_dimensions is passed (true by default) (14:58:12)
+	* Howard Butler <hobu.inc at gmail.com> ignored status has no say on whether or not we can set data for a dimension (14:56:39)
+	* Howard Butler <hobu.inc at gmail.com> put position and byteoffset in the ptree output (14:56:09)
+	* Howard Butler <hobu.inc at gmail.com> setDimension should try to use UUIDs before doing name/namespace searching (14:55:42)
+	* Howard Butler <hobu.inc at gmail.com> check for XYZ dimensions before reading data... use proper type for XYZ raw coordinate dimensions(was using uint32_t instead of int32_t) (14:54:52)
+	* Howard Butler <hobu.inc at gmail.com> do not intermingle ignored status into getDimension and friends (10:18:07)
+
+2012-05-01
+	* Howard Butler <hobu.inc at gmail.com> add parent uuid and uuid to xml schema representation of dimension (11:26:45)
+
+2012-04-30
+	* Howard Butler <hobu.inc at gmail.com> fix up filters.inplacereprojection to do its operations on the PointBuffer, not the Stage (21:13:19)
+	* Howard Butler <hobu.inc at gmail.com> prevent an overflow that was causing the character padding to be multi-gb in size -- there's a boost string algo to do this somewhere (20:58:04)
+	* Howard Butler <hobu.inc at gmail.com> provide a shitton of debugging noise for log level 7+ for reprojection filter (14:42:04)
+
+2012-04-23
+	* Howard Butler <hobu.inc at gmail.com> clean up filters.selector -- simply give it options for 'keep' or 'ignore' and a default whether to keep or drop unspecified dimensions and it will use that (14:28:38)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization vi astyle (12:51:32)
+	* Howard Butler <hobu.inc at gmail.com> Get filters.selector working to actively ignore unwanted dimensions in output (12:51:15)
+
+2012-04-20
+	* Howard Butler <hobu.inc at gmail.com> new astyle options (12:10:57)
+	* Howard Butler <hobu.inc at gmail.com> clean up unused variables (11:46:00)
+	* Howard Butler <hobu.inc at gmail.com> oops, missed a file (11:45:48)
+	* Howard Butler <hobu.inc at gmail.com> use std::string instead of char* to back up source, function, and module (11:25:10)
+	* Howard Butler <hobu.inc at gmail.com> add -Wextra (11:12:46)
+	* Howard Butler <hobu.inc at gmail.com> ignore unused (11:12:21)
+	* Howard Butler <hobu.inc at gmail.com> remove -pedantic for now (11:02:13)
+
+2012-04-19
+	* Howard Butler <hobu.inc at gmail.com> remove the note to stdout about how many points are written. We want pcpipeline to take in stuff via stdin and write out pipeline serializations via stdout.  notices should probably go to stderr (15:25:36)
+	* Howard Butler <hobu.inc at gmail.com> support writePipeline transparently writing to stdout via special filename (15:14:33)
+	* Howard Butler <hobu.inc at gmail.com> add stats filter to example (14:18:38)
+	* Howard Butler <hobu.inc at gmail.com> add metadata entries for stats filter options (14:18:28)
+	* Howard Butler <hobu.inc at gmail.com> add examples for filtering to keep last returns or specified return values (13:20:32)
+	* Howard Butler <hobu.inc at gmail.com> add an example predicate for keeping specified classifications (11:52:53)
+
+2012-04-18
+	* Howard Butler <hobu.inc at gmail.com> boost:: prefix for cstdint data types so we can compile on MSVC 2008 from Kevin Murphy (09:45:26)
+
+2012-04-13
+	* Michael P. Gerlek <mpg at flaxen.com> commentout busted test for now (14:56:38)
+	* Michael P. Gerlek <mpg at flaxen.com> handle missing option sensibly (14:26:49)
+	* Michael P. Gerlek <mpg at flaxen.com> recognize the XYZ writer driver (13:47:59)
+	* Howard Butler <hobu.inc at gmail.com> add a pdal::Object ultimate base class that all of our major objects will eventually derive from (10:05:32)
+
+2012-04-12
+	* Howard Butler <hobu.inc at gmail.com> add mersenne twister to the pdal::Environment so we can easily reuse it for uuid creation instead of having to create one for every uuid we create (08:52:39)
+	* Howard Butler <hobu.inc at gmail.com> to_json method for pdal::Metadata (08:30:05)
+
+2012-04-10
+	* Howard Butler <hobu.inc at gmail.com> add --xml switch to support XML output in addition to JSON (08:48:27)
+
+2012-04-08
+	* Howard Butler <hobu.inc at gmail.com> add a Metadata::to_xml method, this is duplication of the pipelinewriter static method of the same name, but I think these should probably be pulled closer to the objects themselves than out in some auxillary class (14:36:37)
+	* Howard Butler <hobu.inc at gmail.com> add ability to dump xml metadata for stage (14:35:49)
+	* Howard Butler <hobu.inc at gmail.com> add ntif as an open-able driver for pcinfo, etc (13:00:35)
+
+2012-04-07
+	* Howard Butler <hobu.inc at gmail.com> Metadata entries need not be unique (16:53:35)
+	* Howard Butler <hobu.inc at gmail.com> put back full linking of all PDAL dependencies for WIN32 case (16:53:24)
+
+2012-04-06
+	* Howard Butler <hobu.inc at gmail.com> rework pdal::Metadata to be constructed like pdal::Options is in preparation for their soon-to-be happy marriage (16:32:14)
+	* Howard Butler <hobu.inc at gmail.com> shut up silly warning described in https://svn.boost.org/trac/boost/ticket/5598 (15:51:16)
+	* Howard Butler <hobu.inc at gmail.com> move the bad pipeline test cases into their own directory (12:24:08)
+	* Howard Butler <hobu.inc at gmail.com> clean up comparison warning (09:34:00)
+
+2012-04-05
+	* Howard Butler <hobu.inc at gmail.com> make sure to initialize stdin var (16:29:34)
+	* Howard Butler <hobu.inc at gmail.com> add an example that embeds a predicate test in the pipeline xml (16:05:50)
+	* Howard Butler <hobu.inc at gmail.com> move plang pipeline test into predicate filter test, rearrange things a little bit (15:59:53)
+	* Howard Butler <hobu.inc at gmail.com> silence float comparison warnings (15:43:00)
+	* Howard Butler <hobu.inc at gmail.com> remove cruft (15:35:35)
+	* Howard Butler <hobu.inc at gmail.com> allow pcpipeline to use --stdin to read its XML -- note that relative filenames will not work in this case (14:20:32)
+	* Howard Butler <hobu.inc at gmail.com> give PipelineReader the ability to read its data from an istream (14:20:04)
+	* Howard Butler <hobu.inc at gmail.com> more housekeeping (13:27:32)
+	* Howard Butler <hobu.inc at gmail.com> add some doc stuff (12:42:53)
+	* Howard Butler <hobu.inc at gmail.com> a ton of housekeeping for the tests directory (12:41:31)
+	* Howard Butler <hobu.inc at gmail.com> test metadata fetching from stages (10:41:06)
+	* Howard Butler <hobu.inc at gmail.com> forward metadata from the stage (10:40:51)
+	* Howard Butler <hobu.inc at gmail.com> fix up broken test (10:40:31)
+
+2012-04-04
+	* Howard Butler <hobu.inc at gmail.com> square up nitf metadata a little bit for #71 (16:13:01)
+	* Howard Butler <hobu.inc at gmail.com> operator+ forgot to add half of the items (16:12:42)
+	* Howard Butler <hobu.inc at gmail.com> stage-specific pdal::Metadata now written for --pipeline-serialization option of pcpipeline (12:49:25)
+
+2012-04-02
+	* Howard Butler <hobu.inc at gmail.com> remove uuid and namespace junk from pdal::Metadata (13:22:52)
+
+2012-03-30
+	* Michael P. Gerlek <mpg at flaxen.com> cleanup of global headers: delete empty one, rename a couple others for consistency (22:31:51)
+	* Michael P. Gerlek <mpg at flaxen.com> use STL containers, like the big boys do (21:36:57)
+	* Howard Butler <hobu.inc at gmail.com> cast to void* to turn of alignment warnings (15:36:45)
+	* Michael P. Gerlek <mpg at flaxen.com> missing file (15:31:22)
+	* Michael P. Gerlek <mpg at flaxen.com> now writing out stubs around an actual nitf file (15:13:15)
+	* Michael P. Gerlek <mpg at flaxen.com> added ability to start stream from a given offset (15:12:38)
+	* Michael P. Gerlek <mpg at flaxen.com> firstPos() not used (13:57:43)
+	* Michael P. Gerlek <mpg at flaxen.com> added firstPos() function, refactored a bit (13:28:24)
+
+2012-03-29
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (21:23:04)
+	* Michael P. Gerlek <mpg at flaxen.com> tweak it to make it derivation-friendly (21:21:45)
+	* Michael P. Gerlek <mpg at flaxen.com> fix IDE reference for TEXT driver (21:16:55)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (21:02:44)
+	* Michael P. Gerlek <mpg at flaxen.com> this might need to be virtual (21:02:26)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (21:02:08)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:44:40)
+	* Howard Butler <hobu.inc at gmail.com> fix up test output to reflect reality (13:41:36)
+	* Michael P. Gerlek <mpg at flaxen.com> more comments (13:37:27)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:34:46)
+	* Michael P. Gerlek <mpg at flaxen.com> updated comments; metadata tweaks (13:34:36)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:20:40)
+	* Howard Butler <hobu.inc at gmail.com> typo (13:20:23)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (12:17:26)
+	* Bradley J Chambers <brad.chambers at gmail.com> Fixing some madness with scaling floats to signed ints, there may be issues with other conversions as well... (12:00:08)
+	* Howard Butler <hobu.inc at gmail.com> register NITF reader for StageFactory (11:03:39)
+	* Howard Butler <hobu.inc at gmail.com> add method to fetch the number of keys that exist for a given namespace (11:03:26)
+	* Howard Butler <hobu.inc at gmail.com> get the nitf reader with the metadata program (09:41:09)
+
+2012-03-28
+	* Howard Butler <hobu.inc at gmail.com> more pdal::Metadata work -- metadata added to Stage, toPTree methods, operator<< (19:27:21)
+	* Howard Butler <hobu.inc at gmail.com> remove getCurrentOptions, which seems poorly named and little used (14:53:36)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::Metadatas -> pdal::Metadata (14:13:07)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:52:45)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::Metadata to pdal::metadata::Entry (11:52:24)
+	* Michael P. Gerlek <mpg at flaxen.com> missing const (10:23:07)
+	* Howard Butler <hobu.inc at gmail.com> Metadata::getValue should be const (10:12:06)
+
+2012-03-27
+	* Michael P. Gerlek <mpg at flaxen.com> comment out failing test (18:03:56)
+	* Michael P. Gerlek <mpg at flaxen.com> comments (17:45:54)
+	* Michael P. Gerlek <mpg at flaxen.com> comments, removed dead code (17:40:34)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (17:39:49)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:29:57)
+	* Michael P. Gerlek <mpg at flaxen.com> now storing all the metadata (17:29:45)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:32:11)
+	* Howard Butler <hobu.inc at gmail.com> refactor to pdal::Metadatas as a container to hold Metadata instances for PointBuffer and Stage (16:31:48)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (16:19:06)
+	* Michael P. Gerlek <mpg at flaxen.com> rename StreamManager.* to StreamFactory.* (15:00:23)
+	* Michael P. Gerlek <mpg at flaxen.com> access metadata (14:51:48)
+	* Michael P. Gerlek <mpg at flaxen.com> removed old IStreamManager (14:19:47)
+	* Michael P. Gerlek <mpg at flaxen.com> use streamFactory to avoid temp files (13:59:33)
+	* Michael P. Gerlek <mpg at flaxen.com> use new StreamFactory system (13:07:36)
+	* Michael P. Gerlek <mpg at flaxen.com> added StreamFactory system (13:07:10)
+	* Michael P. Gerlek <mpg at flaxen.com> improve restriction idiom (13:06:37)
+
+2012-03-26
+	* Michael P. Gerlek <mpg at flaxen.com> just playing (20:24:28)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:41:51)
+	* Michael P. Gerlek <mpg at flaxen.com> add test showing use of restricted stream (16:41:36)
+	* Howard Butler <hobu.inc at gmail.com> add cherry picks of our own specific boost patches to our import script (16:30:50)
+	* Howard Butler <hobu.inc at gmail.com> Revert "this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources" (16:19:16)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:10:37)
+	* Howard Butler <hobu.inc at gmail.com> add back #pragma (15:54:47)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:47:32)
+	* Howard Butler <hobu.inc at gmail.com> add missing files (15:41:57)
+	* Howard Butler <hobu.inc at gmail.com> update boost (15:36:11)
+	* Howard Butler <hobu.inc at gmail.com> add namespace and setup for running on jenkins machine (15:35:59)
+	* Michael P. Gerlek <mpg at flaxen.com> added comment for building non-embedded (15:16:31)
+	* Howard Butler <hobu.inc at gmail.com> add boost::iostreams::restrict (15:11:41)
+	* Howard Butler <hobu.inc at gmail.com> the latest import-boost script (14:16:29)
+	* Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (13:21:50)
+	* Bradley J Chambers <brad.chambers at gmail.com> now ignoring .DS_Store (OS X) and build directory (13:21:14)
+	* Bradley J Chambers <brad.chambers at gmail.com> GDAL and NITF unit tests would not compile if WITH_GDAL was FALSE, so we now let CMake check for WITH_GDAL to be TRUE before adding the tests (13:19:24)
+	* Bradley J Chambers <brad.chambers at gmail.com> find_package shouldn't be needed when using embedded boost, we now set the variables manually (13:17:04)
+	* Michael P. Gerlek <mpg at flaxen.com> turn runtime checking into  compile-time specialization (12:32:38)
+	* Michael P. Gerlek <mpg at flaxen.com> fix bothced #ifdef (12:31:37)
+	* Bradley J Chambers <brad.chambers at gmail.com> Fixes error that occurs if GDAL is not enabled. (12:12:05)
+	* Michael P. Gerlek <mpg at flaxen.com> #ifdef out python code (11:40:31)
+	* Michael P. Gerlek <mpg at flaxen.com> remove NITF from LAS driver (11:28:18)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Nitf reader (still via LAS), added test (10:53:55)
+	* Michael P. Gerlek <mpg at flaxen.com> zero out the nitf writer stubs (10:51:29)
+	* Michael P. Gerlek <mpg at flaxen.com> include/pdal/drivers/nitf/Writer.hpp (10:51:11)
+	* Michael P. Gerlek <mpg at flaxen.com> added Python note (10:42:00)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (10:34:58)
+	* Michael P. Gerlek <mpg at flaxen.com> added explicit copyctor, oper=, dtor, etc (10:30:32)
+	* Howard Butler <hobu.inc at gmail.com> use the pad=true option of SoftwareId and SystemId to avoid null byte issues (09:01:31)
+
+2012-03-13
+	* Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+	* Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+	* Michael P. Gerlek <mpg at flaxen.com> predicates working (20:06:35)
+	* Michael P. Gerlek <mpg at flaxen.com> working on predicate support; added more unit tests; added return value support (18:23:13)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (15:42:05)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:33:15)
+	* Michael P. Gerlek <mpg at flaxen.com> leakfix (15:33:04)
+	* Michael P. Gerlek <mpg at flaxen.com> added unit tests for errors, data access modes (15:29:56)
+	* Howard Butler <hobu.inc at gmail.com> add sample size option (15:23:32)
+	* Howard Butler <hobu.inc at gmail.com> bumpthe default stats_cache_size*100 (15:22:14)
+	* Howard Butler <hobu.inc at gmail.com> push dimension position caching into the iterators::Base instead of duplicating it for each iterator type (14:17:58)
+	* Michael P. Gerlek <mpg at flaxen.com> split out Method function to base and buffer versions (13:53:41)
+	* Howard Butler <hobu.inc at gmail.com> return empty srs if no srid is available for the SDO_PC (13:32:15)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:21:04)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (13:20:54)
+	* Howard Butler <hobu.inc at gmail.com> create UUIDs when creating Dimension instances to add to the schema (13:14:53)
+	* Howard Butler <hobu.inc at gmail.com> make sure UUIDs are created when creating dimension entries for faux reader (13:14:30)
+	* Howard Butler <hobu.inc at gmail.com> use GDAL's import of the SRID instead of Oracle's for fetching WKT/GeoTIFF keys (13:14:08)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:37:42)
+	* Howard Butler <hobu.inc at gmail.com> fix up bounds setting for oci reader (12:37:32)
+	* Michael P. Gerlek <mpg at flaxen.com> add bounds check (12:24:14)
+	* Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:08:35)
+	* Michael P. Gerlek <mpg at flaxen.com> untabify (11:08:27)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:00:21)
+	* Howard Butler <hobu.inc at gmail.com> FindNumPy added and used (11:00:18)
+	* Howard Butler <hobu.inc at gmail.com> fix up casts and use <numpy/arrayobject.h> include statement (10:59:57)
+	* Michael P. Gerlek <mpg at flaxen.com> initialize the uuid (10:52:13)
+	* Howard Butler <hobu.inc at gmail.com> fix up debug lint so that it uses std debug (08:52:46)
+	* Howard Butler <hobu.inc at gmail.com> merge (08:48:41)
+	* Howard Butler <hobu.inc at gmail.com> more debugging lint (08:47:16)
+
+2012-03-23
+	* Howard Butler <hobu.inc at gmail.com> LASzip compression info metadata as well as VLR metadata for LAS files (13:33:34)
+	* Howard Butler <hobu.inc at gmail.com> addMetadata and setMetadata convenience methods for pdal::PointBuffer (12:35:36)
+
+2012-03-22
+	* Howard Butler <hobu.inc at gmail.com> add a nitf example based on the already existing autzen.las file in the test/data directory (19:32:51)
+	* Howard Butler <hobu.inc at gmail.com> start setting metadata on the PointBuffer from the LAS reader (16:09:11)
+	* Howard Butler <hobu.inc at gmail.com> add a compression info string to the header (16:08:41)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (16:08:06)
+	* Howard Butler <hobu.inc at gmail.com> getLasHeader() can be public to be able to expose metadata to iterators (15:52:53)
+	* Howard Butler <hobu.inc at gmail.com> allow boost::uuids::uuid to live in a pdal::Metadata too (15:52:21)
+	* Howard Butler <hobu.inc at gmail.com> createUUID is expensive (15:51:55)
+	* Howard Butler <hobu.inc at gmail.com> tighten up test. maybe it will pass now (14:54:07)
+	* Howard Butler <hobu.inc at gmail.com> tests to demonstrate how to use metadata fetching/setting on PointBuffer (14:16:09)
+	* Howard Butler <hobu.inc at gmail.com> default argument for namespace for searching via PointBuffer::getMetadata() (14:15:50)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:16:10)
+	* Howard Butler <hobu.inc at gmail.com> methods to get the entire metadata::MetadataMap from a pdal::PointBuffer (11:15:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added error test case (10:44:31)
+	* Michael P. Gerlek <mpg at flaxen.com> stubs for NITF drivers (cloned from Faux) (10:37:57)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for FreeGLUT cmake (10:19:12)
+
+2012-03-21
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:16:14)
+	* Howard Butler <hobu.inc at gmail.com> boost::optional getMetadata methods and friends copied over from pdal::Schema's pdal::Dimension handling (15:56:56)
+	* Howard Butler <hobu.inc at gmail.com> add Metadata boost::multi_index to pdal::PointBuffer to carry pdal::Metadata entries (15:23:33)
+	* Howard Butler <hobu.inc at gmail.com> add id and parent to pdal::Metadata (15:23:07)
+	* Howard Butler <hobu.inc at gmail.com> add errors about metadata (15:22:32)
+	* Michael P. Gerlek <mpg at flaxen.com> pcview works again (15:14:22)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:41:26)
+	* Howard Butler <hobu.inc at gmail.com> Metadata multi_index for PointBuffer to carry Metadata around (14:31:46)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:30:44)
+	* Howard Butler <hobu.inc at gmail.com> hide OptionPtr and map_t in the pdal::options namespace (14:30:32)
+	* Howard Butler <hobu.inc at gmail.com> more tweaks to pdal::Metadata (14:29:58)
+	* Howard Butler <hobu.inc at gmail.com> silence signed vs. unsigned warning (14:08:32)
+	* Michael P. Gerlek <mpg at flaxen.com> added global startup/shutdown; refactored to improve status checking (13:02:01)
+	* Michael P. Gerlek <mpg at flaxen.com> untabify (12:41:33)
+	* Michael P. Gerlek <mpg at flaxen.com> added global environment class for startup/shutdown; could eventually be a 'register' mechanism, though (12:40:11)
+	* Michael P. Gerlek <mpg at flaxen.com> updated (12:39:19)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:37:12)
+	* Howard Butler <hobu.inc at gmail.com> start pdal::Options documentation (11:17:53)
+	* Howard Butler <hobu.inc at gmail.com> documentation and a little cleanup of pdal::Option (11:07:24)
+	* Howard Butler <hobu.inc at gmail.com> remove global static empty_ptree which was being copied anyways (10:00:31)
+
+2012-03-20
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:58:58)
+	* Howard Butler <hobu.inc at gmail.com> tighten up and document pdal::Schema (16:58:41)
+	* Michael P. Gerlek <mpg at flaxen.com> added write tests (16:45:14)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:26:14)
+	* Michael P. Gerlek <mpg at flaxen.com> added VSILFileBuffer class (16:25:29)
+	* Howard Butler <hobu.inc at gmail.com> more better documentation and cleanups for pdal::Dimension (16:01:01)
+	* Howard Butler <hobu.inc at gmail.com> patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc (15:08:50)
+	* Howard Butler <hobu.inc at gmail.com> documentation and cleanups for pdal::PointBuffer (14:45:03)
+	* Michael P. Gerlek <mpg at flaxen.com> a bit of win32 lint (11:20:58)
+	* Howard Butler <hobu.inc at gmail.com> docs for pdal::Metadata (10:43:15)
+	* Howard Butler <hobu.inc at gmail.com> Revert "patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc" (08:40:35)
+	* Howard Butler <hobu.inc at gmail.com> patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc (08:02:44)
+
+2012-03-19
+	* Howard Butler <hobu.inc at gmail.com> obsolete doc (16:33:42)
+	* Howard Butler <hobu.inc at gmail.com> more doc reorg (16:28:49)
+	* Howard Butler <hobu.inc at gmail.com> turn on python by default (16:13:38)
+	* Howard Butler <hobu.inc at gmail.com> more doc work (16:13:06)
+	* Howard Butler <hobu.inc at gmail.com> add more info to dependencies (15:21:05)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:27)
+	* Howard Butler <hobu.inc at gmail.com> tweaking (14:20:08)
+	* Howard Butler <hobu.inc at gmail.com> formatting (14:19:53)
+	* Howard Butler <hobu.inc at gmail.com> update dependency doc (14:19:38)
+	* Howard Butler <hobu.inc at gmail.com> fix up formatting, add more linkage (13:33:12)
+	* Howard Butler <hobu.inc at gmail.com> there is no C API for PDAL (13:33:00)
+	* Michael P. Gerlek <mpg at flaxen.com> added predicate hits counter; added two-python-filters test case (13:26:45)
+
+2012-03-16
+	* Howard Butler <hobu.inc at gmail.com> merge (14:10:29)
+	* Howard Butler <hobu.inc at gmail.com> ByteArray belongs in pdal:: namespace (12:46:08)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 linkage fixes (12:43:05)
+	* Howard Butler <hobu.inc at gmail.com> type of metadata entry is set for you when setValue is called, fix up tests to be more thorough (12:32:31)
+	* Howard Butler <hobu.inc at gmail.com> add arbitrary attributes to metadata entries (08:00:32)
+
+2012-03-15
+	* Howard Butler <hobu.inc at gmail.com> more metadata silliness (16:37:31)
+	* Howard Butler <hobu.inc at gmail.com> fix up base64 encode/decode error (14:39:11)
+	* Howard Butler <hobu.inc at gmail.com> wrong test output (11:24:50)
+	* Howard Butler <hobu.inc at gmail.com> add base64 encode/decode to Utils:: (10:58:52)
+
+2012-03-14
+	* Michael P. Gerlek <mpg at flaxen.com> build fix for hobu (17:06:24)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:38:08)
+	* Michael P. Gerlek <mpg at flaxen.com> add name-aliasing tests; improve outs variable finding (16:37:57)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:31:59)
+	* Howard Butler <hobu.inc at gmail.com> scaffolding for pdal::Metadata (16:31:46)
+	* Michael P. Gerlek <mpg at flaxen.com> rename the predicate variable from Result to Mask (15:28:39)
+	* Michael P. Gerlek <mpg at flaxen.com> remove debug prints (14:59:04)
+	* Michael P. Gerlek <mpg at flaxen.com> plang filtering via pipeline xml works (14:57:32)
+	* Michael P. Gerlek <mpg at flaxen.com> test for FileUtils::readFileIntoString() helper (14:33:37)
+	* Michael P. Gerlek <mpg at flaxen.com> added FileUtils::readFileIntoString() helper (14:32:40)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups; factored out common Script object (13:47:19)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups; factored out common Script object (13:45:49)
+	* Howard Butler <hobu.inc at gmail.com> extraneous ; (07:31:22)
+	* Michael P. Gerlek <mpg at flaxen.com> icomments, whitespace (00:41:27)
+	* Michael P. Gerlek <mpg at flaxen.com> including the numpy header in two places causes problems, evewn with #define NO_IMPORT... (00:25:36)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - debugging static linkage issue (00:11:21)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - renaming plang classes (00:00:49)
+
+2012-03-12
+	* Michael P. Gerlek <mpg at flaxen.com> reduce exposure of Python.h (20:03:43)
+	* Michael P. Gerlek <mpg at flaxen.com> vs20100 lint (19:46:37)
+	* Michael P. Gerlek <mpg at flaxen.com> vs20100 lint (19:46:23)
+	* Michael P. Gerlek <mpg at flaxen.com> debugging code for scale filter problem (19:32:08)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for Jenks, again (19:05:41)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for Jenks, again (19:05:13)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for Jenks (18:52:35)
+	* Michael P. Gerlek <mpg at flaxen.com> remove Qi parser, good riddance; fix some build issues for Mr Jenkins (18:47:22)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:23:00)
+	* Michael P. Gerlek <mpg at flaxen.com> python-based plang starting to work (18:22:52)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (18:13:39)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (17:10:00)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (15:55:41)
+	* Howard Butler <hobu.inc at gmail.com> Readers need to make sure that they only fill in the dimensions they are providing -- there might be other dimensions of the same name in the schema (15:11:50)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (13:55:16)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental (13:32:24)
+
+2012-03-11
+	* Howard Butler <hobu.inc at gmail.com> fix typo (08:57:14)
+	* Michael P. Gerlek <mpg at flaxen.com> add infrastructure for embedded python support (w00t) (00:39:08)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (00:04:00)
+	* Michael P. Gerlek <mpg at flaxen.com> use better variable (00:03:36)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (00:00:17)
+
+2012-03-09
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:37:58)
+	* Howard Butler <hobu.inc at gmail.com> fix up test output (15:37:39)
+	* Howard Butler <hobu.inc at gmail.com> only allow certain scaling conversions, fix up scaling operations for conversions we support (15:37:20)
+	* Howard Butler <hobu.inc at gmail.com> turn float->int conversion back on (15:34:43)
+	* Howard Butler <hobu.inc at gmail.com> initialize the LAS header at the start of the first PointBuffer write, not at writeBegin (15:31:48)
+	* Michael P. Gerlek <mpg at flaxen.com> make plang doc visible (12:54:14)
+	* Michael P. Gerlek <mpg at flaxen.com> need to do laszip manually for now (10:25:58)
+
+2012-03-08
+	* Howard Butler <hobu.inc at gmail.com> a convenience size() method that returns the number of dimensions in the schema (14:41:58)
+	* Howard Butler <hobu.inc at gmail.com> tighten clamping test to report more information when there's a failure -- only fail if we're < or >, not =. inline removeScaling and applyScaling (14:41:25)
+	* Howard Butler <hobu.inc at gmail.com> tighten clamping test to report more information when there's a failure -- only fail if we're < or >, not = (14:40:43)
+	* Michael P. Gerlek <mpg at flaxen.com> typO (12:17:41)
+	* Michael P. Gerlek <mpg at flaxen.com> update req'd CMAKE version, for us windows noobs (12:11:23)
+	* Michael P. Gerlek <mpg at flaxen.com> minor additions (12:03:55)
+	* Michael P. Gerlek <mpg at flaxen.com> #ifdef out tricky test (11:34:24)
+	* Howard Butler <hobu.inc at gmail.com> make sure to get drivers.reader.faux dimensions when setting values (11:10:18)
+	* Howard Butler <hobu.inc at gmail.com> removeScaling should only do bounds checks for exact-precisions types (11:09:07)
+
+2012-03-06
+	* Howard Butler <hobu.inc at gmail.com> support single-inheritance child/parent relationships based on uuids for pdal::Dimension (13:38:14)
+
+2012-03-03
+	* Howard Butler <hobu.inc at gmail.com> clean up some warnings for embedded boost (08:58:24)
+
+2012-03-02
+	* Michael P. Gerlek <mpg at flaxen.com> handle win32 FP differences (15:08:30)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:28:04)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:00:43)
+	* Michael P. Gerlek <mpg at flaxen.com> fix various issues with embeddedboost on windows (13:59:21)
+
+2012-03-01
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (18:38:16)
+	* Howard Butler <hobu.inc at gmail.com> use readBeginImpl instead of readBufferBeginImpl now that the iterator has a buffer being given to it (18:38:02)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL to get report about the difference in values in test output (18:37:18)
+	* Howard Butler <hobu.inc at gmail.com> clean up test (18:35:57)
+	* Howard Butler <hobu.inc at gmail.com> clean up warnings (18:31:27)
+	* Howard Butler <hobu.inc at gmail.com> provide access to the PointBuffer& via getBuffer() method (18:31:03)
+	* Michael P. Gerlek <mpg at flaxen.com> lint and untabify (14:57:45)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:51:58)
+	* Michael P. Gerlek <mpg at flaxen.com> comment out off casting code for now (14:38:48)
+	* Michael P. Gerlek <mpg at flaxen.com> the classical (max)() issue (14:37:25)
+	* Michael P. Gerlek <mpg at flaxen.com> lint - arg not used (14:35:05)
+	* Michael P. Gerlek <mpg at flaxen.com> untabify (14:34:29)
+	* Michael P. Gerlek <mpg at flaxen.com> lint - arg unused (14:32:34)
+	* Michael P. Gerlek <mpg at flaxen.com> boosty lint (14:32:09)
+	* Michael P. Gerlek <mpg at flaxen.com> update win32 buildd info (14:31:23)
+	* Michael P. Gerlek <mpg at flaxen.com> fix comments (14:30:22)
+	* Michael P. Gerlek <mpg at flaxen.com> lint and untabify (14:29:51)
+	* Michael P. Gerlek <mpg at flaxen.com> lint - unusged arg (14:29:17)
+	* Howard Butler <hobu.inc at gmail.com> ReaderIterator did not seem to be used. removing dead code (13:35:17)
+	* Howard Butler <hobu.inc at gmail.com> typo (13:34:19)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (13:29:41)
+	* Michael P. Gerlek <mpg at flaxen.com> lint w/ cmake 2.8.3 (12:50:55)
+	* Howard Butler <hobu.inc at gmail.com> make random iterator take in PointBuffer& at instantiation (12:06:40)
+
+2012-02-29
+	* Howard Butler <hobu.inc at gmail.com> require that a PointBuffer& be passed in to create a sequential iterator -- random will be updated next (19:22:22)
+	* Howard Butler <hobu.inc at gmail.com> treat int8_t and uint8_t as 32-bit ints for string printing purposes (19:21:22)
+	* Howard Butler <hobu.inc at gmail.com> try to do something when float vs int requests come into getField, separate out the conversion part of the function from the rest, add a default PointBuffer size of 65536 to try to start doing away with default chunk size (19:20:29)
+
+2012-02-28
+	* Howard Butler <hobu.inc at gmail.com> use numeric_cast instead of lexical_cast for STRINGIFY to get proper numeric conversions -- let the ostream of ptree do the conversion to string after that (16:33:59)
+	* Howard Butler <hobu.inc at gmail.com> mark float options as floats (16:33:13)
+	* Howard Butler <hobu.inc at gmail.com> increase the default chunk size to 65536 (16:32:46)
+	* Howard Butler <hobu.inc at gmail.com> fix up comparision (16:31:39)
+
+2012-02-24
+	* Howard Butler <hobu.inc at gmail.com> we want to apply scaling for float data too if it is scaled (11:45:21)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (10:55:18)
+	* Howard Butler <hobu.inc at gmail.com> generate a random name for using time.h and rand() for dimensions that have no given name in the constructor. bad things happen if we can't address dimensions by names (10:55:04)
+
+2012-02-23
+	* Howard Butler <hobu.inc at gmail.com> basic BPF test (13:39:41)
+	* Howard Butler <hobu.inc at gmail.com> generate a random name for dimensions that have none (13:39:17)
+	* Howard Butler <hobu.inc at gmail.com> trap execute() in the case where the manager doesn't have a writer on it (11:47:29)
+
+2012-02-22
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:52:18)
+	* Howard Butler <hobu.inc at gmail.com> clean up error message (16:52:08)
+	* Howard Butler <hobu.inc at gmail.com> add BPF test skeleton -- not used by default. The BPF reader is closed source for now (16:51:56)
+	* Howard Butler <hobu.inc at gmail.com> enable drivers.text.writer by default now that the example plugin using it has been demonstrated (10:48:44)
+
+2012-02-21
+	* Howard Butler <hobu.inc at gmail.com> make drivers.text.writer a dynamically loaded plugin that is controlled by PDAL_DRIVER_PATH -- note that this is merely the instructive case for now, and we should probably have both an example and a real drivers.text.writer in the near future (11:53:07)
+	* Howard Butler <hobu.inc at gmail.com> add a string-fetching getenv and make getDLLSymbol be static (11:51:44)
+
+2012-02-17
+	* Howard Butler <hobu.inc at gmail.com> typo (09:19:36)
+
+2012-02-16
+	* Howard Butler <hobu.inc at gmail.com> adjust configuration for LINK_PRIVATE to be WIN32-only when cmake version > 2.8.7 (10:44:36)
+	* Howard Butler <hobu.inc at gmail.com> merge (08:36:59)
+	* Howard Butler <hobu.inc at gmail.com> begin and end variables aren't being used anymore because the pdal las writer doesn't append (08:35:21)
+	* Howard Butler <hobu.inc at gmail.com> shut up GCC for float-equal because this was being thrown nearly every single file :( (08:35:00)
+
+2012-02-15
+	* Kirk McKelvey <kmckelvey at lizardtech.com> windows build of embedded boost; still linkage problems on pdal_test (13:34:53)
+
+2012-02-14
+	* Howard Butler <hobu.inc at gmail.com> remove Utils::trim in favor of boost::algorithm::trim (21:33:08)
+	* Howard Butler <hobu.inc at gmail.com> port GDAL's getSymbol method from CPLSymbol (21:27:18)
+	* Howard Butler <hobu.inc at gmail.com> stubs for getSymbol (20:29:16)
+	* Howard Butler <hobu.inc at gmail.com> attempt to check for pdalboost:: vs boost:: namespace on the first-compiled file so that in situations we get an error right away in situations where things aren't right (20:28:59)
+	* Howard Butler <hobu.inc at gmail.com> define BOOST_SYSTEM_NO_DEPRECATED to shut off warnings about stuff that no longer exists in boost::system (20:28:16)
+	* Howard Butler <hobu.inc at gmail.com> variable for embed or no embed (20:27:37)
+	* Howard Butler <hobu.inc at gmail.com> more BOOST_TEST_DYN_LINK silliness (20:27:21)
+	* Howard Butler <hobu.inc at gmail.com> don't BEFORE the include of embedded boost (20:26:38)
+	* Howard Butler <hobu.inc at gmail.com> GDAL version needs to be 1.9.0+ because of the userdata error stuff in GDAL 1.9 (14:44:31)
+	* Howard Butler <hobu.inc at gmail.com> add shell script for my config (14:42:09)
+	* Howard Butler <hobu.inc at gmail.com> make sure GDAL is 1.8.0+ (14:41:54)
+	* Howard Butler <hobu.inc at gmail.com> add Kirk (14:40:01)
+	* Howard Butler <hobu.inc at gmail.com> Parser_qi needs to be updated for unsigned long long support for this test to work (13:35:26)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (13:22:21)
+	* Howard Butler <hobu.inc at gmail.com> turn off 64bit integer types for plang for now (11:37:07)
+	* Howard Butler <hobu.inc at gmail.com> don't use -isystem because it gets searched last and if a system boost is in the way it will end up being used (10:36:22)
+	* Howard Butler <hobu.inc at gmail.com> PDAL_EMBED_BOOST is a BOOL not a STRING (10:24:09)
+	* Howard Butler <hobu.inc at gmail.com> more boost embed stuff (10:14:05)
+
+2012-02-11
+	* Howard Butler <hobu.inc at gmail.com> this didn't do anything (14:15:37)
+	* Howard Butler <hobu.inc at gmail.com> tweak embed build option some more (14:00:35)
+	* Howard Butler <hobu.inc at gmail.com> use BOOL instead of STRING for PDAL_EMBED_BOOST option (13:38:12)
+	* Howard Butler <hobu.inc at gmail.com> tweak BOOST_TEST_DYN_LINK scenario for static embed boost (13:31:35)
+
+2012-02-10
+	* Howard Butler <hobu.inc at gmail.com> put PDAL_EMBED_BOOST in the cmake cache (16:52:55)
+	* Howard Butler <hobu.inc at gmail.com> pick up definitions (16:37:50)
+	* Howard Butler <hobu.inc at gmail.com> add boost embeded with bjam support (17:30:44)
+	* Howard Butler <hobu.inc at gmail.com> remove current embed in favor of one that is based explicitly on bjam (17:27:34)
+	* Howard Butler <hobu.inc at gmail.com> we are going to use bjam in a command to staticly build boost instead of cmake. pick up the .a files it creates as Boost_LIBRARIES (17:26:55)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost' of https://github.com/PDAL/PDAL into import-boost (17:22:32)
+	* Howard Butler <hobu.inc at gmail.com> if we are embedding boost, we do not add dyn_link definition (17:19:06)
+	* Howard Butler <hobu.inc at gmail.com> don't always BOOST_HAS_LONG_LONG (16:18:43)
+
+2012-02-09
+	* Michael Rosen <michael.rosen at gmail.com> cosmetic (17:57:02)
+	* Michael Rosen <michael.rosen at gmail.com> cosmetic (15:55:05)
+	* Michael Rosen <michael.rosen at gmail.com> boost build notes for windows (12:40:02)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into import-boost (00:41:00)
+	* Pete Gadomski <pete.gadomski at gmail.com> Shebang 'bash' in our jenkins test script (00:33:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Use the simple bash test for the jenkins script (00:30:51)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into import-boost (00:05:27)
+
+2012-02-08
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a 'PDAL-embed-boost' option to test/jenkins.sh (22:53:19)
+	* Kirk McKelvey <kmckelvey at lizardtech.com> instructions and model script to import new boost sources (19:30:38)
+	* Michael Rosen <michael.rosen at gmail.com> Windows work around for Boost issue 6535 (18:40:08)
+	* Kirk McKelvey <kmckelvey at lizardtech.com> phoenix namespace difference if boost is embedded (18:38:55)
+	* Michael Rosen <michael.rosen at gmail.com> renamed mpg-config.bat to config.bat (18:22:08)
+	* Michael Rosen <michael.rosen at gmail.com> new changes prior to rename (18:20:51)
+	* Michael Rosen <michael.rosen at gmail.com> update (17:34:20)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into import-boost (17:05:13)
+	* Michael P. Gerlek <mpg at flaxen.com> fix filename (16:54:40)
+	* Howard Butler <hobu.inc at gmail.com> use -DBOOST_EMBED=ON to use local boost source tree instead of your own system 1.48+ boost installation (16:28:16)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (15:48:19)
+	* Michael P. Gerlek <mpg at flaxen.com> made separater apps topic (15:48:12)
+	* Kirk McKelvey <kmckelvey at lizardtech.com> change inner-boost namespace; purge external/uuid (15:44:23)
+	* Michael Rosen <michael.rosen at gmail.com> updates (15:43:56)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost' of github.com:PDAL/PDAL into import-boost (14:23:17)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (14:22:43)
+	* Howard Butler <hobu.inc at gmail.com> add stubs for filters.selector (14:21:33)
+	* Michael P. Gerlek <mpg at flaxen.com> fix header (13:54:56)
+	* Michael P. Gerlek <mpg at flaxen.com> fix titles (13:54:46)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up sidebar links (13:45:40)
+	* Kirk McKelvey <kmckelvey at lizardtech.com> build inner-boost with BOOST_TEST_DYN_LIB (13:19:13)
+	* Howard Butler <hobu.inc at gmail.com> remove temppath option.  you can change this with the TMPDIR environment variable anyway (12:00:10)
+	* Michael P. Gerlek <mpg at flaxen.com> starting to clean up docs (11:46:50)
+	* Howard Butler <hobu.inc at gmail.com> add tempdir option to LAS reader for it to use as scratch space when unspooling NITF files (11:45:10)
+	* Howard Butler <hobu.inc at gmail.com> add temp filename and temp filepath methods (11:44:45)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (10:29:45)
+
+2012-02-07
+	* Kirk McKelvey <kmckelvey at lizardtech.com> first import of our boost subset, building on mac os x (17:55:21)
+	* Michael Rosen <michael.rosen at gmail.com> windows build instructions (17:42:15)
+	* Howard Butler <hobu.inc at gmail.com> add missing file (16:55:10)
+	* Howard Butler <hobu.inc at gmail.com> add drivers.text.Writer (with tests\!) (16:48:28)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (15:33:13)
+	* Michael P. Gerlek <mpg at flaxen.com> add support for direct PDF generation (15:32:43)
+	* Howard Butler <hobu.inc at gmail.com> stub in drivers.text.writer (13:44:30)
+	* Howard Butler <hobu.inc at gmail.com> remove liblas references (13:41:48)
+	* Michael P. Gerlek <mpg at flaxen.com> dead file (12:43:47)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:39:40)
+	* Michael P. Gerlek <mpg at flaxen.com> start some new docs (12:39:21)
+	* Michael P. Gerlek <mpg at flaxen.com> start some new docs (12:39:16)
+	* Michael P. Gerlek <mpg at flaxen.com> fix laszip name, update for laptop work (12:19:17)
+	* Howard Butler <hobu.inc at gmail.com> use a std::vector to preserve dimension position instead of iterating a multimap which does not for pdal.filter.stats (12:09:48)
+	* Howard Butler <hobu.inc at gmail.com> don't reset seed every time we begin to read a buffer (11:19:50)
+	* Howard Butler <hobu.inc at gmail.com> a few operators for pdal::Options to make combination easier (11:07:16)
+	* Howard Butler <hobu.inc at gmail.com> more logging for stats filter (11:06:53)
+	* Howard Butler <hobu.inc at gmail.com> add a seed option for the stats option (11:06:29)
+
+2012-02-06
+	* Howard Butler <hobu.inc at gmail.com> logging of which dimensions we're sampling (17:43:12)
+	* Howard Butler <hobu.inc at gmail.com> repeatable data in test output is useful.. provide a seed value to the stats filter and use for test output (16:43:32)
+	* Howard Butler <hobu.inc at gmail.com> add missing test file (16:09:54)
+	* Howard Butler <hobu.inc at gmail.com> tweak geotiff lib location (15:53:44)
+	* Howard Butler <hobu.inc at gmail.com> try tweaking again for boost detection (15:49:31)
+	* Howard Butler <hobu.inc at gmail.com> tweak variable for boost finding (15:34:23)
+	* Howard Butler <hobu.inc at gmail.com> use local geotiff instead of system (15:32:52)
+	* Howard Butler <hobu.inc at gmail.com> clobber path for jenkins (15:30:37)
+	* Howard Butler <hobu.inc at gmail.com> more accurate gdal config for jenkins (15:21:10)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fix missing 'local' in cmake paths (14:28:27)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add ORACLE_HOME to jenkins test script (14:22:58)
+	* Howard Butler <hobu.inc at gmail.com> more random data :) (14:09:27)
+	* Howard Butler <hobu.inc at gmail.com> update jenkins build config (14:05:31)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add BuildSetup.jenkins (13:40:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Add a script to run the tests on Jenkins (13:06:23)
+	* Howard Butler <hobu.inc at gmail.com> undo last commit to be better (12:21:16)
+	* Howard Butler <hobu.inc at gmail.com> pipeline reader needs to return the spatial reference of its stage, not of itself (12:17:43)
+
+2012-02-01
+	* Michael P. Gerlek <mpg at flaxen.com> added docs here, for now (10:22:28)
+
+2012-01-31
+	* Michael P. Gerlek <mpg at flaxen.com> use PLANG by default (17:19:37)
+	* Howard Butler <hobu.inc at gmail.com> add raster overlay filter called Colorization that can query GDAL-based rasters and fill in specified dimensions (with user-configurable scale factors (16:21:09)
+	* Howard Butler <hobu.inc at gmail.com> clean up warning (16:19:06)
+
+2012-01-30
+	* Howard Butler <hobu.inc at gmail.com> support .ntf and .nitf extensions (18:57:43)
+	* Howard Butler <hobu.inc at gmail.com> add dimension position to summary so things could be sorted if necessary (15:45:02)
+	* Howard Butler <hobu.inc at gmail.com> destrctors shouldn't throw (15:44:02)
+	* Howard Butler <hobu.inc at gmail.com> add NITF-reading capability -no test files though. (15:43:23)
+	* Howard Butler <hobu.inc at gmail.com> add temp filename-fetching util (15:41:28)
+
+2012-01-26
+	* Howard Butler <hobu.inc at gmail.com> fix up block fetching for SDO_PC queries (21:26:13)
+	* Howard Butler <hobu.inc at gmail.com> put back old OCI reader approach (20:21:53)
+	* Howard Butler <hobu.inc at gmail.com> keep oci reader experimentation (15:47:25)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:02:16)
+	* Howard Butler <hobu.inc at gmail.com> add a random sample of option-specified size to the stats output (10:02:02)
+	* Howard Butler <hobu.inc at gmail.com> add in stubs for fetching color from GDAL datasources (09:08:31)
+
+2012-01-24
+	* Howard Butler <hobu.inc at gmail.com> add histogram binning to stats output (15:10:52)
+
+2012-01-21
+	* Howard Butler <hobu.inc at gmail.com> remove extraneous fetch that was causing exception when reading clould-only data (09:11:30)
+	* Howard Butler <hobu.inc at gmail.com> more better OCI test that doesn't seem to fail. Test all three reader scenarios -- view, single cloud selection, multi-cloud selection (09:11:04)
+
+2012-01-20
+	* Howard Butler <hobu.inc at gmail.com> some fix ups of OCITest to get it working with new code (21:26:59)
+	* Howard Butler <hobu.inc at gmail.com> fix up disable_cloud_trigger option to work if manually set to true. clobber index names to 29 characters to fit within the oracle tablename limit (20:55:38)
+
+2012-01-19
+	* Howard Butler <hobu.inc at gmail.com> merge cleanups (10:17:32)
+	* Howard Butler <hobu.inc at gmail.com> merge (10:10:45)
+	* Howard Butler <hobu.inc at gmail.com> fix up pcinfo tests to keep their data around when they fail for easy manual comparison (10:09:46)
+
+2012-01-17
+	* Howard Butler <hobu.inc at gmail.com> add histogram cumulation based on boost::accumulators::density to Summary object (16:08:42)
+	* Howard Butler <hobu.inc at gmail.com> add histogram cumulation based on boost::accumulators::density to Summary object (16:08:42)
+	* Howard Butler <hobu.inc at gmail.com> fix up merge (14:14:35)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:08:49)
+	* Howard Butler <hobu.inc at gmail.com> use boost::accumulators instead of our own home-grown stuff for statistics generation (14:08:01)
+
+2012-01-12
+	* Howard Butler <hobu.inc at gmail.com> make PLANG contingent on an explict cmake variable (17:07:23)
+	* Howard Butler <hobu.inc at gmail.com> make PLANG contingent on an explict cmake variable (17:07:23)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (11:05:45)
+	* Howard Butler <hobu.inc at gmail.com> update test output (11:05:27)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (10:15:30)
+	* Howard Butler <hobu.inc at gmail.com> add a qfit pipeline example (10:15:11)
+	* Howard Butler <hobu.inc at gmail.com> use a saturation_cast instead of a lexical_cast to clip the numerics in getField. We should probably do the same for setField too (10:14:39)
+	* Howard Butler <hobu.inc at gmail.com> add -fPIC to CXX_FLAGS (08:46:33)
+
+2012-01-11
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (10:13:03)
+	* Howard Butler <hobu.inc at gmail.com> manually pull forward d82c6236a9a2d68bc204e51b965e6da2e950f2e3 (10:12:08)
+	* Howard Butler <hobu.inc at gmail.com> add PDAL_HAVE_PLANG based on boost's minor version > 45 so we can still run in situations with older boost (10:06:52)
+
+2012-01-10
+	* Howard Butler <hobu.inc at gmail.com> (optionally) put back the trigger stuff because not every one is patched up (17:06:42)
+	* Howard Butler <hobu.inc at gmail.com> clean up the logic for fetching additional point clouds so it doesn't interfere with not being done reading the current block (17:03:06)
+
+2011-12-22
+	* Howard Butler <hobu.inc at gmail.com> collaps iterator for terrasolid into reader (14:28:02)
+	* Howard Butler <hobu.inc at gmail.com> collapse iterator for qfit into reader (14:19:38)
+	* Howard Butler <hobu.inc at gmail.com> collapse oci iterator into reader code (14:08:45)
+	* Howard Butler <hobu.inc at gmail.com> update mrsid driver to work with new dimension/schema arrangements (13:14:52)
+	* Howard Butler <hobu.inc at gmail.com> update expected output (13:14:29)
+	* Howard Butler <hobu.inc at gmail.com> remove the libLAS-based reader and writer. Unnecessary duplication (10:51:32)
+	* Howard Butler <hobu.inc at gmail.com> decruft (10:18:57)
+	* Howard Butler <hobu.inc at gmail.com> tweak drivers.las.reader to interact with LASzip a little better.  still not complete (10:17:33)
+
+2011-12-21
+	* Howard Butler <hobu.inc at gmail.com> collaps iterators for reader into las::Reader header (16:28:01)
+	* Howard Butler <hobu.inc at gmail.com> move safeconvert64to32 to Utils (16:27:33)
+	* Howard Butler <hobu.inc at gmail.com> collapse iterators for reader into faux::Reader header (15:59:12)
+	* Howard Butler <hobu.inc at gmail.com> make sure to export iterators into the DLL (15:40:26)
+	* Howard Butler <hobu.inc at gmail.com> fix up Dimension.hpp location (15:21:10)
+	* Howard Butler <hobu.inc at gmail.com> make sure to return in setField if we're not going to cast (14:06:37)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:45:45)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:45:25)
+	* Howard Butler <hobu.inc at gmail.com> prune dead code that can't be reached (13:42:29)
+	* Howard Butler <hobu.inc at gmail.com> processBuffer on the Stats stage is no longer relevant (13:39:33)
+	* Howard Butler <hobu.inc at gmail.com> export stats iterator because pcinfo uses it (11:45:03)
+	* Howard Butler <hobu.inc at gmail.com> we can link against PDAL_LIB instead of all libraries for apps (11:44:25)
+	* Howard Butler <hobu.inc at gmail.com> clean up a few warnings (11:08:10)
+	* Howard Butler <hobu.inc at gmail.com> export stats collector (11:07:54)
+	* Howard Butler <hobu.inc at gmail.com> move my_visitor outside the method to allow the templating to work on gcc (10:59:13)
+
+2011-12-20
+	* Howard Butler <hobu.inc at gmail.com> Merge branches 'dimension_types' and 'master' of github.com:PDAL/PDAL into dimension_types (13:40:07)
+	* Howard Butler <hobu.inc at gmail.com> update tests for the last slug of commits related to Dimension rework to remove Dimension::Id and Dimension::DataType (13:39:55)
+	* Howard Butler <hobu.inc at gmail.com> no longer need this (13:39:30)
+	* Howard Butler <hobu.inc at gmail.com> updates to remove Dimension::Id and Dimension::DataType (13:39:18)
+	* Howard Butler <hobu.inc at gmail.com> remove Dimension::Id and Dimension::DataType from Dimension (13:38:42)
+	* Howard Butler <hobu.inc at gmail.com> update filters.color to use default dimensions approach and remove Dimension::Id and Dimension::DataType (13:37:42)
+	* Howard Butler <hobu.inc at gmail.com> update to remove Dimension::Id and Dimension::DataType (13:36:35)
+	* Howard Butler <hobu.inc at gmail.com> remove all getField/setField methods that do not take in a Dimension, update to remove Dimension::Id and Dimension::DataType (13:35:24)
+	* Howard Butler <hobu.inc at gmail.com> update pdal::Schema to remove Dimension::Id and Dimension::DataType (13:25:25)
+
+2011-12-19
+	* Howard Butler <hobu.inc at gmail.com> make DimensionTest more robust and reflective of how things are currently working (14:49:43)
+	* Howard Butler <hobu.inc at gmail.com> put uuid in ptree and always put scale, offset, max, and min in ptree (14:49:24)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master', remote-tracking branch 'origin' (14:12:57)
+	* Howard Butler <hobu.inc at gmail.com> filters.scaling mostly working now -- need an option to ignore overflows (14:08:43)
+	* Howard Butler <hobu.inc at gmail.com> make XYZ fetching namespace aware (14:08:12)
+	* Howard Butler <hobu.inc at gmail.com> don't use old getDimension methods (14:06:56)
+	* Howard Butler <hobu.inc at gmail.com> reorganize case statement to use Interpretation/Size rather than old Dimension::Type stuff (14:06:28)
+	* Howard Butler <hobu.inc at gmail.com> support fetching namespace (14:05:55)
+	* Howard Butler <hobu.inc at gmail.com> add namespace to ptree output (14:05:27)
+	* Howard Butler <hobu.inc at gmail.com> make getDimension namespace-aware (14:04:46)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:04:11)
+
+2011-12-15
+	* Howard Butler <hobu.inc at gmail.com> more filter.Scaling work (19:36:01)
+	* Howard Butler <hobu.inc at gmail.com> merge (19:33:16)
+	* Michael P. Gerlek <mpg at flaxen.com> programmable filter works (16:56:40)
+	* Michael P. Gerlek <mpg at flaxen.com> predicate filter works (16:40:20)
+	* Michael P. Gerlek <mpg at flaxen.com> fix type of bool operators (16:40:04)
+	* Michael P. Gerlek <mpg at flaxen.com> infrastructure for plang filters (15:33:11)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into dimension_types (14:10:41)
+	* Howard Butler <hobu.inc at gmail.com> more scaling filter rework (14:10:07)
+	* Howard Butler <hobu.inc at gmail.com> use inplacereprojection filter (14:06:42)
+	* Michael P. Gerlek <mpg at flaxen.com> fix memleak (thanks, boost::unit_test\!) (14:00:14)
+	* Michael P. Gerlek <mpg at flaxen.com> imported PLang code into PDAL; tests passing,  but mem leaks (13:31:30)
+	* Howard Butler <hobu.inc at gmail.com> add getDimension methods that return boost::optional containers for convenience (09:33:22)
+
+2011-12-14
+	* Howard Butler <hobu.inc at gmail.com> preliminary scalingfilter refactor -- we need to address iterator creation before we can finish this (21:01:30)
+	* Howard Butler <hobu.inc at gmail.com> cruft cleanup (21:00:31)
+	* Howard Butler <hobu.inc at gmail.com> minor cleanups (09:21:30)
+	* Howard Butler <hobu.inc at gmail.com> text of exception changed (09:21:11)
+	* Howard Butler <hobu.inc at gmail.com> Option now supports its own Options (to indefinite depth) (09:11:37)
+	* Howard Butler <hobu.inc at gmail.com> allow fetching a copy of the stage's current options with getCurrentOptions method (09:09:42)
+
+2011-12-12
+	* Howard Butler <hobu.inc at gmail.com> rejigger the getDimension method to fall through to try the uuid if it doesn't find a dimension with the given name (17:41:47)
+	* Howard Butler <hobu.inc at gmail.com> fix up uuid support so it is based on our internal copy of the boost::uuid library so we can support boost back to 1.41 (16:35:37)
+
+2011-12-08
+	* Howard Butler <hobu.inc at gmail.com> remove unused variables (19:52:40)
+
+2011-12-06
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into dimension_types (19:08:23)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:14:58)
+	* Michael P. Gerlek <mpg at flaxen.com> disable tests if PDAL not configured for them (13:12:44)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:05:58)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #62 from gadomski/remove-trigger-dml (10:03:30)
+
+2011-12-05
+	* Pete Gadomski <pete.gadomski at gmail.com> Remove all oci trigger code (16:58:04)
+	* Howard Butler <hobu.inc at gmail.com> get InPlaceReprojection filter with the program (15:43:45)
+	* Howard Butler <hobu.inc at gmail.com> beef up filters.stats to work for all dimension types and use the new schema/dimension arrangement (15:26:10)
+	* Howard Butler <hobu.inc at gmail.com> only cache dimension positions in the case of a random iterator, not a sequential one (13:47:02)
+	* Howard Butler <hobu.inc at gmail.com> pass in iterator for new GetBlock function signature (13:46:38)
+	* Howard Butler <hobu.inc at gmail.com> don't create a random iterator for every single point (11:38:26)
+	* Howard Butler <hobu.inc at gmail.com> fix a doh (11:36:08)
+
+2011-12-03
+	* Howard Butler <hobu.inc at gmail.com> carry along a pointer to the Buffer's Schema so that if it changes, we can't recompute the pointers to dimensions we care about (16:07:48)
+	* Howard Butler <hobu.inc at gmail.com> de-clutter the invocation of the PointDimensions struct (16:06:54)
+	* Howard Butler <hobu.inc at gmail.com> don't create a PointBuffer every time through the loop (16:06:11)
+
+2011-12-02
+	* Howard Butler <hobu.inc at gmail.com> short-circuit looking up dimension positions for every readBufferBeginImpl call, pass these schema positions into the processBuffer call (14:20:13)
+	* Howard Butler <hobu.inc at gmail.com> use new getDimension call for fetching the BlockID dimension from the PointBuffer (14:19:07)
+	* Howard Butler <hobu.inc at gmail.com> get filters.chipper with the new dimension/schema program (12:06:26)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (12:06:15)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization, merge fix (12:05:49)
+	* Howard Butler <hobu.inc at gmail.com> merge (11:23:40)
+	* Howard Butler <hobu.inc at gmail.com> get filters.chipper with the program (11:21:33)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:21:20)
+	* Howard Butler <hobu.inc at gmail.com> clean up addDefaultDimensions methods to make sure they do not depend on having anything opened to produce results (11:20:54)
+
+2011-12-01
+	* Michael P. Gerlek <mpg at flaxen.com> mingw patch from Roland S. (18:57:56)
+	* Michael P. Gerlek <mpg at flaxen.com> mingw patch from Roland S. (18:41:50)
+
+2011-11-30
+	* Howard Butler <hobu.inc at gmail.com> get TerraSolid with the program (11:27:47)
+	* Howard Butler <hobu.inc at gmail.com> update TerraSolid reader to use the new Schema/Dimension stuff (10:32:00)
+	* Howard Butler <hobu.inc at gmail.com> add a getDimension(boost::guids::guid const&) method (10:31:39)
+	* Howard Butler <hobu.inc at gmail.com> fix up QFIT reader to use new Dimension/Schema scheme (09:17:11)
+	* Howard Butler <hobu.inc at gmail.com> update for new output (07:33:45)
+	* Howard Butler <hobu.inc at gmail.com> make it easier to be able to see the command output in cases where things fail (07:33:36)
+	* Howard Butler <hobu.inc at gmail.com> return Undefined for names we don't recognize (07:32:40)
+	* Howard Butler <hobu.inc at gmail.com> byte offset defaults to -1 (07:32:26)
+	* Howard Butler <hobu.inc at gmail.com> registerFields needs stage to get its default dimensions list from (07:32:08)
+
+2011-11-29
+	* Howard Butler <hobu.inc at gmail.com> put back caching of m_byteSize for the Schema::getByteSize.  This was showing up as being expensive to fetch in the profiler for some reason (12:29:47)
+	* Howard Butler <hobu.inc at gmail.com> be able to discriminate big and little-endian qfit data (11:57:25)
+	* Howard Butler <hobu.inc at gmail.com> be able to discriminate big and little-endian qfit data (11:57:25)
+	* Howard Butler <hobu.inc at gmail.com> use new getField/setField methods that take in actual dimesions. This is faster because we cut down on map lookups for finding dimension positions. (10:21:52)
+	* Howard Butler <hobu.inc at gmail.com> use the setField that takes in the Dimension to write data into the PointBuffer (08:14:02)
+	* Howard Butler <hobu.inc at gmail.com> add a setField method that takes in the Dimension (08:13:46)
+
+2011-11-28
+	* Howard Butler <hobu.inc at gmail.com> typedef a schema::size_type and set it to boost::uint32_t so it can't be <0 -- we can change this later if we need to (10:41:06)
+	* Howard Butler <hobu.inc at gmail.com> remove extra m_pointSize field from pdal::PointBuffer... we will always fetch it as a const& from the Schema::getByteSize() in case the PointBuffer's schema were to ever change (10:40:29)
+	* Howard Butler <hobu.inc at gmail.com> reformatting (10:24:10)
+	* Howard Butler <hobu.inc at gmail.com> have dimension::size_type be a boost::int32_t to support negative indices -- add a createUUID() convenience method (10:23:57)
+
+2011-11-26
+	* Howard Butler <hobu.inc at gmail.com> don't create random uuid for every dimension by creating a random generator for every dimension (21:12:51)
+
+2011-11-25
+	* Howard Butler <hobu.inc at gmail.com> add virtual addDefaultDimensions() method to Stage and Readers (for now) (14:47:19)
+	* Howard Butler <hobu.inc at gmail.com> add error for PointBuffer errors (14:46:22)
+	* Howard Butler <hobu.inc at gmail.com> add uuid and namespace elements to pdal::Dimension (14:45:57)
+	* Howard Butler <hobu.inc at gmail.com> add lexical_cast-enabled getField method to PointBuffer (14:45:26)
+
+2011-11-23
+	* Howard Butler <hobu.inc at gmail.com> finish removing the std::map and std::vector that were being used to manage the dimensions for the pdal::Schema and fully replace with a boost::multi_index (18:31:44)
+	* Howard Butler <hobu.inc at gmail.com> make multi_index non-unique to support schemas with multiple dimensions of the same name (16:05:07)
+	* Howard Butler <hobu.inc at gmail.com> deal with being unable to fetch modifiable Dimension from Schema (13:55:38)
+	* Howard Butler <hobu.inc at gmail.com> back pdal::Schema by a boost::multi_index and start to incorporate that into pdal::Schema's inner workings (10:32:07)
+
+2011-11-22
+	* Howard Butler <hobu.inc at gmail.com> start bolting in new dimension stuff into FauxReader (16:44:24)
+	* Howard Butler <hobu.inc at gmail.com> fix up flags (14:44:08)
+	* Howard Butler <hobu.inc at gmail.com> more pdal::Dimension churn (14:31:18)
+	* Howard Butler <hobu.inc at gmail.com> start reorganizing pdal::Dimension and friends (13:05:56)
+	* Howard Butler <hobu.inc at gmail.com> AttributeFilter does nothing right now, no-op the readBuffer method (12:40:13)
+	* Michael P. Gerlek <mpg at flaxen.com> remove liblas dependency (12:33:22)
+	* Howard Butler <hobu.inc at gmail.com> msvc9 can't do default arguments for templates for some reason (11:27:19)
+	* Howard Butler <hobu.inc at gmail.com> need proper namespacing on cstdint for vc9 (11:26:50)
+	* Howard Butler <hobu.inc at gmail.com> specializations should be for all MSVCs (11:26:34)
+	* Howard Butler <hobu.inc at gmail.com> specializations should be for all MSVCs (11:26:16)
+	* Howard Butler <hobu.inc at gmail.com> need proper namespacing on cstdint for vc9 (11:25:46)
+
+2011-11-21
+	* Howard Butler <hobu.inc at gmail.com> move trigger enable/disable code near sdo_pc.init() invocation (19:08:40)
+	* Howard Butler <hobu.inc at gmail.com> cast to void* to silence alignment warnings. please review mpgerlek (17:13:51)
+	* Howard Butler <hobu.inc at gmail.com> -ansi only works on gcc, not clang (17:13:24)
+	* Howard Butler <hobu.inc at gmail.com> fix prototype so we are not hiding StageBase::getNumPoints (16:47:29)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:37:06)
+	* Howard Butler <hobu.inc at gmail.com> we can no longer instantiate invalid bounds. Bounds for the header must be given in their entirety instead of SetMax and SetMin individually (15:36:56)
+	* Howard Butler <hobu.inc at gmail.com> Bounds::clip can produce invalid bounds. we can no longer instantiate invalid bounds (15:36:21)
+	* Howard Butler <hobu.inc at gmail.com> report the min and max values when bounds is flipped (15:35:51)
+	* Michael P. Gerlek <mpg at flaxen.com> add new pdal_internal.h to IDE (12:02:51)
+	* Michael P. Gerlek <mpg at flaxen.com> pdal.h fallout (12:02:28)
+	* Michael P. Gerlek <mpg at flaxen.com> comments (11:49:34)
+	* Howard Butler <hobu.inc at gmail.com> Revert "add base_trigger_reenable bool option to control whether or not to adjust the trigger created by sdo_pc.init()" (11:10:07)
+	* Howard Butler <hobu.inc at gmail.com> add base_trigger_reenable bool option to control whether or not to adjust the trigger created by sdo_pc.init() (10:18:33)
+
+2011-11-20
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (07:26:46)
+	* Howard Butler <hobu.inc at gmail.com> do not build SWIG C# by default on windows. I don't have swig.exe in my path, which this now requires (07:26:22)
+
+2011-11-18
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:39:54)
+	* Howard Butler <hobu.inc at gmail.com> add Option for reading little-endian written QFIT files... not that we have a frickin way to know if they were written that way :( (14:39:31)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #59 from mloskot/pdal-mloskot-fixes (09:08:38)
+
+2011-11-17
+	* Mateusz Loskot <mateusz at loskot.net> Fix boost::bind compilation error by removing CPL_STDCALL from Debug bindable callbacks. (17:26:47)
+	* Mateusz Loskot <mateusz at loskot.net> Recognise MSVC11 in root CMakeLists.txt (17:24:59)
+	* Mateusz Loskot <mateusz at loskot.net> Perform CMake configuration for SWIG only if SWIG_FOUND to avoid CMake Error at CMakeLists.txt:271 (include) (16:48:48)
+
+2011-11-16
+	* Howard Butler <hobu.inc at gmail.com> basic points2grid interpolation works -- see pipeline_interpolate.xml for an example (16:34:41)
+	* Howard Butler <hobu.inc at gmail.com> link points2grid library if it is there (16:34:06)
+	* Howard Butler <hobu.inc at gmail.com> add method to adjust the floating point output precision (and turn it off) (16:33:48)
+	* Howard Butler <hobu.inc at gmail.com> more points2grid work (15:38:46)
+	* Howard Butler <hobu.inc at gmail.com> allow +inf, -inf bounds instances for cumulators (15:38:23)
+	* Howard Butler <hobu.inc at gmail.com> points2grid scaffolding (13:32:36)
+	* Howard Butler <hobu.inc at gmail.com> add Points2Grid-finding infrastructure (12:05:24)
+
+2011-11-15
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (19:25:02)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal.hpp to pdal_interal.hpp to reserve pdal.hpp for the go-to public header for the library (19:24:52)
+
+2011-11-14
+	* Michael P. Gerlek <mpg at flaxen.com> lint (19:22:21)
+	* Michael P. Gerlek <mpg at flaxen.com> rm temp file (19:21:39)
+	* Michael P. Gerlek <mpg at flaxen.com> updated for filter renamings (19:09:56)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 linkage fixes (19:08:37)
+	* Michael P. Gerlek <mpg at flaxen.com> fixups for Filter renaming (18:32:49)
+	* Michael P. Gerlek <mpg at flaxen.com> fixups for Filter renaming (18:06:20)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:53:31)
+	* Michael P. Gerlek <mpg at flaxen.com> added MosaicFilter and Bounds tests (17:53:22)
+	* Michael P. Gerlek <mpg at flaxen.com> added MosaicFilter and Bounds tests (17:50:40)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::MosaicFilter -> pdal::filters::Mosaic (16:38:45)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::MosaicFilter -> pdal::filters::Mosaic (16:37:29)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::StatsFilter -> pdal::filters::Stats (16:27:45)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ReprojectionFilter -> pdal::filters::Reprojection (16:19:19)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ReprojectionFilter -> pdal::filters::Reprojection (16:18:53)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ScalingFilter to pdal::filters::Scaling (16:11:45)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::InPlaceReprojectionFilter -> pdal::filters::InPlaceReprojection (16:03:12)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::DecimationFilter -> pdal::filters::Decimation (15:54:44)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::CropFilter -> pdal::filters::Crop (15:45:50)
+	* Howard Butler <hobu.inc at gmail.com> pdal::filters::ColorFilter -> pdal::filters::Color (15:35:56)
+	* Howard Butler <hobu.inc at gmail.com> consolidate pdal::filters::Chipper (15:28:55)
+	* Howard Butler <hobu.inc at gmail.com> rename CacheFilter source files to Cache (15:21:38)
+	* Howard Butler <hobu.inc at gmail.com> rename pdal::filters::CacheFilter -> pdal::filters::Cache (15:15:52)
+	* Howard Butler <hobu.inc at gmail.com> more filter/iterator rearranging -- file renaming (15:03:58)
+	* Howard Butler <hobu.inc at gmail.com> rearrange ByteSwapFilter to new regime (15:00:56)
+	* Howard Butler <hobu.inc at gmail.com> more pdal::filters::Attribute deckchairing (14:52:16)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:47:17)
+	* Howard Butler <hobu.inc at gmail.com> reorganize pdal::filters::Attribute and pdal::filters::iterators::sequential::Attribute (14:47:08)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:21:55)
+	* Michael P. Gerlek <mpg at flaxen.com> updated (14:21:41)
+	* Michael P. Gerlek <mpg at flaxen.com> quick fix for missing LogPtr defn (14:21:23)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:21:12)
+	* Howard Butler <hobu.inc at gmail.com> stubs for pdal::filters::AttributeFilter (14:21:03)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 linkage fix (14:20:32)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:52:08)
+	* Michael P. Gerlek <mpg at flaxen.com> undo mrosen changes (13:51:18)
+	* Howard Butler <hobu.inc at gmail.com> back pdal::Options by a multimap so we can have multiple same-named options (13:20:42)
+	* Howard Butler <hobu.inc at gmail.com> add default options for CacheFilter (10:51:37)
+
+2011-11-12
+	* Michael Rosen <michael.rosen at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (21:24:17)
+
+2011-11-11
+	* Michael Rosen <michael.rosen at gmail.com> SWIG bindings from .hpp files instead of hand-rolled duplicates.  Director and GC-proofing work. (14:09:46)
+	* Howard Butler <hobu.inc at gmail.com> tweak pdal::gdal::Debug to only be active when PDAL_HAVE_GDAL is true (13:01:38)
+	* Howard Butler <hobu.inc at gmail.com> add pdal::gdal::Debug support to ReprojectionFilter too (11:46:39)
+	* Howard Butler <hobu.inc at gmail.com> add some debugging options for reprojection example (11:38:52)
+	* Howard Butler <hobu.inc at gmail.com> pop the error handler when we go away (11:38:38)
+	* Howard Butler <hobu.inc at gmail.com> don't pop GDAL's error handlers... the pdal::gdal::Debug object handles all that now (11:38:18)
+	* Howard Butler <hobu.inc at gmail.com> add support for the GDAL debug object for InPlaceReprojectionFilter (11:37:54)
+	* Howard Butler <hobu.inc at gmail.com> consolidate GDAL logging operations into a helper class and utilize for drivers.oci.reader and drivers.oci.writer (10:51:38)
+	* Howard Butler <hobu.inc at gmail.com> only ->flush() if we have the file (10:51:02)
+	* Howard Butler <hobu.inc at gmail.com> move LogPtr into Log.hpp (10:50:22)
+	* Howard Butler <hobu.inc at gmail.com> more ignores (09:28:09)
+
+2011-11-10
+	* Howard Butler <hobu.inc at gmail.com> tweak logging output (13:49:00)
+	* Howard Butler <hobu.inc at gmail.com> the string might not contain a null, use fixed-length constructor (13:48:49)
+
+2011-11-09
+	* Howard Butler <hobu.inc at gmail.com> more Mississippi example stuff including reverse reprojection example (15:07:06)
+	* Howard Butler <hobu.inc at gmail.com> add Mississippi example for vertical reprojection of ft data (14:56:46)
+	* Howard Butler <hobu.inc at gmail.com> make sure to flush the log before we exit (13:54:09)
+	* Howard Butler <hobu.inc at gmail.com> support overriding coordinate system with an option (12:44:48)
+	* Howard Butler <hobu.inc at gmail.com> use ESRI WKT for the .prj file instead of OGC (12:15:13)
+	* Howard Butler <hobu.inc at gmail.com> add inplace reprojection example (12:14:46)
+	* Howard Butler <hobu.inc at gmail.com> add WKT description of the coordinate system for Autzen data (11:42:16)
+	* Howard Butler <hobu.inc at gmail.com> skip the LASzip VLR entirely for file comparison testing.  This is still fragile if Martin changes the encoding format, however (10:55:13)
+	* Howard Butler <hobu.inc at gmail.com> dur, copy/paste error by hobu (10:42:30)
+	* Howard Butler <hobu.inc at gmail.com> more tweaking of pdal::Log for #26 -- now with some docs too (09:57:37)
+	* Howard Butler <hobu.inc at gmail.com> move another logging statement (09:56:58)
+	* Howard Butler <hobu.inc at gmail.com> fix #57 and add some logging (08:38:12)
+
+2011-11-08
+	* Howard Butler <hobu.inc at gmail.com> more fixups related to #26 (11:03:34)
+	* Howard Butler <hobu.inc at gmail.com> more fixups related to #26 (10:35:08)
+	* Howard Butler <hobu.inc at gmail.com> redo the logging system #26 (10:08:22)
+
+2011-11-07
+	* Howard Butler <hobu.inc at gmail.com> update for new reader (11:11:13)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #55 from gadomski/master (09:33:48)
+
+2011-11-05
+	* Howard Butler <hobu.inc at gmail.com> support SELECT CLOUD FROM TABLE to return a list of clouds and export them in addition to the {BLOCK_FIELDS, CLOUD} view scenario that is currently supported. (21:00:24)
+	* Howard Butler <hobu.inc at gmail.com> add read_error to throw when encountering read problems (20:58:48)
+	* Howard Butler <hobu.inc at gmail.com> flip test to correct direction for verbosity (15:42:40)
+
+2011-11-04
+	* Howard Butler <hobu.inc at gmail.com> consolidate fetching the cloud statement from the reader (13:40:05)
+	* Howard Butler <hobu.inc at gmail.com> get rid of CloudPtr stuff -- no need anymore (13:00:56)
+	* Howard Butler <hobu.inc at gmail.com> start separating block fetching (12:42:19)
+	* Howard Butler <hobu.inc at gmail.com> add logging for query type (10:34:19)
+
+2011-11-02
+	* Howard Butler <hobu.inc at gmail.com> support querying for BLK_TABLE+SDO_PC view for drivers.oci.reader (21:04:53)
+	* Howard Butler <hobu.inc at gmail.com> use the Schema from the PointBuffer, not the stage, for writing (20:49:07)
+	* Howard Butler <hobu.inc at gmail.com> use the PointBuffers schema for creating new PointBuffers in case someone changed it (20:48:36)
+	* Howard Butler <hobu.inc at gmail.com> start supporting multiple SDO_PC queries (14:01:15)
+
+2011-11-01
+	* Howard Butler <hobu.inc at gmail.com> back up 924e1348db76149d9f38aadeb7ee95e1d8efe1d8 a bit to make it a different method name so the compiler cant get confused (12:13:50)
+	* Howard Butler <hobu.inc at gmail.com> HeaderPtr changed (12:13:21)
+
+2011-10-31
+	* Pete Gadomski <pete.gadomski at gmail.com> require boost 1.41, not 1.44 (18:43:59)
+	* Howard Butler <hobu.inc at gmail.com> decruft (14:40:34)
+	* Howard Butler <hobu.inc at gmail.com> decruft (14:40:25)
+	* Howard Butler <hobu.inc at gmail.com> used cached byte positions to avoid per-point map lookup of positions for getField queries (14:40:00)
+	* Howard Butler <hobu.inc at gmail.com> use inplacereprojfilter because the scalingfilter combo doesnt work right now (14:39:03)
+	* Howard Butler <hobu.inc at gmail.com> use inplacereprojfilter because the scalingfilter combo doesnt work right now (14:38:18)
+	* Howard Butler <hobu.inc at gmail.com> add getField specialization for fetching based on a pointIndex and Schema::getByteOffset() output (14:36:06)
+	* Howard Butler <hobu.inc at gmail.com> no longer include tuple, not used (14:34:57)
+
+2011-10-27
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:29:28)
+	* Michael P. Gerlek <mpg at flaxen.com> update build instructions (18:28:46)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:24:24)
+	* Howard Butler <hobu.inc at gmail.com>  initialize connection object (14:24:16)
+	* Howard Butler <hobu.inc at gmail.com> use proper reference to getOptions when setting up OracleDriver (14:23:13)
+	* Howard Butler <hobu.inc at gmail.com> put back Cloud impl (14:22:38)
+	* Michael P. Gerlek <mpg at flaxen.com> remove DimensionLayout (OBE) (13:25:11)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 lint for boost (13:03:33)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 lint (13:03:08)
+
+2011-10-26
+	* Howard Butler <hobu.inc at gmail.com> consolidate oracle connection code, and enable things to take advantage of new GDAL RFC 37 logging that should soon be in place (14:20:06)
+
+2011-10-25
+	* Howard Butler <hobu.inc at gmail.com> start using new RFC 37 GDAL logging facilities (13:56:06)
+	* Howard Butler <hobu.inc at gmail.com> add verbosity level to log output (13:55:30)
+
+2011-10-20
+	* Howard Butler <hobu.inc at gmail.com> return new Chipper dimension name for getIdFromName (08:44:30)
+	* Howard Butler <hobu.inc at gmail.com> fix typo for mapping old chipper field names to new :) (08:44:13)
+
+2011-10-18
+	* Howard Butler <hobu.inc at gmail.com> namespace the chipper's dimensions (10:37:44)
+	* Howard Butler <hobu.inc at gmail.com> need add() instead of put() to the tree (09:58:16)
+	* Howard Butler <hobu.inc at gmail.com> overwrite the serialization file if it already exists. (09:57:58)
+	* Howard Butler <hobu.inc at gmail.com> add method to remap old schema names into new ones (09:33:34)
+
+2011-10-17
+	* Howard Butler <hobu.inc at gmail.com> use new logging stuff (16:06:49)
+	* Howard Butler <hobu.inc at gmail.com> use verbosity level and isDebug to determine whether or not to log (16:06:41)
+	* Howard Butler <hobu.inc at gmail.com> start using our fancy new logging system (11:47:25)
+	* Howard Butler <hobu.inc at gmail.com> logging system for pipelines. Logging cannot currently happen in pipeline constructors, and can only happen after initialize() has started the log. Files or stderr/stdout/stdlog can be used in the <Option name="log"/> (11:47:05)
+
+2011-10-16
+	* Howard Butler <hobu.inc at gmail.com> add pc_id pdal::Option if it doesn't exist (11:12:09)
+	* Howard Butler <hobu.inc at gmail.com> rename convert_z_units option to scale_z, and allow the user to set it how they wish (09:54:10)
+	* Howard Butler <hobu.inc at gmail.com> put the pc_id into the options so it is written out when serialized (09:32:59)
+	* Howard Butler <hobu.inc at gmail.com> add pipeline-serialization option to allow the user to serialize the pipeline they created (or used, if some stage happened to modify it like the drivers.oracle.writer (09:32:42)
+
+2011-10-14
+	* Howard Butler <hobu.inc at gmail.com> just set the scale for the field if we're converting z's to 0.001 (15:00:20)
+	* Howard Butler <hobu.inc at gmail.com> millimiters -> m is 1000, not 100 (10:36:30)
+
+2011-10-13
+	* Howard Butler <hobu.inc at gmail.com> add sql script for wiping the test tables in the event that the test crashed for whatever reason. rename qfit example (14:46:54)
+	* Howard Butler <hobu.inc at gmail.com> a functional test scenario for Oracle :) (14:46:18)
+	* Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:46:01)
+	* Howard Butler <hobu.inc at gmail.com> consolidate block buffer reading into a single function so we can (eventually) do it in a couple of different places (14:45:49)
+	* Howard Butler <hobu.inc at gmail.com> qfit pipelines (12:45:46)
+	* Howard Butler <hobu.inc at gmail.com> xyz values are int32_t, not uint32_t for LAS data. We should use a reference to the dimension when applying scaling for the summary data. Only throw exceptions when we don't have XYZ data. Otherwise, write 0's (12:44:38)
+	* Howard Butler <hobu.inc at gmail.com> Dimensions must have a default scale of 1.0, not 0.0 or they can't exist and we can't apply scaling/descaling to them (12:43:25)
+	* Howard Butler <hobu.inc at gmail.com> adjust the passive_z values if we are altering the regular z ones (12:42:15)
+	* Howard Butler <hobu.inc at gmail.com> Dimensions must have a default scale of 1.0, not 0.0 or they can't exist and we can't apply scaling/descaling to them (12:41:18)
+	* Howard Butler <hobu.inc at gmail.com> prefix QFIT dimensions with QFIT: name (12:40:42)
+
+2011-10-12
+	* Howard Butler <hobu.inc at gmail.com> a test that writes data (15:54:34)
+	* Howard Butler <hobu.inc at gmail.com> RunFileSQL does not need to throw if the option isn't there (15:52:00)
+	* Howard Butler <hobu.inc at gmail.com> clean up error message to use correct filter name (15:51:40)
+	* Howard Butler <hobu.inc at gmail.com> more decrufting (14:19:21)
+	* Howard Butler <hobu.inc at gmail.com> do the scaling dance before subtracting 180, or it doesn't mean so much :) (14:19:02)
+	* Howard Butler <hobu.inc at gmail.com> start to revive the oracle test (11:21:14)
+	* Howard Butler <hobu.inc at gmail.com> more decrufting of the drivers.oci.reader (11:21:00)
+	* Howard Butler <hobu.inc at gmail.com> remove dead defineBlock method - this is now on the iterator (10:58:50)
+	* Howard Butler <hobu.inc at gmail.com> compare_no_case does not belong here.  we have boost, dammit! (yes, I was the proliferator of this monstrocity) (10:47:43)
+	* Howard Butler <hobu.inc at gmail.com> use boost's string algos instead of our own for comparing strings and uppercasing them (10:35:59)
+	* Howard Butler <hobu.inc at gmail.com> remove redundant Debug method (10:17:19)
+	* Howard Butler <hobu.inc at gmail.com> move GDAL/SQL debug setting into the ::Connect method to eliminate duplication (10:12:59)
+	* Howard Butler <hobu.inc at gmail.com> decruft OptionsOld stuff (09:09:07)
+	* Howard Butler <hobu.inc at gmail.com> decrufting (09:08:57)
+	* Howard Butler <hobu.inc at gmail.com> x and y's were flipped in qfit reader. make right (08:56:30)
+
+2011-10-11
+	* Howard Butler <hobu.inc at gmail.com> get rid of all of the old OptionsOld cruft (16:26:11)
+	* Howard Butler <hobu.inc at gmail.com> turn off doxygendiagram for now (16:15:03)
+	* Howard Butler <hobu.inc at gmail.com> doxygendiagram testing -- doesn't work yet though (16:13:23)
+
+2011-10-07
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (20:19:07)
+	* Howard Butler <hobu.inc at gmail.com> remove foss4g sign (20:18:58)
+
+2011-10-06
+	* Howard Butler <hobu.inc at gmail.com> add getDimensionOperationType to StageBase (11:38:46)
+
+2011-10-05
+	* Howard Butler <hobu.inc at gmail.com> get rid of magic numbers in VLR userid and description reading (15:15:31)
+	* Howard Butler <hobu.inc at gmail.com> cleanups (15:15:12)
+	* Howard Butler <hobu.inc at gmail.com> add StageOperationType enum (15:09:01)
+	* Howard Butler <hobu.inc at gmail.com> remove recalculateSizes and make calculateSizes private (12:29:33)
+
+2011-09-30
+	* Howard Butler <hobu.inc at gmail.com> Execute does an implicit Fetch() (10:42:36)
+	* Howard Butler <hobu.inc at gmail.com> more debug info on table-finding code (10:11:35)
+
+2011-09-29
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (17:11:51)
+	* Michael P. Gerlek <mpg at flaxen.com> remove DimensionLayout (16:42:29)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor to remove DimensionLayout (16:34:07)
+	* Howard Butler <hobu.inc at gmail.com> merge (16:03:45)
+	* Michael P. Gerlek <mpg at flaxen.com> flip the try/catch pancakes (15:32:28)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (15:11:06)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:59:37)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (14:59:29)
+	* Michael P. Gerlek <mpg at flaxen.com> remove unneeded by-ref accessor (14:54:36)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:45:17)
+	* Howard Butler <hobu.inc at gmail.com> oracle writer updates (14:45:08)
+	* Michael P. Gerlek <mpg at flaxen.com> set endianness bits at consturction time (14:33:11)
+	* Michael P. Gerlek <mpg at flaxen.com> make SchemaLayout go away; update swig (14:17:20)
+	* Michael P. Gerlek <mpg at flaxen.com> refactoring to make SchemaLayout go away (13:47:21)
+	* Michael P. Gerlek <mpg at flaxen.com> spelling (13:17:34)
+	* Michael P. Gerlek <mpg at flaxen.com> refactoring to continue to remove need for SchemaLayout (13:16:07)
+	* Michael P. Gerlek <mpg at flaxen.com> refactoring to start to remove need for SchemaLayout (12:56:59)
+	* Michael P. Gerlek <mpg at flaxen.com> move lookup system over to DimensionId (12:08:22)
+	* Michael P. Gerlek <mpg at flaxen.com> use a table to lookup the known dims (11:55:16)
+	* Michael P. Gerlek <mpg at flaxen.com> move name-based lookup into DimId class (11:46:45)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor id enums into a separate, static class (11:14:16)
+
+2011-09-28
+	* Michael P. Gerlek <mpg at flaxen.com> spelling fix (19:20:05)
+	* Michael P. Gerlek <mpg at flaxen.com> remove awkward get& member (19:19:10)
+	* Michael P. Gerlek <mpg at flaxen.com> remove gratuitous typedefs for Dimension iterators (19:13:01)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:10:40)
+	* Michael P. Gerlek <mpg at flaxen.com> ingore messy path stuff in outputs (15:10:32)
+	* Michael P. Gerlek <mpg at flaxen.com> added ability to skip a line when diffing (15:10:19)
+	* Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:05:00)
+	* Howard Butler <hobu.inc at gmail.com> test equality instead of similarity for block table name -- being greedy here could bite us (15:04:50)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:38:41)
+	* Michael P. Gerlek <mpg at flaxen.com> removed unused include, which caused BOOLEAN type redef issues on windows (14:36:55)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #53 from gadomski/master (12:05:24)
+	* Howard Butler <hobu.inc at gmail.com> don't write red, green, blue, time if the PointBuffer doesn't have it even though the PointFormat says it should (11:52:54)
+	* Howard Butler <hobu.inc at gmail.com> throw an out_of_range error if removeScaling causes the de-scaled value to be outside the bounds of the requested data type (10:53:24)
+
+2011-09-27
+	* Howard Butler <hobu.inc at gmail.com> update drivers.oci.reader to actually work. this was broken and never seemed to work right before :( (16:33:49)
+	* Howard Butler <hobu.inc at gmail.com> update to use FileUtils (16:33:16)
+	* Howard Butler <hobu.inc at gmail.com> add setDataStride method to support copying in chunks of raw PointBuffer data (16:30:35)
+	* Howard Butler <hobu.inc at gmail.com> InPlaceReprojectionFilter - hopes to do what it says :) (15:13:15)
+	* Howard Butler <hobu.inc at gmail.com> clearer name for chipper dimensions (15:12:42)
+	* Howard Butler <hobu.inc at gmail.com> getDimensions() method that returns a non-const& (15:11:45)
+	* Howard Butler <hobu.inc at gmail.com> be able to identify chipper dimension types (15:11:08)
+
+2011-09-23
+	* Howard Butler <hobu.inc at gmail.com> kick the test-no-passing-because-of-silly-file-path-comparisons can to mpg (12:20:51)
+	* Howard Butler <hobu.inc at gmail.com> point dump scales data now (11:14:12)
+	* Pete Gadomski <pete.gadomski at gmail.com> Fixed the LiblasWriterTest to match the changed uuid function def (11:08:46)
+	* Howard Butler <hobu.inc at gmail.com> point oracle pipeline examples to public server (11:01:41)
+	* Howard Butler <hobu.inc at gmail.com> catch the reference to the exception to eliminate a copy (08:56:37)
+	* Howard Butler <hobu.inc at gmail.com> modify getPTree to apply the Dimension's scaling before handing off the string to the property_tree (08:52:03)
+
+2011-09-22
+	* Howard Butler <hobu.inc at gmail.com> more error checking around stream handling (20:45:35)
+	* Howard Butler <hobu.inc at gmail.com> add default option for capacity, fix copy/paste error of dimension creation (20:45:19)
+	* Howard Butler <hobu.inc at gmail.com> tighten up error checking (20:44:35)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:32:00)
+	* Michael P. Gerlek <mpg at flaxen.com> moved Dimension 'index' access to SchemaLayout (15:31:49)
+	* Howard Butler <hobu.inc at gmail.com> add another check to make sure readBufferEnd is called before readEnd() (14:58:12)
+	* Howard Butler <hobu.inc at gmail.com> flip the logic around a bit so we don't rethrow exceptions (14:48:21)
+	* Howard Butler <hobu.inc at gmail.com> add qfit reader example (14:16:04)
+	* Howard Butler <hobu.inc at gmail.com> break up innerRun a little bit and add 'Hardcore Debug' which will not trap errors and instead throw exceptions all the way up to make it easier to debug things (14:15:14)
+	* Pete Gadomski <pete.gadomski at gmail.com> Include uuids from pdal::external::boost (12:59:47)
+	* Howard Butler <hobu.inc at gmail.com> do proper rounding when converting mm->m for z's (12:03:13)
+	* Howard Butler <hobu.inc at gmail.com> flip bytes first, then do math, not the other way (11:48:21)
+	* Howard Butler <hobu.inc at gmail.com> silence warning about comparing doubles (11:41:57)
+	* Michael P. Gerlek <mpg at flaxen.com> fix memleaks (11:11:36)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (11:10:38)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:03:07)
+	* Michael P. Gerlek <mpg at flaxen.com> umm, need to actually set the schema (11:02:57)
+	* Michael P. Gerlek <mpg at flaxen.com> untabify (11:02:32)
+	* Howard Butler <hobu.inc at gmail.com> add options for flipping x coordinates and scaling z coords (10:58:20)
+	* Howard Butler <hobu.inc at gmail.com> remove extra ; (10:57:33)
+
+2011-09-20
+	* Howard Butler <hobu.inc at gmail.com> remove extra qualifications (15:32:36)
+	* hobu <hobu.inc at gmail.com> remove extra class qualification (15:02:03)
+	* hobu <hobu.inc at gmail.com> remove extra , (15:01:42)
+	* hobu <hobu.inc at gmail.com> handle Dimension::Pointer (15:00:39)
+
+2011-09-19
+	* Michael P. Gerlek <mpg at flaxen.com> fixed description field of Dimension (18:08:11)
+	* Michael P. Gerlek <mpg at flaxen.com> make the Dimension be a single enum, not an enum+datatype combination (17:24:54)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 build notes, from Syncadd (11:51:06)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaned up, with help from Syncadd (11:49:32)
+	* Michael P. Gerlek <mpg at flaxen.com> remove comment (11:48:36)
+	* Michael P. Gerlek <mpg at flaxen.com> only link with liblas if needed (11:43:44)
+
+2011-09-17
+	* Michael P. Gerlek <mpg at flaxen.com> obsolete (16:14:28)
+	* Michael P. Gerlek <mpg at flaxen.com> add IDE support for uuid files (11:02:24)
+
+2011-09-16
+	* Howard Butler <hobu.inc at gmail.com> add link to community page (18:54:26)
+
+2011-09-15
+	* Michael P. Gerlek <mpg at flaxen.com> fix windows paths issues (11:53:29)
+	* Michael P. Gerlek <mpg at flaxen.com> make repaceAll public (11:52:55)
+
+2011-09-09
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:40:57)
+	* hobu <hobu.inc at gmail.com> properly namespace pdal::external::boost::uuid and use it throughout to get back to boost >1.41 compatibility (10:40:48)
+	* hobu <hobu.inc at gmail.com> more work for #51 (10:07:12)
+	* hobu <hobu.inc at gmail.com> more work for #51 (10:04:35)
+	* hobu <hobu.inc at gmail.com> use interal boost::uuid includes #51 (09:50:46)
+	* hobu <hobu.inc at gmail.com> more updates to boost::uuid to support PDAL-only copy (09:49:39)
+	* hobu <hobu.inc at gmail.com> updating boost::uuid to use PDAL-copied external includes so we can support back to boost 1.41 #51 (09:43:53)
+	* hobu <hobu.inc at gmail.com> add boost::uuid to external includes so we can support back to boost 1.41 #51 (09:41:29)
+
+2011-09-08
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:31:26)
+	* Michael P. Gerlek <mpg at flaxen.com> added writer example; added Options support (18:31:16)
+	* hobu <hobu.inc at gmail.com> throw correct error (15:33:47)
+	* hobu <hobu.inc at gmail.com> add oracle example pipelines (11:49:18)
+	* hobu <hobu.inc at gmail.com> add more logo stuff (09:56:18)
+
+2011-09-07
+	* Michael P. Gerlek <mpg at flaxen.com> updated (14:55:54)
+
+2011-09-01
+	* Howard Butler <hobu.inc at gmail.com> clean up more whitespace sensitivity in boost::property::write_xml test output (10:31:39)
+	* Howard Butler <hobu.inc at gmail.com> there's some whitespace sensitivity in boost::property_tree xml output for some versions (10:22:04)
+	* hobu <hobu.inc at gmail.com> don't include liblas header for OCI test -- use native (09:50:15)
+	* hobu <hobu.inc at gmail.com> don't include liblas header for OCI test -- use native (09:49:42)
+
+2011-08-31
+	* hobu <hobu.inc at gmail.com> more attempt to support older boost::filesystem... (19:42:41)
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (19:39:06)
+	* hobu <hobu.inc at gmail.com> attempt to support older boost::filesystem... trying to get back to at least boost 1.42 if we can (19:38:57)
+	* Michael P. Gerlek <mpg at flaxen.com> renamed LiblasReader,LiblasWriter to Reader,Writer (19:31:05)
+	* Michael P. Gerlek <mpg at flaxen.com> renamed LasReader,LasWriter to Reader,Writer (19:01:09)
+	* Michael P. Gerlek <mpg at flaxen.com> Color class fallout (18:38:39)
+	* Michael P. Gerlek <mpg at flaxen.com> rename exceptions.hpp to pdal_error.hpp, and only include it where needed (18:30:37)
+	* Michael P. Gerlek <mpg at flaxen.com> remove Color class -- not used (18:08:53)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 wants enums declared before use (18:06:13)
+	* hobu <hobu.inc at gmail.com> missing api docs (14:05:50)
+	* hobu <hobu.inc at gmail.com> more documentation with sphinx/breathe (14:04:32)
+	* hobu <hobu.inc at gmail.com> move doxygen output to ./doc/doxygen instead of api/ more breathe/doxygen work for pdal::Bounds (10:37:05)
+	* hobu <hobu.inc at gmail.com> more documentation for pdal::Bounds and use pdal::bounds_error for exceptions instead of std::runtime_error (10:36:29)
+	* hobu <hobu.inc at gmail.com> add bounds_error exception and #include <pdal/exceptions.hpp> directly in <pdal/pdal.hpp (10:35:52)
+	* hobu <hobu.inc at gmail.com> move doxygen stuff to doxygen directory instead of api directory (09:24:35)
+	* hobu <hobu.inc at gmail.com> move doxygen stuff to doxygen directory instead of api directory (09:24:23)
+
+2011-08-30
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (21:28:01)
+	* Michael P. Gerlek <mpg at flaxen.com> lots of updating (20:08:50)
+	* Michael P. Gerlek <mpg at flaxen.com> moved PointBufferCache into filters/ (18:29:53)
+	* Michael P. Gerlek <mpg at flaxen.com> clarification (18:21:36)
+	* hobu <hobu.inc at gmail.com> implement support for breath from https://github.com/hobu/breathe to allow us to embed doxygen into the sphinx output (14:12:27)
+	* hobu <hobu.inc at gmail.com> we want to generate XML for breathe support for sphinx (13:04:13)
+
+2011-08-29
+	* Michael P. Gerlek <mpg at flaxen.com> obsolete (17:45:40)
+	* Michael P. Gerlek <mpg at flaxen.com> added doxy comments (17:05:09)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for doxy (16:27:36)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:23:47)
+	* Michael P. Gerlek <mpg at flaxen.com> doxy lint (16:23:34)
+	* Michael P. Gerlek <mpg at flaxen.com> configured for PDAL usage (16:23:05)
+	* Michael P. Gerlek <mpg at flaxen.com> auto-updated to doxy ver 1.7.5.1 (15:59:40)
+	* Michael P. Gerlek <mpg at flaxen.com> doxy conf file from liblas (15:58:16)
+	* hobu <hobu.inc at gmail.com> add download link (14:23:47)
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:09:53)
+	* hobu <hobu.inc at gmail.com> add logo files (14:09:49)
+	* Michael P. Gerlek <mpg at flaxen.com> fix default point number (14:02:33)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:23:51)
+	* hobu <hobu.inc at gmail.com> move foss4g icon up (10:04:22)
+
+2011-08-26
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (23:43:30)
+	* Michael P. Gerlek <mpg at flaxen.com> noticed these lines were missing (23:43:06)
+	* hobu <hobu.inc at gmail.com> link to ASI for pointcloud.org domain (16:19:06)
+	* hobu <hobu.inc at gmail.com> more doc reorg (15:31:08)
+	* hobu <hobu.inc at gmail.com> more doc reorg (14:35:00)
+	* hobu <hobu.inc at gmail.com> doc reorg (14:32:34)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (12:45:26)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:10:58)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:10:46)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (12:10:03)
+	* Michael P. Gerlek <mpg at flaxen.com> always print trailing 100% (12:09:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added progress reporting to pc2pc (12:02:57)
+	* Michael P. Gerlek <mpg at flaxen.com> added --chunk_size option (12:02:39)
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:17:10)
+	* hobu <hobu.inc at gmail.com> fix ORA-01480 to add a trailing null (10:16:59)
+
+2011-08-25
+	* Michael P. Gerlek <mpg at flaxen.com> remove hack now that Options work better (18:30:20)
+	* Michael P. Gerlek <mpg at flaxen.com> turn on some Mosaic uses (17:38:53)
+	* Michael P. Gerlek <mpg at flaxen.com> fix all the MosaicFilter bugs (17:38:33)
+	* Michael P. Gerlek <mpg at flaxen.com> bug fix, not handling eof right (17:37:59)
+	* Michael P. Gerlek <mpg at flaxen.com> added equals(), oper!= (17:37:19)
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:42:49)
+	* hobu <hobu.inc at gmail.com> forward the SRS from the getPrevStage() if the existing one on the writer is empty #5 (14:42:39)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #6 from gadomski/master (14:17:06)
+	* Pete Gadomski <pete.gadomski at gmail.com> Added iostream to pdal.hpp (removed from Vector.hpp) (14:13:20)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:13:00)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:12:46)
+	* Michael P. Gerlek <mpg at flaxen.com> renamed Signaller to UserCallbacks; finally implemented within Writer (14:11:50)
+	* hobu <hobu.inc at gmail.com> include iostream for std::cout (13:58:08)
+	* hobu <hobu.inc at gmail.com> allow setting of native LAS writers options using the options mechanism before init #3 (11:07:22)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #4 from gadomski/master (10:08:01)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (10:01:54)
+
+2011-08-24
+	* Michael P. Gerlek <mpg at flaxen.com> pushed prevStage() functions up to StageBase; consolidated initialize() recursion in StageBase too (23:03:10)
+	* Michael P. Gerlek <mpg at flaxen.com> getPrevStage() now just use StageBase::getInputs() (21:58:56)
+	* Michael P. Gerlek <mpg at flaxen.com> added internal_error (21:36:49)
+	* Michael P. Gerlek <mpg at flaxen.com> prove new inputs/outputs lists work (20:20:50)
+	* Michael P. Gerlek <mpg at flaxen.com> added 'inputs' (prev stages) and 'outputs' (next stages) to StageBase; no one using them yet, but they are there and being set (18:28:50)
+	* Michael P. Gerlek <mpg at flaxen.com> stoopid min/max macro (18:21:07)
+	* Michael P. Gerlek <mpg at flaxen.com> test3 (17:25:13)
+	* Michael P. Gerlek <mpg at flaxen.com> testend (16:28:28)
+	* Michael P. Gerlek <mpg at flaxen.com> test2 (16:25:01)
+	* Michael P. Gerlek <mpg at flaxen.com> test (16:20:02)
+	* Michael P. Gerlek <mpg at flaxen.com> test (16:12:43)
+	* Michael P. Gerlek <mpg at flaxen.com> test (16:09:21)
+	* hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:35:38)
+	* hobu <hobu.inc at gmail.com> turn off SchemaLayout equality assertions.  These are really expensive (14:35:29)
+	* hobu <hobu.inc at gmail.com> break out operator== test so that the tests that are easiest to calculate but be different happen first (14:34:40)
+	* hobu <hobu.inc at gmail.com> just munge raw data when copying block_id and pt_id to the new buffer (14:33:41)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up example (13:09:23)
+	* Michael P. Gerlek <mpg at flaxen.com> .NET bindings working again (12:51:12)
+	* Michael P. Gerlek <mpg at flaxen.com> csharp work (10:59:28)
+	* Michael P. Gerlek <mpg at flaxen.com> csharp work (00:03:57)
+
+2011-08-23
+	* Michael P. Gerlek <mpg at flaxen.com> update for .net work (19:36:27)
+	* Michael P. Gerlek <mpg at flaxen.com> updating C\# world (19:33:30)
+	* Michael P. Gerlek <mpg at flaxen.com> merge fixups (18:29:31)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (18:28:07)
+	* Michael P. Gerlek <mpg at flaxen.com> supporting Pipeline as root element, plus versioning (18:06:25)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:34:20)
+	* Michael P. Gerlek <mpg at flaxen.com> typo (17:34:03)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (17:30:48)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (17:28:40)
+	* Michael P. Gerlek <mpg at flaxen.com> support configs without gdal, laszip, liblas (17:27:56)
+	* Pete Gadomski <pete.gadomski at gmail.com> A start on pipline xml generation in python (17:24:08)
+	* Michael P. Gerlek <mpg at flaxen.com> VS10 and gcc 4.5.2 have different notions about how to do template specializations, apparently (17:11:42)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc include fix (16:43:49)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc template fixes (16:43:39)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc fixes (16:19:02)
+	* Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:06:14)
+	* Michael P. Gerlek <mpg at flaxen.com> unit testing without laszip (16:04:59)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc fix (15:56:23)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc fix (15:55:10)
+	* Michael P. Gerlek <mpg at flaxen.com> build without laszip (15:53:30)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (15:35:42)
+	* Pete Gadomski <pete.gadomski at gmail.com> Adds version attribute to Pipline element in pipeline xsd (15:34:36)
+	* Michael P. Gerlek <mpg at flaxen.com> remove temp file (13:26:30)
+	* Michael P. Gerlek <mpg at flaxen.com> changes to support attributes in pipeline schema (13:22:54)
+	* Michael P. Gerlek <mpg at flaxen.com> changes to support attributes in pipeline schema (13:22:34)
+
+2011-08-22
+	* Michael P. Gerlek <mpg at flaxen.com> update path to schemata (14:38:25)
+	* Michael P. Gerlek <mpg at flaxen.com> changed impl of Option/Options to be lessy buggy and ,uch morser-friendly; in particular, Option is no longer a templated class (yeah\!) (14:36:31)
+	* Michael P. Gerlek <mpg at flaxen.com> in some circumstances, we weren't parsing correctly (13:55:39)
+
+2011-08-19
+	* Michael P. Gerlek <mpg at flaxen.com> use hg's ignore settings (23:30:23)
+	* Michael P. Gerlek <mpg at flaxen.com> use hg's ignore settings (23:29:47)
+	* Michael P. Gerlek <mpg at flaxen.com> test3 (23:08:39)
+	* Michael P. Gerlek <mpg at flaxen.com> test (19:56:07)
+	* Michael P. Gerlek <mpg at flaxen.com> test (19:25:25)
+	* Howard Butler <hobu.inc at gmail.com> remove bunk file (15:13:21)
+	* Howard Butler <hobu.inc at gmail.com> Merge pull request #1 from quentonc/master (15:08:34)
+	* Pete Gadomski <pete.gadomski at gmail.com> Added pdal_pipeline.xsd (12:08:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Moved test/data/schemas to a TLD (12:07:56)
+	* Howard Butler <hobu.inc at gmail.com> merge (11:27:24)
+	* Howard Butler <hobu.inc at gmail.com> add readme for gitinit (11:15:06)
+
+2011-08-18
+	* Michael P. Gerlek <mpg at flaxen.com> added getId() to base class, for stage debugging (21:06:09)
+	* Michael P. Gerlek <mpg at flaxen.com> dump filename (21:05:42)
+	* Michael P. Gerlek <mpg at flaxen.com> rename, to avoid confusion with the -real- PTree routines (19:52:28)
+	* Michael P. Gerlek <mpg at flaxen.com> added stage-specific stage dumping to pcinfo (19:44:29)
+	* Michael P. Gerlek <mpg at flaxen.com> pcinfo work, now dumping stats (19:06:52)
+	* Michael P. Gerlek <mpg at flaxen.com> improved stats collection mechanism (19:06:27)
+	* Michael P. Gerlek <mpg at flaxen.com> pcinfo testing (15:33:19)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanup temp files (15:09:11)
+	* Michael P. Gerlek <mpg at flaxen.com> pcinfo tests (15:07:59)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (15:07:51)
+	* Michael P. Gerlek <mpg at flaxen.com> apps work, incl. hack for put/add Options issue and more tests (14:58:11)
+	* Michael P. Gerlek <mpg at flaxen.com> add test for empty() (14:57:26)
+	* Michael P. Gerlek <mpg at flaxen.com> add case showing bug (14:57:07)
+	* Michael P. Gerlek <mpg at flaxen.com> handle eof correctly (14:56:42)
+	* Michael P. Gerlek <mpg at flaxen.com> add an empty() checker (13:50:48)
+	* Michael P. Gerlek <mpg at flaxen.com> app work (12:49:02)
+	* Michael P. Gerlek <mpg at flaxen.com> call init() first (12:48:40)
+	* Michael P. Gerlek <mpg at flaxen.com> options work (12:48:26)
+	* Michael P. Gerlek <mpg at flaxen.com> added comment (12:47:38)
+
+2011-08-17
+	* Michael P. Gerlek <mpg at flaxen.com> pc2pc work (23:44:53)
+	* Michael P. Gerlek <mpg at flaxen.com> work on pc2pc (16:37:00)
+	* Michael P. Gerlek <mpg at flaxen.com> dead code (16:36:27)
+	* Michael P. Gerlek <mpg at flaxen.com> gcc fix (00:12:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added --schema (00:03:58)
+	* Michael P. Gerlek <mpg at flaxen.com> okay to have no opts (00:03:38)
+	* Michael P. Gerlek <mpg at flaxen.com> tests for toPTree() (00:03:07)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups for oper<<, dump(), toPTree() (00:02:37)
+
+2011-08-16
+	* Michael P. Gerlek <mpg at flaxen.com> sync test with pg's fix (18:37:29)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (18:34:03)
+	* Michael P. Gerlek <mpg at flaxen.com> dump a point (18:33:56)
+	* Michael P. Gerlek <mpg at flaxen.com> added toPTree() (18:33:22)
+	* Pete Gadomski <pete.gadomski at gmail.com> Added 'input' as a positional option for pcpipeline (16:01:05)
+	* mpg <none at none> gcc lint (15:04:42)
+	* Michael P. Gerlek <mpg at flaxen.com> oops, put err mssg back in (14:15:18)
+	* Michael P. Gerlek <mpg at flaxen.com> use exceptions, not status codes, for simpler control flow (14:12:56)
+	* Michael P. Gerlek <mpg at flaxen.com> start to support --point and --points (13:47:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added simple Stats filter (13:40:58)
+	* Michael P. Gerlek <mpg at flaxen.com> now supports .xml files cleanly (12:11:33)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanup; added XML driver support (12:11:20)
+	* Michael P. Gerlek <mpg at flaxen.com> pipeline reader/stage now working (11:44:52)
+
+2011-08-15
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint for driver.pipeline.reader (20:56:50)
+	* Michael P. Gerlek <mpg at flaxen.com> use StageFactory now (20:14:01)
+	* Michael P. Gerlek <mpg at flaxen.com> move pipeline xml files into a subdir (19:21:47)
+	* Michael P. Gerlek <mpg at flaxen.com> start of for-real pcinfo app (16:02:39)
+	* Michael P. Gerlek <mpg at flaxen.com> handle unknown options (15:50:31)
+	* Michael P. Gerlek <mpg at flaxen.com> added copy ctor (15:22:06)
+	* Michael P. Gerlek <mpg at flaxen.com> turn compare_no_case into a safer function (15:07:02)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:57:12)
+	* Michael P. Gerlek <mpg at flaxen.com> added support class for the apps (14:34:52)
+	* mpg <none at none> add some app tests that actually work (14:21:54)
+	* Michael P. Gerlek <mpg at flaxen.com> patch for probably-not-to-be-fixed liblas writer test (14:15:08)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:08:59)
+	* mpg <none at none> turn off failing popen tests on unix (14:03:11)
+	* mpg <none at none> popen debugging (12:23:01)
+	* mpg <none at none> disable test unless gdal is around (11:27:47)
+	* mpg <none at none> lint (09:56:22)
+	* Michael P. Gerlek <mpg at flaxen.com> tighten up / dbeugging (09:53:58)
+	* mpg <none at none> debugging on linux (09:35:40)
+	* Michael P. Gerlek <mpg at flaxen.com> dumb fix for memleak (09:34:03)
+	* mpg <none at none> gcc lint (09:12:43)
+	* mpg <none at none> gcc 4.5.2 linker issue (08:43:50)
+
+2011-08-14
+	* Howard Butler <hobu.inc at gmail.com> excise the libLAS requirement from PDAL. No need to have libLAS to be able to build/use PDAL anymore (22:06:34)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:47:06)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (09:45:31)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (09:39:01)
+
+2011-08-12
+	* Michael P. Gerlek <mpg at flaxen.com> merge (17:19:44)
+	* Michael P. Gerlek <mpg at flaxen.com> account for 32 bytes of difference in the VLR header (17:19:20)
+	* Michael P. Gerlek <mpg at flaxen.com> added simpler API for diffing (17:18:26)
+	* Pete Gadomski <pete.gadomski at gmail.com> Merge (17:04:23)
+	* Pete Gadomski <pete.gadomski at gmail.com> Reenable oci.Writer's loading w/o boundary column (17:04:13)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:44:07)
+	* Michael P. Gerlek <mpg at flaxen.com> removed static getDefaultOptions(); cleaned up impl of getName() nd getDescription() (16:27:42)
+	* Howard Butler <hobu.inc at gmail.com> fix up #37 to add better error handling for base_table_boundary_wkt (14:46:55)
+	* Howard Butler <hobu.inc at gmail.com> #ifdef the msvcisms (14:14:56)
+	* Howard Butler <hobu.inc at gmail.com> add WKT validation for boundary geometry #38 (14:14:13)
+	* Michael P. Gerlek <mpg at flaxen.com> default test for each of the apps (12:37:22)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:23:07)
+	* Michael P. Gerlek <mpg at flaxen.com> restore app-level catching (12:22:55)
+	* Michael P. Gerlek <mpg at flaxen.com> added binpath(); make sure paths end in trailing slash (12:22:14)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:19:56)
+	* Howard Butler <hobu.inc at gmail.com> add compare_stage_data method for comparing data. Maybe we should add PointBuffer::operator==? (12:16:00)
+	* Howard Butler <hobu.inc at gmail.com> use setHeaderPadding methods (12:15:09)
+	* Howard Butler <hobu.inc at gmail.com> keep existing padding on the header and don't alter it when writing the header to file (12:14:29)
+	* Howard Butler <hobu.inc at gmail.com> convenience functions for determining byte current length and total byte length of the raw data buffer (12:13:55)
+	* Howard Butler <hobu.inc at gmail.com> support setting header padding (12:12:57)
+	* Howard Butler <hobu.inc at gmail.com> support setting header padding (12:12:29)
+	* Michael P. Gerlek <mpg at flaxen.com> fix comment (11:41:58)
+	* Michael P. Gerlek <mpg at flaxen.com> fix default option printing (11:40:55)
+
+2011-08-11
+	* Michael P. Gerlek <mpg at flaxen.com> attempt some degree of portability... (20:02:50)
+	* Michael P. Gerlek <mpg at flaxen.com> stubs for cmd line tests (20:00:15)
+	* Michael P. Gerlek <mpg at flaxen.com> added run_command(), for quick unit tests of cmd line apps (20:00:00)
+	* Michael P. Gerlek <mpg at flaxen.com> use the new Support::temppath feature (18:52:42)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (18:47:55)
+	* Michael P. Gerlek <mpg at flaxen.com> use the new Support::temppath feature (18:47:43)
+	* Michael P. Gerlek <mpg at flaxen.com> add special dir for unit test output files to live in (18:41:12)
+	* Michael P. Gerlek <mpg at flaxen.com> add ability to diff two files, but exclude certain regions of the file (18:22:36)
+	* Pete Gadomski <pete.gadomski at gmail.com> Silently discard comments in pipeline xml files (18:20:18)
+	* Michael P. Gerlek <mpg at flaxen.com> improve file diff functions (17:53:52)
+	* Howard Butler <hobu.inc at gmail.com> oops, missed one more filename (15:48:12)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:44:45)
+	* Howard Butler <hobu.inc at gmail.com> more path tweaking to get things right (15:44:34)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (15:32:54)
+	* Michael P. Gerlek <mpg at flaxen.com> use proper comparator elsewhere too (15:32:41)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:31:49)
+	* Howard Butler <hobu.inc at gmail.com> start catching up to new LASzip tests (15:31:41)
+	* Michael P. Gerlek <mpg at flaxen.com> fix test for unix (15:31:17)
+	* Howard Butler <hobu.inc at gmail.com> don't override srs from previous stage.  sorry, I did that (15:31:12)
+	* Howard Butler <hobu.inc at gmail.com> set systemid back to TerraScan instead of martin.  isenburg shouldn't change the systemid to keep things 'lossless' (15:30:32)
+	* Michael P. Gerlek <mpg at flaxen.com> added comment about comparators (15:29:33)
+	* Michael P. Gerlek <mpg at flaxen.com> use proper comparator (15:28:12)
+	* Howard Butler <hobu.inc at gmail.com> oops, actually use compressed files (15:05:37)
+	* Howard Butler <hobu.inc at gmail.com> separate the base file so we know which one has been used (14:44:36)
+	* Howard Butler <hobu.inc at gmail.com> remove the original laszip test file (14:36:13)
+	* Howard Butler <hobu.inc at gmail.com> add liblas- and lastools- generated zip files (14:30:44)
+	* Howard Butler <hobu.inc at gmail.com> move schema modification into initialize() method so that chipper-specific fields such as block_id and point_id are added (10:39:17)
+	* Howard Butler <hobu.inc at gmail.com> apply nicolas' patch for gcc 4.6 (08:52:06)
+
+2011-08-08
+	* Howard Butler <hobu.inc at gmail.com> support Options constructor for pipeline support (14:12:33)
+	* Howard Butler <hobu.inc at gmail.com> more tweaks to support pipelines (14:12:07)
+	* Howard Butler <hobu.inc at gmail.com> fix up test for r1028 (13:52:01)
+	* Howard Butler <hobu.inc at gmail.com> more descriptive exception (13:39:34)
+	* Howard Butler <hobu.inc at gmail.com> remove cruft (13:12:09)
+	* Howard Butler <hobu.inc at gmail.com> use ptree-based operator>> for SpatialReference (13:03:55)
+	* Howard Butler <hobu.inc at gmail.com> don't do endian swap for now (13:03:08)
+	* Howard Butler <hobu.inc at gmail.com> clean up after LASzip (13:02:49)
+	* Howard Butler <hobu.inc at gmail.com> don't set the SRS if it was already set (13:02:31)
+	* Howard Butler <hobu.inc at gmail.com> fetch the SpatialReference from options for the stage if it was set (13:02:02)
+	* Howard Butler <hobu.inc at gmail.com> set our identifier to PDAL so we know who wrote things (12:59:20)
+	* Howard Butler <hobu.inc at gmail.com> fix up operator<< and operator>> to take in SRSs via streams and inject them directly into SetFromUserInput (11:31:41)
+
+2011-08-05
+	* Howard Butler <hobu.inc at gmail.com> new compressed file to reflect current state of LASzip compression with native driver (15:56:11)
+	* Howard Butler <hobu.inc at gmail.com> bring PDAL's native driver in line with libLAS' for header handling.  LASzip still not working for some reason yet (15:00:32)
+	* Howard Butler <hobu.inc at gmail.com> Optionsify drivers.oci.writer (15:00:06)
+	* Howard Butler <hobu.inc at gmail.com> turn off oracle-write (14:58:54)
+	* Howard Butler <hobu.inc at gmail.com> common Connect() method that uses the new Options stuff (13:33:03)
+	* Howard Butler <hobu.inc at gmail.com> scales need to default to 1.0, not 0.0 or bad things'll happen (10:51:49)
+	* Howard Butler <hobu.inc at gmail.com> bring the LASzip support up-to-snuff with LASzip 2.0.1+ (09:34:30)
+	* Howard Butler <hobu.inc at gmail.com> BOOST_CHECK_EQUAL tells us what the values were (09:34:08)
+
+2011-08-04
+	* Howard Butler <hobu.inc at gmail.com> add compression Option for drivers.las.writer, but it doesn't seem to work yet for some reason :( (16:21:00)
+	* Howard Butler <hobu.inc at gmail.com> enable drivers.oci.reader to use the new options stuff.  nice work mpg.  basic pcpipeline works with oracle reader (15:30:00)
+	* Howard Butler <hobu.inc at gmail.com> oracle-read is now a pipeline-enabled activity -- use pcpipeline (15:28:25)
+	* Howard Butler <hobu.inc at gmail.com> add new-style options for Reader (14:01:23)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (14:00:58)
+	* Howard Butler <hobu.inc at gmail.com> add some error checking for the case when findFirst returns NULL (14:00:48)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code (11:02:16)
+	* Howard Butler <hobu.inc at gmail.com> touching SDO_PC.PC_EXTENT without disabling the trigger will nuke the cloud's blocks.  Add code to temporarily shut this trigger off if enabled when updating the SDO_PC.PC_EXTENT (11:02:01)
+
+2011-08-03
+	* Howard Butler <hobu.inc at gmail.com> () is an empty bounds.  so is nothing (13:52:24)
+	* Howard Butler <hobu.inc at gmail.com> add default options for drivers.oci.writer.  Not using them yet (11:11:49)
+	* Howard Butler <hobu.inc at gmail.com> test new Bounds<double> option (08:50:45)
+	* Howard Butler <hobu.inc at gmail.com> leave the options static, but .add() new options to it.  Use our Bounds<double> option here instead of std::string (08:50:33)
+
+2011-08-02
+	* Michael P. Gerlek <mpg at flaxen.com> now passing useful params to writeBegin/End; fixed main write code to only have one loop now (w00t) (19:17:46)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up write-chunk loops, and try to reuse the same PointBuffer (18:48:13)
+	* Michael P. Gerlek <mpg at flaxen.com> add writeBufferBegin/End functions, like on the read side; added a bunch of error checking to make sure the begin/end sequences are obeyed (18:18:44)
+	* Michael P. Gerlek <mpg at flaxen.com> added readBegin..readEnd sequence; most of these changes are just renaming readImpl to readBufferImpl (17:43:51)
+	* Michael P. Gerlek <mpg at flaxen.com> add read-scale-reproj-descale-write test for hobu (15:49:18)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up err mssg (15:48:51)
+	* Howard Butler <hobu.inc at gmail.com> make base_table_bounds optional, and if not provided in the options, use the cumulated block bounds (13:57:31)
+	* Howard Butler <hobu.inc at gmail.com> merge (13:43:25)
+	* Howard Butler <hobu.inc at gmail.com> merge (13:43:09)
+	* Michael P. Gerlek <mpg at flaxen.com> add ctor that infers input SRS (13:42:42)
+	* Michael P. Gerlek <mpg at flaxen.com> disallow multiple init() calls (13:42:17)
+	* Howard Butler <hobu.inc at gmail.com> remove reader.initialize(), we shouldn't do that (13:36:40)
+	* Howard Butler <hobu.inc at gmail.com> update the SDO_PC.PC_EXTENT with the cumulated bounds of all of the blocks if no base_table_bounds is set in the options (13:35:55)
+	* Howard Butler <hobu.inc at gmail.com> add testing for ingestion of empty bounds (13:35:13)
+	* Howard Butler <hobu.inc at gmail.com> short-circuit the parsing of empty bounds objects -- feel free to make this not suck so bad mpg (13:34:50)
+	* Howard Butler <hobu.inc at gmail.com> more descriptive error messages (13:34:00)
+	* Michael P. Gerlek <mpg at flaxen.com> remove temp file (13:25:52)
+	* Michael P. Gerlek <mpg at flaxen.com> disable file comparison, as no longer workable (13:23:05)
+	* Michael P. Gerlek <mpg at flaxen.com> added relative-path fixups (13:16:21)
+	* Michael P. Gerlek <mpg at flaxen.com> added isAbs(), getDir() (13:15:53)
+	* Michael P. Gerlek <mpg at flaxen.com> added FileUtils::getcwd, ::toAbsolutePath (12:31:31)
+	* Michael P. Gerlek <mpg at flaxen.com> split some code out of Utils.cpp into a new FileUtils.cpp (11:55:01)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code and carry a bounds object to cumulate the extent of the PC as it is loaded (09:13:57)
+
+2011-08-01
+	* Michael P. Gerlek <mpg at flaxen.com> allow reader to be init'd early, so can snark its SRS (18:54:55)
+	* Michael P. Gerlek <mpg at flaxen.com> sync apps with new initialize() req'ment (18:49:15)
+	* Michael P. Gerlek <mpg at flaxen.com> added public initialize() method for all stages, which must be called before any stage operation is done - typically you will do this after the last pipeline stage is constructed (18:46:11)
+
+2011-07-30
+	* Pete Gadomski <pete.gadomski at gmail.com> Incorrect bounds initialization (18:53:37)
+	* Howard Butler <hobu.inc at gmail.com> apply Mike's fix for block bounds (14:20:56)
+
+2011-07-29
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (15:18:43)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (15:11:02)
+	* Michael P. Gerlek <mpg at flaxen.com> refactored so we now have a ScalingFilter and a DescalingFilter -- no more mixing up the two ctors (14:58:53)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (14:20:31)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (14:14:00)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (14:13:41)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (13:44:22)
+	* Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctor (13:31:43)
+	* Michael P. Gerlek <mpg at flaxen.com> added pcpipeline application (13:03:13)
+	* Michael P. Gerlek <mpg at flaxen.com> improved Options API, added support for debug/vebose opts (11:50:54)
+
+2011-07-28
+	* Michael P. Gerlek <mpg at flaxen.com> made root element ReaderPipeline or WriterPipeline (23:03:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added generic verbose and debug options (23:03:27)
+
+2011-07-27
+	* Michael P. Gerlek <mpg at flaxen.com> added docs (19:28:00)
+	* Michael P. Gerlek <mpg at flaxen.com> factor PipelineManager into separate classes (16:33:15)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up temp files (14:58:49)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:48:39)
+	* Michael P. Gerlek <mpg at flaxen.com> add error checking to pipeline reader (14:48:20)
+	* Howard Butler <hobu.inc at gmail.com> don't reproject if output and input srs are the same (11:19:45)
+	* Howard Butler <hobu.inc at gmail.com> memoize fetching the indexID and blockID for the block so we don't have to do this for every point for a good speed win (09:06:40)
+	* Howard Butler <hobu.inc at gmail.com> apply Will's patch for #38 to enable MSVC2008 building (08:36:22)
+	* Michael P. Gerlek <mpg at flaxen.com> turn on pipeline writer testing (04:45:47)
+
+2011-07-26
+	* Michael P. Gerlek <mpg at flaxen.com> pretty print xml (22:00:27)
+	* Michael P. Gerlek <mpg at flaxen.com> added stage dumping out to pipeline xml (20:15:04)
+	* Michael P. Gerlek <mpg at flaxen.com> improve pipeline testing (17:46:44)
+	* Michael P. Gerlek <mpg at flaxen.com> don't need icky strings (17:46:16)
+	* Michael P. Gerlek <mpg at flaxen.com> fix problem with writing zero points (17:45:34)
+	* Michael P. Gerlek <mpg at flaxen.com> added option-based ctors for Las reader/writer, crop; turned back on pipeline manager tests (17:14:02)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:23:26)
+	* Howard Butler <hobu.inc at gmail.com> reserved bytes should be set to 0xAABB by default (16:15:43)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:14:50)
+	* Howard Butler <hobu.inc at gmail.com> std::cin is in <iostream> (14:52:34)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:04:37)
+	* Michael P. Gerlek <mpg at flaxen.com> StreamOwner renamed to StreamManager because it doesn't actually, umm, own the stream (14:04:27)
+	* Michael P. Gerlek <mpg at flaxen.com> StreamOwner class work (14:00:24)
+	* Howard Butler <hobu.inc at gmail.com> implement a tuple-map for dimension lookup (12:10:18)
+	* Howard Butler <hobu.inc at gmail.com> turn off endianness Dimension setting for now (12:10:08)
+	* Howard Butler <hobu.inc at gmail.com> turn off OCI stuff if now Oracle enabled (11:52:01)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (09:55:34)
+	* Michael P. Gerlek <mpg at flaxen.com> StreamOwner class ready (09:55:22)
+	* Howard Butler <hobu.inc at gmail.com> merge (08:41:02)
+	* Howard Butler <hobu.inc at gmail.com> long int* isn't the same as int* for srid (08:40:52)
+
+2011-07-25
+	* Michael P. Gerlek <mpg at flaxen.com> replace INIT_OPTIONS with something more verbose, but more explicit and simpler (19:30:59)
+	* Howard Butler <hobu.inc at gmail.com> put the try/except globally for oracle-write and oracle-read (15:29:48)
+	* Howard Butler <hobu.inc at gmail.com> point_schema_override doesn't mean anything now (15:08:00)
+	* Howard Butler <hobu.inc at gmail.com> add try/catch around the .write methods to catch any std errors (14:46:58)
+	* Howard Butler <hobu.inc at gmail.com> turn off INIT_OPTIONS, doesn't work on unix (14:40:39)
+	* Howard Butler <hobu.inc at gmail.com> remove extra ;'s (13:04:50)
+	* Michael P. Gerlek <mpg at flaxen.com> start of StreamOwner class (12:38:50)
+	* Howard Butler <hobu.inc at gmail.com> merge (10:19:40)
+	* Howard Butler <hobu.inc at gmail.com> ByteSwapFilter should flip the endianness bit on its dimensions (10:18:05)
+	* Howard Butler <hobu.inc at gmail.com> add non-const getDimensions method (10:17:28)
+	* Howard Butler <hobu.inc at gmail.com> decruft and comment about how we loop through the non-XYZ dimensions to copy the data (09:32:06)
+
+2011-07-22
+	* Michael P. Gerlek <mpg at flaxen.com> start turning back on stage factory, pipeline mangler (23:03:36)
+	* Michael P. Gerlek <mpg at flaxen.com> include guard typo (17:12:30)
+	* Michael P. Gerlek <mpg at flaxen.com> stub in an Options-based ctor for every stage (17:09:33)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (15:41:19)
+	* Michael P. Gerlek <mpg at flaxen.com> split StageBase out into its own file (15:41:04)
+	* Michael P. Gerlek <mpg at flaxen.com> add a really ugly mechanism for static initializers (15:40:46)
+	* Howard Butler <hobu.inc at gmail.com> turn off pkgconfig pdal.pc for now (14:29:34)
+	* Michael P. Gerlek <mpg at flaxen.com> added StageBase class, for getName() and getOptions(); added macros for same (13:54:00)
+	* Howard Butler <hobu.inc at gmail.com> don't be so aggressive in capitalizing everything (10:24:11)
+
+2011-07-21
+	* Howard Butler <hobu.inc at gmail.com> memoize field look ups to get them out of the critical path (15:56:07)
+	* Howard Butler <hobu.inc at gmail.com> turn off byteswapping for now (14:23:27)
+	* Howard Butler <hobu.inc at gmail.com> merge (13:30:25)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (13:28:46)
+	* Howard Butler <hobu.inc at gmail.com> remove lint (13:25:33)
+	* Howard Butler <hobu.inc at gmail.com> fix up ScalingFilter to copy non-XYZ data, appears to work now (13:25:24)
+	* Michael P. Gerlek <mpg at flaxen.com> typo (13:16:09)
+	* Howard Butler <hobu.inc at gmail.com> add typename qualification (11:45:36)
+	* Howard Butler <hobu.inc at gmail.com> merge (10:25:58)
+	* Howard Butler <hobu.inc at gmail.com> start on raw field copying -- doesn't work yet though (10:25:32)
+	* Howard Butler <hobu.inc at gmail.com> add setFieldData method for interacting with setting raw data (10:25:05)
+	* Howard Butler <hobu.inc at gmail.com> add start of ScalingFilter test (10:24:46)
+	* Michael P. Gerlek <mpg at flaxen.com> restore (much of) PipelineManager class (from big backed-out commit) (00:34:45)
+	* Michael P. Gerlek <mpg at flaxen.com> restore (much of) StageFactory class (from big backed-out commit) (00:18:54)
+
+2011-07-20
+	* Michael P. Gerlek <mpg at flaxen.com> improved Options class (from big backed-out commit) (23:41:16)
+	* Michael P. Gerlek <mpg at flaxen.com> typo in include guard (23:27:19)
+	* Michael P. Gerlek <mpg at flaxen.com> re-fix the liblas vs. native writer issue (15:29:32)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:20:10)
+	* Michael P. Gerlek <mpg at flaxen.com> stub in old StageFactory files, restore pipeline unit test file (14:19:43)
+	* Howard Butler <hobu.inc at gmail.com> cannot delete a const& from a Schema (14:04:21)
+	* Howard Butler <hobu.inc at gmail.com> oops, in/out flipped for srs (14:03:59)
+	* Howard Butler <hobu.inc at gmail.com> implement removeDimension (14:03:47)
+	* Howard Butler <hobu.inc at gmail.com> reapply 8b71a4ec238e (12:34:15)
+	* Howard Butler <hobu.inc at gmail.com> clean up oracle reader/writer processes (12:32:00)
+	* Howard Butler <hobu.inc at gmail.com> rollback to r847 sto start this mess over again :) (10:25:35)
+
+2011-07-19
+	* Howard Butler <hobu.inc at gmail.com> remove extraneous ; (14:54:44)
+	* Howard Butler <hobu.inc at gmail.com> oops (14:52:26)
+	* Howard Butler <hobu.inc at gmail.com> include xml_parser from property_tree (14:52:12)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:45:38)
+	* Howard Butler <hobu.inc at gmail.com> an attempt at implementing removeDimension support (14:39:27)
+	* Howard Butler <hobu.inc at gmail.com> we can't delete a reference to the dimension or it will be invalid (14:39:15)
+	* Michael P. Gerlek <mpg at flaxen.com> remove libxml includes (14:18:19)
+	* Howard Butler <hobu.inc at gmail.com> some cleanup of oci stuff (13:08:52)
+	* Howard Butler <hobu.inc at gmail.com> add Bounds cumulation for block insertion (13:08:39)
+	* Michael P. Gerlek <mpg at flaxen.com> make the Iterators be shared ptrs now (13:02:17)
+	* Michael P. Gerlek <mpg at flaxen.com> LiblasWriter now uses options block for filename (01:24:42)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint -- pipeline as ptree now working (01:16:10)
+
+2011-07-18
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint -- trying to debug Options::empty linking issue (23:46:18)
+	* Michael P. Gerlek <mpg at flaxen.com> converted xml-based pipeline manager to ptree (19:40:02)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint -- pipeline manager work (18:37:12)
+	* Michael P. Gerlek <mpg at flaxen.com> botched merge (15:14:33)
+	* Michael P. Gerlek <mpg at flaxen.com> lots of pipeline stage builder and shared ptr work (15:07:43)
+	* Howard Butler <hobu.inc at gmail.com>  >> is an operator and not so good for template discrimination on many compilers (14:54:01)
+
+2011-07-15
+	* Michael P. Gerlek <mpg at flaxen.com> more tests (01:35:27)
+	* Michael P. Gerlek <mpg at flaxen.com> syn with new ctor (01:34:58)
+	* Michael P. Gerlek <mpg at flaxen.com> typo (01:34:40)
+	* Michael P. Gerlek <mpg at flaxen.com> missing \#incl (01:34:23)
+	* Michael P. Gerlek <mpg at flaxen.com> turn on Options ctor (01:33:29)
+
+2011-07-14
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups (15:11:40)
+	* Michael P. Gerlek <mpg at flaxen.com> added Options ctor support for LasReader, LasReader, Crop; had to make the Writer take a filename instead of a stream (14:24:37)
+
+2011-07-13
+	* Michael P. Gerlek <mpg at flaxen.com> piepline builder work (22:21:56)
+	* Michael P. Gerlek <mpg at flaxen.com> cut/paste error (22:21:34)
+	* Michael P. Gerlek <mpg at flaxen.com> stubbed in Option-based ctor for all Stages; added new StageBase class; work on StageFactory class (21:38:29)
+
+2011-07-12
+	* Michael P. Gerlek <mpg at flaxen.com> merge (22:38:59)
+	* Michael P. Gerlek <mpg at flaxen.com> playing around with pipeline builder (22:38:47)
+	* Howard Butler <hobu.inc at gmail.com> some riffing around with boost::multi_index to contain the pdal::Dimensions for the pdal::Schema (16:00:41)
+	* Howard Butler <hobu.inc at gmail.com> add qfit2las utility (to be removed when we have VRT pipeline working (09:29:29)
+	* Howard Butler <hobu.inc at gmail.com> set z scale to 1.0 (09:29:08)
+	* Howard Butler <hobu.inc at gmail.com> apply scaling for test (09:28:52)
+	* Howard Butler <hobu.inc at gmail.com> default the header's scale to 1.0 for xyz (09:28:35)
+
+2011-07-11
+	* Michael P. Gerlek <mpg at flaxen.com> update for latest (15:54:36)
+	* Michael P. Gerlek <mpg at flaxen.com> oops, put those back (15:51:18)
+	* Michael P. Gerlek <mpg at flaxen.com> update ref files to bring liblas and native back in sync (15:39:02)
+	* Howard Butler <hobu.inc at gmail.com> update the QFIT driver to use the new pdal::Options and pdal::Option class (11:37:13)
+	* Howard Butler <hobu.inc at gmail.com> attempt to return an empty value when an option with a given name is not found -- maybe we should throw our own exception here? (11:36:53)
+	* Howard Butler <hobu.inc at gmail.com> reorder initialization order (10:52:02)
+
+2011-07-03
+	* Howard Butler <hobu.inc at gmail.com> clean up initialization order (14:17:21)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:14:07)
+	* Howard Butler <hobu.inc at gmail.com> start noodling around with boost::multi_index as the container for the Dimensions (14:14:00)
+	* Howard Butler <hobu.inc at gmail.com> typo (14:10:44)
+	* Howard Butler <hobu.inc at gmail.com> set the dimension to a fixed precision dimension if we've set an offset value (14:08:59)
+	* Howard Butler <hobu.inc at gmail.com> we should still apply scaling if the offset were set. (14:08:10)
+
+2011-07-02
+	* Michael P. Gerlek <mpg at flaxen.com> mpg (10:44:24)
+
+2011-07-01
+	* Howard Butler <hobu.inc at gmail.com> cut down precision of tolerance and output the schema to the current directory (23:39:30)
+	* Michael P. Gerlek <mpg at flaxen.com> added Options param up and down the Stage class hierarchy (20:01:56)
+	* Michael P. Gerlek <mpg at flaxen.com> fixing capitalization (19:12:15)
+	* Michael P. Gerlek <mpg at flaxen.com> fixing capitalization (19:11:12)
+	* Michael P. Gerlek <mpg at flaxen.com> renamed Hobo's old Options class to OptionsOld, and renamed my new OptionsNew class to Options (19:10:20)
+	* Michael P. Gerlek <mpg at flaxen.com> sync Stage changes to OCI classes (18:27:13)
+	* Michael P. Gerlek <mpg at flaxen.com> turned on multifilter (which doesn't really work) (15:30:01)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:34:42)
+
+2011-06-30
+	* Michael P. Gerlek <mpg at flaxen.com> moved Iterator to StageIterator; added Reader class, derived from Stage; add MultiFilter, but not used yet (19:33:15)
+	* Howard Butler <hobu.inc at gmail.com> merge (16:58:35)
+	* Howard Butler <hobu.inc at gmail.com> fix up boundary wkt insertion (16:58:15)
+	* Howard Butler <hobu.inc at gmail.com> in/out srs's were backwards (16:57:55)
+	* Michael P. Gerlek <mpg at flaxen.com> sync laszip ref files for 2.0 (16:22:26)
+	* Michael P. Gerlek <mpg at flaxen.com> sync with liblas/laszip (16:21:19)
+	* Howard Butler <hobu.inc at gmail.com> throw pdal_error so we can ignore it on ::transform (15:13:38)
+	* Howard Butler <hobu.inc at gmail.com> try to clean up bounds fetching from the options (14:52:40)
+	* Howard Butler <hobu.inc at gmail.com> bad bind position (14:43:32)
+	* Howard Butler <hobu.inc at gmail.com> bad bind position (14:42:52)
+	* Howard Butler <hobu.inc at gmail.com> more rearranging of deck chairs (14:38:19)
+	* Howard Butler <hobu.inc at gmail.com> use the LasReader for oracle-writing (14:29:13)
+
+2011-06-28
+	* Pete Gadomski <pete.gadomski at gmail.com> Fixed extra qualification ‘pdal::OptionsNew::’ on member ‘getOptionPTree’ (13:26:37)
+
+2011-06-27
+	* Michael P. Gerlek <mpg at flaxen.com> disable srs/reproj tess if not using GDAL (16:43:17)
+	* Michael P. Gerlek <mpg at flaxen.com> adding ICONV cmake support (16:22:34)
+	* Michael P. Gerlek <mpg at flaxen.com> lint, for builds without GDAL (14:56:41)
+	* Michael P. Gerlek <mpg at flaxen.com> mpg-specific file, trying to synchronize build configs (14:30:57)
+
+2011-06-24
+	* Michael P. Gerlek <mpg at flaxen.com> more ignorables (19:18:07)
+	* Michael P. Gerlek <mpg at flaxen.com> fix throw (18:47:57)
+	* Michael P. Gerlek <mpg at flaxen.com> comments (18:45:10)
+	* Michael P. Gerlek <mpg at flaxen.com> implemented further Options support (18:42:57)
+	* Michael P. Gerlek <mpg at flaxen.com> updated for laz 2.0 (11:42:35)
+	* Michael P. Gerlek <mpg at flaxen.com> start of pipeline creation support (11:02:06)
+
+2011-06-23
+	* Howard Butler <hobu.inc at gmail.com> merge (08:21:50)
+	* Howard Butler <hobu.inc at gmail.com> start using operator== for pdal::SpatialReference comparisons (08:21:41)
+	* Howard Butler <hobu.inc at gmail.com> throw an error if the CoordinateTransformation object is not created by GDAL (08:21:25)
+	* Howard Butler <hobu.inc at gmail.com> Use the new LASzip 2.0 errors when things go wrong and decrease the level of paranoia (08:20:23)
+
+2011-06-22
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (13:28:02)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (12:34:57)
+	* Michael P. Gerlek <mpg at flaxen.com> pdal.org -> pointcloud.org (12:24:20)
+	* Michael P. Gerlek <mpg at flaxen.com> fix ambiguous resolution (vs2010) (12:06:56)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (12:03:07)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (11:40:54)
+	* Michael P. Gerlek <mpg at flaxen.com> rename to pdal (11:34:57)
+
+2011-06-21
+	* Howard Butler <hobu.inc at gmail.com> merge (12:49:00)
+	* Howard Butler <hobu.inc at gmail.com> more pc2pc oracle-writer refactoring (12:48:54)
+	* Howard Butler <hobu.inc at gmail.com> pdal.org doesn't exist, use pointcloud.org for schema location (12:48:26)
+
+2011-06-16
+	* Howard Butler <hobu.inc at gmail.com> merge (10:54:47)
+
+2011-06-15
+	* Howard Butler <hobu.inc at gmail.com> add a EPSG:4326 file to be able to test with (16:07:51)
+	* Howard Butler <hobu.inc at gmail.com> make sure to set the stages SpatialReference to the output SpatialReference (16:07:38)
+	* Howard Butler <hobu.inc at gmail.com> typo (15:55:12)
+	* Howard Butler <hobu.inc at gmail.com> support for fetching SRS from the SDO_PC's PC_GEOMETRY to set to stage's SRS (11:36:40)
+	* Howard Butler <hobu.inc at gmail.com> change path for srs ingestion so that multiple ones from a complex can be fetched without depending on an absolute path (10:16:11)
+
+2011-06-14
+	* Howard Butler <hobu.inc at gmail.com> support io through operator>> and operator<< for SpatialReference via boost::property_tree (16:04:34)
+	* Howard Butler <hobu.inc at gmail.com> return the proper type for getField (11:00:21)
+	* Howard Butler <hobu.inc at gmail.com> make it GDAL's problem to check for SRS equality instead of checking fragil WKT output (10:58:38)
+	* Howard Butler <hobu.inc at gmail.com> update to catch up to Martin's new error handling (10:39:52)
+	* Howard Butler <hobu.inc at gmail.com> eof endline (10:08:01)
+	* Howard Butler <hobu.inc at gmail.com> normalize includes (10:07:52)
+
+2011-06-09
+	* Howard Butler <hobu.inc at gmail.com> clean up CMakeLists a quite a bit (15:04:05)
+	* Howard Butler <hobu.inc at gmail.com> only wipe LASzip-related objects when we PDAL_HAVE_LASZIP (14:18:12)
+	* Howard Butler <hobu.inc at gmail.com> rename old libpc file.  libPC is now dead.  Long live PDAL (11:54:34)
+	* Howard Butler <hobu.inc at gmail.com> force the deletion order of LASzip objects before we close the stream (11:50:31)
+	* Howard Butler <hobu.inc at gmail.com> only support setSRSFromVLRs_geotiff when PDAL_SRS_ENABLED (11:21:09)
+	* Howard Butler <hobu.inc at gmail.com> conditionally compile XML schema test (11:20:52)
+	* Howard Butler <hobu.inc at gmail.com> support compiling without LASzip (11:11:45)
+	* Howard Butler <hobu.inc at gmail.com> LIBPC_ -> PDAL_ (10:36:28)
+	* Howard Butler <hobu.inc at gmail.com> start to conditionally compile LASzip stuff (10:36:10)
+	* Howard Butler <hobu.inc at gmail.com> use a boost::scoped_ptr to handle the LASzip stuff instead of naked pointer (10:35:35)
+	* Howard Butler <hobu.inc at gmail.com> support compiling native LAS driver when we don't have GDAL + GeoTIFF (09:35:40)
+	* Howard Butler <hobu.inc at gmail.com> LIBPC_DLL -> PDAL_DLL (09:35:15)
+	* Howard Butler <hobu.inc at gmail.com> LIBPC_DLL -> PDAL_DLL (09:35:01)
+	* Howard Butler <hobu.inc at gmail.com> LIBPC->PDAL and #include <boost/concept_check.hpp> for boost::ignore_unused_variable_warning (08:53:30)
+	* Howard Butler <hobu.inc at gmail.com> clean up behavior in situations where we don't have libxml2 (08:48:59)
+	* Howard Butler <hobu.inc at gmail.com> clean up unused variable warning (08:46:58)
+	* Howard Butler <hobu.inc at gmail.com> more libPC->PDAL renaming (08:45:58)
+	* Howard Butler <hobu.inc at gmail.com> start on PDAL rename (08:30:25)
+	* Howard Butler <hobu.inc at gmail.com> some support for QUERY_SDO_PC_BLK_TYPE queries, but it doesn't really work yet (08:27:21)
+
+2011-06-06
+	* Howard Butler <hobu.inc at gmail.com> comment out debugging lint for a day when we have a real debugging system (16:58:08)
+	* Howard Butler <hobu.inc at gmail.com> assert that the number of points we read is the number we've processed (16:57:37)
+	* Howard Butler <hobu.inc at gmail.com> add scale, offset, endianness information from the XML schema to the libpc::Schema when reading (16:56:44)
+	* Howard Butler <hobu.inc at gmail.com> add offset and scale to the operator<< output (16:56:10)
+	* Howard Butler <hobu.inc at gmail.com> add a getStreamPrecision method to take a scale value and turn it into a fixed precision value for setting on a std::ostream (16:55:27)
+	* Howard Butler <hobu.inc at gmail.com> mostly working full service reader/writer for Oracle (15:47:23)
+	* Howard Butler <hobu.inc at gmail.com> make the oracle reader/writer use the ByteSwapFilter (15:46:57)
+	* Howard Butler <hobu.inc at gmail.com> as a stage, the chipper has an unknown but fixed point count.  This could be made smarter in the future to know what the point count is based on the previous stage, however (15:45:19)
+	* Howard Butler <hobu.inc at gmail.com> It is possible to use the XML without validation. If dimensions do not have a name, just start ticking them off from the first user-defined dimension number (15:42:19)
+	* Howard Butler <hobu.inc at gmail.com> add a setAllData method to allow the user to copy in an array of data directly (15:41:59)
+	* Howard Butler <hobu.inc at gmail.com> It is possible to use the XML without validation. If dimensions do not have a name, just start ticking them off from the first user-defined dimension number (15:41:04)
+	* Howard Butler <hobu.inc at gmail.com> tweak logic for ByteSwapFilter to do something special when a chipper is in front of it.  I'm going to add another mode to the SequentialFilter to have it control the returned buffer size in addition to the fill-the-buffer-all-the-way-up mode (15:40:07)
+
+2011-05-26
+	* Howard Butler <hobu.inc at gmail.com> start reworking to be able to use the ByteSwapper filter (13:15:52)
+	* Howard Butler <hobu.inc at gmail.com> decrufting (13:15:17)
+	* Howard Butler <hobu.inc at gmail.com> return the actual number of points swapped instead of the capacity (13:14:53)
+	* Howard Butler <hobu.inc at gmail.com> add support for ByteSwapper filter (13:14:14)
+
+2011-05-25
+	* Howard Butler <hobu.inc at gmail.com> ByteSwapFilter now seems to work (with tests\!) (17:04:51)
+	* Howard Butler <hobu.inc at gmail.com> add the generic swap variants as well (17:04:16)
+	* Howard Butler <hobu.inc at gmail.com> add non-const getData method to all someone to fiddle with the data directly (like byte swapping it :) (17:03:20)
+	* Howard Butler <hobu.inc at gmail.com> use standard sequential iterator verbage (14:52:04)
+	* Howard Butler <hobu.inc at gmail.com> non-const fetches of SchemaLayout and Schema to support changing a PointBuffer's schema on-the-fly (14:51:25)
+	* Howard Butler <hobu.inc at gmail.com> consolidate endianness handling for ByteSwappingFilter's usage as well as Oracle's (13:58:37)
+	* Howard Butler <hobu.inc at gmail.com> add SWAP_LE_TO_BE_N method (13:52:55)
+	* Howard Butler <hobu.inc at gmail.com> add scaffolding for ByteSwapFilter (13:40:26)
+	* Howard Butler <hobu.inc at gmail.com> add SWAP_LE_TO_BE method.  Note that this is exactly the same code as SWAP_BE_TO_LE which is merely just a byte swapping function.  It is valuable to read which way we're actually going in source code, however (13:30:18)
+	* Howard Butler <hobu.inc at gmail.com> add a Get8DimensionFixedSchema method for our fixed-format schema that we currently write to Oracle (11:49:46)
+	* Howard Butler <hobu.inc at gmail.com> pointSourceID is uint16_t, not int16_t (11:49:15)
+	* Howard Butler <hobu.inc at gmail.com> turn off writing the task xml for now (11:48:59)
+	* Howard Butler <hobu.inc at gmail.com> add an endianness element for dimension (11:47:15)
+	* Howard Butler <hobu.inc at gmail.com> write the stage's xml schema if we weren't given an override (10:28:58)
+	* Howard Butler <hobu.inc at gmail.com> use new getXML() rename instead of write() (10:28:30)
+	* Howard Butler <hobu.inc at gmail.com> actually return the schema objects in from_xml (10:26:33)
+	* Howard Butler <hobu.inc at gmail.com> Schema::from_xml and Schema::to_xml static methods for ingesting and producing XML descriptions of Schema objects (10:00:54)
+	* Howard Butler <hobu.inc at gmail.com> rename write() method to getXML() (09:59:52)
+	* Howard Butler <hobu.inc at gmail.com> remove redundant definition for ORACLE (09:45:26)
+
+2011-05-24
+	* Howard Butler <hobu.inc at gmail.com> add simple i/o testing of the XML schema reader/writer (16:27:10)
+	* Howard Butler <hobu.inc at gmail.com> add a getSchema() method for the xml schema reader (16:26:52)
+	* Howard Butler <hobu.inc at gmail.com> add more cases for converting data type names into Dimension::Field enums (16:26:30)
+	* Howard Butler <hobu.inc at gmail.com> We can now serialize a libpc::Schema -> XML (12:47:21)
+
+2011-05-17
+	* Howard Butler <hobu.inc at gmail.com> don't upper case the point_schema_override (17:57:44)
+
+2011-05-12
+	* Howard Butler <hobu.inc at gmail.com> merge (14:01:47)
+	* Howard Butler <hobu.inc at gmail.com> push the XML schema stuff up into a more public area (14:01:37)
+
+2011-05-11
+	* Michael P. Gerlek <mpg at flaxen.com> strengthen seek/skip tests (19:05:37)
+	* Michael P. Gerlek <mpg at flaxen.com> turn on native zip reading (18:58:42)
+	* Michael P. Gerlek <mpg at flaxen.com> added more read/write laz tests (18:06:55)
+	* Michael P. Gerlek <mpg at flaxen.com> memleak (15:12:42)
+	* Michael P. Gerlek <mpg at flaxen.com> memleak (15:06:59)
+	* Michael P. Gerlek <mpg at flaxen.com> memleak (14:43:32)
+	* Michael P. Gerlek <mpg at flaxen.com> make zip tests pass (but still has memleak) (14:35:00)
+	* Michael P. Gerlek <mpg at flaxen.com> add qfit, terrasolid to vs2010 IDE (14:26:08)
+	* Michael P. Gerlek <mpg at flaxen.com> make build (but not yet run correctly) with laszip/liblas changes (14:19:54)
+	* Howard Butler <hobu.inc at gmail.com> TerraSolid reader now working (12:05:38)
+	* Howard Butler <hobu.inc at gmail.com> don't override getPointCout (12:04:33)
+	* Howard Butler <hobu.inc at gmail.com> add a (not yet working) TerraSolid reader (10:49:55)
+	* Howard Butler <hobu.inc at gmail.com> add Field_Alpha name (10:49:38)
+	* Howard Butler <hobu.inc at gmail.com> add Field_Alpha. Calls to setNumericScale that are not 0.0 imply the dimension is fixed precision (10:49:20)
+
+2011-05-06
+	* Howard Butler <hobu.inc at gmail.com> add functional QFIT reader with some tests and example files (15:42:22)
+	* Howard Butler <hobu.inc at gmail.com> fix up copyright (15:42:05)
+	* Howard Butler <hobu.inc at gmail.com> applyScaling should be a no-op in the case where the m_numericScale is 0.0 (15:14:42)
+	* Howard Butler <hobu.inc at gmail.com> construct schema for QFIT data based on the three possible formats and calculate a point count based on point format size and header offset information (10:59:44)
+	* Howard Butler <hobu.inc at gmail.com> add some more user fields (10:58:56)
+	* Howard Butler <hobu.inc at gmail.com> add scaffolding for QFIT reader (09:25:56)
+	* Howard Butler <hobu.inc at gmail.com> more schema writing (09:25:44)
+	* Howard Butler <hobu.inc at gmail.com> add endianness field to libpc::Dimension to denote layout of the dimension (09:25:22)
+
+2011-04-30
+	* Howard Butler <hobu.inc at gmail.com> start on serializing libpc::Schema to xml (08:31:52)
+
+2011-04-29
+	* Howard Butler <hobu.inc at gmail.com> support serializing a libpc::Schema to XML -- will move this into libpc::Schema proper soon (14:17:25)
+
+2011-04-28
+	* Michael P. Gerlek <mpg at flaxen.com> disable a couple tests as per #35 (12:23:21)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:57:12)
+	* Michael P. Gerlek <mpg at flaxen.com> reproj and scaling filters working (11:57:02)
+	* Michael P. Gerlek <mpg at flaxen.com> reproj and scaling filters now working (11:40:40)
+	* Howard Butler <hobu.inc at gmail.com> only compress if set to true (11:15:52)
+	* Michael P. Gerlek <mpg at flaxen.com> update the header's bounds (10:25:32)
+
+2011-04-27
+	* Michael P. Gerlek <mpg at flaxen.com> merge (18:21:56)
+	* Michael P. Gerlek <mpg at flaxen.com> comment out failing tests (18:21:10)
+	* Michael P. Gerlek <mpg at flaxen.com> reprojection and scaling filters almost working (18:13:27)
+	* Michael P. Gerlek <mpg at flaxen.com> added a removeDimension function (18:13:09)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:32:02)
+	* Howard Butler <hobu.inc at gmail.com> only try to set the srs if we have one (14:31:54)
+	* Michael P. Gerlek <mpg at flaxen.com> start of scaling filter (14:13:02)
+	* Michael P. Gerlek <mpg at flaxen.com> harden (14:12:07)
+	* Michael P. Gerlek <mpg at flaxen.com> set buffer spatial bounds (13:51:08)
+	* Michael P. Gerlek <mpg at flaxen.com> added control of writer to emit compound wkts (13:48:14)
+	* Michael P. Gerlek <mpg at flaxen.com> turn on file-compare tests (13:15:35)
+	* Michael P. Gerlek <mpg at flaxen.com> dump wkt info (13:15:17)
+	* Michael P. Gerlek <mpg at flaxen.com> handle case where file missing (13:14:50)
+	* Michael P. Gerlek <mpg at flaxen.com> test now passing (12:54:30)
+	* Michael P. Gerlek <mpg at flaxen.com> SRS bugs all stomped out (12:51:18)
+	* Howard Butler <hobu.inc at gmail.com> fix up options so they actually work :) (10:58:33)
+	* Howard Butler <hobu.inc at gmail.com> add a_srs and compressed options for OCI writer (10:52:52)
+	* Howard Butler <hobu.inc at gmail.com> include cpl_conv.h for CPLFree (10:52:35)
+	* Howard Butler <hobu.inc at gmail.com> include cpl_conv.h for CPLFree (10:52:25)
+	* Howard Butler <hobu.inc at gmail.com> include string and stdexcept (10:41:41)
+
+2011-04-26
+	* Michael P. Gerlek <mpg at flaxen.com> isolated out geotiff stuff; 4 fails left (16:59:47)
+	* Michael P. Gerlek <mpg at flaxen.com> moved string trim function into Utils (16:37:02)
+	* Michael P. Gerlek <mpg at flaxen.com> I keep forgetting to delete the iters -- bad design? (16:31:12)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint -- removing geotiff support inside srs class (16:24:47)
+	* Michael P. Gerlek <mpg at flaxen.com> minor SRS tweaking/debugging; lit up reproj filter (14:35:27)
+	* Michael P. Gerlek <mpg at flaxen.com> input tests passing (12:57:16)
+	* Michael P. Gerlek <mpg at flaxen.com> output tests passing (12:34:57)
+	* Michael P. Gerlek <mpg at flaxen.com> build fix (12:23:28)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:21:33)
+	* Michael P. Gerlek <mpg at flaxen.com> tests for Bounds, Range parsers -- currently doesn't build (12:21:21)
+	* Michael P. Gerlek <mpg at flaxen.com> start of Bounds oper>> parser (12:19:53)
+	* Michael P. Gerlek <mpg at flaxen.com> add some parser helpers (12:19:21)
+	* Howard Butler <hobu.inc at gmail.com> fix up schema override support (12:01:05)
+	* Howard Butler <hobu.inc at gmail.com> make drivers::oci::writer write the 8-dimension format we now use by default (11:33:26)
+	* Howard Butler <hobu.inc at gmail.com> start using our little XML thing for OCI i/o (11:08:16)
+	* Howard Butler <hobu.inc at gmail.com> return #'s that are 0 are legit(ish) (11:06:04)
+	* Howard Butler <hobu.inc at gmail.com> a little more work on Options (10:20:32)
+	* Howard Butler <hobu.inc at gmail.com> update comment about getName (10:20:08)
+	* Howard Butler <hobu.inc at gmail.com> remove OCI-specific stuff from libpc::Options (08:16:36)
+
+2011-04-25
+	* Howard Butler <hobu.inc at gmail.com> clean up uninitialized warning (21:12:51)
+	* Howard Butler <hobu.inc at gmail.com> silence warning about int comparison (21:11:24)
+	* Michael P. Gerlek <mpg at flaxen.com> starting reprojection filter (16:57:08)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (16:43:03)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (16:40:42)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:28:56)
+	* Michael P. Gerlek <mpg at flaxen.com> srs writing done, but with one unit test failure (16:28:43)
+	* Michael P. Gerlek <mpg at flaxen.com> still debugging VLR/SRS stuff (15:38:04)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - SRS/VLR work - split off from Metadata, change VLR ids to strings, etc (13:43:14)
+	* Howard Butler <hobu.inc at gmail.com> reset Stage::getName to be XPath-style stage name (13:41:02)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - SRS/VLR work (12:42:42)
+	* Howard Butler <hobu.inc at gmail.com> rename getName to getDescription in preparation for getName being the XPath-style name to the Stage.  Remove extra getName() virtual on libpc::Writer (12:33:56)
+	* Howard Butler <hobu.inc at gmail.com> move OCI driver's Options thing up into a proper library-wide class (11:35:01)
+	* Howard Butler <hobu.inc at gmail.com> GDAL_DATA and PROJ_LIB aren't necessary on *nix (10:49:33)
+	* Howard Butler <hobu.inc at gmail.com> remove extra qualification (10:49:19)
+
+2011-04-22
+	* Michael P. Gerlek <mpg at flaxen.com> srs starting to work (18:34:38)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint for srs work (18:01:35)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint for srs work (17:54:50)
+	* Michael P. Gerlek <mpg at flaxen.com> tiff libs redirect (15:07:51)
+	* Michael P. Gerlek <mpg at flaxen.com> oops (15:06:35)
+	* Michael P. Gerlek <mpg at flaxen.com> now building against gdal 1.8 (14:30:36)
+	* Michael P. Gerlek <mpg at flaxen.com> dead code (14:29:25)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:12:12)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental SRS work for las reader (13:12:04)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:40:52)
+	* Howard Butler <hobu.inc at gmail.com> provide the ability to override the pc_other_attrs column with a point_schema_override option (12:40:43)
+	* Michael P. Gerlek <mpg at flaxen.com> srs round-tripping passing (12:21:05)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:04:35)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental SRS work (12:04:22)
+	* Howard Butler <hobu.inc at gmail.com> typo (11:10:24)
+	* Michael P. Gerlek <mpg at flaxen.com> fix busted merge (10:58:19)
+	* Michael P. Gerlek <mpg at flaxen.com> move compare_no_case to Utils (10:47:39)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (10:46:29)
+	* Michael P. Gerlek <mpg at flaxen.com> start of srs work (10:43:47)
+	* Howard Butler <hobu.inc at gmail.com> remove extra qualifications (09:52:55)
+	* Howard Butler <hobu.inc at gmail.com> add new defn for compare_no_case (09:52:48)
+
+2011-04-21
+	* Michael P. Gerlek <mpg at flaxen.com> add C macros (16:28:58)
+	* Michael P. Gerlek <mpg at flaxen.com> missing file (16:28:39)
+	* Michael P. Gerlek <mpg at flaxen.com> VLR work, start of SRS support (15:41:10)
+	* Michael P. Gerlek <mpg at flaxen.com> add VLR support to liblas reader (15:03:56)
+	* Michael P. Gerlek <mpg at flaxen.com> start of VLR work (14:06:35)
+	* Michael P. Gerlek <mpg at flaxen.com> fix for gadomski (13:45:58)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:58:49)
+	* Michael P. Gerlek <mpg at flaxen.com> vs2010 fix (11:58:37)
+	* Howard Butler <hobu.inc at gmail.com> don't make overwrite on by default, this is bad :) (11:42:42)
+
+2011-04-20
+	* Howard Butler <hobu.inc at gmail.com> Read the new 8-dimension full layout that las2oci writes... libPC doesn't write this yet, however (13:53:53)
+	* Howard Butler <hobu.inc at gmail.com> revert to allowing 'select * from blk_table' for now (12:32:13)
+	* Howard Butler <hobu.inc at gmail.com> a return number that is 0 is legit (12:29:32)
+	* Howard Butler <hobu.inc at gmail.com> dumb mapping of name -> Dimension::Field for now (12:18:42)
+	* Howard Butler <hobu.inc at gmail.com> make sure to seek to end of file before reading data (11:07:20)
+	* Howard Butler <hobu.inc at gmail.com> xml parsing for generating libpc::Dimension entries (11:07:00)
+	* Howard Butler <hobu.inc at gmail.com> add operator < and > for sorting (09:42:15)
+	* Howard Butler <hobu.inc at gmail.com> start on some OCI schema stuff (08:27:59)
+
+2011-04-18
+	* Michael P. Gerlek <mpg at flaxen.com> add demo version (23:27:51)
+	* Michael P. Gerlek <mpg at flaxen.com> move to do parallel reads (oooh\!) (23:22:04)
+	* Michael P. Gerlek <mpg at flaxen.com> handle read-past-end nicely (23:21:07)
+	* Michael P. Gerlek <mpg at flaxen.com> support skipping (23:20:50)
+	* Michael P. Gerlek <mpg at flaxen.com> avoid small reads at all costs (16:27:50)
+	* Michael P. Gerlek <mpg at flaxen.com> switch to native las driver, some tuning (16:03:15)
+	* Michael P. Gerlek <mpg at flaxen.com> inlined some things; made color filter work with LAS schema (16:02:39)
+
+2011-04-15
+	* Michael P. Gerlek <mpg at flaxen.com> start to add native LAZ support (22:21:11)
+	* Michael P. Gerlek <mpg at flaxen.com> fix guid writing (19:45:28)
+	* Michael P. Gerlek <mpg at flaxen.com> win32 build fix (18:40:12)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (18:36:50)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - native las drivers almost to partiy with liblas drivers (18:36:12)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint -- turning on native las tests (17:44:39)
+	* Howard Butler <hobu.inc at gmail.com> start on an OCI-Schema test (17:14:12)
+	* Howard Butler <hobu.inc at gmail.com> remove redundant call, we throw exceptions now (17:13:49)
+	* Howard Butler <hobu.inc at gmail.com> flips the modes around for createFile and openFile (17:13:15)
+	* Michael P. Gerlek <mpg at flaxen.com> add libxml2 (16:43:44)
+	* Howard Butler <hobu.inc at gmail.com> install custom error handlers for libxml2 (16:40:36)
+	* Howard Butler <hobu.inc at gmail.com> merge (16:21:31)
+	* Howard Butler <hobu.inc at gmail.com> turn off table creation/deletion for now (16:21:21)
+	* Howard Butler <hobu.inc at gmail.com> start adding Cloud object definition (16:21:04)
+	* Howard Butler <hobu.inc at gmail.com> start adding Cloud object definition (16:20:35)
+	* Howard Butler <hobu.inc at gmail.com> add more schema stuff (16:20:11)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:14:28)
+	* Michael P. Gerlek <mpg at flaxen.com> added IDE grouping (16:14:19)
+	* Michael P. Gerlek <mpg at flaxen.com> refactoring support functions (16:00:25)
+	* Howard Butler <hobu.inc at gmail.com> scaffolding for libxml2-based schema reader/writer for OCI driver (15:37:04)
+	* Howard Butler <hobu.inc at gmail.com> add a default: case to handle other pointformats (14:49:00)
+	* Howard Butler <hobu.inc at gmail.com> include ostream for defn (14:48:40)
+	* Michael P. Gerlek <mpg at flaxen.com> liblaswriter now does header rewriting (14:43:44)
+
+2011-04-14
+	* Howard Butler <hobu.inc at gmail.com> throw buffer_too_small error when user requested a buffer that won't fit the oracle block (13:45:48)
+	* Howard Butler <hobu.inc at gmail.com> logic bug in determining if we can fit more points in the block.  This was causing lots of extra PointBuffer creation. (10:26:10)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:24:44)
+	* Howard Butler <hobu.inc at gmail.com> move block define and query type operations from Iterator to Reader (09:24:34)
+
+2011-04-13
+	* Michael P. Gerlek <mpg at flaxen.com> added tests for liblas formats (18:06:33)
+	* Michael P. Gerlek <mpg at flaxen.com> add control over version, guid (18:06:19)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (16:45:07)
+	* Michael P. Gerlek <mpg at flaxen.com> refactoring of common code in las/liblas readers/writers (16:44:57)
+	* Michael P. Gerlek <mpg at flaxen.com> add nonconst version of getDim (16:44:08)
+	* Howard Butler <hobu.inc at gmail.com> decruft in preparation for moving definition onto the Reader instead of the Iterator (15:15:13)
+	* Howard Butler <hobu.inc at gmail.com> use liblas writer for reader test because it matches our fixed schema right now (14:39:20)
+	* Howard Butler <hobu.inc at gmail.com> virtualize Stage::getNumPoints (14:38:55)
+	* Howard Butler <hobu.inc at gmail.com> only run OCI test if you give a connection string via command line argument (13:28:49)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:58:09)
+	* Michael P. Gerlek <mpg at flaxen.com> fix vs2010 build (12:57:56)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:50:55)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:50:41)
+	* Michael P. Gerlek <mpg at flaxen.com> sync with Dimension:: changes (12:50:37)
+	* Howard Butler <hobu.inc at gmail.com> use LasWriter instead of LiblasWriter (12:50:00)
+	* Howard Butler <hobu.inc at gmail.com> throw a connection_error in the event we are unable to connect (09:11:56)
+	* Pete Gadomski <pete.gadomski at gmail.com> Changed cmake's WITH_LIBLAS to default to TRUE (09:00:19)
+
+2011-04-12
+	* Howard Butler <hobu.inc at gmail.com> remove extra writing of buffer overrun data (15:11:31)
+	* Howard Butler <hobu.inc at gmail.com> rename getNumericValue (14:30:30)
+	* Howard Butler <hobu.inc at gmail.com> throw dimension_not_found error when it doesn't match up (14:30:09)
+	* Howard Butler <hobu.inc at gmail.com> add dimension_not_found exception (14:26:01)
+	* Howard Butler <hobu.inc at gmail.com> use applyScaling method that was renamed (14:24:44)
+	* Howard Butler <hobu.inc at gmail.com> rename Dimension::getNumericValue to applyScaling, add a removeScaling method, and add an Undefined DataType (14:23:47)
+	* Howard Butler <hobu.inc at gmail.com> Start on an OCI test case (11:41:18)
+	* Howard Butler <hobu.inc at gmail.com> lint and operator precedence (11:41:08)
+	* Howard Butler <hobu.inc at gmail.com> hop out of readImpl before resetting the buffer's count to 0 (11:40:43)
+	* Howard Butler <hobu.inc at gmail.com> reset the point count to 0 for each readBuffer call (11:38:38)
+	* Howard Butler <hobu.inc at gmail.com> convenience function to fetch the connection (11:38:15)
+	* Howard Butler <hobu.inc at gmail.com> move connection to the database at construction time (11:38:01)
+	* Howard Butler <hobu.inc at gmail.com> LASzip's version has increased to 1.2.0, this means updating the test file (11:37:23)
+
+2011-04-11
+	* Howard Butler <hobu.inc at gmail.com> fix up block edge accounting (16:30:25)
+	* Howard Butler <hobu.inc at gmail.com> copy/paste error (15:12:24)
+	* Howard Butler <hobu.inc at gmail.com> we need to fill in variables to compare to (15:12:06)
+	* Howard Butler <hobu.inc at gmail.com> don't set scales until initialize() (15:10:49)
+	* Howard Butler <hobu.inc at gmail.com> more useful lint :) (15:01:10)
+	* Howard Butler <hobu.inc at gmail.com> add some lint (14:57:15)
+	* Howard Butler <hobu.inc at gmail.com> set scale and offset (14:43:45)
+	* Howard Butler <hobu.inc at gmail.com> explicitly write the num points written at writeEnd (14:41:22)
+	* Howard Butler <hobu.inc at gmail.com> keep track of the number of points we've written and rewrite the header on writeEnd to put the count in (14:33:28)
+	* Howard Butler <hobu.inc at gmail.com> more case name stuff for header files (11:54:16)
+	* Howard Butler <hobu.inc at gmail.com> newline at end of file (11:53:37)
+	* Howard Butler <hobu.inc at gmail.com> more case name stuff for header files (11:52:58)
+	* Howard Butler <hobu.inc at gmail.com> libLAS' header file names are lower cased (11:51:10)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:50:44)
+	* Howard Butler <hobu.inc at gmail.com> add endian swapping for OCI.  This should be updated to just use boost's (09:50:35)
+	* Howard Butler <hobu.inc at gmail.com> ignore bin/ (08:26:25)
+	* Howard Butler <hobu.inc at gmail.com> add a WKT boundary file for LAS data (08:26:20)
+
+2011-04-10
+	* Howard Butler <hobu.inc at gmail.com> use Ivan's WriteClob function to write and bind the WKT column into the SDO_GEOMETRY constructor (21:10:59)
+	* Howard Butler <hobu.inc at gmail.com> fix off-by-one error in binding column position of writer (14:45:12)
+
+2011-04-08
+	* Howard Butler <hobu.inc at gmail.com> more tweaks of oracle configs (16:30:52)
+	* Howard Butler <hobu.inc at gmail.com> remove dead code, add bounds fetching (16:30:36)
+	* Howard Butler <hobu.inc at gmail.com> use size_type instead of size_t for vector size, add an add() method (16:14:17)
+	* Howard Butler <hobu.inc at gmail.com> only try deleting block table if it exists (15:45:52)
+	* Howard Butler <hobu.inc at gmail.com> use liblas::HeaderPtr to keep track of header information for LAS writer (14:27:32)
+	* Howard Butler <hobu.inc at gmail.com> trim dead code (08:30:05)
+
+2011-04-07
+	* Howard Butler <hobu.inc at gmail.com> support table deletion and PC object creation (15:29:00)
+	* Howard Butler <hobu.inc at gmail.com> support overwrite for OCI (15:28:20)
+	* Howard Butler <hobu.inc at gmail.com> successfully read 5-fixed-dimension OCI data for the first time (13:06:22)
+	* Howard Butler <hobu.inc at gmail.com> comment out the assertion about making sure we wrote the right number of points.  We don't know that anymore (13:04:18)
+
+2011-04-06
+	* Howard Butler <hobu.inc at gmail.com> a good stopping point (21:19:59)
+
+2011-04-05
+	* Michael P. Gerlek <mpg at flaxen.com> merge (17:10:07)
+	* Michael P. Gerlek <mpg at flaxen.com> add las reading (17:09:55)
+	* Howard Butler <hobu.inc at gmail.com> add support for fetching OCIArray* lengths (16:46:20)
+	* Michael P. Gerlek <mpg at flaxen.com> add pcview (16:28:51)
+	* Michael P. Gerlek <mpg at flaxen.com> add FreeGLUT library (16:02:08)
+	* Howard Butler <hobu.inc at gmail.com> a few debugging updates for oracle (12:00:00)
+
+2011-04-04
+	* Howard Butler <hobu.inc at gmail.com> I could swear I fixed this (15:24:32)
+	* Howard Butler <hobu.inc at gmail.com> execute needs to be inside try/except (15:17:16)
+	* Howard Butler <hobu.inc at gmail.com> SDO_GEOMETRY blk_extent fetching for readBuffer (08:04:16)
+
+2011-04-01
+	* Howard Butler <hobu.inc at gmail.com> if ::write(0) is called, we just write until the iteratore reads 0 points for us (16:02:02)
+	* Howard Butler <hobu.inc at gmail.com> no longer need to bogusly set the point count (16:01:19)
+	* Howard Butler <hobu.inc at gmail.com> move most reading functions into the IteratorBase (15:48:16)
+	* Howard Butler <hobu.inc at gmail.com> supportsIterator is a const method (15:48:01)
+	* Howard Butler <hobu.inc at gmail.com> more blob fetching for libpc::drivers::oci::Reader (13:53:59)
+	* Howard Butler <hobu.inc at gmail.com> add new ReadBlob method that can be called multiple times until the blob is entirely read (09:15:55)
+	* Howard Butler <hobu.inc at gmail.com> BLOB point selection now working (07:43:52)
+	* Howard Butler <hobu.inc at gmail.com> No longer do assert() when getDimensionIndex returns a -1. Instead, return the -1, and then have getField return a 0 if it was given a field dimension of -1 (07:43:35)
+
+2011-03-31
+	* Howard Butler <hobu.inc at gmail.com> add support for boundary insertion via CLOBs to libpc::drivers::oci::Writer (09:33:40)
+	* Howard Butler <hobu.inc at gmail.com> more libpc::drivers::oci::Reader work (07:27:43)
+
+2011-03-29
+	* Howard Butler <hobu.inc at gmail.com> more oci reader scaffolding (12:22:08)
+	* Howard Butler <hobu.inc at gmail.com> use libPC include path for oci_wrapper.h (12:21:28)
+	* Howard Butler <hobu.inc at gmail.com> update OCI wrapper to match latest in SVN (12:20:33)
+
+2011-03-28
+	* Howard Butler <hobu.inc at gmail.com> have oci::Reader iterator create a statement using the shared connection (15:09:11)
+	* Howard Butler <hobu.inc at gmail.com> oci::Reader Iterator scaffolding.  use libpc::drivers instead of libpc::driver for namespace for OCI driver like the rest (14:04:55)
+	* Howard Butler <hobu.inc at gmail.com> more oci reader scaffolding (12:57:26)
+	* Howard Butler <hobu.inc at gmail.com> move the connect code into common for both reader and writer to use (12:03:53)
+	* Howard Butler <hobu.inc at gmail.com> remove supportsITERATORTYPEIterator() methods in favor of supportsIterator(IteratorType t) (11:31:58)
+	* Howard Butler <hobu.inc at gmail.com> Make the chipper support a SequentialIterator and implement writeBuffer to use it (11:13:35)
+
+2011-03-25
+	* Michael P. Gerlek <mpg at flaxen.com> remove old (and now empty) Header class files (18:46:41)
+	* Michael P. Gerlek <mpg at flaxen.com> get rid of need for separate Header classes (yippee) (18:27:51)
+	* Michael P. Gerlek <mpg at flaxen.com> getDimensionIndex() now takes both the field name and the datatype, to reduce errors; it is defined to throw if the field is not found or if it is found but with the wrong datatype (17:12:09)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:58:05)
+	* Howard Butler <hobu.inc at gmail.com> BlockIterator scaffolding (14:56:40)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:09:34)
+	* Michael P. Gerlek <mpg at flaxen.com> fix compare_approx to work more betterer (14:09:22)
+	* Howard Butler <hobu.inc at gmail.com> move chipper down into filters and namespace appropriately (13:58:59)
+	* Howard Butler <hobu.inc at gmail.com> merge (13:36:15)
+	* Howard Butler <hobu.inc at gmail.com> move chipper down into filters namespace (13:36:06)
+	* Michael P. Gerlek <mpg at flaxen.com> fix comment (13:35:56)
+	* Michael P. Gerlek <mpg at flaxen.com> handle 64-bit errors (13:32:02)
+	* Michael P. Gerlek <mpg at flaxen.com> handle 64-bit errors (13:25:06)
+	* Michael P. Gerlek <mpg at flaxen.com> allow for 64b writes (13:10:15)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor to remove duplicated code (13:05:10)
+	* Michael P. Gerlek <mpg at flaxen.com> updated comments (13:05:00)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor to remove duplicated code (13:00:54)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:38:57)
+	* Michael P. Gerlek <mpg at flaxen.com> #1: now using consistent LIBPC_* macros, fixed some old ones (12:38:47)
+	* Howard Butler <hobu.inc at gmail.com> add bool suppo0rtsIterator(StageIteratorType t) method and remove other junk :) (12:15:16)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (11:56:02)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:53:25)
+	* Michael P. Gerlek <mpg at flaxen.com> nasty lint (11:53:16)
+	* Howard Butler <hobu.inc at gmail.com> merge (11:51:37)
+	* Howard Butler <hobu.inc at gmail.com> add generic createIterator(StageIteratorType t) method to stages (11:51:27)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (11:50:49)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:45:00)
+	* Michael P. Gerlek <mpg at flaxen.com> use perc, not eps, for FP compares (11:44:44)
+	* Michael P. Gerlek <mpg at flaxen.com> added note about FP compares (11:44:24)
+	* Howard Butler <hobu.inc at gmail.com> add getIteratorSupport method to Stage:: to make it easier to add new iterator types (11:29:51)
+	* Michael P. Gerlek <mpg at flaxen.com> a cut-and-paste error and an off-by-one error at the same time :-) (10:59:12)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL and BOOST_CHECK_CLOSE and friends from http://www.boost.org/doc/libs/1_46_0/libs/test/doc/html/utf/testing-tools/reference.html so we get better output instead of merely using BOOST_CHECK (09:55:29)
+	* Howard Butler <hobu.inc at gmail.com> include fixups related to #21 (08:07:44)
+	* Howard Butler <hobu.inc at gmail.com> merge (07:54:45)
+	* Howard Butler <hobu.inc at gmail.com> scaffolding for BlockIterator (07:54:32)
+	* Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE instead of BOOST_CHECK_CLOSE_FRACTION (07:54:19)
+
+2011-03-24
+	* Michael P. Gerlek <mpg at flaxen.com> merge (23:03:03)
+	* Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (23:02:53)
+	* Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (22:47:27)
+	* Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (19:32:09)
+	* Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (19:09:37)
+	* Howard Butler <hobu.inc at gmail.com> more test of chipper (14:26:10)
+	* Michael P. Gerlek <mpg at flaxen.com> fix test that was too subject to random data (14:12:56)
+	* Michael P. Gerlek <mpg at flaxen.com> fix off-by-one (14:12:21)
+	* Michael P. Gerlek <mpg at flaxen.com> added a Ramp mode to FauxReader (13:19:10)
+	* Michael P. Gerlek <mpg at flaxen.com> merg (12:54:51)
+	* Michael P. Gerlek <mpg at flaxen.com> provide pessimistic defaults for iter creation (12:54:33)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:39:53)
+	* Howard Butler <hobu.inc at gmail.com> start making the Chipper a filter (12:39:43)
+	* Michael P. Gerlek <mpg at flaxen.com> good 4-iter test (12:38:30)
+	* Michael P. Gerlek <mpg at flaxen.com> refactored read() into the liblasiter base (12:08:53)
+	* Michael P. Gerlek <mpg at flaxen.com> make the liblas iters have their own ::liblas::reader objects (12:04:29)
+	* Michael P. Gerlek <mpg at flaxen.com> removed commented-out code (11:12:53)
+	* Michael P. Gerlek <mpg at flaxen.com> additional test for liblas iter reset (11:03:39)
+	* Michael P. Gerlek <mpg at flaxen.com> temp hack for multi-iter support (10:48:17)
+	* Michael P. Gerlek <mpg at flaxen.com> test (10:06:11)
+
+2011-03-23
+	* Michael P. Gerlek <mpg at flaxen.com> fix stupid name and remove silly cast (21:03:35)
+	* Michael P. Gerlek <mpg at flaxen.com> added random iterators (17:43:21)
+	* Michael P. Gerlek <mpg at flaxen.com> rename Iterator -> SequentialIterator (16:59:25)
+	* Howard Butler <hobu.inc at gmail.com> completely back up the chipper in preparation for random iterators (16:37:10)
+	* Howard Butler <hobu.inc at gmail.com> have the chipper carry around its point's data and then provide a GetPointBuffer method for blocks to return it to those who need it (14:27:22)
+	* Howard Butler <hobu.inc at gmail.com> add indeterminate_count_error for situations where that's a problem (14:26:46)
+	* Howard Butler <hobu.inc at gmail.com> Give PointBuffer a ::setData method for those wishing to interact with it at the raw level (14:23:24)
+	* Michael P. Gerlek <mpg at flaxen.com> make the las readers take filenames, not istreams, for future parallel I/O (13:25:19)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (13:03:19)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (12:54:26)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (12:47:37)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (12:47:00)
+	* Michael P. Gerlek <mpg at flaxen.com> refactor cache system for const-correctness (12:30:31)
+	* Michael P. Gerlek <mpg at flaxen.com> change stupid name (11:59:16)
+	* Howard Butler <hobu.inc at gmail.com> that never would have worked (PointBuffer::operator=) (11:32:45)
+	* Howard Butler <hobu.inc at gmail.com> undo PointBuffer stuff, let's try a different way (11:29:23)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:10:46)
+	* Michael P. Gerlek <mpg at flaxen.com> iter work - hiding the point count management (11:10:20)
+	* Michael P. Gerlek <mpg at flaxen.com> rename some iter functions (10:48:01)
+	* Howard Butler <hobu.inc at gmail.com> fix up stupidity in PointBuffer assignment constructor (10:43:55)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (10:36:43)
+	* Michael P. Gerlek <mpg at flaxen.com> iter work - tests passing now (10:36:31)
+	* Howard Butler <hobu.inc at gmail.com> use copyable PointBuffer for caching points in Chipper (10:11:26)
+	* Michael P. Gerlek <mpg at flaxen.com> iter work (10:01:47)
+	* Howard Butler <hobu.inc at gmail.com> blindly cast to char* for unix putenv (09:56:21)
+
+2011-03-22
+	* Michael P. Gerlek <mpg at flaxen.com> banish vile const_cast (18:05:20)
+	* Michael P. Gerlek <mpg at flaxen.com> fix leak (17:55:30)
+	* Michael P. Gerlek <mpg at flaxen.com> fix test name (17:51:28)
+	* Michael P. Gerlek <mpg at flaxen.com> fix test name (17:46:37)
+	* Michael P. Gerlek <mpg at flaxen.com> fix leak in iterators (17:36:54)
+	* Michael P. Gerlek <mpg at flaxen.com> fix leak, fix warning (16:49:51)
+	* Howard Butler <hobu.inc at gmail.com> add a getData method that returns copied raw bytes back to the user they can own (12:58:50)
+	* Howard Butler <hobu.inc at gmail.com> file rename for PointData->PointBuffer (12:58:10)
+	* Howard Butler <hobu.inc at gmail.com> PointData now == PointBuffer (12:04:59)
+	* Howard Butler <hobu.inc at gmail.com> back PointData's m_data with a boost::scoped_array instead of a naked array of bytes so we get some exception and leak safety (11:39:21)
+	* Howard Butler <hobu.inc at gmail.com> http://stackoverflow.com/questions/656948/a-class-key-must-be-declared-when-declaring-a-friend states that we must use 'friend class className' to satisfy gcc rather than merely 'friend className'  I don't know why, and I don't have any friends (10:39:17)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (09:34:07)
+
+2011-03-21
+	* Michael P. Gerlek <mpg at flaxen.com> archived copies of sprint slides (19:53:47)
+	* Michael P. Gerlek <mpg at flaxen.com> moving to _static (19:51:01)
+	* Michael P. Gerlek <mpg at flaxen.com> obsolete (19:49:40)
+	* Michael P. Gerlek <mpg at flaxen.com> remove extra ifdefs (19:42:49)
+	* Michael P. Gerlek <mpg at flaxen.com> update for gdal, oci (19:42:33)
+
+2011-03-18
+	* Michael P. Gerlek <mpg at flaxen.com> made Stages be const wrt other stages and iterators (21:26:41)
+	* Michael P. Gerlek <mpg at flaxen.com> put the Iters into their own files (20:46:41)
+	* Michael P. Gerlek <mpg at flaxen.com> iterator work checkpoint -stage-based read methods now gone (19:54:29)
+	* Michael P. Gerlek <mpg at flaxen.com> iterator work checkpoint (18:10:08)
+	* Kirk McKelvey <kirkoman at lizardtech.com> allow pcinfo build w/out mrsid configured (11:19:49)
+	* Kirk McKelvey <kirkoman at lizardtech.com> get mrsid reader linking and reporting num points (11:03:09)
+	* Kirk McKelvey <kirkoman at lizardtech.com> teach pcinfo to open .sid files (11:00:22)
+	* Kirk McKelvey <kirkoman at lizardtech.com> not every app should claim to be pc2pc (10:59:49)
+	* Howard Butler <hobu.inc at gmail.com> fix ups to carry along raw point data with PtRef's (10:39:39)
+	* Howard Butler <hobu.inc at gmail.com> make getData public (10:39:26)
+	* Howard Butler <hobu.inc at gmail.com> copy data in assigment and copy constructors (10:39:09)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:07:37)
+	* Howard Butler <hobu.inc at gmail.com> clean up includes a bit in Chipper (09:07:26)
+	* Kirk McKelvey <kirkoman at lizardtech.com> get rid of WITH_LIBLAS-not-used message (09:06:04)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:02:12)
+	* Howard Butler <hobu.inc at gmail.com> oci::Block copy constructor should actually copy something (09:01:46)
+	* Kirk McKelvey <kirkoman at lizardtech.com> introducing build and source files for mrsid driver (driver not operational) (09:01:33)
+	* Howard Butler <hobu.inc at gmail.com> merge (08:53:33)
+	* Howard Butler <hobu.inc at gmail.com> fix up chipper::Block constructor (08:53:27)
+	* Howard Butler <hobu.inc at gmail.com> add copy and assignment constructors to PointData (08:53:06)
+	* Kirk McKelvey <kmckelvey at lizardtech.com> make FindOracle friendlier to Instant Client (08:37:07)
+
+2011-03-17
+	* Howard Butler <hobu.inc at gmail.com> merge (14:46:55)
+	* Howard Butler <hobu.inc at gmail.com> some (broken) chipper work (14:46:41)
+	* Howard Butler <hobu.inc at gmail.com> make getCapacity const (14:46:20)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:38:48)
+	* Michael P. Gerlek <mpg at flaxen.com> guards (14:38:27)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:35:05)
+	* Howard Butler <hobu.inc at gmail.com> don't include libpc_config.hpp right now (14:31:14)
+	* Howard Butler <hobu.inc at gmail.com> don't multiple include _config (14:30:39)
+	* Howard Butler <hobu.inc at gmail.com> do something if we read no points (14:30:11)
+	* Michael P. Gerlek <mpg at flaxen.com> removed bounds from read() calls (14:26:33)
+	* Michael P. Gerlek <mpg at flaxen.com> added bounds member (14:11:02)
+	* Michael P. Gerlek <mpg at flaxen.com> iter work (13:56:34)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:24:36)
+	* Michael P. Gerlek <mpg at flaxen.com> add point count type get/set (13:24:23)
+	* Kirk McKelvey <kirkoman at gmail.com> reparenting the OCI Reader (13:12:20)
+	* Michael P. Gerlek <mpg at flaxen.com> reorder files (13:04:19)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:01:41)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:00:17)
+	* Michael P. Gerlek <mpg at flaxen.com> make test dir work for win32 (12:59:57)
+	* Howard Butler <hobu.inc at gmail.com> merge (12:59:24)
+	* Howard Butler <hobu.inc at gmail.com> comment about bounds fix (12:59:09)
+	* Howard Butler <hobu.inc at gmail.com> fix up LAS readers to use capacity instead of numPoints (12:58:59)
+	* Michael P. Gerlek <mpg at flaxen.com> repair init order (12:26:18)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (12:12:51)
+	* Michael P. Gerlek <mpg at flaxen.com> removed Reader class; add some iter support code (12:12:31)
+	* Kirk McKelvey <kirkoman at gmail.com> second try at the global data path (11:38:16)
+	* Kirk McKelvey <kirkoman at gmail.com> first pieces of mrsid cmake config (10:16:35)
+	* Howard Butler <hobu.inc at gmail.com> fix ups for bounds-based reading for OCI (10:15:32)
+	* Michael P. Gerlek <mpg at flaxen.com> bad merge (10:06:31)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (10:04:38)
+	* Michael P. Gerlek <mpg at flaxen.com> bounds fix (10:03:52)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (10:03:44)
+	* Howard Butler <hobu.inc at gmail.com> keep track of point count vs capacity in CropFilter (09:57:00)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (09:52:54)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (conflicts resolved) (09:52:25)
+	* Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the mosaic and use the capacity of the PointData to inform how many points we might be reading instead of PointData::getNumPoints() (09:42:09)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (09:41:03)
+	* Michael P. Gerlek <mpg at flaxen.com> add bounds param to read() calls (09:40:49)
+	* Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the mosaic and use the capacity of the PointData to inform how many points we might be reading instead of PointData::getNumPoints() (09:29:42)
+	* Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the PointData (09:28:59)
+	* Howard Butler <hobu.inc at gmail.com> the user must always keep track of the point count when doing copyPoint(s) (09:28:33)
+	* Michael P. Gerlek <mpg at flaxen.com> add default bounds getter (09:20:03)
+	* Howard Butler <hobu.inc at gmail.com> merge (08:57:14)
+	* Howard Butler <hobu.inc at gmail.com> fix up PointDataTest in light of changes to PointData wrt capacity vs. count (08:57:04)
+	* Howard Butler <hobu.inc at gmail.com> fix up CacheFilter in light of changes to PointData wrt capacity vs. count (08:56:45)
+	* Michael P. Gerlek <mpg at flaxen.com> missing file (empty for now) (08:56:31)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (08:39:21)
+	* Michael P. Gerlek <mpg at flaxen.com> add impedance checking to colorizer filter (08:38:58)
+
+2011-03-16
+	* Pete Gadomski <pete.gadomski at gmail.com> Added rudimentary cmake-swig support for csharp and python (15:55:46)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:52:29)
+	* Howard Butler <hobu.inc at gmail.com> it's not worse than it was before -- attempting to keep track of count and capacity for PointData (15:52:21)
+	* Michael P. Gerlek <mpg at flaxen.com> updated (15:21:48)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (15:19:33)
+	* Michael P. Gerlek <mpg at flaxen.com> added libpc.hpp (15:19:23)
+	* Michael P. Gerlek <mpg at flaxen.com> offbyone error (15:19:10)
+	* Howard Butler <hobu.inc at gmail.com> fix up BOOST_TEST_MODULE for static boost::unit_test (14:44:04)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:38:38)
+	* Michael P. Gerlek <mpg at flaxen.com> build fix for win32 (14:38:27)
+	* Howard Butler <hobu.inc at gmail.com> fix namespaced liblas reader (14:37:25)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:33:44)
+	* Howard Butler <hobu.inc at gmail.com> add capacity arg to pointData (14:33:34)
+	* Kirk McKelvey <kirkoman at gmail.com> static linkage already defines main in the boost lib (14:32:54)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:31:50)
+	* Michael P. Gerlek <mpg at flaxen.com> add some more namespacing (14:31:35)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:15:10)
+	* Howard Butler <hobu.inc at gmail.com> remove IsValid et. al. from PointData (14:14:56)
+	* Kirk McKelvey <kirkoman at gmail.com> merge (14:13:18)
+	* Michael P. Gerlek <mpg at flaxen.com> turn off iters for now (13:49:38)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:48:35)
+	* Michael P. Gerlek <mpg at flaxen.com> placeholder for future work (13:48:21)
+	* Michael P. Gerlek <mpg at flaxen.com> switch to doubles (13:48:05)
+	* Kirk McKelvey <kirkoman at gmail.com> set libpc_test data directory from the command line (13:23:10)
+	* Howard Butler <hobu.inc at gmail.com> fix up float->double in FauxReader/Writer (12:11:43)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (11:49:08)
+	* Michael P. Gerlek <mpg at flaxen.com> getting ready for iterators (11:48:57)
+	* Michael P. Gerlek <mpg at flaxen.com> typo in IDE grouping (11:36:51)
+	* Howard Butler <hobu.inc at gmail.com> clean up more == comparison tests with epsilon tests (11:22:48)
+	* Howard Butler <hobu.inc at gmail.com> clean up more == comparison tests with epsilon tests (11:15:07)
+	* Howard Butler <hobu.inc at gmail.com> make Faux Writer deal in doubles, not floats, and clean up some == comparisons to use epsilon tests (10:58:15)
+	* Howard Butler <hobu.inc at gmail.com> make DescribeType take in a const char* (10:47:12)
+	* Howard Butler <hobu.inc at gmail.com> clean up comment junk (10:38:32)
+	* Howard Butler <hobu.inc at gmail.com> add file for iterators (10:37:19)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:51:26)
+	* Howard Butler <hobu.inc at gmail.com> make libpc::driver::oci::Writer derive from libpc::Writer (09:51:08)
+	* Kirk McKelvey <kirkoman at gmail.com> merge (09:50:00)
+	* Kirk McKelvey <kirkoman at gmail.com> refer to CacheFilter in its namespace (09:47:48)
+	* Pete Gadomski <pete.gadomski at gmail.com> Added conditional BOOST_TEST_DYN_LINK option for testing (09:45:51)
+	* Howard Butler <hobu.inc at gmail.com> rearrange oci driver to fit new layout (09:42:59)
+	* Kirk McKelvey <kirkoman at gmail.com> header capitalization, location (09:33:19)
+	* Howard Butler <hobu.inc at gmail.com> merge (09:21:33)
+	* Howard Butler <hobu.inc at gmail.com> more epsilon compares (09:21:28)
+	* Howard Butler <hobu.inc at gmail.com> oops, rollback that (09:16:58)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (09:06:46)
+	* Michael P. Gerlek <mpg at flaxen.com> group files for IDE explorer (09:06:33)
+	* Howard Butler <hobu.inc at gmail.com> clean up initialization order warning (09:02:17)
+	* Howard Butler <hobu.inc at gmail.com> Use epsilon compares instead of == for doubles (08:57:57)
+	* Howard Butler <hobu.inc at gmail.com> clean up initialization order warning (08:47:42)
+	* Howard Butler <hobu.inc at gmail.com> do an epsilon compare for testing doubles (08:46:11)
+	* Michael P. Gerlek <mpg at flaxen.com> fix spelling (01:35:32)
+	* Michael P. Gerlek <mpg at flaxen.com> better namespacing (01:34:47)
+
+2011-03-15
+	* Michael P. Gerlek <mpg at flaxen.com> namespace'd the filters (21:26:50)
+	* Michael P. Gerlek <mpg at flaxen.com> namespace'd the filters (20:51:33)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (20:37:30)
+	* Michael P. Gerlek <mpg at flaxen.com> fix capitalization of some file names (20:37:15)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (20:25:15)
+	* Michael P. Gerlek <mpg at flaxen.com> renamed Producer->Reader, Consumer->Writer; made Writer not be a Stage (20:25:01)
+	* Howard Butler <hobu.inc at gmail.com> add dummies so _templates and _static directories stick (15:35:16)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:33:04)
+	* Howard Butler <hobu.inc at gmail.com> add Sphinx build setup (15:32:41)
+	* Michael P. Gerlek <mpg at flaxen.com> move filters into a subdir (15:29:46)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaning include paths; build fixes (15:13:45)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaning include paths; build fixes (15:11:04)
+	* Howard Butler <hobu.inc at gmail.com> add Pete as a contributor (14:35:30)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaing include paths (14:30:13)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:02:28)
+	* Michael P. Gerlek <mpg at flaxen.com> rationalize placement of drivers, public headers (14:02:00)
+	* Howard Butler <hobu.inc at gmail.com> make libLAS 1.6.0 a required dependency for now (13:32:40)
+	* Pete Gadomski <pete.gadomski at gmail.com> Removed a stale reference to libpc.pc (13:24:49)
+	* Howard Butler <hobu.inc at gmail.com> merge (13:18:20)
+	* Howard Butler <hobu.inc at gmail.com> rename chipper.cpp to Chipper.cpp to match naming styles (13:17:45)
+	* Howard Butler <hobu.inc at gmail.com> ignore Makefiles (13:17:25)
+	* Michael P. Gerlek <mpg at flaxen.com> fix boost version; tweak mpg builds (12:44:03)
+
+2011-03-14
+	* Michael P. Gerlek <mpg at flaxen.com> merge (15:39:47)
+	* Howard Butler <hobu.inc at gmail.com> giant messy merge (14:08:54)
+	* Michael P. Gerlek <mpg at flaxen.com> start to add swig build (13:42:10)
+	* Michael P. Gerlek <mpg at flaxen.com> make less chatty; fix libpc/liblas typo (13:39:07)
+	* Michael P. Gerlek <mpg at flaxen.com> unused (13:30:00)
+	* Howard Butler <hobu.inc at gmail.com> start on libpc::driver::oci::Reader scaffolding (12:20:27)
+	* Howard Butler <hobu.inc at gmail.com> move more stuff into common spot (12:20:09)
+	* Howard Butler <hobu.inc at gmail.com> move gdal debug stuff into common.cpp (12:19:45)
+	* Howard Butler <hobu.inc at gmail.com> move more stuff into common.hpp (12:19:31)
+	* Howard Butler <hobu.inc at gmail.com> put common libpc::driver.oci stuff into a single file (12:07:20)
+	* Howard Butler <hobu.inc at gmail.com> tweak libLAS library detection to account for lib naming on win32 (11:49:36)
+
+2011-03-12
+	* Howard Butler <hobu.inc at gmail.com> basic block insertion working (09:20:52)
+	* Howard Butler <hobu.inc at gmail.com> fixups to bring things in line with mpg's latest changes (08:09:18)
+
+2011-03-11
+	* Michael P. Gerlek <mpg at flaxen.com> VS10 lint (19:18:10)
+	* Michael P. Gerlek <mpg at flaxen.com> get rid of readBegin/End; each concrete stage must manage currentPointIndex on its own now (18:23:59)
+	* Michael P. Gerlek <mpg at flaxen.com> GpsTime --> Time (17:36:08)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (17:31:26)
+	* Michael P. Gerlek <mpg at flaxen.com> add stats collection; fix small seek bug; add clear cache function; add cache size configurability (17:31:13)
+	* Howard Butler <hobu.inc at gmail.com> more OCI block construction work (17:12:01)
+	* Michael P. Gerlek <mpg at flaxen.com> throw if sad reader (16:56:11)
+	* Howard Butler <hobu.inc at gmail.com> add seekToPoint to reset reader (15:10:46)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:10:33)
+	* Michael P. Gerlek <mpg at flaxen.com> bringing lru cache online (14:10:23)
+	* Howard Butler <hobu.inc at gmail.com> tweak #ifdefs (13:27:39)
+	* Michael P. Gerlek <mpg at flaxen.com> rename lru cache (11:29:21)
+	* Michael P. Gerlek <mpg at flaxen.com> mild and likely inconsequential bug fix (11:23:19)
+	* Michael P. Gerlek <mpg at flaxen.com> non-ORA build fix (11:21:59)
+
+2011-03-10
+	* Howard Butler <hobu.inc at gmail.com> #ifdef Oracle out of the way (21:20:01)
+	* Michael P. Gerlek <mpg at flaxen.com> converted lru cache to a PointData cache, with the needed semantics (20:17:28)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (19:42:55)
+	* Michael P. Gerlek <mpg at flaxen.com> lru cache testing (19:42:39)
+	* Michael P. Gerlek <mpg at flaxen.com> added LRU cache (18:09:32)
+	* Howard Butler <hobu.inc at gmail.com> fix up GDAL CPL_DEBUG output so it at least works (leaks a putenv string right now).  start on an oci example (17:04:03)
+	* Michael P. Gerlek <mpg at flaxen.com> minimally turn on pcinfo (16:56:29)
+	* Michael P. Gerlek <mpg at flaxen.com> add support for positional opts (16:55:59)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (16:24:29)
+	* Michael P. Gerlek <mpg at flaxen.com> lint; mild bug fix (16:20:43)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:00:10)
+	* Michael P. Gerlek <mpg at flaxen.com> docs and notes for sprint (12:59:54)
+	* Michael P. Gerlek <mpg at flaxen.com> added dump() (12:38:40)
+	* Michael P. Gerlek <mpg at flaxen.com> notes for/during the montreal sprint (12:25:48)
+	* Michael P. Gerlek <mpg at flaxen.com> should be private (12:13:25)
+
+2011-03-09
+	* Michael P. Gerlek <mpg at flaxen.com> updated (18:40:01)
+	* Howard Butler <hobu.inc at gmail.com> add method for creating spatial index table entry (14:04:43)
+	* Howard Butler <hobu.inc at gmail.com> rework insertion of point cloud entry (13:24:26)
+	* Howard Butler <hobu.inc at gmail.com> a big wad of Oracle writer (08:21:32)
+
+2011-03-08
+	* Michael P. Gerlek <mpg at flaxen.com> viewer work (18:05:29)
+	* Michael P. Gerlek <mpg at flaxen.com> added cheesy decimation filter (18:04:11)
+
+2011-03-07
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint (22:52:36)
+	* Michael P. Gerlek <mpg at flaxen.com> sync w/ Reader->Producer change (18:31:08)
+	* Michael P. Gerlek <mpg at flaxen.com> minor cleanups and docs (18:03:52)
+	* Michael P. Gerlek <mpg at flaxen.com> very simple cache filter (16:44:33)
+	* Howard Butler <hobu.inc at gmail.com> rename libpc::Reader to libpc::Producer (14:37:14)
+	* Howard Butler <hobu.inc at gmail.com> rename libpc::Writer to libpc::Consumer (14:07:33)
+	* Howard Butler <hobu.inc at gmail.com> fix up missing invocation (14:03:34)
+	* Howard Butler <hobu.inc at gmail.com> more OCI writer scaffolding (13:46:28)
+
+2011-03-04
+	* Michael P. Gerlek <mpg at flaxen.com> pcview work (16:47:27)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:39:35)
+	* Michael P. Gerlek <mpg at flaxen.com> I can read a point in C# now (14:39:21)
+	* Michael P. Gerlek <mpg at flaxen.com> more incremental swig work (14:13:29)
+	* Michael P. Gerlek <mpg at flaxen.com> fix typedef (14:12:57)
+	* Michael P. Gerlek <mpg at flaxen.com> added set() for oper[] (13:39:06)
+	* Michael P. Gerlek <mpg at flaxen.com> incremental swig work (13:18:25)
+	* Howard Butler <hobu.inc at gmail.com> get chipper working.  bolt on some testing (12:27:30)
+
+2011-03-03
+	* Michael P. Gerlek <mpg at flaxen.com> swig work (19:39:35)
+	* Michael P. Gerlek <mpg at flaxen.com> don't expose liblas headers\! (19:03:54)
+	* Michael P. Gerlek <mpg at flaxen.com> fixed bad types (18:46:50)
+	* Michael P. Gerlek <mpg at flaxen.com> improved virtual functions in Stage classes; implemented MosaicFilter (18:44:46)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:16:04)
+	* Michael P. Gerlek <mpg at flaxen.com> fix argument order (14:15:52)
+	* Howard Butler <hobu.inc at gmail.com> merge (14:10:50)
+	* Howard Butler <hobu.inc at gmail.com> add the chipper (14:10:39)
+	* Michael P. Gerlek <mpg at flaxen.com> start of pcview (12:09:26)
+	* Michael P. Gerlek <mpg at flaxen.com> get swig building (11:58:37)
+	* Michael P. Gerlek <mpg at flaxen.com> get swig building (11:55:47)
+
+2011-03-02
+	* Michael P. Gerlek <mpg at flaxen.com> missing files (22:47:18)
+	* Michael P. Gerlek <mpg at flaxen.com> start at bindings (22:43:42)
+	* Howard Butler <hobu.inc at gmail.com> more OCI scaffolding (12:56:55)
+	* Howard Butler <hobu.inc at gmail.com> using often blows my foot off. (10:58:47)
+	* Howard Butler <hobu.inc at gmail.com> simplify allValid to hop out of testing once we hit a false one.  Clean up initialization of m_numPoints so it is only set once on construction (10:49:11)
+	* Howard Butler <hobu.inc at gmail.com> std::vector<bool> doesn't work on a lot of compilers.  Use std::vector<uint8_t>::size_type for vector indicies instead of size_t.  Provide an allValid method to shortcut testing each item in the validity mask individually. (10:39:52)
+
+2011-03-01
+	* Michael P. Gerlek <mpg at flaxen.com> added -native (18:21:54)
+	* Michael P. Gerlek <mpg at flaxen.com> more coding (18:10:45)
+	* Michael P. Gerlek <mpg at flaxen.com> better point format control (17:33:58)
+	* Michael P. Gerlek <mpg at flaxen.com> bump up blocking factor, again (17:33:31)
+	* Michael P. Gerlek <mpg at flaxen.com> explicitly inline these dudes (17:33:05)
+	* Michael P. Gerlek <mpg at flaxen.com> wrap user function in try/catch (17:32:03)
+	* Michael P. Gerlek <mpg at flaxen.com> set output point format to same as input (17:31:48)
+	* Michael P. Gerlek <mpg at flaxen.com> move *Layout classes into separate files (15:51:51)
+	* Michael P. Gerlek <mpg at flaxen.com> add Stage::getName() (15:40:24)
+	* Michael P. Gerlek <mpg at flaxen.com> reset default size (15:40:08)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:08:17)
+	* Howard Butler <hobu.inc at gmail.com> clean up test target invocation (15:08:10)
+	* Michael P. Gerlek <mpg at flaxen.com> was using wrong filesize (14:52:38)
+	* Michael P. Gerlek <mpg at flaxen.com> tidying up (14:52:18)
+	* Michael P. Gerlek <mpg at flaxen.com> fix test name (13:37:19)
+	* Michael P. Gerlek <mpg at flaxen.com> remove nonsense (13:36:02)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (13:10:07)
+	* Michael P. Gerlek <mpg at flaxen.com> fixes to getDimension APIs; trying to get liblaswriter to work (13:09:53)
+	* Howard Butler <hobu.inc at gmail.com> plumbing for OCI driver (12:29:56)
+	* Michael P. Gerlek <mpg at flaxen.com> 32-bit compilation lint (11:27:22)
+	* Michael P. Gerlek <mpg at flaxen.com> 32-bit compilation lint (11:21:30)
+	* Howard Butler <hobu.inc at gmail.com> handle liblas::ePointFormatUnknown (08:57:41)
+	* Howard Butler <hobu.inc at gmail.com> you can't forward declare enums (08:57:29)
+
+2011-02-28
+	* Michael P. Gerlek <mpg at flaxen.com> adding -i, -o (19:28:52)
+	* Michael P. Gerlek <mpg at flaxen.com> typos (19:28:30)
+	* Michael P. Gerlek <mpg at flaxen.com> increase block size for actual runs (19:27:32)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (19:27:06)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (19:26:48)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (19:26:07)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (19:25:52)
+	* Michael P. Gerlek <mpg at flaxen.com> w00t: .laz support (18:21:04)
+	* Michael P. Gerlek <mpg at flaxen.com> improve liblaswriter (18:15:15)
+	* Michael P. Gerlek <mpg at flaxen.com> updated liblas ref file (17:34:21)
+	* Michael P. Gerlek <mpg at flaxen.com> moved note on custom fields NYI (17:34:03)
+	* Michael P. Gerlek <mpg at flaxen.com> turned on liblas writer for point types (17:32:03)
+	* Michael P. Gerlek <mpg at flaxen.com> added addDims() (17:31:29)
+	* Michael P. Gerlek <mpg at flaxen.com> note custom fields NYI (17:30:53)
+	* Michael P. Gerlek <mpg at flaxen.com> started ability to use custom fields (17:28:52)
+	* Michael P. Gerlek <mpg at flaxen.com> liblas reader now accepting all point types (16:22:15)
+	* Michael P. Gerlek <mpg at flaxen.com> missed fix to signaller test (11:31:08)
+	* Michael P. Gerlek <mpg at flaxen.com> make it compile, for now (11:29:10)
+
+2011-02-26
+	* Michael P. Gerlek <mpg at flaxen.com> merge (20:40:20)
+	* Michael P. Gerlek <mpg at flaxen.com> added -timer (20:30:26)
+	* Michael P. Gerlek <mpg at flaxen.com> unit test for progress meter (20:14:43)
+	* Michael P. Gerlek <mpg at flaxen.com> use fixed date (20:08:04)
+	* Michael P. Gerlek <mpg at flaxen.com> tidy up Application class usage (19:45:08)
+
+2011-02-25
+	* Michael P. Gerlek <mpg at flaxen.com> cmd line app harness (19:53:33)
+	* Michael P. Gerlek <mpg at flaxen.com> move boost test DYN_LINK into cmake (15:37:04)
+	* Howard Butler <hobu.inc at gmail.com> merge (15:13:52)
+	* Howard Butler <hobu.inc at gmail.com> start re-organizing things into separate driver directories (15:07:13)
+	* Michael P. Gerlek <mpg at flaxen.com> fix file path (15:04:51)
+	* Michael P. Gerlek <mpg at flaxen.com> fix dyn linkage (15:04:42)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (15:02:20)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (14:59:12)
+	* Michael P. Gerlek <mpg at flaxen.com> liblas writer working; added file comparator, support functions (14:58:56)
+	* Howard Butler <hobu.inc at gmail.com> get tests building and working on osx with 'make test' target (14:05:33)
+	* Michael P. Gerlek <mpg at flaxen.com> liblas reader ocming online; fixed bad by-ref param (13:30:11)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:28:56)
+
+2011-02-24
+	* Michael P. Gerlek <mpg at flaxen.com> get liblas linking in correctly (14:08:59)
+	* Michael P. Gerlek <mpg at flaxen.com> boy did that cause problems (13:35:16)
+	* Michael P. Gerlek <mpg at flaxen.com> improved version tests (12:58:48)
+	* Michael P. Gerlek <mpg at flaxen.com> stubbing in liblas support (12:55:38)
+	* Michael P. Gerlek <mpg at flaxen.com> added libLAS support, added some config tests (12:54:21)
+	* Michael P. Gerlek <mpg at flaxen.com> outdated, already moved (12:50:54)
+	* Michael P. Gerlek <mpg at flaxen.com> major cut/paste error (11:07:46)
+
+2011-02-23
+	* Howard Butler <hobu.inc at gmail.com> fix ups to compile on gcc -- we don't link yet though (21:17:51)
+	* Howard Butler <hobu.inc at gmail.com> gcc complains about these, and I don't get what was going on here.  copy/paste error? (21:16:36)
+	* Michael P. Gerlek <mpg at flaxen.com> add Crop filter test (20:18:58)
+	* Michael P. Gerlek <mpg at flaxen.com> revise error tolerance (20:18:28)
+	* Michael P. Gerlek <mpg at flaxen.com> comment (20:18:02)
+	* Michael P. Gerlek <mpg at flaxen.com> add Faux read/write tests (20:00:03)
+	* Michael P. Gerlek <mpg at flaxen.com> add FP compare support (19:59:11)
+	* Michael P. Gerlek <mpg at flaxen.com> start of reader/writer stage tests (19:22:36)
+	* Michael P. Gerlek <mpg at flaxen.com> clean up reader/writer classes (19:16:53)
+	* Michael P. Gerlek <mpg at flaxen.com> use constant-time field indexing (17:06:04)
+	* Michael P. Gerlek <mpg at flaxen.com> init properly (13:44:54)
+	* Michael P. Gerlek <mpg at flaxen.com> catch missing file (13:44:40)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (13:32:05)
+	* Michael P. Gerlek <mpg at flaxen.com> more unit tests (10:39:29)
+
+2011-02-22
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint (15:49:03)
+	* Michael P. Gerlek <mpg at flaxen.com> bunch of unit test work (12:38:12)
+
+2011-02-21
+	* Michael P. Gerlek <mpg at flaxen.com> why? (10:59:21)
+	* Michael P. Gerlek <mpg at flaxen.com> added some unit tests (10:58:49)
+
+2011-02-18
+	* Michael P. Gerlek <mpg at flaxen.com> cmake work (13:54:21)
+
+2011-02-17
+	* Michael P. Gerlek <mpg at flaxen.com> unit test work (14:35:44)
+	* Michael P. Gerlek <mpg at flaxen.com> stub for using boost unit tests (14:00:55)
+	* Michael P. Gerlek <mpg at flaxen.com> fix bad cast (#213 from liblas) (12:23:40)
+	* Michael P. Gerlek <mpg at flaxen.com> first las output achieved (11:22:01)
+
+2011-02-16
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - las writing (16:22:44)
+	* Michael P. Gerlek <mpg at flaxen.com> debugging (15:38:24)
+	* Michael P. Gerlek <mpg at flaxen.com> boost I/O fix (15:38:01)
+
+2011-02-15
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - las read/write (19:25:48)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - working on las reading (15:54:49)
+	* Michael P. Gerlek <mpg at flaxen.com> tweaks (14:16:37)
+	* Michael P. Gerlek <mpg at flaxen.com> las header reader coming online (13:58:18)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint: renamed Layout to Schema, adding las header reading ability (12:30:59)
+
+2011-02-14
+	* Michael P. Gerlek <mpg at flaxen.com> added SpatialReference, Metadata; split out LasSchema (23:14:06)
+	* Michael P. Gerlek <mpg at flaxen.com> added Vector, to back up Range and Bounds (20:25:48)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - schema work (19:33:43)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint - Schema work (16:57:34)
+	* Michael P. Gerlek <mpg at flaxen.com> uml project (10:42:55)
+	* Michael P. Gerlek <mpg at flaxen.com> stub in progress/interrupt callback (10:41:08)
+
+2011-02-12
+	* Michael P. Gerlek <mpg at flaxen.com> fix size_t (16:42:10)
+	* Michael P. Gerlek <mpg at flaxen.com> convert to std::size_t and friends (15:21:13)
+	* Michael P. Gerlek <mpg at flaxen.com> more updates (14:01:09)
+	* Michael P. Gerlek <mpg at flaxen.com> misc updates (11:11:48)
+
+2011-02-11
+	* Michael P. Gerlek <mpg at flaxen.com> quick hack until cmake can do it for us (22:44:52)
+	* Michael P. Gerlek <mpg at flaxen.com> lint (16:33:25)
+	* Michael P. Gerlek <mpg at flaxen.com> moved color ramp function (16:18:19)
+	* Michael P. Gerlek <mpg at flaxen.com> byte -> boost::uint8_t (16:18:05)
+	* Michael P. Gerlek <mpg at flaxen.com> moved in some utility funcs (16:00:41)
+	* Michael P. Gerlek <mpg at flaxen.com> added Color (from liblas) (15:45:24)
+	* Michael P. Gerlek <mpg at flaxen.com> added Schema (from liblas) (15:35:19)
+	* Michael P. Gerlek <mpg at flaxen.com> move << to .cpp (14:20:09)
+	* Michael P. Gerlek <mpg at flaxen.com> "using namspace libpc;"  ->  "namespace libpc {..." (14:11:37)
+	* Michael P. Gerlek <mpg at flaxen.com> added Dimension (from liblas) (13:51:31)
+	* Michael P. Gerlek <mpg at flaxen.com> added exceptions and versioning support (12:13:52)
+	* Michael P. Gerlek <mpg at flaxen.com> cleaned up source conventions (11:22:07)
+	* Michael P. Gerlek <mpg at flaxen.com> applied astyle everywhere (mostly to fix indents) (10:28:32)
+	* Michael P. Gerlek <mpg at flaxen.com> initial guess (10:28:07)
+	* Howard Butler <hobu.inc at gmail.com> namespace closing }'s should not have ;'s after them (08:35:14)
+	* Howard Butler <hobu.inc at gmail.com> don't replace header for liblas::Bounds (08:26:47)
+
+2011-02-10
+	* Michael P. Gerlek <mpg at flaxen.com> building with liblas' Bounds class now (23:46:18)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (22:53:09)
+	* Michael P. Gerlek <mpg at flaxen.com> namespacing, adding Bounds class (22:47:31)
+
+2011-02-09
+	* Michael P. Gerlek <mpg at flaxen.com> cmake builds now working (22:38:20)
+	* Michael P. Gerlek <mpg at flaxen.com> comment everything out for now (22:14:32)
+	* Michael P. Gerlek <mpg at flaxen.com> unix name fix (22:14:17)
+	* Michael P. Gerlek <mpg at flaxen.com> starting to turn on cmake builds (22:07:18)
+	* Michael P. Gerlek <mpg at flaxen.com> obsolete (21:49:50)
+	* Michael P. Gerlek <mpg at flaxen.com> copied from liblas (21:08:06)
+	* Michael P. Gerlek <mpg at flaxen.com> copied from liblas (14:33:36)
+	* Michael P. Gerlek <mpg at flaxen.com> copy of cmake files from liblas (14:25:21)
+	* Michael P. Gerlek <mpg at flaxen.com> removed (14:25:04)
+	* Michael P. Gerlek <mpg at flaxen.com> 0.1 (14:18:11)
+	* Michael P. Gerlek <mpg at flaxen.com> credits (14:16:44)
+
+2011-02-08
+	* Michael P. Gerlek <mpg at flaxen.com> remove unused index (18:31:41)
+	* Michael P. Gerlek <mpg at flaxen.com> removed isActive (I feel better now) (16:51:21)
+	* Michael P. Gerlek <mpg at flaxen.com> moved isActive into the Field, but it is still isn't a clean concept; checkpoint here, before removing it (16:48:46)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanup work on isActive notion (15:08:59)
+	* Michael P. Gerlek <mpg at flaxen.com> cleanups (14:51:09)
+	* Michael P. Gerlek <mpg at flaxen.com> remove evil initialize() protocols (14:19:18)
+	* Michael P. Gerlek <mpg at flaxen.com> mosaicker basically working (13:03:16)
+	* Michael P. Gerlek <mpg at flaxen.com> working end-to-end now (11:11:46)
+
+2011-02-07
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint (still need to set isActive) (20:39:05)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint (15:53:54)
+	* Michael P. Gerlek <mpg at flaxen.com> checkpoint (13:32:25)
+
+2011-02-05
+	* Michael P. Gerlek <mpg at flaxen.com> fix for Hobu :-) (17:54:32)
+
+2011-02-04
+	* Michael P. Gerlek <mpg at flaxen.com> updated copyright (20:11:50)
+	* Michael P. Gerlek <mpg at flaxen.com> merge (18:08:40)
+	* Michael P. Gerlek <mpg at flaxen.com> start of prototype API (18:08:23)
+	* Howard Butler <hobu.inc at gmail.com> attempt to answer some questions and fill in more stuff (11:01:53)
+
+2011-02-03
+	* Michael P. Gerlek <mpg at flaxen.com> rst fix (17:37:07)
+	* Michael P. Gerlek <mpg at flaxen.com> first post! (17:06:15)
+
diff --git a/apps/pdal-config b/apps/pdal-config
index 4876801..b3a8d0c 100644
--- a/apps/pdal-config
+++ b/apps/pdal-config
@@ -58,7 +58,7 @@ case $1 in
     ;;
 
   --version)
-    echo 1.0.1
+    echo 1.1.0
     ;;
 
   *)
diff --git a/cmake/geowave.cmake b/cmake/geowave.cmake
index a9cec72..1b69798 100644
--- a/cmake/geowave.cmake
+++ b/cmake/geowave.cmake
@@ -5,9 +5,9 @@
 # GeoWave support - optional, default=OFF
 option(BUILD_PLUGIN_GEOWAVE "Choose if GeoWave support should be built" FALSE)
 if(BUILD_PLUGIN_GEOWAVE)
-    find_package(GeoWave 0.8.3)
+    find_package(GeoWave)
     if(GEOWAVE_FOUND)    
-        mark_as_advanced(CLEAR GeoWave_RUNTIME_JAR)
+        mark_as_advanced(CLEAR GEOWAVE_RUNTIME_JAR)
         add_definitions(-DGEOWAVE_RUNTIME_JAR=${GEOWAVE_RUNTIME_JAR})
         set(PDAL_HAVE_GEOWAVE 1)
     else()
diff --git a/cmake/jace.cmake b/cmake/jace.cmake
index 62ed14f..390d94f 100644
--- a/cmake/jace.cmake
+++ b/cmake/jace.cmake
@@ -10,12 +10,10 @@ if(BUILD_PLUGIN_GEOWAVE)
         include_directories(${JACE_INCLUDE_DIR})
         mark_as_advanced(CLEAR JACE_INCLUDE_DIR)
         mark_as_advanced(CLEAR JACE_LIBRARY)
-        mark_as_advanced(CLEAR JACE_RUNTIME_JAR)
-        add_definitions(-DJACE_RUNTIME_JAR=${JACE_RUNTIME_JAR})
         set(PDAL_HAVE_JACE 1)
     else()
+        set(JACE_INCLUDE_DIR "")
         set(JACE_LIBRARY "")
-        set(JACE_RUNTIME "")
         set(BUILD_PLUGIN_GEOWAVE FALSE)
     endif()
 endif()
diff --git a/cmake/jni.cmake b/cmake/jni.cmake
index f3a89aa..37e7ded 100644
--- a/cmake/jni.cmake
+++ b/cmake/jni.cmake
@@ -6,14 +6,17 @@
 if(BUILD_PLUGIN_GEOWAVE)
     find_package(JNI)
     if(JNI_FOUND) 
-        set(CMAKE_REQUIRED_LIBRARIES "${JNI_LIBRARIES}")
-        include_directories(${JNI_INCLUDE_DIRS})
-        mark_as_advanced(CLEAR JNI_INCLUDE_DIRS)
-        mark_as_advanced(CLEAR JNI_LIBRARIES)
-        add_definitions(-DJAVA_EXECUTABLE_PATH=${Java_JAVA_EXECUTABLE})
+        set(CMAKE_REQUIRED_LIBRARIES "${JAVA_JVM_LIBRARY}")
+        include_directories(${JAVA_INCLUDE_PATH})
+        include_directories(${JAVA_INCLUDE_PATH2})
+        mark_as_advanced(CLEAR JAVA_INCLUDE_PATH)
+        mark_as_advanced(CLEAR JAVA_INCLUDE_PATH2)
+        mark_as_advanced(CLEAR JAVA_JVM_LIBRARY)
         set(PDAL_HAVE_JNI 1)
     else()
-        set(JNI_LIBRARIES "")
+        set(JAVA_INCLUDE_PATH "")
+        set(JAVA_INCLUDE_PATH2 "")
+        set(JAVA_JVM_LIBRARY "")
         set(BUILD_PLUGIN_GEOWAVE FALSE)
     endif()
 endif()
diff --git a/cmake/modules/FindGeoWave.cmake b/cmake/modules/FindGeoWave.cmake
index 7440eef..06231f8 100644
--- a/cmake/modules/FindGeoWave.cmake
+++ b/cmake/modules/FindGeoWave.cmake
@@ -15,7 +15,7 @@ IF(GEOWAVE_RUNTIME_JAR)
 ENDIF()
 
 FIND_FILE(GEOWAVE_RUNTIME_JAR
-  geowave-deploy-${GeoWave_FIND_VERSION}-accumulo-singlejar.jar
+  geowave-jace.jar
   PATHS
   /usr/bin
   /usr/local
diff --git a/cmake/modules/FindJace.cmake b/cmake/modules/FindJace.cmake
index a413db2..122b66a 100644
--- a/cmake/modules/FindJace.cmake
+++ b/cmake/modules/FindJace.cmake
@@ -24,23 +24,14 @@ FIND_PATH(JACE_INCLUDE_DIR
   /usr/local
   /usr/local/include)
 
-SET(JACE_NAMES libjace.so jace.lib)
-
 FIND_LIBRARY(JACE_LIBRARY
-  NAMES ${JACE_NAMES}
+  NAMES jace
   PATHS
   /usr/lib
   /usr/local
   /usr/local/lib)
 
-FIND_FILE(JACE_RUNTIME_JAR
-  jace-runtime.jar
-  PATHS
-  /usr/bin
-  /usr/local
-  /usr/local/bin)
-
 # Handle the QUIETLY and REQUIRED arguments and set JACE_FOUND to TRUE
 # if all listed variables are TRUE
 INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(Jace DEFAULT_MSG JACE_RUNTIME_JAR JACE_LIBRARY JACE_INCLUDE_DIR)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Jace DEFAULT_MSG JACE_LIBRARY JACE_INCLUDE_DIR)
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
new file mode 100644
index 0000000..13b0ad1
--- /dev/null
+++ b/doc/_templates/layout.html
@@ -0,0 +1,20 @@
+{# Import the theme's layout. #}
+{% extends "!layout.html" %}
+
+{# Add some extra stuff before and use existing with 'super()' call. #}
+
+{%- block footer %}
+    <div class="footer">
+        <div class="container">
+                    ©  {{ copyright }}
+                        <a href="http://github.com/hobu">Howard Butler</a>,
+                        <a href="http://github.com/mpgerlek">Michael Gerlek</a>,
+                        and
+                        <a href="https://github.com/PDAL/PDAL/graphs/contributors">others</a>,
+            {%- if last_updated %}
+                {% trans last_updated=last_updated|e %}Last updated
+                    on {{ last_updated }}.{% endtrans %}
+            {%- endif %}
+        </div>
+    </div>
+{%- endblock %}
diff --git a/doc/_themes/bootstrap/bootstrap.js b/doc/_themes/bootstrap/bootstrap.js
deleted file mode 100755
index 39ad031..0000000
--- a/doc/_themes/bootstrap/bootstrap.js
+++ /dev/null
@@ -1,2038 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  $(function () {
-
-    "use strict"; // jshint ;_;
-
-
-    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
-     * ======================================================= */
-
-    $.support.transition = (function () {
-
-      var transitionEnd = (function () {
-
-        var el = document.createElement('bootstrap')
-          , transEndEventNames = {
-               'WebkitTransition' : 'webkitTransitionEnd'
-            ,  'MozTransition'    : 'transitionend'
-            ,  'OTransition'      : 'oTransitionEnd otransitionend'
-            ,  'transition'       : 'transitionend'
-            }
-          , name
-
-        for (name in transEndEventNames){
-          if (el.style[name] !== undefined) {
-            return transEndEventNames[name]
-          }
-        }
-
-      }())
-
-      return transitionEnd && {
-        end: transitionEnd
-      }
-
-    })()
-
-  })
-
-}(window.jQuery);
-/* =========================================================
- * bootstrap-modal.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* MODAL CLASS DEFINITION
-  * ====================== */
-
-  var Modal = function (element, options) {
-    this.options = options
-    this.$element = $(element)
-      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
-    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
-  }
-
-  Modal.prototype = {
-
-      constructor: Modal
-
-    , toggle: function () {
-        return this[!this.isShown ? 'show' : 'hide']()
-      }
-
-    , show: function () {
-        var that = this
-          , e = $.Event('show')
-
-        this.$element.trigger(e)
-
-        if (this.isShown || e.isDefaultPrevented()) return
-
-        $('body').addClass('modal-open')
-
-        this.isShown = true
-
-        this.escape()
-
-        this.backdrop(function () {
-          var transition = $.support.transition && that.$element.hasClass('fade')
-
-          if (!that.$element.parent().length) {
-            that.$element.appendTo(document.body) //don't move modals dom position
-          }
-
-          that.$element
-            .show()
-
-          if (transition) {
-            that.$element[0].offsetWidth // force reflow
-          }
-
-          that.$element
-            .addClass('in')
-            .attr('aria-hidden', false)
-            .focus()
-
-          that.enforceFocus()
-
-          transition ?
-            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
-            that.$element.trigger('shown')
-
-        })
-      }
-
-    , hide: function (e) {
-        e && e.preventDefault()
-
-        var that = this
-
-        e = $.Event('hide')
-
-        this.$element.trigger(e)
-
-        if (!this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = false
-
-        $('body').removeClass('modal-open')
-
-        this.escape()
-
-        $(document).off('focusin.modal')
-
-        this.$element
-          .removeClass('in')
-          .attr('aria-hidden', true)
-
-        $.support.transition && this.$element.hasClass('fade') ?
-          this.hideWithTransition() :
-          this.hideModal()
-      }
-
-    , enforceFocus: function () {
-        var that = this
-        $(document).on('focusin.modal', function (e) {
-          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
-            that.$element.focus()
-          }
-        })
-      }
-
-    , escape: function () {
-        var that = this
-        if (this.isShown && this.options.keyboard) {
-          this.$element.on('keyup.dismiss.modal', function ( e ) {
-            e.which == 27 && that.hide()
-          })
-        } else if (!this.isShown) {
-          this.$element.off('keyup.dismiss.modal')
-        }
-      }
-
-    , hideWithTransition: function () {
-        var that = this
-          , timeout = setTimeout(function () {
-              that.$element.off($.support.transition.end)
-              that.hideModal()
-            }, 500)
-
-        this.$element.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          that.hideModal()
-        })
-      }
-
-    , hideModal: function (that) {
-        this.$element
-          .hide()
-          .trigger('hidden')
-
-        this.backdrop()
-      }
-
-    , removeBackdrop: function () {
-        this.$backdrop.remove()
-        this.$backdrop = null
-      }
-
-    , backdrop: function (callback) {
-        var that = this
-          , animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-        if (this.isShown && this.options.backdrop) {
-          var doAnimate = $.support.transition && animate
-
-          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-            .appendTo(document.body)
-
-          if (this.options.backdrop != 'static') {
-            this.$backdrop.click($.proxy(this.hide, this))
-          }
-
-          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-          this.$backdrop.addClass('in')
-
-          doAnimate ?
-            this.$backdrop.one($.support.transition.end, callback) :
-            callback()
-
-        } else if (!this.isShown && this.$backdrop) {
-          this.$backdrop.removeClass('in')
-
-          $.support.transition && this.$element.hasClass('fade')?
-            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
-            this.removeBackdrop()
-
-        } else if (callback) {
-          callback()
-        }
-      }
-  }
-
-
- /* MODAL PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.modal = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('modal')
-        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option]()
-      else if (options.show) data.show()
-    })
-  }
-
-  $.fn.modal.defaults = {
-      backdrop: true
-    , keyboard: true
-    , show: true
-  }
-
-  $.fn.modal.Constructor = Modal
-
-
- /* MODAL DATA-API
-  * ============== */
-
-  $(function () {
-    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
-      var $this = $(this)
-        , href = $this.attr('href')
-        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
-        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
-      e.preventDefault()
-
-      $target
-        .modal(option)
-        .one('hide', function () {
-          $this.focus()
-        })
-    })
-  })
-
-}(window.jQuery);
-/* ============================================================
- * bootstrap-dropdown.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* DROPDOWN CLASS DEFINITION
-  * ========================= */
-
-  var toggle = '[data-toggle=dropdown]'
-    , Dropdown = function (element) {
-        var $el = $(element).on('click.dropdown.data-api', this.toggle)
-        $('html').on('click.dropdown.data-api', function () {
-          $el.parent().removeClass('open')
-        })
-      }
-
-  Dropdown.prototype = {
-
-    constructor: Dropdown
-
-  , toggle: function (e) {
-      var $this = $(this)
-        , $parent
-        , isActive
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      clearMenus()
-
-      if (!isActive) {
-        $parent.toggleClass('open')
-        $this.focus()
-      }
-
-      return false
-    }
-
-  , keydown: function (e) {
-      var $this
-        , $items
-        , $active
-        , $parent
-        , isActive
-        , index
-
-      if (!/(38|40|27)/.test(e.keyCode)) return
-
-      $this = $(this)
-
-      e.preventDefault()
-      e.stopPropagation()
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
-
-      $items = $('[role=menu] li:not(.divider) a', $parent)
-
-      if (!$items.length) return
-
-      index = $items.index($items.filter(':focus'))
-
-      if (e.keyCode == 38 && index > 0) index--                                        // up
-      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
-      if (!~index) index = 0
-
-      $items
-        .eq(index)
-        .focus()
-    }
-
-  }
-
-  function clearMenus() {
-    getParent($(toggle))
-      .removeClass('open')
-  }
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = $(selector)
-    $parent.length || ($parent = $this.parent())
-
-    return $parent
-  }
-
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  $.fn.dropdown = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('dropdown')
-      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  $(function () {
-    $('html')
-      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
-    $('body')
-      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })
-      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
-      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
-  })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-scrollspy.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* SCROLLSPY CLASS DEFINITION
-  * ========================== */
-
-  function ScrollSpy(element, options) {
-    var process = $.proxy(this.process, this)
-      , $element = $(element).is('body') ? $(window) : $(element)
-      , href
-    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
-    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
-    this.selector = (this.options.target
-      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      || '') + ' .nav li > a'
-    this.$body = $('body')
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.prototype = {
-
-      constructor: ScrollSpy
-
-    , refresh: function () {
-        var self = this
-          , $targets
-
-        this.offsets = $([])
-        this.targets = $([])
-
-        $targets = this.$body
-          .find(this.selector)
-          .map(function () {
-            var $el = $(this)
-              , href = $el.data('target') || $el.attr('href')
-              , $href = /^#\w/.test(href) && $(href)
-            return ( $href
-              && $href.length
-              && [[ $href.position().top, href ]] ) || null
-          })
-          .sort(function (a, b) { return a[0] - b[0] })
-          .each(function () {
-            self.offsets.push(this[0])
-            self.targets.push(this[1])
-          })
-      }
-
-    , process: function () {
-        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
-          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
-          , maxScroll = scrollHeight - this.$scrollElement.height()
-          , offsets = this.offsets
-          , targets = this.targets
-          , activeTarget = this.activeTarget
-          , i
-
-        if (scrollTop >= maxScroll) {
-          return activeTarget != (i = targets.last()[0])
-            && this.activate ( i )
-        }
-
-        for (i = offsets.length; i--;) {
-          activeTarget != targets[i]
-            && scrollTop >= offsets[i]
-            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-            && this.activate( targets[i] )
-        }
-      }
-
-    , activate: function (target) {
-        var active
-          , selector
-
-        this.activeTarget = target
-
-        $(this.selector)
-          .parent('.active')
-          .removeClass('active')
-
-        selector = this.selector
-          + '[data-target="' + target + '"],'
-          + this.selector + '[href="' + target + '"]'
-
-        active = $(selector)
-          .parent('li')
-          .addClass('active')
-
-        if (active.parent('.dropdown-menu').length)  {
-          active = active.closest('li.dropdown').addClass('active')
-        }
-
-        active.trigger('activate')
-      }
-
-  }
-
-
- /* SCROLLSPY PLUGIN DEFINITION
-  * =========================== */
-
-  $.fn.scrollspy = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('scrollspy')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-  $.fn.scrollspy.defaults = {
-    offset: 10
-  }
-
-
- /* SCROLLSPY DATA-API
-  * ================== */
-
-  $(window).on('load', function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      $spy.scrollspy($spy.data())
-    })
-  })
-
-}(window.jQuery);
-/* ========================================================
- * bootstrap-tab.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TAB CLASS DEFINITION
-  * ==================== */
-
-  var Tab = function (element) {
-    this.element = $(element)
-  }
-
-  Tab.prototype = {
-
-    constructor: Tab
-
-  , show: function () {
-      var $this = this.element
-        , $ul = $this.closest('ul:not(.dropdown-menu)')
-        , selector = $this.attr('data-target')
-        , previous
-        , $target
-        , e
-
-      if (!selector) {
-        selector = $this.attr('href')
-        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-      }
-
-      if ( $this.parent('li').hasClass('active') ) return
-
-      previous = $ul.find('.active a').last()[0]
-
-      e = $.Event('show', {
-        relatedTarget: previous
-      })
-
-      $this.trigger(e)
-
-      if (e.isDefaultPrevented()) return
-
-      $target = $(selector)
-
-      this.activate($this.parent('li'), $ul)
-      this.activate($target, $target.parent(), function () {
-        $this.trigger({
-          type: 'shown'
-        , relatedTarget: previous
-        })
-      })
-    }
-
-  , activate: function ( element, container, callback) {
-      var $active = container.find('> .active')
-        , transition = callback
-            && $.support.transition
-            && $active.hasClass('fade')
-
-      function next() {
-        $active
-          .removeClass('active')
-          .find('> .dropdown-menu > .active')
-          .removeClass('active')
-
-        element.addClass('active')
-
-        if (transition) {
-          element[0].offsetWidth // reflow for transition
-          element.addClass('in')
-        } else {
-          element.removeClass('fade')
-        }
-
-        if ( element.parent('.dropdown-menu') ) {
-          element.closest('li.dropdown').addClass('active')
-        }
-
-        callback && callback()
-      }
-
-      transition ?
-        $active.one($.support.transition.end, next) :
-        next()
-
-      $active.removeClass('in')
-    }
-  }
-
-
- /* TAB PLUGIN DEFINITION
-  * ===================== */
-
-  $.fn.tab = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tab')
-      if (!data) $this.data('tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tab.Constructor = Tab
-
-
- /* TAB DATA-API
-  * ============ */
-
-  $(function () {
-    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-      e.preventDefault()
-      $(this).tab('show')
-    })
-  })
-
-}(window.jQuery);
-/* ===========================================================
- * bootstrap-tooltip.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Tooltip = function (element, options) {
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.prototype = {
-
-    constructor: Tooltip
-
-  , init: function (type, element, options) {
-      var eventIn
-        , eventOut
-
-      this.type = type
-      this.$element = $(element)
-      this.options = this.getOptions(options)
-      this.enabled = true
-
-      if (this.options.trigger == 'click') {
-        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-      } else if (this.options.trigger != 'manual') {
-        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
-        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
-        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-      }
-
-      this.options.selector ?
-        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-        this.fixTitle()
-    }
-
-  , getOptions: function (options) {
-      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
-
-      if (options.delay && typeof options.delay == 'number') {
-        options.delay = {
-          show: options.delay
-        , hide: options.delay
-        }
-      }
-
-      return options
-    }
-
-  , enter: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (!self.options.delay || !self.options.delay.show) return self.show()
-
-      clearTimeout(this.timeout)
-      self.hoverState = 'in'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'in') self.show()
-      }, self.options.delay.show)
-    }
-
-  , leave: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (this.timeout) clearTimeout(this.timeout)
-      if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-      self.hoverState = 'out'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'out') self.hide()
-      }, self.options.delay.hide)
-    }
-
-  , show: function () {
-      var $tip
-        , inside
-        , pos
-        , actualWidth
-        , actualHeight
-        , placement
-        , tp
-
-      if (this.hasContent() && this.enabled) {
-        $tip = this.tip()
-        this.setContent()
-
-        if (this.options.animation) {
-          $tip.addClass('fade')
-        }
-
-        placement = typeof this.options.placement == 'function' ?
-          this.options.placement.call(this, $tip[0], this.$element[0]) :
-          this.options.placement
-
-        inside = /in/.test(placement)
-
-        $tip
-          .remove()
-          .css({ top: 0, left: 0, display: 'block' })
-          .appendTo(inside ? this.$element : document.body)
-
-        pos = this.getPosition(inside)
-
-        actualWidth = $tip[0].offsetWidth
-        actualHeight = $tip[0].offsetHeight
-
-        switch (inside ? placement.split(' ')[1] : placement) {
-          case 'bottom':
-            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'top':
-            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'left':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
-            break
-          case 'right':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
-            break
-        }
-
-        $tip
-          .css(tp)
-          .addClass(placement)
-          .addClass('in')
-      }
-    }
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-
-      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-      $tip.removeClass('fade in top bottom left right')
-    }
-
-  , hide: function () {
-      var that = this
-        , $tip = this.tip()
-
-      $tip.removeClass('in')
-
-      function removeWithAnimation() {
-        var timeout = setTimeout(function () {
-          $tip.off($.support.transition.end).remove()
-        }, 500)
-
-        $tip.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          $tip.remove()
-        })
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        removeWithAnimation() :
-        $tip.remove()
-
-      return this
-    }
-
-  , fixTitle: function () {
-      var $e = this.$element
-      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
-        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
-      }
-    }
-
-  , hasContent: function () {
-      return this.getTitle()
-    }
-
-  , getPosition: function (inside) {
-      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
-        width: this.$element[0].offsetWidth
-      , height: this.$element[0].offsetHeight
-      })
-    }
-
-  , getTitle: function () {
-      var title
-        , $e = this.$element
-        , o = this.options
-
-      title = $e.attr('data-original-title')
-        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-      return title
-    }
-
-  , tip: function () {
-      return this.$tip = this.$tip || $(this.options.template)
-    }
-
-  , validate: function () {
-      if (!this.$element[0].parentNode) {
-        this.hide()
-        this.$element = null
-        this.options = null
-      }
-    }
-
-  , enable: function () {
-      this.enabled = true
-    }
-
-  , disable: function () {
-      this.enabled = false
-    }
-
-  , toggleEnabled: function () {
-      this.enabled = !this.enabled
-    }
-
-  , toggle: function () {
-      this[this.tip().hasClass('in') ? 'hide' : 'show']()
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  }
-
-
- /* TOOLTIP PLUGIN DEFINITION
-  * ========================= */
-
-  $.fn.tooltip = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tooltip')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tooltip.Constructor = Tooltip
-
-  $.fn.tooltip.defaults = {
-    animation: true
-  , placement: 'top'
-  , selector: false
-  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
-  , trigger: 'hover'
-  , title: ''
-  , delay: 0
-  , html: true
-  }
-
-}(window.jQuery);
-
-/* ===========================================================
- * bootstrap-popover.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* POPOVER PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-
-  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
-     ========================================== */
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
-
-    constructor: Popover
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-        , content = this.getContent()
-
-      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
-
-      $tip.removeClass('fade top bottom left right in')
-    }
-
-  , hasContent: function () {
-      return this.getTitle() || this.getContent()
-    }
-
-  , getContent: function () {
-      var content
-        , $e = this.$element
-        , o = this.options
-
-      content = $e.attr('data-content')
-        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
-
-      return content
-    }
-
-  , tip: function () {
-      if (!this.$tip) {
-        this.$tip = $(this.options.template)
-      }
-      return this.$tip
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  })
-
-
- /* POPOVER PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.popover = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('popover')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.popover.Constructor = Popover
-
-  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
-    placement: 'right'
-  , trigger: 'click'
-  , content: ''
-  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
-  })
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-affix.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#affix
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* AFFIX CLASS DEFINITION
-  * ====================== */
-
-  var Affix = function (element, options) {
-    this.options = $.extend({}, $.fn.affix.defaults, options)
-    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
-    this.$element = $(element)
-    this.checkPosition()
-  }
-
-  Affix.prototype.checkPosition = function () {
-    if (!this.$element.is(':visible')) return
-
-    var scrollHeight = $(document).height()
-      , scrollTop = this.$window.scrollTop()
-      , position = this.$element.offset()
-      , offset = this.options.offset
-      , offsetBottom = offset.bottom
-      , offsetTop = offset.top
-      , reset = 'affix affix-top affix-bottom'
-      , affix
-
-    if (typeof offset != 'object') offsetBottom = offsetTop = offset
-    if (typeof offsetTop == 'function') offsetTop = offset.top()
-    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
-    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
-      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
-      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
-      'top'    : false
-
-    if (this.affixed === affix) return
-
-    this.affixed = affix
-    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
-
-    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
-  }
-
-
- /* AFFIX PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.affix = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('affix')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('affix', (data = new Affix(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.affix.Constructor = Affix
-
-  $.fn.affix.defaults = {
-    offset: 0
-  }
-
-
- /* AFFIX DATA-API
-  * ============== */
-
-  $(window).on('load', function () {
-    $('[data-spy="affix"]').each(function () {
-      var $spy = $(this)
-        , data = $spy.data()
-
-      data.offset = data.offset || {}
-
-      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
-      data.offsetTop && (data.offset.top = data.offsetTop)
-
-      $spy.affix(data)
-    })
-  })
-
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-alert.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* ALERT CLASS DEFINITION
-  * ====================== */
-
-  var dismiss = '[data-dismiss="alert"]'
-    , Alert = function (el) {
-        $(el).on('click', dismiss, this.close)
-      }
-
-  Alert.prototype.close = function (e) {
-    var $this = $(this)
-      , selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = $(selector)
-
-    e && e.preventDefault()
-
-    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
-
-    $parent.trigger(e = $.Event('close'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      $parent
-        .trigger('closed')
-        .remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent.on($.support.transition.end, removeElement) :
-      removeElement()
-  }
-
-
- /* ALERT PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.alert = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('alert')
-      if (!data) $this.data('alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.alert.Constructor = Alert
-
-
- /* ALERT DATA-API
-  * ============== */
-
-  $(function () {
-    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
-  })
-
-}(window.jQuery);
-/* ============================================================
- * bootstrap-button.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* BUTTON PUBLIC CLASS DEFINITION
-  * ============================== */
-
-  var Button = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.button.defaults, options)
-  }
-
-  Button.prototype.setState = function (state) {
-    var d = 'disabled'
-      , $el = this.$element
-      , data = $el.data()
-      , val = $el.is('input') ? 'val' : 'html'
-
-    state = state + 'Text'
-    data.resetText || $el.data('resetText', $el[val]())
-
-    $el[val](data[state] || this.options[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout(function () {
-      state == 'loadingText' ?
-        $el.addClass(d).attr(d, d) :
-        $el.removeClass(d).removeAttr(d)
-    }, 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
-
-    $parent && $parent
-      .find('.active')
-      .removeClass('active')
-
-    this.$element.toggleClass('active')
-  }
-
-
- /* BUTTON PLUGIN DEFINITION
-  * ======================== */
-
-  $.fn.button = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('button')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('button', (data = new Button(this, options)))
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  $.fn.button.defaults = {
-    loadingText: 'loading...'
-  }
-
-  $.fn.button.Constructor = Button
-
-
- /* BUTTON DATA-API
-  * =============== */
-
-  $(function () {
-    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
-      var $btn = $(e.target)
-      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-      $btn.button('toggle')
-    })
-  })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-collapse.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
-  * ================================ */
-
-  var Collapse = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.collapse.defaults, options)
-
-    if (this.options.parent) {
-      this.$parent = $(this.options.parent)
-    }
-
-    this.options.toggle && this.toggle()
-  }
-
-  Collapse.prototype = {
-
-    constructor: Collapse
-
-  , dimension: function () {
-      var hasWidth = this.$element.hasClass('width')
-      return hasWidth ? 'width' : 'height'
-    }
-
-  , show: function () {
-      var dimension
-        , scroll
-        , actives
-        , hasData
-
-      if (this.transitioning) return
-
-      dimension = this.dimension()
-      scroll = $.camelCase(['scroll', dimension].join('-'))
-      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
-
-      if (actives && actives.length) {
-        hasData = actives.data('collapse')
-        if (hasData && hasData.transitioning) return
-        actives.collapse('hide')
-        hasData || actives.data('collapse', null)
-      }
-
-      this.$element[dimension](0)
-      this.transition('addClass', $.Event('show'), 'shown')
-      $.support.transition && this.$element[dimension](this.$element[0][scroll])
-    }
-
-  , hide: function () {
-      var dimension
-      if (this.transitioning) return
-      dimension = this.dimension()
-      this.reset(this.$element[dimension]())
-      this.transition('removeClass', $.Event('hide'), 'hidden')
-      this.$element[dimension](0)
-    }
-
-  , reset: function (size) {
-      var dimension = this.dimension()
-
-      this.$element
-        .removeClass('collapse')
-        [dimension](size || 'auto')
-        [0].offsetWidth
-
-      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
-
-      return this
-    }
-
-  , transition: function (method, startEvent, completeEvent) {
-      var that = this
-        , complete = function () {
-            if (startEvent.type == 'show') that.reset()
-            that.transitioning = 0
-            that.$element.trigger(completeEvent)
-          }
-
-      this.$element.trigger(startEvent)
-
-      if (startEvent.isDefaultPrevented()) return
-
-      this.transitioning = 1
-
-      this.$element[method]('in')
-
-      $.support.transition && this.$element.hasClass('collapse') ?
-        this.$element.one($.support.transition.end, complete) :
-        complete()
-    }
-
-  , toggle: function () {
-      this[this.$element.hasClass('in') ? 'hide' : 'show']()
-    }
-
-  }
-
-
- /* COLLAPSIBLE PLUGIN DEFINITION
-  * ============================== */
-
-  $.fn.collapse = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('collapse')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.collapse.defaults = {
-    toggle: true
-  }
-
-  $.fn.collapse.Constructor = Collapse
-
-
- /* COLLAPSIBLE DATA-API
-  * ==================== */
-
-  $(function () {
-    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
-      var $this = $(this), href
-        , target = $this.attr('data-target')
-          || e.preventDefault()
-          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
-        , option = $(target).data('collapse') ? 'toggle' : $this.data()
-      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
-      $(target).collapse(option)
-    })
-  })
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-carousel.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* CAROUSEL CLASS DEFINITION
-  * ========================= */
-
-  var Carousel = function (element, options) {
-    this.$element = $(element)
-    this.options = options
-    this.options.slide && this.slide(this.options.slide)
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter', $.proxy(this.pause, this))
-      .on('mouseleave', $.proxy(this.cycle, this))
-  }
-
-  Carousel.prototype = {
-
-    cycle: function (e) {
-      if (!e) this.paused = false
-      this.options.interval
-        && !this.paused
-        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-      return this
-    }
-
-  , to: function (pos) {
-      var $active = this.$element.find('.item.active')
-        , children = $active.parent().children()
-        , activePos = children.index($active)
-        , that = this
-
-      if (pos > (children.length - 1) || pos < 0) return
-
-      if (this.sliding) {
-        return this.$element.one('slid', function () {
-          that.to(pos)
-        })
-      }
-
-      if (activePos == pos) {
-        return this.pause().cycle()
-      }
-
-      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
-    }
-
-  , pause: function (e) {
-      if (!e) this.paused = true
-      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
-        this.$element.trigger($.support.transition.end)
-        this.cycle()
-      }
-      clearInterval(this.interval)
-      this.interval = null
-      return this
-    }
-
-  , next: function () {
-      if (this.sliding) return
-      return this.slide('next')
-    }
-
-  , prev: function () {
-      if (this.sliding) return
-      return this.slide('prev')
-    }
-
-  , slide: function (type, next) {
-      var $active = this.$element.find('.item.active')
-        , $next = next || $active[type]()
-        , isCycling = this.interval
-        , direction = type == 'next' ? 'left' : 'right'
-        , fallback  = type == 'next' ? 'first' : 'last'
-        , that = this
-        , e = $.Event('slide', {
-            relatedTarget: $next[0]
-          })
-
-      this.sliding = true
-
-      isCycling && this.pause()
-
-      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
-
-      if ($next.hasClass('active')) return
-
-      if ($.support.transition && this.$element.hasClass('slide')) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $next.addClass(type)
-        $next[0].offsetWidth // force reflow
-        $active.addClass(direction)
-        $next.addClass(direction)
-        this.$element.one($.support.transition.end, function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () { that.$element.trigger('slid') }, 0)
-        })
-      } else {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $active.removeClass('active')
-        $next.addClass('active')
-        this.sliding = false
-        this.$element.trigger('slid')
-      }
-
-      isCycling && this.cycle()
-
-      return this
-    }
-
-  }
-
-
- /* CAROUSEL PLUGIN DEFINITION
-  * ========================== */
-
-  $.fn.carousel = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('carousel')
-        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
-        , action = typeof option == 'string' ? option : options.slide
-      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (action) data[action]()
-      else if (options.interval) data.cycle()
-    })
-  }
-
-  $.fn.carousel.defaults = {
-    interval: 5000
-  , pause: 'hover'
-  }
-
-  $.fn.carousel.Constructor = Carousel
-
-
- /* CAROUSEL DATA-API
-  * ================= */
-
-  $(function () {
-    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
-      var $this = $(this), href
-        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
-      $target.carousel(options)
-      e.preventDefault()
-    })
-  })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-typeahead.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function($){
-
-  "use strict"; // jshint ;_;
-
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
-  * ================================= */
-
-  var Typeahead = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.typeahead.defaults, options)
-    this.matcher = this.options.matcher || this.matcher
-    this.sorter = this.options.sorter || this.sorter
-    this.highlighter = this.options.highlighter || this.highlighter
-    this.updater = this.options.updater || this.updater
-    this.$menu = $(this.options.menu).appendTo('body')
-    this.source = this.options.source
-    this.shown = false
-    this.listen()
-  }
-
-  Typeahead.prototype = {
-
-    constructor: Typeahead
-
-  , select: function () {
-      var val = this.$menu.find('.active').attr('data-value')
-      this.$element
-        .val(this.updater(val))
-        .change()
-      return this.hide()
-    }
-
-  , updater: function (item) {
-      return item
-    }
-
-  , show: function () {
-      var pos = $.extend({}, this.$element.offset(), {
-        height: this.$element[0].offsetHeight
-      })
-
-      this.$menu.css({
-        top: pos.top + pos.height
-      , left: pos.left
-      })
-
-      this.$menu.show()
-      this.shown = true
-      return this
-    }
-
-  , hide: function () {
-      this.$menu.hide()
-      this.shown = false
-      return this
-    }
-
-  , lookup: function (event) {
-      var items
-
-      this.query = this.$element.val()
-
-      if (!this.query || this.query.length < this.options.minLength) {
-        return this.shown ? this.hide() : this
-      }
-
-      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
-
-      return items ? this.process(items) : this
-    }
-
-  , process: function (items) {
-      var that = this
-
-      items = $.grep(items, function (item) {
-        return that.matcher(item)
-      })
-
-      items = this.sorter(items)
-
-      if (!items.length) {
-        return this.shown ? this.hide() : this
-      }
-
-      return this.render(items.slice(0, this.options.items)).show()
-    }
-
-  , matcher: function (item) {
-      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
-    }
-
-  , sorter: function (items) {
-      var beginswith = []
-        , caseSensitive = []
-        , caseInsensitive = []
-        , item
-
-      while (item = items.shift()) {
-        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
-        else if (~item.indexOf(this.query)) caseSensitive.push(item)
-        else caseInsensitive.push(item)
-      }
-
-      return beginswith.concat(caseSensitive, caseInsensitive)
-    }
-
-  , highlighter: function (item) {
-      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
-      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
-        return '<strong>' + match + '</strong>'
-      })
-    }
-
-  , render: function (items) {
-      var that = this
-
-      items = $(items).map(function (i, item) {
-        i = $(that.options.item).attr('data-value', item)
-        i.find('a').html(that.highlighter(item))
-        return i[0]
-      })
-
-      items.first().addClass('active')
-      this.$menu.html(items)
-      return this
-    }
-
-  , next: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , next = active.next()
-
-      if (!next.length) {
-        next = $(this.$menu.find('li')[0])
-      }
-
-      next.addClass('active')
-    }
-
-  , prev: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , prev = active.prev()
-
-      if (!prev.length) {
-        prev = this.$menu.find('li').last()
-      }
-
-      prev.addClass('active')
-    }
-
-  , listen: function () {
-      this.$element
-        .on('blur',     $.proxy(this.blur, this))
-        .on('keypress', $.proxy(this.keypress, this))
-        .on('keyup',    $.proxy(this.keyup, this))
-
-      if ($.browser.webkit || $.browser.msie) {
-        this.$element.on('keydown', $.proxy(this.keydown, this))
-      }
-
-      this.$menu
-        .on('click', $.proxy(this.click, this))
-        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
-    }
-
-  , move: function (e) {
-      if (!this.shown) return
-
-      switch(e.keyCode) {
-        case 9: // tab
-        case 13: // enter
-        case 27: // escape
-          e.preventDefault()
-          break
-
-        case 38: // up arrow
-          e.preventDefault()
-          this.prev()
-          break
-
-        case 40: // down arrow
-          e.preventDefault()
-          this.next()
-          break
-      }
-
-      e.stopPropagation()
-    }
-
-  , keydown: function (e) {
-      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
-      this.move(e)
-    }
-
-  , keypress: function (e) {
-      if (this.suppressKeyPressRepeat) return
-      this.move(e)
-    }
-
-  , keyup: function (e) {
-      switch(e.keyCode) {
-        case 40: // down arrow
-        case 38: // up arrow
-          break
-
-        case 9: // tab
-        case 13: // enter
-          if (!this.shown) return
-          this.select()
-          break
-
-        case 27: // escape
-          if (!this.shown) return
-          this.hide()
-          break
-
-        default:
-          this.lookup()
-      }
-
-      e.stopPropagation()
-      e.preventDefault()
-  }
-
-  , blur: function (e) {
-      var that = this
-      setTimeout(function () { that.hide() }, 150)
-    }
-
-  , click: function (e) {
-      e.stopPropagation()
-      e.preventDefault()
-      this.select()
-    }
-
-  , mouseenter: function (e) {
-      this.$menu.find('.active').removeClass('active')
-      $(e.currentTarget).addClass('active')
-    }
-
-  }
-
-
-  /* TYPEAHEAD PLUGIN DEFINITION
-   * =========================== */
-
-  $.fn.typeahead = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('typeahead')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.typeahead.defaults = {
-    source: []
-  , items: 8
-  , menu: '<ul class="typeahead dropdown-menu"></ul>'
-  , item: '<li><a href="#"></a></li>'
-  , minLength: 1
-  }
-
-  $.fn.typeahead.Constructor = Typeahead
-
-
- /*   TYPEAHEAD DATA-API
-  * ================== */
-
-  $(function () {
-    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
-      var $this = $(this)
-      if ($this.data('typeahead')) return
-      e.preventDefault()
-      $this.typeahead($this.data())
-    })
-  })
-
-}(window.jQuery);
diff --git a/doc/_themes/bootstrap/bootstrap.min.js b/doc/_themes/bootstrap/bootstrap.min.js
deleted file mode 100755
index 731e0ad..0000000
--- a/doc/_themes/bootstrap/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
-* Bootstrap.js by @fat & @mdo
-* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js
-* Copyright 2012 Twitter, Inc.
-* http://www.apache.org/licenses/LICENSE-2.0.txt
-*/
-!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hi [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/indexsidebar.html b/doc/_themes/bootstrap/indexsidebar.html
deleted file mode 100644
index 7d542f2..0000000
--- a/doc/_themes/bootstrap/indexsidebar.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<p>
-<script src="http://widgets.twimg.com/j/2/widget.js"></script>
-<script>
-new TWTR.Widget({
-  version: 2,
-  type: 'profile',
-  rpp: 4,
-  interval: 6000,
-  width: 'auto',
-  height: 200,
-  theme: {
-    shell: {
-      background: '#2c7fb8',
-      color: '#ffffff'
-    },
-    tweets: {
-      background: '#2c7fb8',
-      color: '#ffffff',
-      links: '#ffffff'
-    }
-  },
-  features: {
-    scrollbar: false,
-    loop: false,
-    live: false,
-    hashtags: true,
-    timestamp: true,
-    avatars: false,
-    behavior: 'all'
-  }
-}).render().setUser('pointcloudpipe').start();
-</script>
-</p>
-
-
-
-<p>
-<script type="text/javascript" src="http://www.ohloh.net/p/585810/widgets/project_thin_badge.js"></script>
-</p>
-
-
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.css b/doc/_themes/bootstrap/static/bootstrap-default.css
deleted file mode 100644
index 0664207..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-default.css
+++ /dev/null
@@ -1,5624 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-
-audio:not([controls]) {
-  display: none;
-}
-
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-      -ms-text-size-adjust: 100%;
-}
-
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-a:hover,
-a:active {
-  outline: 0;
-}
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-img {
-  height: auto;
-  max-width: 100%;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img {
-  max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-
-.clearfix {
-  *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.clearfix:after {
-  clear: both;
-}
-
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-body {
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  background-color: #ffffff;
-}
-
-a {
-  color: #0088cc;
-  text-decoration: none;
-}
-
-a:hover {
-  color: #005580;
-  text-decoration: underline;
-}
-
-.img-rounded {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
-  -webkit-border-radius: 500px;
-     -moz-border-radius: 500px;
-          border-radius: 500px;
-}
-
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-
-.row:before,
-.row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row:after {
-  clear: both;
-}
-
-[class*="span"] {
-  float: left;
-  margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.span12 {
-  width: 940px;
-}
-
-.span11 {
-  width: 860px;
-}
-
-.span10 {
-  width: 780px;
-}
-
-.span9 {
-  width: 700px;
-}
-
-.span8 {
-  width: 620px;
-}
-
-.span7 {
-  width: 540px;
-}
-
-.span6 {
-  width: 460px;
-}
-
-.span5 {
-  width: 380px;
-}
-
-.span4 {
-  width: 300px;
-}
-
-.span3 {
-  width: 220px;
-}
-
-.span2 {
-  width: 140px;
-}
-
-.span1 {
-  width: 60px;
-}
-
-.offset12 {
-  margin-left: 980px;
-}
-
-.offset11 {
-  margin-left: 900px;
-}
-
-.offset10 {
-  margin-left: 820px;
-}
-
-.offset9 {
-  margin-left: 740px;
-}
-
-.offset8 {
-  margin-left: 660px;
-}
-
-.offset7 {
-  margin-left: 580px;
-}
-
-.offset6 {
-  margin-left: 500px;
-}
-
-.offset5 {
-  margin-left: 420px;
-}
-
-.offset4 {
-  margin-left: 340px;
-}
-
-.offset3 {
-  margin-left: 260px;
-}
-
-.offset2 {
-  margin-left: 180px;
-}
-
-.offset1 {
-  margin-left: 100px;
-}
-
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row-fluid:after {
-  clear: both;
-}
-
-.row-fluid [class*="span"] {
-  display: block;
-  float: left;
-  width: 100%;
-  min-height: 30px;
-  margin-left: 2.127659574468085%;
-  *margin-left: 2.074468085106383%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
-  width: 82.97872340425532%;
-  *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
-  width: 74.46808510638297%;
-  *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
-  width: 65.95744680851064%;
-  *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {
-  width: 57.44680851063829%;
-  *width: 57.39361702127659%;
-}
-
-.row-fluid .span6 {
-  width: 48.93617021276595%;
-  *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
-  width: 40.42553191489362%;
-  *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {
-  width: 31.914893617021278%;
-  *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
-  width: 23.404255319148934%;
-  *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-
-.container:before,
-.container:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container:after {
-  clear: both;
-}
-
-.container-fluid {
-  padding-right: 20px;
-  padding-left: 20px;
-  *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container-fluid:after {
-  clear: both;
-}
-
-p {
-  margin: 0 0 10px;
-}
-
-.lead {
-  margin-bottom: 20px;
-  font-size: 20px;
-  font-weight: 200;
-  line-height: 30px;
-}
-
-small {
-  font-size: 85%;
-}
-
-strong {
-  font-weight: bold;
-}
-
-em {
-  font-style: italic;
-}
-
-cite {
-  font-style: normal;
-}
-
-.muted {
-  color: #999999;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 10px 0;
-  font-family: inherit;
-  font-weight: bold;
-  line-height: 1;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-
-h1 {
-  font-size: 36px;
-  line-height: 40px;
-}
-
-h2 {
-  font-size: 30px;
-  line-height: 40px;
-}
-
-h3 {
-  font-size: 24px;
-  line-height: 40px;
-}
-
-h4 {
-  font-size: 18px;
-  line-height: 20px;
-}
-
-h5 {
-  font-size: 14px;
-  line-height: 20px;
-}
-
-h6 {
-  font-size: 12px;
-  line-height: 20px;
-}
-
-h1 small {
-  font-size: 24px;
-}
-
-h2 small {
-  font-size: 18px;
-}
-
-h3 small {
-  font-size: 14px;
-}
-
-h4 small {
-  font-size: 14px;
-}
-
-.page-header {
-  padding-bottom: 9px;
-  margin: 20px 0 30px;
-  border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 10px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-
-li {
-  line-height: 20px;
-}
-
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-
-dl {
-  margin-bottom: 20px;
-}
-
-dt,
-dd {
-  line-height: 20px;
-}
-
-dt {
-  font-weight: bold;
-}
-
-dd {
-  margin-left: 10px;
-}
-
-.dl-horizontal dt {
-  float: left;
-  width: 120px;
-  overflow: hidden;
-  clear: left;
-  text-align: right;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.dl-horizontal dd {
-  margin-left: 130px;
-}
-
-hr {
-  margin: 20px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-
-abbr[title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 20px;
-  border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
-  margin-bottom: 0;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 25px;
-}
-
-blockquote small {
-  display: block;
-  line-height: 20px;
-  color: #999999;
-}
-
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-
-blockquote.pull-right small:before {
-  content: '';
-}
-
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-address {
-  display: block;
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 20px;
-}
-
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 12px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-code {
-  padding: 2px 4px;
-  color: #d14;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 20px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-pre.prettyprint {
-  margin-bottom: 20px;
-}
-
-pre code {
-  padding: 0;
-  color: inherit;
-  background-color: transparent;
-  border: 0;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-form {
-  margin: 0 0 20px;
-}
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: 40px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
-  font-size: 15px;
-  color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 20px;
-  padding: 4px 6px;
-  margin-bottom: 9px;
-  font-size: 14px;
-  line-height: 20px;
-  color: #555555;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-input,
-textarea {
-  width: 210px;
-}
-
-textarea {
-  height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-          transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9;
-  *margin-top: 0;
-  line-height: normal;
-  cursor: pointer;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-
-select,
-input[type="file"] {
-  height: 30px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 30px;
-}
-
-select {
-  width: 220px;
-  background-color: #ffffff;
-  border: 1px solid #bbb;
-}
-
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  cursor: not-allowed;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-
-.radio,
-.checkbox {
-  min-height: 18px;
-  padding-left: 18px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-  margin-left: -18px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-
-.input-mini {
-  width: 60px;
-}
-
-.input-small {
-  width: 90px;
-}
-
-.input-medium {
-  width: 150px;
-}
-
-.input-large {
-  width: 210px;
-}
-
-.input-xlarge {
-  width: 270px;
-}
-
-.input-xxlarge {
-  width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
-  width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
-  width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
-  width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
-  width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
-  width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
-  width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
-  width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
-  width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
-  width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
-  width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
-  width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
-  width: 46px;
-}
-
-.controls-row {
-  *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.controls-row:after {
-  clear: both;
-}
-
-.controls-row [class*="span"] {
-  float: left;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-     -moz-box-shadow: 0 0 6px #f8b9b7;
-          box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
-  padding: 19px 20px 20px;
-  margin-top: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-actions:after {
-  clear: both;
-}
-
-.help-block,
-.help-inline {
-  color: #595959;
-}
-
-.help-block {
-  display: block;
-  margin-bottom: 10px;
-}
-
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  padding-left: 5px;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
-  margin-bottom: 5px;
-  font-size: 0;
-  white-space: nowrap;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  font-size: 14px;
-  vertical-align: top;
-  -webkit-border-radius: 0 3px 3px 0;
-     -moz-border-radius: 0 3px 3px 0;
-          border-radius: 0 3px 3px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 20px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
-  margin-left: -1px;
-  vertical-align: top;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
-  background-color: #a9dba9;
-  border-color: #46a546;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 3px 0 0 3px;
-     -moz-border-radius: 3px 0 0 3px;
-          border-radius: 3px 0 0 3px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 3px 0 0 3px;
-     -moz-border-radius: 3px 0 0 3px;
-          border-radius: 3px 0 0 3px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
-  -webkit-border-radius: 0 3px 3px 0;
-     -moz-border-radius: 0 3px 3px 0;
-          border-radius: 0 3px 3px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 3px 0 0 3px;
-     -moz-border-radius: 3px 0 0 3px;
-          border-radius: 3px 0 0 3px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 3px 3px 0;
-     -moz-border-radius: 0 3px 3px 0;
-          border-radius: 0 3px 3px 0;
-}
-
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-
-.control-group {
-  margin-bottom: 10px;
-}
-
-legend + .control-group {
-  margin-top: 20px;
-  -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
-  margin-bottom: 20px;
-  *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-horizontal .control-group:after {
-  clear: both;
-}
-
-.form-horizontal .control-label {
-  float: left;
-  width: 140px;
-  padding-top: 5px;
-  text-align: right;
-}
-
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 160px;
-  *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
-  *padding-left: 160px;
-}
-
-.form-horizontal .help-block {
-  margin-top: 10px;
-  margin-bottom: 0;
-}
-
-.form-horizontal .form-actions {
-  padding-left: 160px;
-}
-
-table {
-  max-width: 100%;
-  background-color: transparent;
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.table {
-  width: 100%;
-  margin-bottom: 20px;
-}
-
-.table th,
-.table td {
-  padding: 8px;
-  line-height: 20px;
-  text-align: left;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-
-.table th {
-  font-weight: bold;
-}
-
-.table thead th {
-  vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
-  -webkit-border-radius: 0 0 0 4px;
-     -moz-border-radius: 0 0 0 4px;
-          border-radius: 0 0 0 4px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-right-topleft: 4px;
-}
-
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
-  background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
-  background-color: #f5f5f5;
-}
-
-table [class*=span],
-.row-fluid table [class*=span] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-
-table .span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-
-table .span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-
-table .span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-
-table .span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-
-table .span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-
-table .span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-
-table .span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-
-table .span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-
-table .span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-
-table .span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-
-table .span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-
-table .span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-
-table .span13 {
-  float: none;
-  width: 1004px;
-  margin-left: 0;
-}
-
-table .span14 {
-  float: none;
-  width: 1084px;
-  margin-left: 0;
-}
-
-table .span15 {
-  float: none;
-  width: 1164px;
-  margin-left: 0;
-}
-
-table .span16 {
-  float: none;
-  width: 1244px;
-  margin-left: 0;
-}
-
-table .span17 {
-  float: none;
-  width: 1324px;
-  margin-left: 0;
-}
-
-table .span18 {
-  float: none;
-  width: 1404px;
-  margin-left: 0;
-}
-
-table .span19 {
-  float: none;
-  width: 1484px;
-  margin-left: 0;
-}
-
-table .span20 {
-  float: none;
-  width: 1564px;
-  margin-left: 0;
-}
-
-table .span21 {
-  float: none;
-  width: 1644px;
-  margin-left: 0;
-}
-
-table .span22 {
-  float: none;
-  width: 1724px;
-  margin-left: 0;
-}
-
-table .span23 {
-  float: none;
-  width: 1804px;
-  margin-left: 0;
-}
-
-table .span24 {
-  float: none;
-  width: 1884px;
-  margin-left: 0;
-}
-
-.table tbody tr.success td {
-  background-color: #dff0d8;
-}
-
-.table tbody tr.error td {
-  background-color: #f2dede;
-}
-
-.table tbody tr.info td {
-  background-color: #d9edf7;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  margin-top: 1px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/active states of certain elements */
-
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
-  background-position: 0      0;
-}
-
-.icon-music {
-  background-position: -24px 0;
-}
-
-.icon-search {
-  background-position: -48px 0;
-}
-
-.icon-envelope {
-  background-position: -72px 0;
-}
-
-.icon-heart {
-  background-position: -96px 0;
-}
-
-.icon-star {
-  background-position: -120px 0;
-}
-
-.icon-star-empty {
-  background-position: -144px 0;
-}
-
-.icon-user {
-  background-position: -168px 0;
-}
-
-.icon-film {
-  background-position: -192px 0;
-}
-
-.icon-th-large {
-  background-position: -216px 0;
-}
-
-.icon-th {
-  background-position: -240px 0;
-}
-
-.icon-th-list {
-  background-position: -264px 0;
-}
-
-.icon-ok {
-  background-position: -288px 0;
-}
-
-.icon-remove {
-  background-position: -312px 0;
-}
-
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-
-.icon-off {
-  background-position: -384px 0;
-}
-
-.icon-signal {
-  background-position: -408px 0;
-}
-
-.icon-cog {
-  background-position: -432px 0;
-}
-
-.icon-trash {
-  background-position: -456px 0;
-}
-
-.icon-home {
-  background-position: 0 -24px;
-}
-
-.icon-file {
-  background-position: -24px -24px;
-}
-
-.icon-time {
-  background-position: -48px -24px;
-}
-
-.icon-road {
-  background-position: -72px -24px;
-}
-
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-
-.icon-download {
-  background-position: -120px -24px;
-}
-
-.icon-upload {
-  background-position: -144px -24px;
-}
-
-.icon-inbox {
-  background-position: -168px -24px;
-}
-
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-
-.icon-repeat {
-  background-position: -216px -24px;
-}
-
-.icon-refresh {
-  background-position: -240px -24px;
-}
-
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-
-.icon-lock {
-  background-position: -287px -24px;
-}
-
-.icon-flag {
-  background-position: -312px -24px;
-}
-
-.icon-headphones {
-  background-position: -336px -24px;
-}
-
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-
-.icon-barcode {
-  background-position: -456px -24px;
-}
-
-.icon-tag {
-  background-position: 0 -48px;
-}
-
-.icon-tags {
-  background-position: -25px -48px;
-}
-
-.icon-book {
-  background-position: -48px -48px;
-}
-
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-
-.icon-print {
-  background-position: -96px -48px;
-}
-
-.icon-camera {
-  background-position: -120px -48px;
-}
-
-.icon-font {
-  background-position: -144px -48px;
-}
-
-.icon-bold {
-  background-position: -167px -48px;
-}
-
-.icon-italic {
-  background-position: -192px -48px;
-}
-
-.icon-text-height {
-  background-position: -216px -48px;
-}
-
-.icon-text-width {
-  background-position: -240px -48px;
-}
-
-.icon-align-left {
-  background-position: -264px -48px;
-}
-
-.icon-align-center {
-  background-position: -288px -48px;
-}
-
-.icon-align-right {
-  background-position: -312px -48px;
-}
-
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-
-.icon-list {
-  background-position: -360px -48px;
-}
-
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-
-.icon-picture {
-  background-position: -456px -48px;
-}
-
-.icon-pencil {
-  background-position: 0 -72px;
-}
-
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-
-.icon-adjust {
-  background-position: -48px -72px;
-}
-
-.icon-tint {
-  background-position: -72px -72px;
-}
-
-.icon-edit {
-  background-position: -96px -72px;
-}
-
-.icon-share {
-  background-position: -120px -72px;
-}
-
-.icon-check {
-  background-position: -144px -72px;
-}
-
-.icon-move {
-  background-position: -168px -72px;
-}
-
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-
-.icon-backward {
-  background-position: -240px -72px;
-}
-
-.icon-play {
-  background-position: -264px -72px;
-}
-
-.icon-pause {
-  background-position: -288px -72px;
-}
-
-.icon-stop {
-  background-position: -312px -72px;
-}
-
-.icon-forward {
-  background-position: -336px -72px;
-}
-
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-
-.icon-eject {
-  background-position: -408px -72px;
-}
-
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-
-.icon-plus {
-  background-position: -408px -96px;
-}
-
-.icon-minus {
-  background-position: -433px -96px;
-}
-
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-
-.icon-gift {
-  background-position: -24px -120px;
-}
-
-.icon-leaf {
-  background-position: -48px -120px;
-}
-
-.icon-fire {
-  background-position: -72px -120px;
-}
-
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-
-.icon-plane {
-  background-position: -168px -120px;
-}
-
-.icon-calendar {
-  background-position: -192px -120px;
-}
-
-.icon-random {
-  width: 16px;
-  background-position: -216px -120px;
-}
-
-.icon-comment {
-  background-position: -240px -120px;
-}
-
-.icon-magnet {
-  background-position: -264px -120px;
-}
-
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-
-.icon-retweet {
-  background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-
-.icon-folder-close {
-  background-position: -384px -120px;
-}
-
-.icon-folder-open {
-  width: 16px;
-  background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-
-.icon-hdd {
-  background-position: 0 -144px;
-}
-
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-
-.icon-bell {
-  background-position: -48px -144px;
-}
-
-.icon-certificate {
-  background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-
-.icon-globe {
-  background-position: -336px -144px;
-}
-
-.icon-wrench {
-  background-position: -360px -144px;
-}
-
-.icon-tasks {
-  background-position: -384px -144px;
-}
-
-.icon-filter {
-  background-position: -408px -144px;
-}
-
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 20px;
-  color: #333333;
-  white-space: nowrap;
-}
-
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0088cc;
-  background-color: #0081c2;
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0088cc;
-  background-color: #0081c2;
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  outline: 0;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
-  color: #999999;
-}
-
-.dropdown-menu .disabled > a:hover {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-}
-
-.open {
-  *z-index: 1000;
-}
-
-.open > .dropdown-menu {
-  display: block;
-}
-
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "\2191";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-
-.dropdown-submenu {
-  position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-     -moz-border-radius: 0 6px 6px 6px;
-          border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover .dropdown-menu {
-  display: block;
-}
-
-.dropdown-submenu > a:after {
-  display: block;
-  float: right;
-  width: 0;
-  height: 0;
-  margin-top: 5px;
-  margin-right: -10px;
-  border-color: transparent;
-  border-left-color: #cccccc;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-
-.dropdown .dropdown-menu .nav-header {
-  padding-right: 20px;
-  padding-left: 20px;
-}
-
-.typeahead {
-  margin-top: 2px;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-     -moz-transition: opacity 0.15s linear;
-       -o-transition: opacity 0.15s linear;
-          transition: opacity 0.15s linear;
-}
-
-.fade.in {
-  opacity: 1;
-}
-
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  overflow: visible \9;
-  -webkit-transition: height 0.35s ease;
-     -moz-transition: height 0.35s ease;
-       -o-transition: height 0.35s ease;
-          transition: height 0.35s ease;
-}
-
-.collapse.in {
-  height: auto;
-}
-
-.close {
-  float: right;
-  font-size: 20px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-
-.close:hover {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.btn {
-  display: inline-block;
-  *display: inline;
-  padding: 4px 14px;
-  margin-bottom: 0;
-  *margin-left: .3em;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  color: #333333;
-  text-align: center;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  vertical-align: middle;
-  cursor: pointer;
-  background-color: #f5f5f5;
-  *background-color: #e6e6e6;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border: 1px solid #bbbbbb;
-  *border: 0;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-bottom-color: #a2a2a2;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-
-.btn:first-child {
-  *margin-left: 0;
-}
-
-.btn:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-  /* Buttons in IE7 don't get borders, so darken on hover */
-
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-     -moz-transition: background-position 0.1s linear;
-       -o-transition: background-position 0.1s linear;
-          transition: background-position 0.1s linear;
-}
-
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
-  background-color: #e6e6e6;
-  background-color: #d9d9d9 \9;
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-color: #e6e6e6;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-large {
-  padding: 9px 14px;
-  font-size: 16px;
-  line-height: normal;
-  -webkit-border-radius: 5px;
-     -moz-border-radius: 5px;
-          border-radius: 5px;
-}
-
-.btn-large [class^="icon-"] {
-  margin-top: 2px;
-}
-
-.btn-small {
-  padding: 3px 9px;
-  font-size: 12px;
-  line-height: 18px;
-}
-
-.btn-small [class^="icon-"] {
-  margin-top: 0;
-}
-
-.btn-mini {
-  padding: 2px 6px;
-  font-size: 11px;
-  line-height: 16px;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.btn {
-  border-color: #c5c5c5;
-  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  *background-color: #0044cc;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #003399 \9;
-}
-
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  *background-color: #f89406;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  *background-color: #bd362f;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  *background-color: #51a351;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-repeat: repeat-x;
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  *background-color: #2f96b4;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  *background-color: #222222;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-repeat: repeat-x;
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-link {
-  color: #0088cc;
-  cursor: pointer;
-  border-color: transparent;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-link:hover {
-  color: #005580;
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.btn-group {
-  position: relative;
-  *margin-left: .3em;
-  font-size: 0;
-  white-space: nowrap;
-}
-
-.btn-group:first-child {
-  *margin-left: 0;
-}
-
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-toolbar {
-  margin-top: 10px;
-  margin-bottom: 10px;
-  font-size: 0;
-}
-
-.btn-toolbar .btn-group {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
-  font-size: 14px;
-}
-
-.btn-group > .btn-mini {
-  font-size: 11px;
-}
-
-.btn-group > .btn-small {
-  font-size: 12px;
-}
-
-.btn-group > .btn-large {
-  font-size: 16px;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
-  *padding-top: 5px;
-  padding-right: 8px;
-  *padding-bottom: 5px;
-  padding-left: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
-  *padding-top: 2px;
-  padding-right: 5px;
-  *padding-bottom: 2px;
-  padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
-  *padding-top: 7px;
-  padding-right: 12px;
-  *padding-bottom: 7px;
-  padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #0044cc;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #222222;
-}
-
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
-  margin-top: 6px;
-}
-
-.btn-large .caret {
-  border-top-width: 5px;
-  border-right-width: 5px;
-  border-left-width: 5px;
-}
-
-.dropup .btn-large .caret {
-  border-top: 0;
-  border-bottom: 5px solid #000000;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-
-.btn-group-vertical .btn {
-  display: block;
-  float: none;
-  width: 100%;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group-vertical .btn + .btn {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-vertical .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-     -moz-border-radius: 6px 6px 0 0;
-          border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.alert {
-  padding: 8px 35px 8px 14px;
-  margin-bottom: 20px;
-  color: #c09853;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.alert h4 {
-  margin: 0;
-}
-
-.alert .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  line-height: 20px;
-}
-
-.alert-success {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-
-.alert-danger,
-.alert-error {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #eed3d7;
-}
-
-.alert-info {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-
-.alert-block p + p {
-  margin-top: 5px;
-}
-
-.nav {
-  margin-bottom: 20px;
-  margin-left: 0;
-  list-style: none;
-}
-
-.nav > li > a {
-  display: block;
-}
-
-.nav > li > a:hover {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-
-.nav > .pull-right {
-  float: right;
-}
-
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-
-.nav-list {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-right: -15px;
-  margin-left: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #0088cc;
-}
-
-.nav-list [class^="icon-"] {
-  margin-right: 2px;
-}
-
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  line-height: 20px;
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
-  color: #555555;
-  cursor: default;
-  background-color: #ffffff;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  -webkit-border-radius: 5px;
-     -moz-border-radius: 5px;
-          border-radius: 5px;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
-  color: #ffffff;
-  background-color: #0088cc;
-}
-
-.nav-stacked > li {
-  float: none;
-}
-
-.nav-stacked > li > a {
-  margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover {
-  z-index: 2;
-  border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
-  margin-top: 6px;
-  border-top-color: #0088cc;
-  border-bottom-color: #0088cc;
-}
-
-.nav .dropdown-toggle:hover .caret {
-  border-top-color: #005580;
-  border-bottom-color: #005580;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover {
-  cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover {
-  border-color: #999999;
-}
-
-.tabbable {
-  *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.tabbable:after {
-  clear: both;
-}
-
-.tab-content {
-  overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover {
-  border-top-color: #ddd;
-  border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
-  border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 3px;
-}
-
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 19px;
-  border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
-  color: #999999;
-}
-
-.nav > .disabled > a:hover {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-}
-
-.navbar {
-  *position: relative;
-  *z-index: 2;
-  margin-bottom: 20px;
-  overflow: visible;
-  color: #555555;
-}
-
-.navbar-inner {
-  min-height: 40px;
-  padding-right: 20px;
-  padding-left: 20px;
-  background-color: #fafafa;
-  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
-  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
-  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
-  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
-  background-repeat: repeat-x;
-  border: 1px solid #d4d4d4;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar .container {
-  width: auto;
-}
-
-.nav-collapse.collapse {
-  height: auto;
-}
-
-.navbar .brand {
-  display: block;
-  float: left;
-  padding: 10px 20px 10px;
-  margin-left: -20px;
-  font-size: 20px;
-  font-weight: 200;
-  color: #555555;
-  text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .brand:hover {
-  text-decoration: none;
-}
-
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 40px;
-}
-
-.navbar-link {
-  color: #555555;
-}
-
-.navbar-link:hover {
-  color: #333333;
-}
-
-.navbar .divider-vertical {
-  height: 40px;
-  margin: 0 9px;
-  border-right: 1px solid #ffffff;
-  border-left: 1px solid #f2f2f2;
-}
-
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 6px;
-}
-
-.navbar .btn-group .btn {
-  margin: 0;
-}
-
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-form:after {
-  clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 6px;
-  white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-
-.navbar-search .search-query {
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.navbar-static-top {
-  position: static;
-  width: 100%;
-  margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.navbar-fixed-top {
-  top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
-  float: right;
-}
-
-.navbar .nav > li {
-  float: left;
-}
-
-.navbar .nav > li > a {
-  float: none;
-  padding: 10px 15px 10px;
-  color: #555555;
-  text-decoration: none;
-  text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #555555;
-  text-decoration: none;
-  background-color: #e5e5e5;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-right: 5px;
-  margin-left: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #ededed;
-  *background-color: #e5e5e5;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
-  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
-  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-repeat: repeat-x;
-  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #e5e5e5;
-  *background-color: #d9d9d9;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #cccccc \9;
-}
-
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-     -moz-border-radius: 1px;
-          border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
-  position: absolute;
-  top: -7px;
-  left: 9px;
-  display: inline-block;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-left: 7px solid transparent;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
-  position: absolute;
-  top: -6px;
-  left: 10px;
-  display: inline-block;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  border-left: 6px solid transparent;
-  content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  top: auto;
-  bottom: -7px;
-  border-top: 7px solid #ccc;
-  border-bottom: 0;
-  border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  top: auto;
-  bottom: -6px;
-  border-top: 6px solid #ffffff;
-  border-bottom: 0;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #555555;
-  background-color: #e5e5e5;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  right: 12px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  right: 13px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  right: 100%;
-  left: auto;
-  margin-right: -1px;
-  margin-left: 0;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-inner {
-  background-color: #1b1b1b;
-  background-image: -moz-linear-gradient(top, #222222, #111111);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-  background-image: -webkit-linear-gradient(top, #222222, #111111);
-  background-image: -o-linear-gradient(top, #222222, #111111);
-  background-image: linear-gradient(to bottom, #222222, #111111);
-  background-repeat: repeat-x;
-  border-color: #252525;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-  background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
-  border-right-color: #222222;
-  border-left-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #515151;
-  border-color: #111111;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-  -webkit-transition: none;
-     -moz-transition: none;
-       -o-transition: none;
-          transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  outline: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e0e0e;
-  *background-color: #040404;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-  background-image: -webkit-linear-gradient(top, #151515, #040404);
-  background-image: -o-linear-gradient(top, #151515, #040404);
-  background-image: linear-gradient(to bottom, #151515, #040404);
-  background-image: -moz-linear-gradient(top, #151515, #040404);
-  background-repeat: repeat-x;
-  border-color: #040404 #040404 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #040404;
-  *background-color: #000000;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #000000 \9;
-}
-
-.breadcrumb {
-  padding: 8px 15px;
-  margin: 0 0 20px;
-  list-style: none;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.breadcrumb li {
-  display: inline-block;
-  *display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-
-.breadcrumb .divider {
-  padding: 0 5px;
-  color: #ccc;
-}
-
-.breadcrumb .active {
-  color: #999999;
-}
-
-.pagination {
-  height: 40px;
-  margin: 20px 0;
-}
-
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  margin-left: 0;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination li {
-  display: inline;
-}
-
-.pagination a,
-.pagination span {
-  float: left;
-  padding: 0 14px;
-  line-height: 38px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
-  background-color: #f5f5f5;
-}
-
-.pagination .active a,
-.pagination .active span {
-  color: #999999;
-  cursor: default;
-}
-
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
-  color: #999999;
-  cursor: default;
-  background-color: transparent;
-}
-
-.pagination li:first-child a,
-.pagination li:first-child span {
-  border-left-width: 1px;
-  -webkit-border-radius: 3px 0 0 3px;
-     -moz-border-radius: 3px 0 0 3px;
-          border-radius: 3px 0 0 3px;
-}
-
-.pagination li:last-child a,
-.pagination li:last-child span {
-  -webkit-border-radius: 0 3px 3px 0;
-     -moz-border-radius: 0 3px 3px 0;
-          border-radius: 0 3px 3px 0;
-}
-
-.pagination-centered {
-  text-align: center;
-}
-
-.pagination-right {
-  text-align: right;
-}
-
-.pager {
-  margin: 20px 0;
-  text-align: center;
-  list-style: none;
-  *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.pager:after {
-  clear: both;
-}
-
-.pager li {
-  display: inline;
-}
-
-.pager a {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.pager a:hover {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-
-.pager .next a {
-  float: right;
-}
-
-.pager .previous a {
-  float: left;
-}
-
-.pager .disabled a,
-.pager .disabled a:hover {
-  color: #999999;
-  cursor: default;
-  background-color: #fff;
-}
-
-.modal-open .dropdown-menu {
-  z-index: 2050;
-}
-
-.modal-open .dropdown.open {
-  *z-index: 2050;
-}
-
-.modal-open .popover {
-  z-index: 2060;
-}
-
-.modal-open .tooltip {
-  z-index: 2080;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.modal {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  z-index: 1050;
-  width: 560px;
-  margin: -250px 0 0 -280px;
-  overflow: auto;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-
-.modal.fade {
-  top: -25%;
-  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
-     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
-       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
-          transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
-  top: 50%;
-}
-
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
-  margin-top: 2px;
-}
-
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-
-.modal-body {
-  max-height: 400px;
-  padding: 15px;
-  overflow-y: auto;
-}
-
-.modal-form {
-  margin-bottom: 0;
-}
-
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-     -moz-box-shadow: inset 0 1px 0 #ffffff;
-          box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.modal-footer:after {
-  clear: both;
-}
-
-.modal-footer .btn + .btn {
-  margin-bottom: 0;
-  margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  padding: 5px;
-  font-size: 11px;
-  opacity: 0;
-  filter: alpha(opacity=0);
-  visibility: visible;
-}
-
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.tooltip.top {
-  margin-top: -3px;
-}
-
-.tooltip.right {
-  margin-left: 3px;
-}
-
-.tooltip.bottom {
-  margin-top: 3px;
-}
-
-.tooltip.left {
-  margin-left: -3px;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-top-color: #000000;
-  border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-right-color: #000000;
-  border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-left-color: #000000;
-  border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-bottom-color: #000000;
-  border-width: 0 5px 5px;
-}
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1010;
-  display: none;
-  width: 236px;
-  padding: 1px;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.popover.top {
-  margin-bottom: 10px;
-}
-
-.popover.right {
-  margin-left: 10px;
-}
-
-.popover.bottom {
-  margin-top: 10px;
-}
-
-.popover.left {
-  margin-right: 10px;
-}
-
-.popover-title {
-  padding: 8px 14px;
-  margin: 0;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-     -moz-border-radius: 5px 5px 0 0;
-          border-radius: 5px 5px 0 0;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
-  margin-bottom: 0;
-}
-
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: inline-block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover .arrow:after {
-  z-index: -1;
-  content: "";
-}
-
-.popover.top .arrow {
-  bottom: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-top-color: #ffffff;
-  border-width: 10px 10px 0;
-}
-
-.popover.top .arrow:after {
-  bottom: -1px;
-  left: -11px;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  border-width: 11px 11px 0;
-}
-
-.popover.right .arrow {
-  top: 50%;
-  left: -10px;
-  margin-top: -10px;
-  border-right-color: #ffffff;
-  border-width: 10px 10px 10px 0;
-}
-
-.popover.right .arrow:after {
-  bottom: -11px;
-  left: -1px;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  border-width: 11px 11px 11px 0;
-}
-
-.popover.bottom .arrow {
-  top: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-bottom-color: #ffffff;
-  border-width: 0 10px 10px;
-}
-
-.popover.bottom .arrow:after {
-  top: -1px;
-  left: -11px;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  border-width: 0 11px 11px;
-}
-
-.popover.left .arrow {
-  top: 50%;
-  right: -10px;
-  margin-top: -10px;
-  border-left-color: #ffffff;
-  border-width: 10px 0 10px 10px;
-}
-
-.popover.left .arrow:after {
-  right: -1px;
-  bottom: -11px;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  border-width: 11px 0 11px 11px;
-}
-
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.thumbnails:after {
-  clear: both;
-}
-
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-
-.thumbnails > li {
-  float: left;
-  margin-bottom: 20px;
-  margin-left: 20px;
-}
-
-.thumbnail {
-  display: block;
-  padding: 4px;
-  line-height: 20px;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-     -moz-transition: all 0.2s ease-in-out;
-       -o-transition: all 0.2s ease-in-out;
-          transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover {
-  border-color: #0088cc;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.thumbnail .caption {
-  padding: 9px;
-  color: #555555;
-}
-
-.label,
-.badge {
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  white-space: nowrap;
-  vertical-align: baseline;
-  background-color: #999999;
-}
-
-.label {
-  padding: 1px 4px 2px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.badge {
-  padding: 1px 9px 2px;
-  -webkit-border-radius: 9px;
-     -moz-border-radius: 9px;
-          border-radius: 9px;
-}
-
-a.label:hover,
-a.badge:hover {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
-
- at -webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
- at -moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
- at -ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
- at -o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
-
- at keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-.progress {
-  height: 20px;
-  margin-bottom: 20px;
-  overflow: hidden;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
-  float: left;
-  width: 0;
-  height: 100%;
-  font-size: 12px;
-  color: #ffffff;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-     -moz-transition: width 0.6s ease;
-       -o-transition: width 0.6s ease;
-          transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-     -moz-background-size: 40px 40px;
-       -o-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-     -moz-animation: progress-bar-stripes 2s linear infinite;
-      -ms-animation: progress-bar-stripes 2s linear infinite;
-       -o-animation: progress-bar-stripes 2s linear infinite;
-          animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.accordion {
-  margin-bottom: 20px;
-}
-
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-}
-
-.accordion-heading {
-  border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-
-.accordion-toggle {
-  cursor: pointer;
-}
-
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
-  position: relative;
-  margin-bottom: 20px;
-  line-height: 1;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel .item {
-  position: relative;
-  display: none;
-  -webkit-transition: 0.6s ease-in-out left;
-     -moz-transition: 0.6s ease-in-out left;
-       -o-transition: 0.6s ease-in-out left;
-          transition: 0.6s ease-in-out left;
-}
-
-.carousel .item > img {
-  display: block;
-  line-height: 1;
-}
-
-.carousel .active,
-.carousel .next,
-.carousel .prev {
-  display: block;
-}
-
-.carousel .active {
-  left: 0;
-}
-
-.carousel .next,
-.carousel .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-
-.carousel .next {
-  left: 100%;
-}
-
-.carousel .prev {
-  left: -100%;
-}
-
-.carousel .next.left,
-.carousel .prev.right {
-  left: 0;
-}
-
-.carousel .active.left {
-  left: -100%;
-}
-
-.carousel .active.right {
-  left: 100%;
-}
-
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-     -moz-border-radius: 23px;
-          border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
-  right: 15px;
-  left: auto;
-}
-
-.carousel-control:hover {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
-  line-height: 20px;
-  color: #ffffff;
-}
-
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-
-.carousel-caption p {
-  margin-bottom: 0;
-}
-
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  letter-spacing: -1px;
-  color: inherit;
-}
-
-.hero-unit p {
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 30px;
-  color: inherit;
-}
-
-.pull-right {
-  float: right;
-}
-
-.pull-left {
-  float: left;
-}
-
-.hide {
-  display: none;
-}
-
-.show {
-  display: block;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-.affix {
-  position: fixed;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.min.css b/doc/_themes/bootstrap/static/bootstrap-default.min.css
deleted file mode 100644
index 3119038..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-default.min.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:- [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-dropdown.js b/doc/_themes/bootstrap/static/bootstrap-dropdown.js
deleted file mode 100644
index 15f4677..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-dropdown.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ============================================================
- * bootstrap-dropdown.js v2.0.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdown
- * ============================================================
- * Copyright 2011 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function( $ ){
-
-  "use strict"
-
- /* DROPDOWN CLASS DEFINITION
-  * ========================= */
-
-  var toggle = '[data-toggle="dropdown"]'
-    , Dropdown = function ( element ) {
-        $(element).bind('click', this.toggle)
-      }
-
-  Dropdown.prototype = {
-
-    constructor: Dropdown
-
-  , toggle: function ( e ) {
-      var $this = $(this)
-        , selector = $this.attr('data-target') || $this.attr('href')
-        , $parent = $(selector)
-
-      $parent.length || ($parent = $this.parent())
-
-      clearMenus()
-
-      !$parent.hasClass('open') && $parent.toggleClass('open')
-
-      return false
-    }
-
-  }
-
-  function clearMenus() {
-    $(toggle).parent().removeClass('open')
-  }
-
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  $.fn.dropdown = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('dropdown')
-      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  $(function () {
-    $('html').on('click.dropdown.data-api', clearMenus)
-    $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
-  })
-
-}( window.jQuery )
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.css
deleted file mode 100755
index 0cc15fd..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-engineauth.css
+++ /dev/null
@@ -1,5700 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-.clearfix {
-  *zoom: 1;
-}
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.clearfix:after {
-  clear: both;
-}
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-audio:not([controls]) {
-  display: none;
-}
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-  -ms-text-size-adjust: 100%;
-}
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-a:hover,
-a:active {
-  outline: 0;
-}
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  max-width: 100%;
-  height: auto;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-#map_canvas img {
-  max-width: none;
-}
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-body {
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  background-color: #ffffff;
-}
-a {
-  color: #0e84b5;
-  text-decoration: none;
-}
-a:hover {
-  color: #f26a1e;
-  text-decoration: underline;
-}
-.img-rounded {
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-.img-circle {
-  -webkit-border-radius: 500px;
-  -moz-border-radius: 500px;
-  border-radius: 500px;
-}
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-.row:before,
-.row:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.row:after {
-  clear: both;
-}
-[class*="span"] {
-  float: left;
-  margin-left: 20px;
-}
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-.span12 {
-  width: 940px;
-}
-.span11 {
-  width: 860px;
-}
-.span10 {
-  width: 780px;
-}
-.span9 {
-  width: 700px;
-}
-.span8 {
-  width: 620px;
-}
-.span7 {
-  width: 540px;
-}
-.span6 {
-  width: 460px;
-}
-.span5 {
-  width: 380px;
-}
-.span4 {
-  width: 300px;
-}
-.span3 {
-  width: 220px;
-}
-.span2 {
-  width: 140px;
-}
-.span1 {
-  width: 60px;
-}
-.offset12 {
-  margin-left: 980px;
-}
-.offset11 {
-  margin-left: 900px;
-}
-.offset10 {
-  margin-left: 820px;
-}
-.offset9 {
-  margin-left: 740px;
-}
-.offset8 {
-  margin-left: 660px;
-}
-.offset7 {
-  margin-left: 580px;
-}
-.offset6 {
-  margin-left: 500px;
-}
-.offset5 {
-  margin-left: 420px;
-}
-.offset4 {
-  margin-left: 340px;
-}
-.offset3 {
-  margin-left: 260px;
-}
-.offset2 {
-  margin-left: 180px;
-}
-.offset1 {
-  margin-left: 100px;
-}
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.row-fluid:after {
-  clear: both;
-}
-.row-fluid [class*="span"] {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  float: left;
-  margin-left: 2.127659574468085%;
-  *margin-left: 2.074468085106383%;
-}
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-.row-fluid .span10 {
-  width: 82.97872340425532%;
-  *width: 82.92553191489361%;
-}
-.row-fluid .span9 {
-  width: 74.46808510638297%;
-  *width: 74.41489361702126%;
-}
-.row-fluid .span8 {
-  width: 65.95744680851064%;
-  *width: 65.90425531914893%;
-}
-.row-fluid .span7 {
-  width: 57.44680851063829%;
-  *width: 57.39361702127659%;
-}
-.row-fluid .span6 {
-  width: 48.93617021276595%;
-  *width: 48.88297872340425%;
-}
-.row-fluid .span5 {
-  width: 40.42553191489362%;
-  *width: 40.37234042553192%;
-}
-.row-fluid .span4 {
-  width: 31.914893617021278%;
-  *width: 31.861702127659576%;
-}
-.row-fluid .span3 {
-  width: 23.404255319148934%;
-  *width: 23.351063829787233%;
-}
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-.container:before,
-.container:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.container:after {
-  clear: both;
-}
-.container-fluid {
-  padding-right: 20px;
-  padding-left: 20px;
-  *zoom: 1;
-}
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.container-fluid:after {
-  clear: both;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 20px;
-  font-weight: 200;
-  line-height: 30px;
-}
-small {
-  font-size: 85%;
-}
-strong {
-  font-weight: bold;
-}
-em {
-  font-style: italic;
-}
-cite {
-  font-style: normal;
-}
-.muted {
-  color: #999999;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 10px 0;
-  font-family: inherit;
-  font-weight: normal;
-  line-height: 1;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-h1 {
-  font-size: 36px;
-  line-height: 40px;
-}
-h2 {
-  font-size: 30px;
-  line-height: 40px;
-}
-h3 {
-  font-size: 24px;
-  line-height: 40px;
-}
-h4 {
-  font-size: 18px;
-  line-height: 20px;
-}
-h5 {
-  font-size: 14px;
-  line-height: 20px;
-}
-h6 {
-  font-size: 12px;
-  line-height: 20px;
-}
-h1 small {
-  font-size: 24px;
-}
-h2 small {
-  font-size: 18px;
-}
-h3 small {
-  font-size: 14px;
-}
-h4 small {
-  font-size: 14px;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 20px 0 30px;
-  border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 10px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-li {
-  line-height: 20px;
-}
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-dl {
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 20px;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 10px;
-}
-.dl-horizontal dt {
-  float: left;
-  width: 120px;
-  clear: left;
-  text-align: right;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.dl-horizontal dd {
-  margin-left: 130px;
-}
-hr {
-  margin: 20px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-abbr[title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 20px;
-  border-left: 5px solid #eeeeee;
-}
-blockquote p {
-  margin-bottom: 0;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 25px;
-}
-blockquote small {
-  display: block;
-  line-height: 20px;
-  color: #999999;
-}
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-blockquote.pull-right small:before {
-  content: '';
-}
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-address {
-  display: block;
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 20px;
-}
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 12px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-code {
-  padding: 2px 4px;
-  color: #d14;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 20px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-pre.prettyprint {
-  margin-bottom: 20px;
-}
-pre code {
-  padding: 0;
-  color: inherit;
-  background-color: transparent;
-  border: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-.label,
-.badge {
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  vertical-align: baseline;
-  white-space: nowrap;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #999999;
-}
-.label {
-  padding: 1px 4px 2px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.badge {
-  padding: 1px 9px 2px;
-  -webkit-border-radius: 9px;
-  -moz-border-radius: 9px;
-  border-radius: 9px;
-}
-a.label:hover,
-a.badge:hover {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
-table {
-  max-width: 100%;
-  background-color: transparent;
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-.table {
-  width: 100%;
-  margin-bottom: 20px;
-}
-.table th,
-.table td {
-  padding: 8px;
-  line-height: 20px;
-  text-align: left;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-.table th {
-  font-weight: bold;
-}
-.table thead th {
-  vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-  border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-  border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
-  -webkit-border-radius: 0 0 0 4px;
-  -moz-border-radius: 0 0 0 4px;
-  border-radius: 0 0 0 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 4px;
-  border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-  border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-  border-top-right-radius: 4px;
-  -moz-border-right-topleft: 4px;
-}
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
-  background-color: #f9f9f9;
-}
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
-  background-color: #f5f5f5;
-}
-table [class*=span],
-.row-fluid table [class*=span] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-table .span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-table .span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-table .span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-table .span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-table .span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-table .span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-table .span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-table .span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-table .span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-table .span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-table .span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-table .span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-table .span13 {
-  float: none;
-  width: 1004px;
-  margin-left: 0;
-}
-table .span14 {
-  float: none;
-  width: 1084px;
-  margin-left: 0;
-}
-table .span15 {
-  float: none;
-  width: 1164px;
-  margin-left: 0;
-}
-table .span16 {
-  float: none;
-  width: 1244px;
-  margin-left: 0;
-}
-table .span17 {
-  float: none;
-  width: 1324px;
-  margin-left: 0;
-}
-table .span18 {
-  float: none;
-  width: 1404px;
-  margin-left: 0;
-}
-table .span19 {
-  float: none;
-  width: 1484px;
-  margin-left: 0;
-}
-table .span20 {
-  float: none;
-  width: 1564px;
-  margin-left: 0;
-}
-table .span21 {
-  float: none;
-  width: 1644px;
-  margin-left: 0;
-}
-table .span22 {
-  float: none;
-  width: 1724px;
-  margin-left: 0;
-}
-table .span23 {
-  float: none;
-  width: 1804px;
-  margin-left: 0;
-}
-table .span24 {
-  float: none;
-  width: 1884px;
-  margin-left: 0;
-}
-.table tbody tr.success td {
-  background-color: #dff0d8;
-}
-.table tbody tr.error td {
-  background-color: #f2dede;
-}
-.table tbody tr.info td {
-  background-color: #d9edf7;
-}
-form {
-  margin: 0 0 20px;
-}
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: 40px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-legend small {
-  font-size: 15px;
-  color: #999999;
-}
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-}
-input,
-button,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 20px;
-  padding: 4px 6px;
-  margin-bottom: 9px;
-  font-size: 14px;
-  line-height: 20px;
-  color: #555555;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-input,
-textarea {
-  width: 210px;
-}
-textarea {
-  height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear .2s, box-shadow linear .2s;
-  -moz-transition: border linear .2s, box-shadow linear .2s;
-  -o-transition: border linear .2s, box-shadow linear .2s;
-  transition: border linear .2s, box-shadow linear .2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-}
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  *margin-top: 0;
-  /* IE7 */
-
-  margin-top: 1px \9;
-  /* IE8-9 */
-
-  line-height: normal;
-  cursor: pointer;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-select,
-input[type="file"] {
-  height: 30px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 30px;
-}
-select {
-  width: 220px;
-  border: 1px solid #bbb;
-  background-color: #ffffff;
-}
-select[multiple],
-select[size] {
-  height: auto;
-}
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  cursor: not-allowed;
-}
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-.radio,
-.checkbox {
-  min-height: 18px;
-  padding-left: 18px;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-  margin-left: -18px;
-}
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-.input-mini {
-  width: 60px;
-}
-.input-small {
-  width: 90px;
-}
-.input-medium {
-  width: 150px;
-}
-.input-large {
-  width: 210px;
-}
-.input-xlarge {
-  width: 270px;
-}
-.input-xxlarge {
-  width: 530px;
-}
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-input.span12, textarea.span12, .uneditable-input.span12 {
-  width: 926px;
-}
-input.span11, textarea.span11, .uneditable-input.span11 {
-  width: 846px;
-}
-input.span10, textarea.span10, .uneditable-input.span10 {
-  width: 766px;
-}
-input.span9, textarea.span9, .uneditable-input.span9 {
-  width: 686px;
-}
-input.span8, textarea.span8, .uneditable-input.span8 {
-  width: 606px;
-}
-input.span7, textarea.span7, .uneditable-input.span7 {
-  width: 526px;
-}
-input.span6, textarea.span6, .uneditable-input.span6 {
-  width: 446px;
-}
-input.span5, textarea.span5, .uneditable-input.span5 {
-  width: 366px;
-}
-input.span4, textarea.span4, .uneditable-input.span4 {
-  width: 286px;
-}
-input.span3, textarea.span3, .uneditable-input.span3 {
-  width: 206px;
-}
-input.span2, textarea.span2, .uneditable-input.span2 {
-  width: 126px;
-}
-input.span1, textarea.span1, .uneditable-input.span1 {
-  width: 46px;
-}
-.controls-row {
-  *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.controls-row:after {
-  clear: both;
-}
-.controls-row [class*="span"] {
-  float: left;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-.form-actions {
-  padding: 19px 20px 20px;
-  margin-top: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.form-actions:after {
-  clear: both;
-}
-.help-block,
-.help-inline {
-  color: #595959;
-}
-.help-block {
-  display: block;
-  margin-bottom: 10px;
-}
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  vertical-align: middle;
-  padding-left: 5px;
-}
-.input-append,
-.input-prepend {
-  margin-bottom: 5px;
-  font-size: 0;
-  white-space: nowrap;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  font-size: 14px;
-  vertical-align: top;
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 20px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
-  margin-left: -1px;
-  vertical-align: top;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.input-append .active,
-.input-prepend .active {
-  background-color: #a9dba9;
-  border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-/* Allow for input prepend/append in search forms */
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-  -moz-border-radius: 14px 0 0 14px;
-  border-radius: 14px 0 0 14px;
-}
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-  -moz-border-radius: 0 14px 14px 0;
-  border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-  -moz-border-radius: 0 14px 14px 0;
-  border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-  -moz-border-radius: 14px 0 0 14px;
-  border-radius: 14px 0 0 14px;
-}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-.control-group {
-  margin-bottom: 10px;
-}
-legend + .control-group {
-  margin-top: 20px;
-  -webkit-margin-top-collapse: separate;
-}
-.form-horizontal .control-group {
-  margin-bottom: 20px;
-  *zoom: 1;
-}
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.form-horizontal .control-group:after {
-  clear: both;
-}
-.form-horizontal .control-label {
-  float: left;
-  width: 140px;
-  padding-top: 5px;
-  text-align: right;
-}
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 160px;
-  *margin-left: 0;
-}
-.form-horizontal .controls:first-child {
-  *padding-left: 160px;
-}
-.form-horizontal .help-block {
-  margin-top: 10px;
-  margin-bottom: 0;
-}
-.form-horizontal .form-actions {
-  padding-left: 160px;
-}
-.btn {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-  color: #333333;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  background-color: #f5f5f5;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #e6e6e6;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  border: 1px solid #bbbbbb;
-  *border: 0;
-  border-bottom-color: #a2a2a2;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  *margin-left: .3em;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-.btn:first-child {
-  *margin-left: 0;
-}
-.btn:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-  /* Buttons in IE7 don't get borders, so darken on hover */
-
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-  -moz-transition: background-position 0.1s linear;
-  -o-transition: background-position 0.1s linear;
-  transition: background-position 0.1s linear;
-}
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
-  background-color: #e6e6e6;
-  background-color: #d9d9d9 \9;
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-color: #e6e6e6;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn-large {
-  padding: 9px 14px;
-  font-size: 16px;
-  line-height: normal;
-  -webkit-border-radius: 5px;
-  -moz-border-radius: 5px;
-  border-radius: 5px;
-}
-.btn-large [class^="icon-"] {
-  margin-top: 2px;
-}
-.btn-small {
-  padding: 3px 9px;
-  font-size: 12px;
-  line-height: 18px;
-}
-.btn-small [class^="icon-"] {
-  margin-top: 0;
-}
-.btn-mini {
-  padding: 2px 6px;
-  font-size: 11px;
-  line-height: 16px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-left: 0;
-  padding-right: 0;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-.btn {
-  border-color: #c5c5c5;
-  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e6eb5;
-  background-image: -moz-linear-gradient(top, #0e84b5, #0e4cb5);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));
-  background-image: -webkit-linear-gradient(top, #0e84b5, #0e4cb5);
-  background-image: -o-linear-gradient(top, #0e84b5, #0e4cb5);
-  background-image: linear-gradient(to bottom, #0e84b5, #0e4cb5);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0e4cb5', GradientType=0);
-  border-color: #0e4cb5 #0e4cb5 #092e6e;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #0e4cb5;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #0e4cb5;
-  *background-color: #0c429d;
-}
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #0a3886 \9;
-}
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #f89406;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #bd362f;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #51a351;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #2f96b4;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #222222;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-.btn-link,
-.btn-link:active {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn-link {
-  border-color: transparent;
-  cursor: pointer;
-  color: #0e84b5;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-link:hover {
-  color: #f26a1e;
-  text-decoration: underline;
-  background-color: transparent;
-}
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-  margin-top: 1px;
-}
-/* White icons with optional class, or on hover/active states of certain elements */
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-.icon-glass {
-  background-position: 0      0;
-}
-.icon-music {
-  background-position: -24px 0;
-}
-.icon-search {
-  background-position: -48px 0;
-}
-.icon-envelope {
-  background-position: -72px 0;
-}
-.icon-heart {
-  background-position: -96px 0;
-}
-.icon-star {
-  background-position: -120px 0;
-}
-.icon-star-empty {
-  background-position: -144px 0;
-}
-.icon-user {
-  background-position: -168px 0;
-}
-.icon-film {
-  background-position: -192px 0;
-}
-.icon-th-large {
-  background-position: -216px 0;
-}
-.icon-th {
-  background-position: -240px 0;
-}
-.icon-th-list {
-  background-position: -264px 0;
-}
-.icon-ok {
-  background-position: -288px 0;
-}
-.icon-remove {
-  background-position: -312px 0;
-}
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-.icon-off {
-  background-position: -384px 0;
-}
-.icon-signal {
-  background-position: -408px 0;
-}
-.icon-cog {
-  background-position: -432px 0;
-}
-.icon-trash {
-  background-position: -456px 0;
-}
-.icon-home {
-  background-position: 0 -24px;
-}
-.icon-file {
-  background-position: -24px -24px;
-}
-.icon-time {
-  background-position: -48px -24px;
-}
-.icon-road {
-  background-position: -72px -24px;
-}
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-.icon-download {
-  background-position: -120px -24px;
-}
-.icon-upload {
-  background-position: -144px -24px;
-}
-.icon-inbox {
-  background-position: -168px -24px;
-}
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-.icon-repeat {
-  background-position: -216px -24px;
-}
-.icon-refresh {
-  background-position: -240px -24px;
-}
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-.icon-lock {
-  background-position: -287px -24px;
-}
-.icon-flag {
-  background-position: -312px -24px;
-}
-.icon-headphones {
-  background-position: -336px -24px;
-}
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-.icon-barcode {
-  background-position: -456px -24px;
-}
-.icon-tag {
-  background-position: 0 -48px;
-}
-.icon-tags {
-  background-position: -25px -48px;
-}
-.icon-book {
-  background-position: -48px -48px;
-}
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-.icon-print {
-  background-position: -96px -48px;
-}
-.icon-camera {
-  background-position: -120px -48px;
-}
-.icon-font {
-  background-position: -144px -48px;
-}
-.icon-bold {
-  background-position: -167px -48px;
-}
-.icon-italic {
-  background-position: -192px -48px;
-}
-.icon-text-height {
-  background-position: -216px -48px;
-}
-.icon-text-width {
-  background-position: -240px -48px;
-}
-.icon-align-left {
-  background-position: -264px -48px;
-}
-.icon-align-center {
-  background-position: -288px -48px;
-}
-.icon-align-right {
-  background-position: -312px -48px;
-}
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-.icon-list {
-  background-position: -360px -48px;
-}
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-.icon-picture {
-  background-position: -456px -48px;
-}
-.icon-pencil {
-  background-position: 0 -72px;
-}
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-.icon-adjust {
-  background-position: -48px -72px;
-}
-.icon-tint {
-  background-position: -72px -72px;
-}
-.icon-edit {
-  background-position: -96px -72px;
-}
-.icon-share {
-  background-position: -120px -72px;
-}
-.icon-check {
-  background-position: -144px -72px;
-}
-.icon-move {
-  background-position: -168px -72px;
-}
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-.icon-backward {
-  background-position: -240px -72px;
-}
-.icon-play {
-  background-position: -264px -72px;
-}
-.icon-pause {
-  background-position: -288px -72px;
-}
-.icon-stop {
-  background-position: -312px -72px;
-}
-.icon-forward {
-  background-position: -336px -72px;
-}
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-.icon-eject {
-  background-position: -408px -72px;
-}
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-.icon-plus {
-  background-position: -408px -96px;
-}
-.icon-minus {
-  background-position: -433px -96px;
-}
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-.icon-gift {
-  background-position: -24px -120px;
-}
-.icon-leaf {
-  background-position: -48px -120px;
-}
-.icon-fire {
-  background-position: -72px -120px;
-}
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-.icon-plane {
-  background-position: -168px -120px;
-}
-.icon-calendar {
-  background-position: -192px -120px;
-}
-.icon-random {
-  background-position: -216px -120px;
-  width: 16px;
-}
-.icon-comment {
-  background-position: -240px -120px;
-}
-.icon-magnet {
-  background-position: -264px -120px;
-}
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-.icon-retweet {
-  background-position: -336px -120px;
-}
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-.icon-folder-close {
-  background-position: -384px -120px;
-}
-.icon-folder-open {
-  background-position: -408px -120px;
-  width: 16px;
-}
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-.icon-hdd {
-  background-position: 0 -144px;
-}
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-.icon-bell {
-  background-position: -48px -144px;
-}
-.icon-certificate {
-  background-position: -72px -144px;
-}
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-.icon-globe {
-  background-position: -336px -144px;
-}
-.icon-wrench {
-  background-position: -360px -144px;
-}
-.icon-tasks {
-  background-position: -384px -144px;
-}
-.icon-filter {
-  background-position: -408px -144px;
-}
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-.btn-group {
-  position: relative;
-  font-size: 0;
-  white-space: nowrap;
-  *margin-left: .3em;
-}
-.btn-group:first-child {
-  *margin-left: 0;
-}
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-.btn-toolbar {
-  font-size: 0;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.btn-toolbar .btn-group {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
-  margin-left: 5px;
-}
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
-  font-size: 14px;
-}
-.btn-group > .btn-mini {
-  font-size: 11px;
-}
-.btn-group > .btn-small {
-  font-size: 12px;
-}
-.btn-group > .btn-large {
-  font-size: 16px;
-}
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  -webkit-border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-  border-top-left-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  border-bottom-left-radius: 4px;
-}
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-  -webkit-border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  border-bottom-right-radius: 4px;
-}
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-  -webkit-border-top-left-radius: 6px;
-  -moz-border-radius-topleft: 6px;
-  border-top-left-radius: 6px;
-  -webkit-border-bottom-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  border-bottom-left-radius: 6px;
-}
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-  -webkit-border-top-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-  -moz-border-radius-bottomright: 6px;
-  border-bottom-right-radius: 6px;
-}
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  *padding-top: 5px;
-  *padding-bottom: 5px;
-}
-.btn-group > .btn-mini + .dropdown-toggle {
-  padding-left: 5px;
-  padding-right: 5px;
-  *padding-top: 2px;
-  *padding-bottom: 2px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #0e4cb5;
-}
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #bd362f;
-}
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #51a351;
-}
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #2f96b4;
-}
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #222222;
-}
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
-  margin-top: 6px;
-}
-.btn-large .caret {
-  border-left-width: 5px;
-  border-right-width: 5px;
-  border-top-width: 5px;
-}
-.dropup .btn-large .caret {
-  border-bottom: 5px solid #000000;
-  border-top: 0;
-}
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-.btn-group-vertical .btn {
-  display: block;
-  float: none;
-  width: 100%;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-group-vertical .btn + .btn {
-  margin-left: 0;
-  margin-top: -1px;
-}
-.btn-group-vertical .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  border-radius: 4px 4px 0 0;
-}
-.btn-group-vertical .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius: 0 0 4px 4px;
-  border-radius: 0 0 4px 4px;
-}
-.btn-group-vertical .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-  -moz-border-radius: 6px 6px 0 0;
-  border-radius: 6px 6px 0 0;
-}
-.btn-group-vertical .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-}
-.nav {
-  margin-left: 0;
-  margin-bottom: 20px;
-  list-style: none;
-}
-.nav > li > a {
-  display: block;
-}
-.nav > li > a:hover {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-.nav > .pull-right {
-  float: right;
-}
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-.nav-list {
-  padding-left: 15px;
-  padding-right: 15px;
-  margin-bottom: 0;
-}
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-left: -15px;
-  margin-right: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #0e84b5;
-}
-.nav-list [class^="icon-"] {
-  margin-right: 2px;
-}
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-.nav-tabs > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  line-height: 20px;
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
-  color: #555555;
-  background-color: #ffffff;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-  cursor: default;
-}
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  -webkit-border-radius: 5px;
-  -moz-border-radius: 5px;
-  border-radius: 5px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
-  color: #ffffff;
-  background-color: #0e84b5;
-}
-.nav-stacked > li {
-  float: none;
-}
-.nav-stacked > li > a {
-  margin-right: 0;
-}
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  border-top-right-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-  border-top-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  border-bottom-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li > a:hover {
-  border-color: #ddd;
-  z-index: 2;
-}
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-}
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.nav .dropdown-toggle .caret {
-  border-top-color: #0e84b5;
-  border-bottom-color: #0e84b5;
-  margin-top: 6px;
-}
-.nav .dropdown-toggle:hover .caret {
-  border-top-color: #f26a1e;
-  border-bottom-color: #f26a1e;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover {
-  cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover {
-  border-color: #999999;
-}
-.tabbable {
-  *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.tabbable:after {
-  clear: both;
-}
-.tab-content {
-  overflow: auto;
-}
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius: 0 0 4px 4px;
-  border-radius: 0 0 4px 4px;
-}
-.tabs-below > .nav-tabs > li > a:hover {
-  border-bottom-color: transparent;
-  border-top-color: #ddd;
-}
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
-  border-color: transparent #ddd #ddd #ddd;
-}
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 19px;
-  border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -moz-border-radius: 4px 0 0 4px;
-  border-radius: 4px 0 0 4px;
-}
-.tabs-left > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-  -moz-border-radius: 0 4px 4px 0;
-  border-radius: 0 4px 4px 0;
-}
-.tabs-right > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
-  color: #999999;
-}
-.nav > .disabled > a:hover {
-  text-decoration: none;
-  background-color: transparent;
-  cursor: default;
-}
-.navbar {
-  overflow: visible;
-  margin-bottom: 20px;
-  color: #0e84b5;
-  *position: relative;
-  *z-index: 2;
-}
-.navbar-inner {
-  min-height: 40px;
-  padding-left: 20px;
-  padding-right: 20px;
-  background-color: #ffffff;
-  background-image: -moz-linear-gradient(top, #ffffff, #ffffff);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));
-  background-image: -webkit-linear-gradient(top, #ffffff, #ffffff);
-  background-image: -o-linear-gradient(top, #ffffff, #ffffff);
-  background-image: linear-gradient(to bottom, #ffffff, #ffffff);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffffff', GradientType=0);
-  border: 1px solid #e0e0e0;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-.navbar .container {
-  width: auto;
-}
-.nav-collapse.collapse {
-  height: auto;
-}
-.navbar .brand {
-  float: left;
-  display: block;
-  padding: 10px 20px 10px;
-  margin-left: -20px;
-  font-size: 20px;
-  font-weight: 200;
-  color: #0e84b5;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.navbar .brand:hover {
-  text-decoration: none;
-}
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 40px;
-}
-.navbar-link {
-  color: #0e84b5;
-}
-.navbar-link:hover {
-  color: #f26a1e;
-}
-.navbar .divider-vertical {
-  height: 40px;
-  margin: 0 9px;
-  border-left: 1px solid #ffffff;
-  border-right: 1px solid #ffffff;
-}
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 6px;
-}
-.navbar .btn-group .btn {
-  margin: 0;
-}
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.navbar-form:after {
-  clear: both;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 5px;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 6px;
-  white-space: nowrap;
-}
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-.navbar-search .search-query {
-  margin-bottom: 0;
-  padding: 4px 14px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-.navbar-static-top {
-  position: static;
-  width: 100%;
-  margin-bottom: 0;
-}
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-left: 0;
-  padding-right: 0;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-.navbar-fixed-top {
-  top: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-  -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-  box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-  -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-  box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-}
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
-  float: right;
-}
-.navbar .nav > li {
-  float: left;
-}
-.navbar .nav > li > a {
-  float: none;
-  padding: 10px 15px 10px;
-  color: #0e84b5;
-  text-decoration: none;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  background-color: transparent;
-  color: #f26a1e;
-  text-decoration: none;
-}
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #f26a1e;
-  text-decoration: none;
-  background-color: #f2f2f2;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-left: 5px;
-  margin-right: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #f2f2f2;
-  background-image: -moz-linear-gradient(top, #f2f2f2, #f2f2f2);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));
-  background-image: -webkit-linear-gradient(top, #f2f2f2, #f2f2f2);
-  background-image: -o-linear-gradient(top, #f2f2f2, #f2f2f2);
-  background-image: linear-gradient(to bottom, #f2f2f2, #f2f2f2);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#fff2f2f2', GradientType=0);
-  border-color: #f2f2f2 #f2f2f2 #cccccc;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #f2f2f2;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #f2f2f2;
-  *background-color: #e5e5e5;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #d9d9d9 \9;
-}
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-  -moz-border-radius: 1px;
-  border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
-  content: '';
-  display: inline-block;
-  border-left: 7px solid transparent;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  position: absolute;
-  top: -7px;
-  left: 9px;
-}
-.navbar .nav > li > .dropdown-menu:after {
-  content: '';
-  display: inline-block;
-  border-left: 6px solid transparent;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  position: absolute;
-  top: -6px;
-  left: 10px;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  border-top: 7px solid #ccc;
-  border-top-color: rgba(0, 0, 0, 0.2);
-  border-bottom: 0;
-  bottom: -7px;
-  top: auto;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  border-top: 6px solid #ffffff;
-  border-bottom: 0;
-  bottom: -6px;
-  top: auto;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  background-color: #f2f2f2;
-  color: #f26a1e;
-}
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #0e84b5;
-  border-bottom-color: #0e84b5;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #f26a1e;
-  border-bottom-color: #f26a1e;
-}
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  left: auto;
-  right: 0;
-}
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  left: auto;
-  right: 12px;
-}
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  left: auto;
-  right: 13px;
-}
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  left: auto;
-  right: 100%;
-  margin-left: 0;
-  margin-right: -1px;
-  -webkit-border-radius: 6px 0 6px 6px;
-  -moz-border-radius: 6px 0 6px 6px;
-  border-radius: 6px 0 6px 6px;
-}
-.navbar-inverse {
-  color: #999999;
-}
-.navbar-inverse .navbar-inner {
-  background-color: #1b1b1b;
-  background-image: -moz-linear-gradient(top, #222222, #111111);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-  background-image: -webkit-linear-gradient(top, #222222, #111111);
-  background-image: -o-linear-gradient(top, #222222, #111111);
-  background-image: linear-gradient(to bottom, #222222, #111111);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-  border-color: #252525;
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  background-color: transparent;
-  color: #ffffff;
-}
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #111111;
-}
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
-  border-left-color: #111111;
-  border-right-color: #222222;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  background-color: #111111;
-  color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #515151;
-  border-color: #111111;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  -webkit-transition: none;
-  -moz-transition: none;
-  -o-transition: none;
-  transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  outline: 0;
-}
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e0e0e;
-  background-image: -moz-linear-gradient(top, #151515, #040404);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-  background-image: -webkit-linear-gradient(top, #151515, #040404);
-  background-image: -o-linear-gradient(top, #151515, #040404);
-  background-image: linear-gradient(to bottom, #151515, #040404);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-  border-color: #040404 #040404 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #040404;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #040404;
-  *background-color: #000000;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #000000 \9;
-}
-.breadcrumb {
-  padding: 8px 15px;
-  margin: 0 0 20px;
-  list-style: none;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.breadcrumb li {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  text-shadow: 0 1px 0 #ffffff;
-}
-.breadcrumb .divider {
-  padding: 0 5px;
-  color: #ccc;
-}
-.breadcrumb .active {
-  color: #999999;
-}
-.pagination {
-  height: 40px;
-  margin: 20px 0;
-}
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  margin-left: 0;
-  margin-bottom: 0;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
-  display: inline;
-}
-.pagination a,
-.pagination span {
-  float: left;
-  padding: 0 14px;
-  line-height: 38px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
-  background-color: #f5f5f5;
-}
-.pagination .active a,
-.pagination .active span {
-  color: #999999;
-  cursor: default;
-}
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
-  color: #999999;
-  background-color: transparent;
-  cursor: default;
-}
-.pagination li:first-child a,
-.pagination li:first-child span {
-  border-left-width: 1px;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.pagination li:last-child a,
-.pagination li:last-child span {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.pagination-centered {
-  text-align: center;
-}
-.pagination-right {
-  text-align: right;
-}
-.pager {
-  margin: 20px 0;
-  list-style: none;
-  text-align: center;
-  *zoom: 1;
-}
-.pager:before,
-.pager:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.pager:after {
-  clear: both;
-}
-.pager li {
-  display: inline;
-}
-.pager a {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-.pager a:hover {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-.pager .next a {
-  float: right;
-}
-.pager .previous a {
-  float: left;
-}
-.pager .disabled a,
-.pager .disabled a:hover {
-  color: #999999;
-  background-color: #fff;
-  cursor: default;
-}
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.thumbnails:after {
-  clear: both;
-}
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-.thumbnails > li {
-  float: left;
-  margin-bottom: 20px;
-  margin-left: 20px;
-}
-.thumbnail {
-  display: block;
-  padding: 4px;
-  line-height: 20px;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-  -moz-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover {
-  border-color: #0e84b5;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-left: auto;
-  margin-right: auto;
-}
-.thumbnail .caption {
-  padding: 9px;
-  color: #555555;
-}
-.alert {
-  padding: 8px 35px 8px 14px;
-  margin-bottom: 20px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  color: #c09853;
-}
-.alert h4 {
-  margin: 0;
-}
-.alert .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  line-height: 20px;
-}
-.alert-success {
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-  color: #468847;
-}
-.alert-danger,
-.alert-error {
-  background-color: #f2dede;
-  border-color: #eed3d7;
-  color: #b94a48;
-}
-.alert-info {
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-  color: #3a87ad;
-}
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-.alert-block p + p {
-  margin-top: 5px;
-}
- at -webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
- at keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-.progress {
-  overflow: hidden;
-  height: 20px;
-  margin-bottom: 20px;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.progress .bar {
-  width: 0%;
-  height: 100%;
-  color: #ffffff;
-  float: left;
-  font-size: 12px;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-  -moz-transition: width 0.6s ease;
-  -o-transition: width 0.6s ease;
-  transition: width 0.6s ease;
-}
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-}
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-  -moz-background-size: 40px 40px;
-  -o-background-size: 40px 40px;
-  background-size: 40px 40px;
-}
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-  -moz-animation: progress-bar-stripes 2s linear infinite;
-  -ms-animation: progress-bar-stripes 2s linear infinite;
-  -o-animation: progress-bar-stripes 2s linear infinite;
-  animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  color: inherit;
-  letter-spacing: -1px;
-}
-.hero-unit p {
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 30px;
-  color: inherit;
-}
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  visibility: visible;
-  padding: 5px;
-  font-size: 11px;
-  opacity: 0;
-  filter: alpha(opacity=0);
-}
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-.tooltip.top {
-  margin-top: -3px;
-}
-.tooltip.right {
-  margin-left: 3px;
-}
-.tooltip.bottom {
-  margin-top: 3px;
-}
-.tooltip.left {
-  margin-left: -3px;
-}
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-width: 5px 5px 5px 0;
-  border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000000;
-}
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1010;
-  display: none;
-  width: 236px;
-  padding: 1px;
-  background-color: #ffffff;
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding;
-  background-clip: padding-box;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-.popover.top {
-  margin-bottom: 10px;
-}
-.popover.right {
-  margin-left: 10px;
-}
-.popover.bottom {
-  margin-top: 10px;
-}
-.popover.left {
-  margin-right: 10px;
-}
-.popover-title {
-  margin: 0;
-  padding: 8px 14px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-  -moz-border-radius: 5px 5px 0 0;
-  border-radius: 5px 5px 0 0;
-}
-.popover-content {
-  padding: 9px 14px;
-}
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
-  margin-bottom: 0;
-}
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: inline-block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.popover .arrow:after {
-  content: "";
-  z-index: -1;
-}
-.popover.top .arrow {
-  bottom: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-width: 10px 10px 0;
-  border-top-color: #ffffff;
-}
-.popover.top .arrow:after {
-  border-width: 11px 11px 0;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  bottom: -1px;
-  left: -11px;
-}
-.popover.right .arrow {
-  top: 50%;
-  left: -10px;
-  margin-top: -10px;
-  border-width: 10px 10px 10px 0;
-  border-right-color: #ffffff;
-}
-.popover.right .arrow:after {
-  border-width: 11px 11px 11px 0;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  bottom: -11px;
-  left: -1px;
-}
-.popover.bottom .arrow {
-  top: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-width: 0 10px 10px;
-  border-bottom-color: #ffffff;
-}
-.popover.bottom .arrow:after {
-  border-width: 0 11px 11px;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  top: -1px;
-  left: -11px;
-}
-.popover.left .arrow {
-  top: 50%;
-  right: -10px;
-  margin-top: -10px;
-  border-width: 10px 0 10px 10px;
-  border-left-color: #ffffff;
-}
-.popover.left .arrow:after {
-  border-width: 11px 0 11px 11px;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  bottom: -11px;
-  right: -1px;
-}
-.modal-open .dropdown-menu {
-  z-index: 2050;
-}
-.modal-open .dropdown.open {
-  *z-index: 2050;
-}
-.modal-open .popover {
-  z-index: 2060;
-}
-.modal-open .tooltip {
-  z-index: 2080;
-}
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-.modal-backdrop.fade {
-  opacity: 0;
-}
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-.modal {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  z-index: 1050;
-  overflow: auto;
-  width: 560px;
-  margin: -250px 0 0 -280px;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  /* IE6-7 */
-
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding-box;
-  background-clip: padding-box;
-}
-.modal.fade {
-  -webkit-transition: opacity .3s linear, top .3s ease-out;
-  -moz-transition: opacity .3s linear, top .3s ease-out;
-  -o-transition: opacity .3s linear, top .3s ease-out;
-  transition: opacity .3s linear, top .3s ease-out;
-  top: -25%;
-}
-.modal.fade.in {
-  top: 50%;
-}
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-.modal-header .close {
-  margin-top: 2px;
-}
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-.modal-body {
-  overflow-y: auto;
-  max-height: 400px;
-  padding: 15px;
-}
-.modal-form {
-  margin-bottom: 0;
-}
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-  -moz-box-shadow: inset 0 1px 0 #ffffff;
-  box-shadow: inset 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.modal-footer:after {
-  clear: both;
-}
-.modal-footer .btn + .btn {
-  margin-left: 5px;
-  margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-.dropup,
-.dropdown {
-  position: relative;
-}
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding;
-  background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 20px;
-  color: #333333;
-  white-space: nowrap;
-}
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
-  text-decoration: none;
-  color: #ffffff;
-  background-color: #0e84b5;
-  background-color: #0d7dac;
-  background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
-  background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
-}
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
-  color: #ffffff;
-  text-decoration: none;
-  outline: 0;
-  background-color: #0e84b5;
-  background-color: #0d7dac;
-  background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
-  background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
-  background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
-}
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
-  color: #999999;
-}
-.dropdown-menu .disabled > a:hover {
-  text-decoration: none;
-  background-color: transparent;
-  cursor: default;
-}
-.open {
-  *z-index: 1000;
-}
-.open  > .dropdown-menu {
-  display: block;
-}
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "\2191";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-.dropdown-submenu {
-  position: relative;
-}
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-  -moz-border-radius: 0 6px 6px 6px;
-  border-radius: 0 6px 6px 6px;
-}
-.dropdown-submenu:hover .dropdown-menu {
-  display: block;
-}
-.dropdown-submenu > a:after {
-  display: block;
-  content: " ";
-  float: right;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #cccccc;
-  margin-top: 5px;
-  margin-right: -10px;
-}
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-.dropdown .dropdown-menu .nav-header {
-  padding-left: 20px;
-  padding-right: 20px;
-}
-.typeahead {
-  margin-top: 2px;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.accordion {
-  margin-bottom: 20px;
-}
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.accordion-heading {
-  border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-.accordion-toggle {
-  cursor: pointer;
-}
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-.carousel {
-  position: relative;
-  margin-bottom: 20px;
-  line-height: 1;
-}
-.carousel-inner {
-  overflow: hidden;
-  width: 100%;
-  position: relative;
-}
-.carousel .item {
-  display: none;
-  position: relative;
-  -webkit-transition: 0.6s ease-in-out left;
-  -moz-transition: 0.6s ease-in-out left;
-  -o-transition: 0.6s ease-in-out left;
-  transition: 0.6s ease-in-out left;
-}
-.carousel .item > img {
-  display: block;
-  line-height: 1;
-}
-.carousel .active,
-.carousel .next,
-.carousel .prev {
-  display: block;
-}
-.carousel .active {
-  left: 0;
-}
-.carousel .next,
-.carousel .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-.carousel .next {
-  left: 100%;
-}
-.carousel .prev {
-  left: -100%;
-}
-.carousel .next.left,
-.carousel .prev.right {
-  left: 0;
-}
-.carousel .active.left {
-  left: -100%;
-}
-.carousel .active.right {
-  left: 100%;
-}
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-  -moz-border-radius: 23px;
-  border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-.carousel-control.right {
-  left: auto;
-  right: 15px;
-}
-.carousel-control:hover {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-.carousel-caption {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-.carousel-caption h4,
-.carousel-caption p {
-  color: #ffffff;
-  line-height: 20px;
-}
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-.carousel-caption p {
-  margin-bottom: 0;
-}
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.close {
-  float: right;
-  font-size: 20px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-.close:hover {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-.pull-right {
-  float: right;
-}
-.pull-left {
-  float: left;
-}
-.hide {
-  display: none;
-}
-.show {
-  display: block;
-}
-.invisible {
-  visibility: hidden;
-}
-.affix {
-  position: fixed;
-}
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-  -moz-transition: opacity 0.15s linear;
-  -o-transition: opacity 0.15s linear;
-  transition: opacity 0.15s linear;
-}
-.fade.in {
-  opacity: 1;
-}
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  overflow: visible \9;
-  -webkit-transition: height 0.35s ease;
-  -moz-transition: height 0.35s ease;
-  -o-transition: height 0.35s ease;
-  transition: height 0.35s ease;
-}
-.collapse.in {
-  height: auto;
-}
-.hidden {
-  display: none;
-  visibility: hidden;
-}
-.visible-phone {
-  display: none !important;
-}
-.visible-tablet {
-  display: none !important;
-}
-.hidden-desktop {
-  display: none !important;
-}
-.visible-desktop {
-  display: inherit !important;
-}
- at media (min-width: 768px) and (max-width: 979px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important ;
-  }
-  .visible-tablet {
-    display: inherit !important;
-  }
-  .hidden-tablet {
-    display: none !important;
-  }
-}
- at media (max-width: 767px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important;
-  }
-  .visible-phone {
-    display: inherit !important;
-  }
-  .hidden-phone {
-    display: none !important;
-  }
-}
- at media (max-width: 767px) {
-  body {
-    padding-left: 20px;
-    padding-right: 20px;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    margin-left: -20px;
-    margin-right: -20px;
-  }
-  .container-fluid {
-    padding: 0;
-  }
-  .dl-horizontal dt {
-    float: none;
-    clear: none;
-    width: auto;
-    text-align: left;
-  }
-  .dl-horizontal dd {
-    margin-left: 0;
-  }
-  .container {
-    width: auto;
-  }
-  .row-fluid {
-    width: 100%;
-  }
-  .row,
-  .thumbnails {
-    margin-left: 0;
-  }
-  .thumbnails > li {
-    float: none;
-    margin-left: 0;
-  }
-  [class*="span"],
-  .row-fluid [class*="span"] {
-    float: none;
-    display: block;
-    width: auto;
-    margin-left: 0;
-  }
-  .span12,
-  .row-fluid .span12 {
-    width: 100%;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-  }
-  .input-large,
-  .input-xlarge,
-  .input-xxlarge,
-  input[class*="span"],
-  select[class*="span"],
-  textarea[class*="span"],
-  .uneditable-input {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-  }
-  .input-prepend input,
-  .input-append input,
-  .input-prepend input[class*="span"],
-  .input-append input[class*="span"] {
-    display: inline-block;
-    width: auto;
-  }
-  .modal {
-    position: fixed;
-    top: 20px;
-    left: 20px;
-    right: 20px;
-    width: auto;
-    margin: 0;
-  }
-  .modal.fade.in {
-    top: auto;
-  }
-}
- at media (max-width: 480px) {
-  .nav-collapse {
-    -webkit-transform: translate3d(0, 0, 0);
-  }
-  .page-header h1 small {
-    display: block;
-    line-height: 20px;
-  }
-  input[type="checkbox"],
-  input[type="radio"] {
-    border: 1px solid #ccc;
-  }
-  .form-horizontal .control-group > label {
-    float: none;
-    width: auto;
-    padding-top: 0;
-    text-align: left;
-  }
-  .form-horizontal .controls {
-    margin-left: 0;
-  }
-  .form-horizontal .control-list {
-    padding-top: 0;
-  }
-  .form-horizontal .form-actions {
-    padding-left: 10px;
-    padding-right: 10px;
-  }
-  .modal {
-    top: 10px;
-    left: 10px;
-    right: 10px;
-  }
-  .modal-header .close {
-    padding: 10px;
-    margin: -10px;
-  }
-  .carousel-caption {
-    position: static;
-  }
-}
- at media (min-width: 768px) and (max-width: 979px) {
-  .row {
-    margin-left: -20px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 20px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 724px;
-  }
-  .span12 {
-    width: 724px;
-  }
-  .span11 {
-    width: 662px;
-  }
-  .span10 {
-    width: 600px;
-  }
-  .span9 {
-    width: 538px;
-  }
-  .span8 {
-    width: 476px;
-  }
-  .span7 {
-    width: 414px;
-  }
-  .span6 {
-    width: 352px;
-  }
-  .span5 {
-    width: 290px;
-  }
-  .span4 {
-    width: 228px;
-  }
-  .span3 {
-    width: 166px;
-  }
-  .span2 {
-    width: 104px;
-  }
-  .span1 {
-    width: 42px;
-  }
-  .offset12 {
-    margin-left: 764px;
-  }
-  .offset11 {
-    margin-left: 702px;
-  }
-  .offset10 {
-    margin-left: 640px;
-  }
-  .offset9 {
-    margin-left: 578px;
-  }
-  .offset8 {
-    margin-left: 516px;
-  }
-  .offset7 {
-    margin-left: 454px;
-  }
-  .offset6 {
-    margin-left: 392px;
-  }
-  .offset5 {
-    margin-left: 330px;
-  }
-  .offset4 {
-    margin-left: 268px;
-  }
-  .offset3 {
-    margin-left: 206px;
-  }
-  .offset2 {
-    margin-left: 144px;
-  }
-  .offset1 {
-    margin-left: 82px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-    float: left;
-    margin-left: 2.7624309392265194%;
-    *margin-left: 2.709239449864817%;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.43646408839778%;
-    *width: 91.38327259903608%;
-  }
-  .row-fluid .span10 {
-    width: 82.87292817679558%;
-    *width: 82.81973668743387%;
-  }
-  .row-fluid .span9 {
-    width: 74.30939226519337%;
-    *width: 74.25620077583166%;
-  }
-  .row-fluid .span8 {
-    width: 65.74585635359117%;
-    *width: 65.69266486422946%;
-  }
-  .row-fluid .span7 {
-    width: 57.18232044198895%;
-    *width: 57.12912895262725%;
-  }
-  .row-fluid .span6 {
-    width: 48.61878453038674%;
-    *width: 48.56559304102504%;
-  }
-  .row-fluid .span5 {
-    width: 40.05524861878453%;
-    *width: 40.00205712942283%;
-  }
-  .row-fluid .span4 {
-    width: 31.491712707182323%;
-    *width: 31.43852121782062%;
-  }
-  .row-fluid .span3 {
-    width: 22.92817679558011%;
-    *width: 22.87498530621841%;
-  }
-  .row-fluid .span2 {
-    width: 14.3646408839779%;
-    *width: 14.311449394616199%;
-  }
-  .row-fluid .span1 {
-    width: 5.801104972375691%;
-    *width: 5.747913483013988%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.52486187845304%;
-    *margin-left: 105.41847889972962%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.76243093922652%;
-    *margin-left: 102.6560479605031%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.96132596685082%;
-    *margin-left: 96.8549429881274%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.1988950276243%;
-    *margin-left: 94.09251204890089%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.39779005524862%;
-    *margin-left: 88.2914070765252%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.6353591160221%;
-    *margin-left: 85.52897613729868%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.8342541436464%;
-    *margin-left: 79.72787116492299%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 77.07182320441989%;
-    *margin-left: 76.96544022569647%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 71.2707182320442%;
-    *margin-left: 71.16433525332079%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.50828729281768%;
-    *margin-left: 68.40190431409427%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.70718232044199%;
-    *margin-left: 62.600799341718584%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.94475138121547%;
-    *margin-left: 59.838368402492065%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 54.14364640883978%;
-    *margin-left: 54.037263430116376%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.38121546961326%;
-    *margin-left: 51.27483249088986%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.58011049723757%;
-    *margin-left: 45.47372751851417%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.81767955801105%;
-    *margin-left: 42.71129657928765%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 37.01657458563536%;
-    *margin-left: 36.91019160691196%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.25414364640884%;
-    *margin-left: 34.14776066768544%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.45303867403315%;
-    *margin-left: 28.346655695309746%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.69060773480663%;
-    *margin-left: 25.584224756083227%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.88950276243094%;
-    *margin-left: 19.783119783707537%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.12707182320442%;
-    *margin-left: 17.02068884448102%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.32596685082873%;
-    *margin-left: 11.219583872105325%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.56353591160221%;
-    *margin-left: 8.457152932878806%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 20px;
-  }
-  input.span12, textarea.span12, .uneditable-input.span12 {
-    width: 710px;
-  }
-  input.span11, textarea.span11, .uneditable-input.span11 {
-    width: 648px;
-  }
-  input.span10, textarea.span10, .uneditable-input.span10 {
-    width: 586px;
-  }
-  input.span9, textarea.span9, .uneditable-input.span9 {
-    width: 524px;
-  }
-  input.span8, textarea.span8, .uneditable-input.span8 {
-    width: 462px;
-  }
-  input.span7, textarea.span7, .uneditable-input.span7 {
-    width: 400px;
-  }
-  input.span6, textarea.span6, .uneditable-input.span6 {
-    width: 338px;
-  }
-  input.span5, textarea.span5, .uneditable-input.span5 {
-    width: 276px;
-  }
-  input.span4, textarea.span4, .uneditable-input.span4 {
-    width: 214px;
-  }
-  input.span3, textarea.span3, .uneditable-input.span3 {
-    width: 152px;
-  }
-  input.span2, textarea.span2, .uneditable-input.span2 {
-    width: 90px;
-  }
-  input.span1, textarea.span1, .uneditable-input.span1 {
-    width: 28px;
-  }
-}
- at media (min-width: 1200px) {
-  .row {
-    margin-left: -30px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 30px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 1170px;
-  }
-  .span12 {
-    width: 1170px;
-  }
-  .span11 {
-    width: 1070px;
-  }
-  .span10 {
-    width: 970px;
-  }
-  .span9 {
-    width: 870px;
-  }
-  .span8 {
-    width: 770px;
-  }
-  .span7 {
-    width: 670px;
-  }
-  .span6 {
-    width: 570px;
-  }
-  .span5 {
-    width: 470px;
-  }
-  .span4 {
-    width: 370px;
-  }
-  .span3 {
-    width: 270px;
-  }
-  .span2 {
-    width: 170px;
-  }
-  .span1 {
-    width: 70px;
-  }
-  .offset12 {
-    margin-left: 1230px;
-  }
-  .offset11 {
-    margin-left: 1130px;
-  }
-  .offset10 {
-    margin-left: 1030px;
-  }
-  .offset9 {
-    margin-left: 930px;
-  }
-  .offset8 {
-    margin-left: 830px;
-  }
-  .offset7 {
-    margin-left: 730px;
-  }
-  .offset6 {
-    margin-left: 630px;
-  }
-  .offset5 {
-    margin-left: 530px;
-  }
-  .offset4 {
-    margin-left: 430px;
-  }
-  .offset3 {
-    margin-left: 330px;
-  }
-  .offset2 {
-    margin-left: 230px;
-  }
-  .offset1 {
-    margin-left: 130px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-    float: left;
-    margin-left: 2.564102564102564%;
-    *margin-left: 2.5109110747408616%;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.45299145299145%;
-    *width: 91.39979996362975%;
-  }
-  .row-fluid .span10 {
-    width: 82.90598290598291%;
-    *width: 82.8527914166212%;
-  }
-  .row-fluid .span9 {
-    width: 74.35897435897436%;
-    *width: 74.30578286961266%;
-  }
-  .row-fluid .span8 {
-    width: 65.81196581196582%;
-    *width: 65.75877432260411%;
-  }
-  .row-fluid .span7 {
-    width: 57.26495726495726%;
-    *width: 57.21176577559556%;
-  }
-  .row-fluid .span6 {
-    width: 48.717948717948715%;
-    *width: 48.664757228587014%;
-  }
-  .row-fluid .span5 {
-    width: 40.17094017094017%;
-    *width: 40.11774868157847%;
-  }
-  .row-fluid .span4 {
-    width: 31.623931623931625%;
-    *width: 31.570740134569924%;
-  }
-  .row-fluid .span3 {
-    width: 23.076923076923077%;
-    *width: 23.023731587561375%;
-  }
-  .row-fluid .span2 {
-    width: 14.52991452991453%;
-    *width: 14.476723040552828%;
-  }
-  .row-fluid .span1 {
-    width: 5.982905982905983%;
-    *width: 5.929714493544281%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.12820512820512%;
-    *margin-left: 105.02182214948171%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.56410256410257%;
-    *margin-left: 102.45771958537915%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.58119658119658%;
-    *margin-left: 96.47481360247316%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.01709401709402%;
-    *margin-left: 93.91071103837061%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.03418803418803%;
-    *margin-left: 87.92780505546462%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.47008547008548%;
-    *margin-left: 85.36370249136206%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.48717948717949%;
-    *margin-left: 79.38079650845607%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 76.92307692307693%;
-    *margin-left: 76.81669394435352%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 70.94017094017094%;
-    *margin-left: 70.83378796144753%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.37606837606839%;
-    *margin-left: 68.26968539734497%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.393162393162385%;
-    *margin-left: 62.28677941443899%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.82905982905982%;
-    *margin-left: 59.72267685033642%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 53.84615384615384%;
-    *margin-left: 53.739770867430444%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.28205128205128%;
-    *margin-left: 51.175668303327875%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.299145299145295%;
-    *margin-left: 45.1927623204219%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.73504273504273%;
-    *margin-left: 42.62865975631933%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 36.75213675213675%;
-    *margin-left: 36.645753773413354%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.18803418803419%;
-    *margin-left: 34.081651209310785%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.205128205128204%;
-    *margin-left: 28.0987452264048%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.641025641025642%;
-    *margin-left: 25.53464266230224%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.65811965811966%;
-    *margin-left: 19.551736679396257%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.094017094017094%;
-    *margin-left: 16.98763411529369%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.11111111111111%;
-    *margin-left: 11.004728132387708%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.547008547008547%;
-    *margin-left: 8.440625568285142%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 30px;
-  }
-  input.span12, textarea.span12, .uneditable-input.span12 {
-    width: 1156px;
-  }
-  input.span11, textarea.span11, .uneditable-input.span11 {
-    width: 1056px;
-  }
-  input.span10, textarea.span10, .uneditable-input.span10 {
-    width: 956px;
-  }
-  input.span9, textarea.span9, .uneditable-input.span9 {
-    width: 856px;
-  }
-  input.span8, textarea.span8, .uneditable-input.span8 {
-    width: 756px;
-  }
-  input.span7, textarea.span7, .uneditable-input.span7 {
-    width: 656px;
-  }
-  input.span6, textarea.span6, .uneditable-input.span6 {
-    width: 556px;
-  }
-  input.span5, textarea.span5, .uneditable-input.span5 {
-    width: 456px;
-  }
-  input.span4, textarea.span4, .uneditable-input.span4 {
-    width: 356px;
-  }
-  input.span3, textarea.span3, .uneditable-input.span3 {
-    width: 256px;
-  }
-  input.span2, textarea.span2, .uneditable-input.span2 {
-    width: 156px;
-  }
-  input.span1, textarea.span1, .uneditable-input.span1 {
-    width: 56px;
-  }
-  .thumbnails {
-    margin-left: -30px;
-  }
-  .thumbnails > li {
-    margin-left: 30px;
-  }
-  .row-fluid .thumbnails {
-    margin-left: 0;
-  }
-}
- at media (max-width: 979px) {
-  body {
-    padding-top: 0;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    position: static;
-  }
-  .navbar-fixed-top {
-    margin-bottom: 20px;
-  }
-  .navbar-fixed-bottom {
-    margin-top: 20px;
-  }
-  .navbar-fixed-top .navbar-inner,
-  .navbar-fixed-bottom .navbar-inner {
-    padding: 5px;
-  }
-  .navbar .container {
-    width: auto;
-    padding: 0;
-  }
-  .navbar .brand {
-    padding-left: 10px;
-    padding-right: 10px;
-    margin: 0 0 0 -5px;
-  }
-  .nav-collapse {
-    clear: both;
-  }
-  .nav-collapse .nav {
-    float: none;
-    margin: 0 0 10px;
-  }
-  .nav-collapse .nav > li {
-    float: none;
-  }
-  .nav-collapse .nav > li > a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > .divider-vertical {
-    display: none;
-  }
-  .nav-collapse .nav .nav-header {
-    color: #0e84b5;
-    text-shadow: none;
-  }
-  .nav-collapse .nav > li > a,
-  .nav-collapse .dropdown-menu a {
-    padding: 9px 15px;
-    font-weight: bold;
-    color: #0e84b5;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    border-radius: 3px;
-  }
-  .nav-collapse .btn {
-    padding: 4px 10px 4px;
-    font-weight: normal;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-  }
-  .nav-collapse .dropdown-menu li + li a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > li > a:hover,
-  .nav-collapse .dropdown-menu a:hover {
-    background-color: #ffffff;
-  }
-  .navbar-inverse .nav-collapse .nav > li > a:hover,
-  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
-    background-color: #111111;
-  }
-  .nav-collapse.in .btn-group {
-    margin-top: 5px;
-    padding: 0;
-  }
-  .nav-collapse .dropdown-menu {
-    position: static;
-    top: auto;
-    left: auto;
-    float: none;
-    display: block;
-    max-width: none;
-    margin: 0 15px;
-    padding: 0;
-    background-color: transparent;
-    border: none;
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0;
-    border-radius: 0;
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
-    box-shadow: none;
-  }
-  .nav-collapse .dropdown-menu:before,
-  .nav-collapse .dropdown-menu:after {
-    display: none;
-  }
-  .nav-collapse .dropdown-menu .divider {
-    display: none;
-  }
-  .nav-collapse .navbar-form,
-  .nav-collapse .navbar-search {
-    float: none;
-    padding: 10px 15px;
-    margin: 10px 0;
-    border-top: 1px solid #ffffff;
-    border-bottom: 1px solid #ffffff;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-  }
-  .navbar .nav-collapse .nav.pull-right {
-    float: none;
-    margin-left: 0;
-  }
-  .nav-collapse,
-  .nav-collapse.collapse {
-    overflow: hidden;
-    height: 0;
-  }
-  .navbar .btn-navbar {
-    display: block;
-  }
-  .navbar-static .navbar-inner {
-    padding-left: 10px;
-    padding-right: 10px;
-  }
-}
- at media (min-width: 980px) {
-  .nav-collapse.collapse {
-    height: auto !important;
-    overflow: visible !important;
-  }
-}
-
-.footer {
-    background-color: #eee;
-}
-
-.quick-links {
-    background-color: #EEEEEE;
-}
-
-.quick-links strong {
-    color: #999999;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
deleted file mode 100755
index 188425a..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
+++ /dev/null
@@ -1,829 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
-.clearfix:after{clear:both;}
-.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
-.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
-article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
-audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
-audio:not([controls]){display:none;}
-html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
-a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-a:hover,a:active{outline:0;}
-sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
-sup{top:-0.5em;}
-sub{bottom:-0.25em;}
-img{max-width:100%;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
-#map_canvas img{max-width:none;}
-button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
-button,input{*overflow:visible;line-height:normal;}
-button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
-button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
-input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
-input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
-textarea{overflow:auto;vertical-align:top;}
-body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;}
-a{color:#0e84b5;text-decoration:none;}
-a:hover{color:#f26a1e;text-decoration:underline;}
-.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
-.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
-.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
-.row:after{clear:both;}
-[class*="span"]{float:left;margin-left:20px;}
-.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
-.span12{width:940px;}
-.span11{width:860px;}
-.span10{width:780px;}
-.span9{width:700px;}
-.span8{width:620px;}
-.span7{width:540px;}
-.span6{width:460px;}
-.span5{width:380px;}
-.span4{width:300px;}
-.span3{width:220px;}
-.span2{width:140px;}
-.span1{width:60px;}
-.offset12{margin-left:980px;}
-.offset11{margin-left:900px;}
-.offset10{margin-left:820px;}
-.offset9{margin-left:740px;}
-.offset8{margin-left:660px;}
-.offset7{margin-left:580px;}
-.offset6{margin-left:500px;}
-.offset5{margin-left:420px;}
-.offset4{margin-left:340px;}
-.offset3{margin-left:260px;}
-.offset2{margin-left:180px;}
-.offset1{margin-left:100px;}
-.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
-.row-fluid:after{clear:both;}
-.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
-.row-fluid [class*="span"]:first-child{margin-left:0;}
-.row-fluid .span12{width:100%;*width:99.94680851063829%;}
-.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
-.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
-.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
-.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
-.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
-.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
-.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
-.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
-.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
-.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
-.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
-.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
-.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
-.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
-.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
-.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
-.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
-.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
-.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
-.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
-.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
-.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
-.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
-.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
-.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
-.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
-.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
-.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
-.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
-.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
-.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
-.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
-.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
-.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
-.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
-[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
-[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
-.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
-.container:after{clear:both;}
-.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
-.container-fluid:after{clear:both;}
-p{margin:0 0 10px;}
-.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px;}
-small{font-size:85%;}
-strong{font-weight:bold;}
-em{font-style:italic;}
-cite{font-style:normal;}
-.muted{color:#999999;}
-h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:normal;line-height:1;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
-h1{font-size:36px;line-height:40px;}
-h2{font-size:30px;line-height:40px;}
-h3{font-size:24px;line-height:40px;}
-h4{font-size:18px;line-height:20px;}
-h5{font-size:14px;line-height:20px;}
-h6{font-size:12px;line-height:20px;}
-h1 small{font-size:24px;}
-h2 small{font-size:18px;}
-h3 small{font-size:14px;}
-h4 small{font-size:14px;}
-.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
-ul,ol{padding:0;margin:0 0 10px 25px;}
-ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
-li{line-height:20px;}
-ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
-dl{margin-bottom:20px;}
-dt,dd{line-height:20px;}
-dt{font-weight:bold;}
-dd{margin-left:10px;}
-.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
-.dl-horizontal dd{margin-left:130px;}
-hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
-abbr[title]{cursor:help;border-bottom:1px dotted #999999;}
-abbr.initialism{font-size:90%;text-transform:uppercase;}
-blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;}
-blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
-blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
-blockquote.pull-right small:before{content:'';}
-blockquote.pull-right small:after{content:'\00A0 \2014';}
-q:before,q:after,blockquote:before,blockquote:after{content:"";}
-address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
-code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
-pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;}
-pre code{padding:0;color:inherit;background-color:transparent;border:0;}
-.pre-scrollable{max-height:340px;overflow-y:scroll;}
-.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
-.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
-a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
-.label-important,.badge-important{background-color:#b94a48;}
-.label-important[href],.badge-important[href]{background-color:#953b39;}
-.label-warning,.badge-warning{background-color:#f89406;}
-.label-warning[href],.badge-warning[href]{background-color:#c67605;}
-.label-success,.badge-success{background-color:#468847;}
-.label-success[href],.badge-success[href]{background-color:#356635;}
-.label-info,.badge-info{background-color:#3a87ad;}
-.label-info[href],.badge-info[href]{background-color:#2d6987;}
-.label-inverse,.badge-inverse{background-color:#333333;}
-.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
-.btn .label,.btn .badge{position:relative;top:-1px;}
-.btn-mini .label,.btn-mini .badge{top:0;}
-table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
-.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
-.table th{font-weight:bold;}
-.table thead th{vertical-align:bottom;}
-.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
-.table tbody+tbody{border-top:2px solid #dddddd;}
-.table-condensed th,.table-condensed td{padding:4px 5px;}
-.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
-.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
-.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
-.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;}
-.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;}
-.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;}
-.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
-.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px;}
-.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
-.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;}
-table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0;}
-table .span1{float:none;width:44px;margin-left:0;}
-table .span2{float:none;width:124px;margin-left:0;}
-table .span3{float:none;width:204px;margin-left:0;}
-table .span4{float:none;width:284px;margin-left:0;}
-table .span5{float:none;width:364px;margin-left:0;}
-table .span6{float:none;width:444px;margin-left:0;}
-table .span7{float:none;width:524px;margin-left:0;}
-table .span8{float:none;width:604px;margin-left:0;}
-table .span9{float:none;width:684px;margin-left:0;}
-table .span10{float:none;width:764px;margin-left:0;}
-table .span11{float:none;width:844px;margin-left:0;}
-table .span12{float:none;width:924px;margin-left:0;}
-table .span13{float:none;width:1004px;margin-left:0;}
-table .span14{float:none;width:1084px;margin-left:0;}
-table .span15{float:none;width:1164px;margin-left:0;}
-table .span16{float:none;width:1244px;margin-left:0;}
-table .span17{float:none;width:1324px;margin-left:0;}
-table .span18{float:none;width:1404px;margin-left:0;}
-table .span19{float:none;width:1484px;margin-left:0;}
-table .span20{float:none;width:1564px;margin-left:0;}
-table .span21{float:none;width:1644px;margin-left:0;}
-table .span22{float:none;width:1724px;margin-left:0;}
-table .span23{float:none;width:1804px;margin-left:0;}
-table .span24{float:none;width:1884px;margin-left:0;}
-.table tbody tr.success td{background-color:#dff0d8;}
-.table tbody tr.error td{background-color:#f2dede;}
-.table tbody tr.info td{background-color:#d9edf7;}
-form{margin:0 0 20px;}
-fieldset{padding:0;margin:0;border:0;}
-legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
-label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;}
-input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
-label{display:block;margin-bottom:5px;}
-select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:3px;-moz-border-radius:3px;border- [...]
-input,textarea{width:210px;}
-textarea{height:auto;}
-textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset  [...]
-input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;}
-input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
-select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
-select{width:220px;border:1px solid #bbb;background-color:#ffffff;}
-select[multiple],select[size]{height:auto;}
-select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
-.uneditable-input{overflow:hidden;white-space:nowrap;}
-.uneditable-textarea{width:auto;height:auto;}
-input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
-input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
-input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
-.radio,.checkbox{min-height:18px;padding-left:18px;}
-.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
-.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
-.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
-.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
-.input-mini{width:60px;}
-.input-small{width:90px;}
-.input-medium{width:150px;}
-.input-large{width:210px;}
-.input-xlarge{width:270px;}
-.input-xxlarge{width:530px;}
-input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
-.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
-input,textarea,.uneditable-input{margin-left:0;}
-.controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
-input.span12, textarea.span12, .uneditable-input.span12{width:926px;}
-input.span11, textarea.span11, .uneditable-input.span11{width:846px;}
-input.span10, textarea.span10, .uneditable-input.span10{width:766px;}
-input.span9, textarea.span9, .uneditable-input.span9{width:686px;}
-input.span8, textarea.span8, .uneditable-input.span8{width:606px;}
-input.span7, textarea.span7, .uneditable-input.span7{width:526px;}
-input.span6, textarea.span6, .uneditable-input.span6{width:446px;}
-input.span5, textarea.span5, .uneditable-input.span5{width:366px;}
-input.span4, textarea.span4, .uneditable-input.span4{width:286px;}
-input.span3, textarea.span3, .uneditable-input.span3{width:206px;}
-input.span2, textarea.span2, .uneditable-input.span2{width:126px;}
-input.span1, textarea.span1, .uneditable-input.span1{width:46px;}
-.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
-.controls-row:after{clear:both;}
-.controls-row [class*="span"]{float:left;}
-input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
-input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
-.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
-.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus [...]
-.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
-.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
-.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.er [...]
-.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
-.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
-.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus [...]
-.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
-input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
-.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
-.form-actions:after{clear:both;}
-.help-block,.help-inline{color:#595959;}
-.help-block{display:block;margin-bottom:10px;}
-.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
-.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-pr [...]
-.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
-.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
-.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
-.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
-.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
-.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
-.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
-.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.fo [...]
-.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
-.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
-.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
-.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
-.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
-.control-group{margin-bottom:10px;}
-legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
-.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
-.form-horizontal .control-group:after{clear:both;}
-.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
-.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;}
-.form-horizontal .help-block{margin-top:10px;margin-bottom:0;}
-.form-horizontal .form-actions{padding-left:160px;}
-.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);backgroun [...]
-.btn:active,.btn.active{background-color:#cccccc \9;}
-.btn:first-child{*margin-left:0;}
-.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
-.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
-.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.btn-large [class^="icon-"]{margin-top:2px;}
-.btn-small{padding:3px 9px;font-size:12px;line-height:18px;}
-.btn-small [class^="icon-"]{margin-top:0;}
-.btn-mini{padding:2px 6px;font-size:11px;line-height:16px;}
-.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
-.btn-block+.btn-block{margin-top:5px;}
-.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
-.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);}
-.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e6eb5;background-image:-moz-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));background-image:-webkit-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-o-linear-gradient(top, #0e84b5, #0e4cb5);background-image:linear-gradient(to bottom, #0e84b5, #0e4cb5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-primary:active,.btn-primary.active{background-color:#0a3886 \9;}
-.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
-.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
-.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
-.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-success:active,.btn-success.active{background-color:#408140 \9;}
-.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradi [...]
-.btn-info:active,.btn-info.active{background-color:#24748c \9;}
-.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
-button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
-button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
-button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
-button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
-.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-.btn-link{border-color:transparent;cursor:pointer;color:#0e84b5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-link:hover{color:#f26a1e;text-decoration:underline;background-color:transparent;}
-[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
-.icon-white,.nav>.active>a>[class^="icon-"],.nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
-.icon-glass{background-position:0 0;}
-.icon-music{background-position:-24px 0;}
-.icon-search{background-position:-48px 0;}
-.icon-envelope{background-position:-72px 0;}
-.icon-heart{background-position:-96px 0;}
-.icon-star{background-position:-120px 0;}
-.icon-star-empty{background-position:-144px 0;}
-.icon-user{background-position:-168px 0;}
-.icon-film{background-position:-192px 0;}
-.icon-th-large{background-position:-216px 0;}
-.icon-th{background-position:-240px 0;}
-.icon-th-list{background-position:-264px 0;}
-.icon-ok{background-position:-288px 0;}
-.icon-remove{background-position:-312px 0;}
-.icon-zoom-in{background-position:-336px 0;}
-.icon-zoom-out{background-position:-360px 0;}
-.icon-off{background-position:-384px 0;}
-.icon-signal{background-position:-408px 0;}
-.icon-cog{background-position:-432px 0;}
-.icon-trash{background-position:-456px 0;}
-.icon-home{background-position:0 -24px;}
-.icon-file{background-position:-24px -24px;}
-.icon-time{background-position:-48px -24px;}
-.icon-road{background-position:-72px -24px;}
-.icon-download-alt{background-position:-96px -24px;}
-.icon-download{background-position:-120px -24px;}
-.icon-upload{background-position:-144px -24px;}
-.icon-inbox{background-position:-168px -24px;}
-.icon-play-circle{background-position:-192px -24px;}
-.icon-repeat{background-position:-216px -24px;}
-.icon-refresh{background-position:-240px -24px;}
-.icon-list-alt{background-position:-264px -24px;}
-.icon-lock{background-position:-287px -24px;}
-.icon-flag{background-position:-312px -24px;}
-.icon-headphones{background-position:-336px -24px;}
-.icon-volume-off{background-position:-360px -24px;}
-.icon-volume-down{background-position:-384px -24px;}
-.icon-volume-up{background-position:-408px -24px;}
-.icon-qrcode{background-position:-432px -24px;}
-.icon-barcode{background-position:-456px -24px;}
-.icon-tag{background-position:0 -48px;}
-.icon-tags{background-position:-25px -48px;}
-.icon-book{background-position:-48px -48px;}
-.icon-bookmark{background-position:-72px -48px;}
-.icon-print{background-position:-96px -48px;}
-.icon-camera{background-position:-120px -48px;}
-.icon-font{background-position:-144px -48px;}
-.icon-bold{background-position:-167px -48px;}
-.icon-italic{background-position:-192px -48px;}
-.icon-text-height{background-position:-216px -48px;}
-.icon-text-width{background-position:-240px -48px;}
-.icon-align-left{background-position:-264px -48px;}
-.icon-align-center{background-position:-288px -48px;}
-.icon-align-right{background-position:-312px -48px;}
-.icon-align-justify{background-position:-336px -48px;}
-.icon-list{background-position:-360px -48px;}
-.icon-indent-left{background-position:-384px -48px;}
-.icon-indent-right{background-position:-408px -48px;}
-.icon-facetime-video{background-position:-432px -48px;}
-.icon-picture{background-position:-456px -48px;}
-.icon-pencil{background-position:0 -72px;}
-.icon-map-marker{background-position:-24px -72px;}
-.icon-adjust{background-position:-48px -72px;}
-.icon-tint{background-position:-72px -72px;}
-.icon-edit{background-position:-96px -72px;}
-.icon-share{background-position:-120px -72px;}
-.icon-check{background-position:-144px -72px;}
-.icon-move{background-position:-168px -72px;}
-.icon-step-backward{background-position:-192px -72px;}
-.icon-fast-backward{background-position:-216px -72px;}
-.icon-backward{background-position:-240px -72px;}
-.icon-play{background-position:-264px -72px;}
-.icon-pause{background-position:-288px -72px;}
-.icon-stop{background-position:-312px -72px;}
-.icon-forward{background-position:-336px -72px;}
-.icon-fast-forward{background-position:-360px -72px;}
-.icon-step-forward{background-position:-384px -72px;}
-.icon-eject{background-position:-408px -72px;}
-.icon-chevron-left{background-position:-432px -72px;}
-.icon-chevron-right{background-position:-456px -72px;}
-.icon-plus-sign{background-position:0 -96px;}
-.icon-minus-sign{background-position:-24px -96px;}
-.icon-remove-sign{background-position:-48px -96px;}
-.icon-ok-sign{background-position:-72px -96px;}
-.icon-question-sign{background-position:-96px -96px;}
-.icon-info-sign{background-position:-120px -96px;}
-.icon-screenshot{background-position:-144px -96px;}
-.icon-remove-circle{background-position:-168px -96px;}
-.icon-ok-circle{background-position:-192px -96px;}
-.icon-ban-circle{background-position:-216px -96px;}
-.icon-arrow-left{background-position:-240px -96px;}
-.icon-arrow-right{background-position:-264px -96px;}
-.icon-arrow-up{background-position:-289px -96px;}
-.icon-arrow-down{background-position:-312px -96px;}
-.icon-share-alt{background-position:-336px -96px;}
-.icon-resize-full{background-position:-360px -96px;}
-.icon-resize-small{background-position:-384px -96px;}
-.icon-plus{background-position:-408px -96px;}
-.icon-minus{background-position:-433px -96px;}
-.icon-asterisk{background-position:-456px -96px;}
-.icon-exclamation-sign{background-position:0 -120px;}
-.icon-gift{background-position:-24px -120px;}
-.icon-leaf{background-position:-48px -120px;}
-.icon-fire{background-position:-72px -120px;}
-.icon-eye-open{background-position:-96px -120px;}
-.icon-eye-close{background-position:-120px -120px;}
-.icon-warning-sign{background-position:-144px -120px;}
-.icon-plane{background-position:-168px -120px;}
-.icon-calendar{background-position:-192px -120px;}
-.icon-random{background-position:-216px -120px;width:16px;}
-.icon-comment{background-position:-240px -120px;}
-.icon-magnet{background-position:-264px -120px;}
-.icon-chevron-up{background-position:-288px -120px;}
-.icon-chevron-down{background-position:-313px -119px;}
-.icon-retweet{background-position:-336px -120px;}
-.icon-shopping-cart{background-position:-360px -120px;}
-.icon-folder-close{background-position:-384px -120px;}
-.icon-folder-open{background-position:-408px -120px;width:16px;}
-.icon-resize-vertical{background-position:-432px -119px;}
-.icon-resize-horizontal{background-position:-456px -118px;}
-.icon-hdd{background-position:0 -144px;}
-.icon-bullhorn{background-position:-24px -144px;}
-.icon-bell{background-position:-48px -144px;}
-.icon-certificate{background-position:-72px -144px;}
-.icon-thumbs-up{background-position:-96px -144px;}
-.icon-thumbs-down{background-position:-120px -144px;}
-.icon-hand-right{background-position:-144px -144px;}
-.icon-hand-left{background-position:-168px -144px;}
-.icon-hand-up{background-position:-192px -144px;}
-.icon-hand-down{background-position:-216px -144px;}
-.icon-circle-arrow-right{background-position:-240px -144px;}
-.icon-circle-arrow-left{background-position:-264px -144px;}
-.icon-circle-arrow-up{background-position:-288px -144px;}
-.icon-circle-arrow-down{background-position:-312px -144px;}
-.icon-globe{background-position:-336px -144px;}
-.icon-wrench{background-position:-360px -144px;}
-.icon-tasks{background-position:-384px -144px;}
-.icon-filter{background-position:-408px -144px;}
-.icon-briefcase{background-position:-432px -144px;}
-.icon-fullscreen{background-position:-456px -144px;}
-.btn-group{position:relative;font-size:0;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
-.btn-group+.btn-group{margin-left:5px;}
-.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
-.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;}
-.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-group>.btn+.btn{margin-left:-1px;}
-.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;}
-.btn-group>.btn-mini{font-size:11px;}
-.btn-group>.btn-small{font-size:12px;}
-.btn-group>.btn-large{font-size:16px;}
-.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
-.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
-.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
-.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
-.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
-.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
-.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
-.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
-.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
-.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
-.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
-.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
-.btn-group.open .btn-primary.dropdown-toggle{background-color:#0e4cb5;}
-.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
-.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
-.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
-.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
-.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
-.btn .caret{margin-top:8px;margin-left:0;}
-.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;}
-.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
-.dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;}
-.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
-.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
-.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;}
-.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
-.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
-.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
-.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
-.nav{margin-left:0;margin-bottom:20px;list-style:none;}
-.nav>li>a{display:block;}
-.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
-.nav>.pull-right{float:right;}
-.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
-.nav li+.nav-header{margin-top:9px;}
-.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
-.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
-.nav-list>li>a{padding:3px 15px;}
-.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0e84b5;}
-.nav-list [class^="icon-"]{margin-right:2px;}
-.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
-.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
-.nav-tabs:after,.nav-pills:after{clear:both;}
-.nav-tabs>li,.nav-pills>li{float:left;}
-.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
-.nav-tabs{border-bottom:1px solid #ddd;}
-.nav-tabs>li{margin-bottom:-1px;}
-.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
-.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
-.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0e84b5;}
-.nav-stacked>li{float:none;}
-.nav-stacked>li>a{margin-right:0;}
-.nav-tabs.nav-stacked{border-bottom:0;}
-.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
-.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
-.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
-.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
-.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
-.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
-.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.nav .dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;margin-top:6px;}
-.nav .dropdown-toggle:hover .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
-.nav-tabs .dropdown-toggle .caret{margin-top:8px;}
-.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
-.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
-.nav>.dropdown.active>a:hover{cursor:pointer;}
-.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
-.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
-.tabs-stacked .open>a:hover{border-color:#999999;}
-.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
-.tabbable:after{clear:both;}
-.tab-content{overflow:auto;}
-.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
-.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
-.tab-content>.active,.pill-content>.active{display:block;}
-.tabs-below>.nav-tabs{border-top:1px solid #ddd;}
-.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
-.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
-.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;}
-.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
-.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
-.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
-.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
-.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
-.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
-.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
-.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
-.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
-.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
-.nav>.disabled>a{color:#999999;}
-.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
-.navbar{overflow:visible;margin-bottom:20px;color:#0e84b5;*position:relative;*z-index:2;}
-.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#ffffff;background-image:-moz-linear-gradient(top, #ffffff, #ffffff);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));background-image:-webkit-linear-gradient(top, #ffffff, #ffffff);background-image:-o-linear-gradient(top, #ffffff, #ffffff);background-image:linear-gradient(to bottom, #ffffff, #ffffff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
-.navbar .container{width:auto;}
-.nav-collapse.collapse{height:auto;}
-.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#0e84b5;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;}
-.navbar-text{margin-bottom:0;line-height:40px;}
-.navbar-link{color:#0e84b5;}.navbar-link:hover{color:#f26a1e;}
-.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #ffffff;border-right:1px solid #ffffff;}
-.navbar .btn,.navbar .btn-group{margin-top:6px;}
-.navbar .btn-group .btn{margin:0;}
-.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
-.navbar-form:after{clear:both;}
-.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
-.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
-.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
-.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
-.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.navbar-static-top{position:static;width:100%;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
-.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0;}
-.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
-.navbar-fixed-top{top:0;}
-.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);}
-.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);}
-.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
-.navbar .nav.pull-right{float:right;}
-.navbar .nav>li{float:left;}
-.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#0e84b5;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
-.navbar .nav .dropdown-toggle .caret{margin-top:8px;}
-.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#f26a1e;text-decoration:none;}
-.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#f26a1e;text-decoration:none;background-color:#f2f2f2;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
-.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#f2f2f2;background-image:-moz-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-o-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:linear-gradient(to bottom, #f2f2f [...]
-.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d9d9d9 \9;}
-.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
-.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
-.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
-.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
-.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
-.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
-.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#f2f2f2;color:#f26a1e;}
-.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;}
-.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
-.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
-.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
-.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
-.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient( [...]
-.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;}
-.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
-.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
-.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;}
-.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
-.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
-.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
-.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
-.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
-.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransfo [...]
-.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
-.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}
-.breadcrumb .divider{padding:0 5px;color:#ccc;}
-.breadcrumb .active{color:#999999;}
-.pagination{height:40px;margin:20px 0;}
-.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
-.pagination li{display:inline;}
-.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
-.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5;}
-.pagination .active a,.pagination .active span{color:#999999;cursor:default;}
-.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
-.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.pagination-centered{text-align:center;}
-.pagination-right{text-align:right;}
-.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
-.pager:after{clear:both;}
-.pager li{display:inline;}
-.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
-.pager .next a{float:right;}
-.pager .previous a{float:left;}
-.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}
-.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
-.thumbnails:after{clear:both;}
-.row-fluid .thumbnails{margin-left:0;}
-.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
-.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
-a.thumbnail:hover{border-color:#0e84b5;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
-.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
-.thumbnail .caption{padding:9px;color:#555555;}
-.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;}
-.alert h4{margin:0;}
-.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
-.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
-.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
-.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
-.alert-block{padding-top:14px;padding-bottom:14px;}
-.alert-block>p,.alert-block>ul{margin-bottom:0;}
-.alert-block p+p{margin-top:5px;}
- at -webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0 [...]
-.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);bac [...]
-.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
-.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, [...]
-.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
-.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f [...]
-.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, t [...]
-.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
-.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
-.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc [...]
-.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, trans [...]
-.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
-.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
-.hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
-.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit;}
-.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
-.tooltip.top{margin-top:-3px;}
-.tooltip.right{margin-left:3px;}
-.tooltip.bottom{margin-top:3px;}
-.tooltip.left{margin-left:-3px;}
-.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
-.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
-.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
-.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
-.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
-.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-bo [...]
-.popover.right{margin-left:10px;}
-.popover.bottom{margin-top:10px;}
-.popover.left{margin-right:10px;}
-.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}
-.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
-.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;}
-.popover .arrow:after{content:"";z-index:-1;}
-.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;}
-.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;}
-.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;}
-.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;}
-.modal-open .dropdown-menu{z-index:2050;}
-.modal-open .dropdown.open{*z-index:2050;}
-.modal-open .popover{z-index:2060;}
-.modal-open .tooltip{z-index:2080;}
-.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
-.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
-.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-cli [...]
-.modal.fade.in{top:50%;}
-.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
-.modal-header h3{margin:0;line-height:30px;}
-.modal-body{overflow-y:auto;max-height:400px;padding:15px;}
-.modal-form{margin-bottom:0;}
-.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
-.modal-footer:after{clear:both;}
-.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
-.modal-footer .btn-group .btn+.btn{margin-left:-1px;}
-.dropup,.dropdown{position:relative;}
-.dropdown-toggle{*margin-bottom:-3px;}
-.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
-.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
-.dropdown .caret{margin-top:8px;margin-left:2px;}
-.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-ba [...]
-.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
-.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
-.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d); [...]
-.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;outline:0;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d);background-r [...]
-.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;}
-.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
-.open{*z-index:1000;}.open >.dropdown-menu{display:block;}
-.pull-right>.dropdown-menu{right:0;left:auto;}
-.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
-.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
-.dropdown-submenu{position:relative;}
-.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
-.dropdown-submenu:hover .dropdown-menu{display:block;}
-.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
-.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
-.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
-.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.accordion{margin-bottom:20px;}
-.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.accordion-heading{border-bottom:0;}
-.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
-.accordion-toggle{cursor:pointer;}
-.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
-.carousel{position:relative;margin-bottom:20px;line-height:1;}
-.carousel-inner{overflow:hidden;width:100%;position:relative;}
-.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
-.carousel .item>img{display:block;line-height:1;}
-.carousel .active,.carousel .next,.carousel .prev{display:block;}
-.carousel .active{left:0;}
-.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
-.carousel .next{left:100%;}
-.carousel .prev{left:-100%;}
-.carousel .next.left,.carousel .prev.right{left:0;}
-.carousel .active.left{left:-100%;}
-.carousel .active.right{left:100%;}
-.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
-.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
-.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
-.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
-.carousel-caption h4{margin:0 0 5px;}
-.carousel-caption p{margin-bottom:0;}
-.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
-.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
-button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
-.pull-right{float:right;}
-.pull-left{float:left;}
-.hide{display:none;}
-.show{display:block;}
-.invisible{visibility:hidden;}
-.affix{position:fixed;}
-.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
-.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
-.hidden{display:none;visibility:hidden;}
-.visible-phone{display:none !important;}
-.visible-tablet{display:none !important;}
-.hidden-desktop{display:none !important;}
-.visible-desktop{display:inherit !important;}
- at media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .nav [...]
-
-.footer {
-    background-color: #eee;
-}
-
-.quick-links {
-    background-color: #EEEEEE;
-}
-
-.quick-links strong {
-    color: #999999;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.css b/doc/_themes/bootstrap/static/bootstrap-responsive.css
deleted file mode 100644
index daafa91..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-responsive.css
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*!
- * Bootstrap Responsive v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
-  *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.clearfix:after {
-  clear: both;
-}
-
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.hidden {
-  display: none;
-  visibility: hidden;
-}
-
-.visible-phone {
-  display: none !important;
-}
-
-.visible-tablet {
-  display: none !important;
-}
-
-.hidden-desktop {
-  display: none !important;
-}
-
-.visible-desktop {
-  display: inherit !important;
-}
-
- at media (min-width: 768px) and (max-width: 979px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important ;
-  }
-  .visible-tablet {
-    display: inherit !important;
-  }
-  .hidden-tablet {
-    display: none !important;
-  }
-}
-
- at media (max-width: 767px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important;
-  }
-  .visible-phone {
-    display: inherit !important;
-  }
-  .hidden-phone {
-    display: none !important;
-  }
-}
-
- at media (min-width: 1200px) {
-  .row {
-    margin-left: -30px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    line-height: 0;
-    content: "";
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 30px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 1170px;
-  }
-  .span12 {
-    width: 1170px;
-  }
-  .span11 {
-    width: 1070px;
-  }
-  .span10 {
-    width: 970px;
-  }
-  .span9 {
-    width: 870px;
-  }
-  .span8 {
-    width: 770px;
-  }
-  .span7 {
-    width: 670px;
-  }
-  .span6 {
-    width: 570px;
-  }
-  .span5 {
-    width: 470px;
-  }
-  .span4 {
-    width: 370px;
-  }
-  .span3 {
-    width: 270px;
-  }
-  .span2 {
-    width: 170px;
-  }
-  .span1 {
-    width: 70px;
-  }
-  .offset12 {
-    margin-left: 1230px;
-  }
-  .offset11 {
-    margin-left: 1130px;
-  }
-  .offset10 {
-    margin-left: 1030px;
-  }
-  .offset9 {
-    margin-left: 930px;
-  }
-  .offset8 {
-    margin-left: 830px;
-  }
-  .offset7 {
-    margin-left: 730px;
-  }
-  .offset6 {
-    margin-left: 630px;
-  }
-  .offset5 {
-    margin-left: 530px;
-  }
-  .offset4 {
-    margin-left: 430px;
-  }
-  .offset3 {
-    margin-left: 330px;
-  }
-  .offset2 {
-    margin-left: 230px;
-  }
-  .offset1 {
-    margin-left: 130px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    line-height: 0;
-    content: "";
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    float: left;
-    width: 100%;
-    min-height: 30px;
-    margin-left: 2.564102564102564%;
-    *margin-left: 2.5109110747408616%;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.45299145299145%;
-    *width: 91.39979996362975%;
-  }
-  .row-fluid .span10 {
-    width: 82.90598290598291%;
-    *width: 82.8527914166212%;
-  }
-  .row-fluid .span9 {
-    width: 74.35897435897436%;
-    *width: 74.30578286961266%;
-  }
-  .row-fluid .span8 {
-    width: 65.81196581196582%;
-    *width: 65.75877432260411%;
-  }
-  .row-fluid .span7 {
-    width: 57.26495726495726%;
-    *width: 57.21176577559556%;
-  }
-  .row-fluid .span6 {
-    width: 48.717948717948715%;
-    *width: 48.664757228587014%;
-  }
-  .row-fluid .span5 {
-    width: 40.17094017094017%;
-    *width: 40.11774868157847%;
-  }
-  .row-fluid .span4 {
-    width: 31.623931623931625%;
-    *width: 31.570740134569924%;
-  }
-  .row-fluid .span3 {
-    width: 23.076923076923077%;
-    *width: 23.023731587561375%;
-  }
-  .row-fluid .span2 {
-    width: 14.52991452991453%;
-    *width: 14.476723040552828%;
-  }
-  .row-fluid .span1 {
-    width: 5.982905982905983%;
-    *width: 5.929714493544281%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.12820512820512%;
-    *margin-left: 105.02182214948171%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.56410256410257%;
-    *margin-left: 102.45771958537915%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.58119658119658%;
-    *margin-left: 96.47481360247316%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.01709401709402%;
-    *margin-left: 93.91071103837061%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.03418803418803%;
-    *margin-left: 87.92780505546462%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.47008547008548%;
-    *margin-left: 85.36370249136206%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.48717948717949%;
-    *margin-left: 79.38079650845607%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 76.92307692307693%;
-    *margin-left: 76.81669394435352%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 70.94017094017094%;
-    *margin-left: 70.83378796144753%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.37606837606839%;
-    *margin-left: 68.26968539734497%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.393162393162385%;
-    *margin-left: 62.28677941443899%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.82905982905982%;
-    *margin-left: 59.72267685033642%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 53.84615384615384%;
-    *margin-left: 53.739770867430444%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.28205128205128%;
-    *margin-left: 51.175668303327875%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.299145299145295%;
-    *margin-left: 45.1927623204219%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.73504273504273%;
-    *margin-left: 42.62865975631933%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 36.75213675213675%;
-    *margin-left: 36.645753773413354%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.18803418803419%;
-    *margin-left: 34.081651209310785%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.205128205128204%;
-    *margin-left: 28.0987452264048%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.641025641025642%;
-    *margin-left: 25.53464266230224%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.65811965811966%;
-    *margin-left: 19.551736679396257%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.094017094017094%;
-    *margin-left: 16.98763411529369%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.11111111111111%;
-    *margin-left: 11.004728132387708%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.547008547008547%;
-    *margin-left: 8.440625568285142%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 30px;
-  }
-  input.span12,
-  textarea.span12,
-  .uneditable-input.span12 {
-    width: 1156px;
-  }
-  input.span11,
-  textarea.span11,
-  .uneditable-input.span11 {
-    width: 1056px;
-  }
-  input.span10,
-  textarea.span10,
-  .uneditable-input.span10 {
-    width: 956px;
-  }
-  input.span9,
-  textarea.span9,
-  .uneditable-input.span9 {
-    width: 856px;
-  }
-  input.span8,
-  textarea.span8,
-  .uneditable-input.span8 {
-    width: 756px;
-  }
-  input.span7,
-  textarea.span7,
-  .uneditable-input.span7 {
-    width: 656px;
-  }
-  input.span6,
-  textarea.span6,
-  .uneditable-input.span6 {
-    width: 556px;
-  }
-  input.span5,
-  textarea.span5,
-  .uneditable-input.span5 {
-    width: 456px;
-  }
-  input.span4,
-  textarea.span4,
-  .uneditable-input.span4 {
-    width: 356px;
-  }
-  input.span3,
-  textarea.span3,
-  .uneditable-input.span3 {
-    width: 256px;
-  }
-  input.span2,
-  textarea.span2,
-  .uneditable-input.span2 {
-    width: 156px;
-  }
-  input.span1,
-  textarea.span1,
-  .uneditable-input.span1 {
-    width: 56px;
-  }
-  .thumbnails {
-    margin-left: -30px;
-  }
-  .thumbnails > li {
-    margin-left: 30px;
-  }
-  .row-fluid .thumbnails {
-    margin-left: 0;
-  }
-}
-
- at media (min-width: 768px) and (max-width: 979px) {
-  .row {
-    margin-left: -20px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    line-height: 0;
-    content: "";
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 20px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 724px;
-  }
-  .span12 {
-    width: 724px;
-  }
-  .span11 {
-    width: 662px;
-  }
-  .span10 {
-    width: 600px;
-  }
-  .span9 {
-    width: 538px;
-  }
-  .span8 {
-    width: 476px;
-  }
-  .span7 {
-    width: 414px;
-  }
-  .span6 {
-    width: 352px;
-  }
-  .span5 {
-    width: 290px;
-  }
-  .span4 {
-    width: 228px;
-  }
-  .span3 {
-    width: 166px;
-  }
-  .span2 {
-    width: 104px;
-  }
-  .span1 {
-    width: 42px;
-  }
-  .offset12 {
-    margin-left: 764px;
-  }
-  .offset11 {
-    margin-left: 702px;
-  }
-  .offset10 {
-    margin-left: 640px;
-  }
-  .offset9 {
-    margin-left: 578px;
-  }
-  .offset8 {
-    margin-left: 516px;
-  }
-  .offset7 {
-    margin-left: 454px;
-  }
-  .offset6 {
-    margin-left: 392px;
-  }
-  .offset5 {
-    margin-left: 330px;
-  }
-  .offset4 {
-    margin-left: 268px;
-  }
-  .offset3 {
-    margin-left: 206px;
-  }
-  .offset2 {
-    margin-left: 144px;
-  }
-  .offset1 {
-    margin-left: 82px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    line-height: 0;
-    content: "";
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    float: left;
-    width: 100%;
-    min-height: 30px;
-    margin-left: 2.7624309392265194%;
-    *margin-left: 2.709239449864817%;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.43646408839778%;
-    *width: 91.38327259903608%;
-  }
-  .row-fluid .span10 {
-    width: 82.87292817679558%;
-    *width: 82.81973668743387%;
-  }
-  .row-fluid .span9 {
-    width: 74.30939226519337%;
-    *width: 74.25620077583166%;
-  }
-  .row-fluid .span8 {
-    width: 65.74585635359117%;
-    *width: 65.69266486422946%;
-  }
-  .row-fluid .span7 {
-    width: 57.18232044198895%;
-    *width: 57.12912895262725%;
-  }
-  .row-fluid .span6 {
-    width: 48.61878453038674%;
-    *width: 48.56559304102504%;
-  }
-  .row-fluid .span5 {
-    width: 40.05524861878453%;
-    *width: 40.00205712942283%;
-  }
-  .row-fluid .span4 {
-    width: 31.491712707182323%;
-    *width: 31.43852121782062%;
-  }
-  .row-fluid .span3 {
-    width: 22.92817679558011%;
-    *width: 22.87498530621841%;
-  }
-  .row-fluid .span2 {
-    width: 14.3646408839779%;
-    *width: 14.311449394616199%;
-  }
-  .row-fluid .span1 {
-    width: 5.801104972375691%;
-    *width: 5.747913483013988%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.52486187845304%;
-    *margin-left: 105.41847889972962%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.76243093922652%;
-    *margin-left: 102.6560479605031%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.96132596685082%;
-    *margin-left: 96.8549429881274%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.1988950276243%;
-    *margin-left: 94.09251204890089%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.39779005524862%;
-    *margin-left: 88.2914070765252%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.6353591160221%;
-    *margin-left: 85.52897613729868%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.8342541436464%;
-    *margin-left: 79.72787116492299%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 77.07182320441989%;
-    *margin-left: 76.96544022569647%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 71.2707182320442%;
-    *margin-left: 71.16433525332079%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.50828729281768%;
-    *margin-left: 68.40190431409427%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.70718232044199%;
-    *margin-left: 62.600799341718584%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.94475138121547%;
-    *margin-left: 59.838368402492065%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 54.14364640883978%;
-    *margin-left: 54.037263430116376%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.38121546961326%;
-    *margin-left: 51.27483249088986%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.58011049723757%;
-    *margin-left: 45.47372751851417%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.81767955801105%;
-    *margin-left: 42.71129657928765%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 37.01657458563536%;
-    *margin-left: 36.91019160691196%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.25414364640884%;
-    *margin-left: 34.14776066768544%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.45303867403315%;
-    *margin-left: 28.346655695309746%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.69060773480663%;
-    *margin-left: 25.584224756083227%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.88950276243094%;
-    *margin-left: 19.783119783707537%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.12707182320442%;
-    *margin-left: 17.02068884448102%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.32596685082873%;
-    *margin-left: 11.219583872105325%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.56353591160221%;
-    *margin-left: 8.457152932878806%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 20px;
-  }
-  input.span12,
-  textarea.span12,
-  .uneditable-input.span12 {
-    width: 710px;
-  }
-  input.span11,
-  textarea.span11,
-  .uneditable-input.span11 {
-    width: 648px;
-  }
-  input.span10,
-  textarea.span10,
-  .uneditable-input.span10 {
-    width: 586px;
-  }
-  input.span9,
-  textarea.span9,
-  .uneditable-input.span9 {
-    width: 524px;
-  }
-  input.span8,
-  textarea.span8,
-  .uneditable-input.span8 {
-    width: 462px;
-  }
-  input.span7,
-  textarea.span7,
-  .uneditable-input.span7 {
-    width: 400px;
-  }
-  input.span6,
-  textarea.span6,
-  .uneditable-input.span6 {
-    width: 338px;
-  }
-  input.span5,
-  textarea.span5,
-  .uneditable-input.span5 {
-    width: 276px;
-  }
-  input.span4,
-  textarea.span4,
-  .uneditable-input.span4 {
-    width: 214px;
-  }
-  input.span3,
-  textarea.span3,
-  .uneditable-input.span3 {
-    width: 152px;
-  }
-  input.span2,
-  textarea.span2,
-  .uneditable-input.span2 {
-    width: 90px;
-  }
-  input.span1,
-  textarea.span1,
-  .uneditable-input.span1 {
-    width: 28px;
-  }
-}
-
- at media (max-width: 767px) {
-  body {
-    padding-right: 20px;
-    padding-left: 20px;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    margin-right: -20px;
-    margin-left: -20px;
-  }
-  .container-fluid {
-    padding: 0;
-  }
-  .dl-horizontal dt {
-    float: none;
-    width: auto;
-    clear: none;
-    text-align: left;
-  }
-  .dl-horizontal dd {
-    margin-left: 0;
-  }
-  .container {
-    width: auto;
-  }
-  .row-fluid {
-    width: 100%;
-  }
-  .row,
-  .thumbnails {
-    margin-left: 0;
-  }
-  .thumbnails > li {
-    float: none;
-    margin-left: 0;
-  }
-  [class*="span"],
-  .row-fluid [class*="span"] {
-    display: block;
-    float: none;
-    width: auto;
-    margin-left: 0;
-  }
-  .span12,
-  .row-fluid .span12 {
-    width: 100%;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-  }
-  .input-large,
-  .input-xlarge,
-  .input-xxlarge,
-  input[class*="span"],
-  select[class*="span"],
-  textarea[class*="span"],
-  .uneditable-input {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-  }
-  .input-prepend input,
-  .input-append input,
-  .input-prepend input[class*="span"],
-  .input-append input[class*="span"] {
-    display: inline-block;
-    width: auto;
-  }
-  .modal {
-    position: fixed;
-    top: 20px;
-    right: 20px;
-    left: 20px;
-    width: auto;
-    margin: 0;
-  }
-  .modal.fade.in {
-    top: auto;
-  }
-}
-
- at media (max-width: 480px) {
-  .nav-collapse {
-    -webkit-transform: translate3d(0, 0, 0);
-  }
-  .page-header h1 small {
-    display: block;
-    line-height: 20px;
-  }
-  input[type="checkbox"],
-  input[type="radio"] {
-    border: 1px solid #ccc;
-  }
-  .form-horizontal .control-group > label {
-    float: none;
-    width: auto;
-    padding-top: 0;
-    text-align: left;
-  }
-  .form-horizontal .controls {
-    margin-left: 0;
-  }
-  .form-horizontal .control-list {
-    padding-top: 0;
-  }
-  .form-horizontal .form-actions {
-    padding-right: 10px;
-    padding-left: 10px;
-  }
-  .modal {
-    top: 10px;
-    right: 10px;
-    left: 10px;
-  }
-  .modal-header .close {
-    padding: 10px;
-    margin: -10px;
-  }
-  .carousel-caption {
-    position: static;
-  }
-}
-
- at media (max-width: 979px) {
-  body {
-    padding-top: 0;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    position: static;
-  }
-  .navbar-fixed-top {
-    margin-bottom: 20px;
-  }
-  .navbar-fixed-bottom {
-    margin-top: 20px;
-  }
-  .navbar-fixed-top .navbar-inner,
-  .navbar-fixed-bottom .navbar-inner {
-    padding: 5px;
-  }
-  .navbar .container {
-    width: auto;
-    padding: 0;
-  }
-  .navbar .brand {
-    padding-right: 10px;
-    padding-left: 10px;
-    margin: 0 0 0 -5px;
-  }
-  .nav-collapse {
-    clear: both;
-  }
-  .nav-collapse .nav {
-    float: none;
-    margin: 0 0 10px;
-  }
-  .nav-collapse .nav > li {
-    float: none;
-  }
-  .nav-collapse .nav > li > a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > .divider-vertical {
-    display: none;
-  }
-  .nav-collapse .nav .nav-header {
-    color: #555555;
-    text-shadow: none;
-  }
-  .nav-collapse .nav > li > a,
-  .nav-collapse .dropdown-menu a {
-    padding: 9px 15px;
-    font-weight: bold;
-    color: #555555;
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
-  }
-  .nav-collapse .btn {
-    padding: 4px 10px 4px;
-    font-weight: normal;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-  }
-  .nav-collapse .dropdown-menu li + li a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > li > a:hover,
-  .nav-collapse .dropdown-menu a:hover {
-    background-color: #f2f2f2;
-  }
-  .navbar-inverse .nav-collapse .nav > li > a:hover,
-  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
-    background-color: #111111;
-  }
-  .nav-collapse.in .btn-group {
-    padding: 0;
-    margin-top: 5px;
-  }
-  .nav-collapse .dropdown-menu {
-    position: static;
-    top: auto;
-    left: auto;
-    display: block;
-    float: none;
-    max-width: none;
-    padding: 0;
-    margin: 0 15px;
-    background-color: transparent;
-    border: none;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-    -webkit-box-shadow: none;
-       -moz-box-shadow: none;
-            box-shadow: none;
-  }
-  .nav-collapse .dropdown-menu:before,
-  .nav-collapse .dropdown-menu:after {
-    display: none;
-  }
-  .nav-collapse .dropdown-menu .divider {
-    display: none;
-  }
-  .nav-collapse .navbar-form,
-  .nav-collapse .navbar-search {
-    float: none;
-    padding: 10px 15px;
-    margin: 10px 0;
-    border-top: 1px solid #f2f2f2;
-    border-bottom: 1px solid #f2f2f2;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
-  }
-  .navbar .nav-collapse .nav.pull-right {
-    float: none;
-    margin-left: 0;
-  }
-  .nav-collapse,
-  .nav-collapse.collapse {
-    height: 0;
-    overflow: hidden;
-  }
-  .navbar .btn-navbar {
-    display: block;
-  }
-  .navbar-static .navbar-inner {
-    padding-right: 10px;
-    padding-left: 10px;
-  }
-}
-
- at media (min-width: 980px) {
-  .nav-collapse.collapse {
-    height: auto !important;
-    overflow: visible !important;
-  }
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.min.css b/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
deleted file mode 100644
index ab59da3..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Bootstrap Responsive v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{displa [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-sapling.css b/doc/_themes/bootstrap/static/bootstrap-sapling.css
deleted file mode 100644
index c50510a..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-sapling.css
+++ /dev/null
@@ -1,6484 +0,0 @@
-/*!
- * vendor/styles/bootstrap v2.0.3
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-audio:not([controls]) {
-  display: none;
-}
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-  -ms-text-size-adjust: 100%;
-}
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-a:hover,
-a:active {
-  outline: 0;
-}
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-sup {
-  top: -0.5em;
-}
-sub {
-  bottom: -0.25em;
-}
-img {
-  max-width: 100%;
-  height: auto;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-#map_canvas img {
-  max-width: none;
-}
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-.clearfix {
-  *zoom: 1;
-}
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.clearfix:after {
-  clear: both;
-}
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-body {
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 20px;
-  color: #1f444b;
-  background-color: #ffffff;
-}
-a {
-  color: #6e8f4a;
-  text-decoration: none;
-}
-a:hover {
-  color: #f26a1e;
-  text-decoration: underline;
-}
-.img-rounded {
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-.img-circle {
-  -webkit-border-radius: 500px;
-  -moz-border-radius: 500px;
-  border-radius: 500px;
-}
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-.row:before,
-.row:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.row:after {
-  clear: both;
-}
-[class*="span"] {
-  float: left;
-  margin-left: 20px;
-}
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-.span12 {
-  width: 940px;
-}
-.span11 {
-  width: 860px;
-}
-.span10 {
-  width: 780px;
-}
-.span9 {
-  width: 700px;
-}
-.span8 {
-  width: 620px;
-}
-.span7 {
-  width: 540px;
-}
-.span6 {
-  width: 460px;
-}
-.span5 {
-  width: 380px;
-}
-.span4 {
-  width: 300px;
-}
-.span3 {
-  width: 220px;
-}
-.span2 {
-  width: 140px;
-}
-.span1 {
-  width: 60px;
-}
-.offset12 {
-  margin-left: 980px;
-}
-.offset11 {
-  margin-left: 900px;
-}
-.offset10 {
-  margin-left: 820px;
-}
-.offset9 {
-  margin-left: 740px;
-}
-.offset8 {
-  margin-left: 660px;
-}
-.offset7 {
-  margin-left: 580px;
-}
-.offset6 {
-  margin-left: 500px;
-}
-.offset5 {
-  margin-left: 420px;
-}
-.offset4 {
-  margin-left: 340px;
-}
-.offset3 {
-  margin-left: 260px;
-}
-.offset2 {
-  margin-left: 180px;
-}
-.offset1 {
-  margin-left: 100px;
-}
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.row-fluid:after {
-  clear: both;
-}
-.row-fluid [class*="span"] {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  float: left;
-  margin-left: 2.127659574468085%;
-  *margin-left: 2.074468085106383%;
-}
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-.row-fluid .span10 {
-  width: 82.97872340425532%;
-  *width: 82.92553191489361%;
-}
-.row-fluid .span9 {
-  width: 74.46808510638297%;
-  *width: 74.41489361702126%;
-}
-.row-fluid .span8 {
-  width: 65.95744680851064%;
-  *width: 65.90425531914893%;
-}
-.row-fluid .span7 {
-  width: 57.44680851063829%;
-  *width: 57.39361702127659%;
-}
-.row-fluid .span6 {
-  width: 48.93617021276595%;
-  *width: 48.88297872340425%;
-}
-.row-fluid .span5 {
-  width: 40.42553191489362%;
-  *width: 40.37234042553192%;
-}
-.row-fluid .span4 {
-  width: 31.914893617021278%;
-  *width: 31.861702127659576%;
-}
-.row-fluid .span3 {
-  width: 23.404255319148934%;
-  *width: 23.351063829787233%;
-}
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-.container:before,
-.container:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.container:after {
-  clear: both;
-}
-.container-fluid {
-  padding-right: 20px;
-  padding-left: 20px;
-  *zoom: 1;
-}
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.container-fluid:after {
-  clear: both;
-}
-p {
-  margin: 0 0 10px;
-}
-.lead {
-  margin-bottom: 20px;
-  font-size: 20px;
-  font-weight: 200;
-  line-height: 30px;
-}
-small {
-  font-size: 85%;
-}
-strong {
-  font-weight: bold;
-}
-em {
-  font-style: italic;
-}
-cite {
-  font-style: normal;
-}
-.muted {
-  color: #999999;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 10px 0;
-  font-family: inherit;
-  font-weight: bold;
-  line-height: 1;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-h1 {
-  font-size: 36px;
-  line-height: 40px;
-}
-h2 {
-  font-size: 30px;
-  line-height: 40px;
-}
-h3 {
-  font-size: 24px;
-  line-height: 40px;
-}
-h4 {
-  font-size: 18px;
-  line-height: 20px;
-}
-h5 {
-  font-size: 14px;
-  line-height: 20px;
-}
-h6 {
-  font-size: 12px;
-  line-height: 20px;
-}
-h1 small {
-  font-size: 24px;
-}
-h2 small {
-  font-size: 18px;
-}
-h3 small {
-  font-size: 14px;
-}
-h4 small {
-  font-size: 14px;
-}
-.page-header {
-  padding-bottom: 9px;
-  margin: 20px 0 30px;
-  border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 10px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-li {
-  line-height: 20px;
-}
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-dl {
-  margin-bottom: 20px;
-}
-dt,
-dd {
-  line-height: 20px;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 10px;
-}
-.dl-horizontal dt {
-  float: left;
-  width: 120px;
-  clear: left;
-  text-align: right;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.dl-horizontal dd {
-  margin-left: 130px;
-}
-hr {
-  margin: 20px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-abbr[title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 20px;
-  border-left: 5px solid #eeeeee;
-}
-blockquote p {
-  margin-bottom: 0;
-  font-size: 16px;
-  font-weight: 300;
-  line-height: 25px;
-}
-blockquote small {
-  display: block;
-  line-height: 20px;
-  color: #999999;
-}
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-blockquote.pull-right small:before {
-  content: '';
-}
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-address {
-  display: block;
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 20px;
-}
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 12px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-code {
-  padding: 2px 4px;
-  color: #d14;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 20px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-pre.prettyprint {
-  margin-bottom: 20px;
-}
-pre code {
-  padding: 0;
-  color: inherit;
-  background-color: transparent;
-  border: 0;
-}
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-form {
-  margin: 0 0 20px;
-}
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: 40px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-legend small {
-  font-size: 15px;
-  color: #999999;
-}
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-}
-input,
-button,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 20px;
-  padding: 4px 6px;
-  margin-bottom: 9px;
-  font-size: 14px;
-  line-height: 20px;
-  color: #555555;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-input,
-textarea {
-  width: 210px;
-}
-textarea {
-  height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear .2s, box-shadow linear .2s;
-  -moz-transition: border linear .2s, box-shadow linear .2s;
-  -o-transition: border linear .2s, box-shadow linear .2s;
-  transition: border linear .2s, box-shadow linear .2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-}
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  *margin-top: 0;
-  /* IE7 */
-
-  margin-top: 1px \9;
-  /* IE8-9 */
-
-  line-height: normal;
-  cursor: pointer;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-select,
-input[type="file"] {
-  height: 30px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 30px;
-}
-select {
-  width: 220px;
-  border: 1px solid #bbb;
-  background-color: #ffffff;
-}
-select[multiple],
-select[size] {
-  height: auto;
-}
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-  cursor: not-allowed;
-}
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-.radio,
-.checkbox {
-  min-height: 18px;
-  padding-left: 18px;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-  margin-left: -18px;
-}
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-.input-mini {
-  width: 60px;
-}
-.input-small {
-  width: 90px;
-}
-.input-medium {
-  width: 150px;
-}
-.input-large {
-  width: 210px;
-}
-.input-xlarge {
-  width: 270px;
-}
-.input-xxlarge {
-  width: 530px;
-}
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-input.span12, textarea.span12, .uneditable-input.span12 {
-  width: 926px;
-}
-input.span11, textarea.span11, .uneditable-input.span11 {
-  width: 846px;
-}
-input.span10, textarea.span10, .uneditable-input.span10 {
-  width: 766px;
-}
-input.span9, textarea.span9, .uneditable-input.span9 {
-  width: 686px;
-}
-input.span8, textarea.span8, .uneditable-input.span8 {
-  width: 606px;
-}
-input.span7, textarea.span7, .uneditable-input.span7 {
-  width: 526px;
-}
-input.span6, textarea.span6, .uneditable-input.span6 {
-  width: 446px;
-}
-input.span5, textarea.span5, .uneditable-input.span5 {
-  width: 366px;
-}
-input.span4, textarea.span4, .uneditable-input.span4 {
-  width: 286px;
-}
-input.span3, textarea.span3, .uneditable-input.span3 {
-  width: 206px;
-}
-input.span2, textarea.span2, .uneditable-input.span2 {
-  width: 126px;
-}
-input.span1, textarea.span1, .uneditable-input.span1 {
-  width: 46px;
-}
-.controls-row {
-  *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.controls-row:after {
-  clear: both;
-}
-.controls-row [class*="span"] {
-  float: left;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-  -moz-box-shadow: 0 0 6px #f8b9b7;
-  box-shadow: 0 0 6px #f8b9b7;
-}
-.form-actions {
-  padding: 19px 20px 20px;
-  margin-top: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.form-actions:after {
-  clear: both;
-}
-.help-block,
-.help-inline {
-  color: #357581;
-}
-.help-block {
-  display: block;
-  margin-bottom: 10px;
-}
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  vertical-align: middle;
-  padding-left: 5px;
-}
-.input-append,
-.input-prepend {
-  margin-bottom: 5px;
-  font-size: 0;
-  white-space: nowrap;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  font-size: 14px;
-  vertical-align: top;
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 20px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
-  margin-left: -1px;
-  vertical-align: top;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.input-append .active,
-.input-prepend .active {
-  background-color: #a9dba9;
-  border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-/* Allow for input prepend/append in search forms */
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-  -moz-border-radius: 14px 0 0 14px;
-  border-radius: 14px 0 0 14px;
-}
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-  -moz-border-radius: 0 14px 14px 0;
-  border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-  -moz-border-radius: 0 14px 14px 0;
-  border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-  -moz-border-radius: 14px 0 0 14px;
-  border-radius: 14px 0 0 14px;
-}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-.control-group {
-  margin-bottom: 10px;
-}
-legend + .control-group {
-  margin-top: 20px;
-  -webkit-margin-top-collapse: separate;
-}
-.form-horizontal .control-group {
-  margin-bottom: 20px;
-  *zoom: 1;
-}
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.form-horizontal .control-group:after {
-  clear: both;
-}
-.form-horizontal .control-label {
-  float: left;
-  width: 140px;
-  padding-top: 5px;
-  text-align: right;
-}
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 160px;
-  *margin-left: 0;
-}
-.form-horizontal .controls:first-child {
-  *padding-left: 160px;
-}
-.form-horizontal .help-block {
-  margin-top: 10px;
-  margin-bottom: 0;
-}
-.form-horizontal .form-actions {
-  padding-left: 160px;
-}
-table {
-  max-width: 100%;
-  background-color: transparent;
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-.table {
-  width: 100%;
-  margin-bottom: 20px;
-}
-.table th,
-.table td {
-  padding: 8px;
-  line-height: 20px;
-  text-align: left;
-  vertical-align: top;
-  border-top: 1px solid #dddddd;
-}
-.table th {
-  font-weight: bold;
-}
-.table thead th {
-  vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-  border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-  border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
-  -webkit-border-radius: 0 0 0 4px;
-  -moz-border-radius: 0 0 0 4px;
-  border-radius: 0 0 0 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 4px;
-  border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-  -webkit-border-top-left-radius: 4px;
-  border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-  -webkit-border-top-right-radius: 4px;
-  border-top-right-radius: 4px;
-  -moz-border-right-topleft: 4px;
-}
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
-  background-color: #f9f9f9;
-}
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
-  background-color: #f5f5f5;
-}
-table [class*=span],
-.row-fluid table [class*=span] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-table .span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-table .span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-table .span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-table .span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-table .span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-table .span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-table .span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-table .span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-table .span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-table .span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-table .span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-table .span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-table .span13 {
-  float: none;
-  width: 1004px;
-  margin-left: 0;
-}
-table .span14 {
-  float: none;
-  width: 1084px;
-  margin-left: 0;
-}
-table .span15 {
-  float: none;
-  width: 1164px;
-  margin-left: 0;
-}
-table .span16 {
-  float: none;
-  width: 1244px;
-  margin-left: 0;
-}
-table .span17 {
-  float: none;
-  width: 1324px;
-  margin-left: 0;
-}
-table .span18 {
-  float: none;
-  width: 1404px;
-  margin-left: 0;
-}
-table .span19 {
-  float: none;
-  width: 1484px;
-  margin-left: 0;
-}
-table .span20 {
-  float: none;
-  width: 1564px;
-  margin-left: 0;
-}
-table .span21 {
-  float: none;
-  width: 1644px;
-  margin-left: 0;
-}
-table .span22 {
-  float: none;
-  width: 1724px;
-  margin-left: 0;
-}
-table .span23 {
-  float: none;
-  width: 1804px;
-  margin-left: 0;
-}
-table .span24 {
-  float: none;
-  width: 1884px;
-  margin-left: 0;
-}
-.table tbody tr.success td {
-  background-color: #dff0d8;
-}
-.table tbody tr.error td {
-  background-color: #f2dede;
-}
-.table tbody tr.info td {
-  background-color: #d9edf7;
-}
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-  margin-top: 1px;
-}
-/* White icons with optional class, or on hover/active states of certain elements */
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-.icon-glass {
-  background-position: 0      0;
-}
-.icon-music {
-  background-position: -24px 0;
-}
-.icon-search {
-  background-position: -48px 0;
-}
-.icon-envelope {
-  background-position: -72px 0;
-}
-.icon-heart {
-  background-position: -96px 0;
-}
-.icon-star {
-  background-position: -120px 0;
-}
-.icon-star-empty {
-  background-position: -144px 0;
-}
-.icon-user {
-  background-position: -168px 0;
-}
-.icon-film {
-  background-position: -192px 0;
-}
-.icon-th-large {
-  background-position: -216px 0;
-}
-.icon-th {
-  background-position: -240px 0;
-}
-.icon-th-list {
-  background-position: -264px 0;
-}
-.icon-ok {
-  background-position: -288px 0;
-}
-.icon-remove {
-  background-position: -312px 0;
-}
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-.icon-off {
-  background-position: -384px 0;
-}
-.icon-signal {
-  background-position: -408px 0;
-}
-.icon-cog {
-  background-position: -432px 0;
-}
-.icon-trash {
-  background-position: -456px 0;
-}
-.icon-home {
-  background-position: 0 -24px;
-}
-.icon-file {
-  background-position: -24px -24px;
-}
-.icon-time {
-  background-position: -48px -24px;
-}
-.icon-road {
-  background-position: -72px -24px;
-}
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-.icon-download {
-  background-position: -120px -24px;
-}
-.icon-upload {
-  background-position: -144px -24px;
-}
-.icon-inbox {
-  background-position: -168px -24px;
-}
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-.icon-repeat {
-  background-position: -216px -24px;
-}
-.icon-refresh {
-  background-position: -240px -24px;
-}
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-.icon-lock {
-  background-position: -287px -24px;
-}
-.icon-flag {
-  background-position: -312px -24px;
-}
-.icon-headphones {
-  background-position: -336px -24px;
-}
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-.icon-barcode {
-  background-position: -456px -24px;
-}
-.icon-tag {
-  background-position: 0 -48px;
-}
-.icon-tags {
-  background-position: -25px -48px;
-}
-.icon-book {
-  background-position: -48px -48px;
-}
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-.icon-print {
-  background-position: -96px -48px;
-}
-.icon-camera {
-  background-position: -120px -48px;
-}
-.icon-font {
-  background-position: -144px -48px;
-}
-.icon-bold {
-  background-position: -167px -48px;
-}
-.icon-italic {
-  background-position: -192px -48px;
-}
-.icon-text-height {
-  background-position: -216px -48px;
-}
-.icon-text-width {
-  background-position: -240px -48px;
-}
-.icon-align-left {
-  background-position: -264px -48px;
-}
-.icon-align-center {
-  background-position: -288px -48px;
-}
-.icon-align-right {
-  background-position: -312px -48px;
-}
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-.icon-list {
-  background-position: -360px -48px;
-}
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-.icon-picture {
-  background-position: -456px -48px;
-}
-.icon-pencil {
-  background-position: 0 -72px;
-}
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-.icon-adjust {
-  background-position: -48px -72px;
-}
-.icon-tint {
-  background-position: -72px -72px;
-}
-.icon-edit {
-  background-position: -96px -72px;
-}
-.icon-share {
-  background-position: -120px -72px;
-}
-.icon-check {
-  background-position: -144px -72px;
-}
-.icon-move {
-  background-position: -168px -72px;
-}
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-.icon-backward {
-  background-position: -240px -72px;
-}
-.icon-play {
-  background-position: -264px -72px;
-}
-.icon-pause {
-  background-position: -288px -72px;
-}
-.icon-stop {
-  background-position: -312px -72px;
-}
-.icon-forward {
-  background-position: -336px -72px;
-}
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-.icon-eject {
-  background-position: -408px -72px;
-}
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-.icon-plus {
-  background-position: -408px -96px;
-}
-.icon-minus {
-  background-position: -433px -96px;
-}
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-.icon-gift {
-  background-position: -24px -120px;
-}
-.icon-leaf {
-  background-position: -48px -120px;
-}
-.icon-fire {
-  background-position: -72px -120px;
-}
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-.icon-plane {
-  background-position: -168px -120px;
-}
-.icon-calendar {
-  background-position: -192px -120px;
-}
-.icon-random {
-  background-position: -216px -120px;
-  width: 16px;
-}
-.icon-comment {
-  background-position: -240px -120px;
-}
-.icon-magnet {
-  background-position: -264px -120px;
-}
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-.icon-retweet {
-  background-position: -336px -120px;
-}
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-.icon-folder-close {
-  background-position: -384px -120px;
-}
-.icon-folder-open {
-  background-position: -408px -120px;
-  width: 16px;
-}
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-.icon-hdd {
-  background-position: 0 -144px;
-}
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-.icon-bell {
-  background-position: -48px -144px;
-}
-.icon-certificate {
-  background-position: -72px -144px;
-}
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-.icon-globe {
-  background-position: -336px -144px;
-}
-.icon-wrench {
-  background-position: -360px -144px;
-}
-.icon-tasks {
-  background-position: -384px -144px;
-}
-.icon-filter {
-  background-position: -408px -144px;
-}
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-/*  Font Awesome
-    the iconic font designed for use with Twitter Bootstrap
-    -------------------------------------------------------
-    The full suite of pictographic icons, examples, and documentation
-    can be found at: http://fortawesome.github.com/Font-Awesome/
-
-    License
-    -------------------------------------------------------
-    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
-    http://creativecommons.org/licenses/by/3.0/ A mention of
-    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
-    source code is considered acceptable attribution (most common on the web).
-    If human readable source code is not available to the end user, a mention in
-    an 'About' or 'Credits' screen is considered acceptable (most common in desktop
-    or mobile software).
-
-    Contact
-    -------------------------------------------------------
-    Email: dave at davegandy.com
-    Twitter: http://twitter.com/fortaweso_me
-    Work: Lead Product Designer @ http://kyruus.com
-
-    */
- at font-face {
-  font-family: 'FontAwesome';
-  src: url('../font/fontawesome-webfont.eot');
-  src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg');
-  font-weight: normal;
-  font-style: normal;
-}
-/*  Font Awesome styles
-    ------------------------------------------------------- */
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
-  font-family: FontAwesome;
-  font-weight: normal;
-  font-style: normal;
-  display: inline-block;
-  text-decoration: inherit;
-}
-a [class^="icon-"],
-a [class*=" icon-"] {
-  display: inline-block;
-  text-decoration: inherit;
-}
-/* makes the font 33% larger relative to the icon container */
-.icon-large:before {
-  vertical-align: middle;
-  font-size: 1.3333333333333333em;
-}
-.btn [class^="icon-"],
-.nav-tabs [class^="icon-"],
-.btn [class*=" icon-"],
-.nav-tabs [class*=" icon-"] {
-  /* keeps button heights with and without icons the same */
-
-  line-height: .9em;
-}
-li [class^="icon-"],
-li [class*=" icon-"] {
-  display: inline-block;
-  width: 1.25em;
-  text-align: center;
-}
-li .icon-large:before,
-li .icon-large:before {
-  /* 1.5 increased font size for icon-large * 1.25 width */
-
-  width: 1.875em;
-}
-ul.icons {
-  list-style-type: none;
-  margin-left: 2em;
-  text-indent: -0.8em;
-}
-ul.icons li [class^="icon-"],
-ul.icons li [class*=" icon-"] {
-  width: .8em;
-}
-ul.icons li .icon-large:before,
-ul.icons li .icon-large:before {
-  /* 1.5 increased font size for icon-large * 1.25 width */
-
-  vertical-align: initial;
-}
-/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
-    readers do not read off random characters that represent icons */
-.icon-glass:before {
-  content: "\f000";
-}
-.icon-music:before {
-  content: "\f001";
-}
-.icon-search:before {
-  content: "\f002";
-}
-.icon-envelope:before {
-  content: "\f003";
-}
-.icon-heart:before {
-  content: "\f004";
-}
-.icon-star:before {
-  content: "\f005";
-}
-.icon-star-empty:before {
-  content: "\f006";
-}
-.icon-user:before {
-  content: "\f007";
-}
-.icon-film:before {
-  content: "\f008";
-}
-.icon-th-large:before {
-  content: "\f009";
-}
-.icon-th:before {
-  content: "\f00a";
-}
-.icon-th-list:before {
-  content: "\f00b";
-}
-.icon-ok:before {
-  content: "\f00c";
-}
-.icon-remove:before {
-  content: "\f00d";
-}
-.icon-zoom-in:before {
-  content: "\f00e";
-}
-.icon-zoom-out:before {
-  content: "\f010";
-}
-.icon-off:before {
-  content: "\f011";
-}
-.icon-signal:before {
-  content: "\f012";
-}
-.icon-cog:before {
-  content: "\f013";
-}
-.icon-trash:before {
-  content: "\f014";
-}
-.icon-home:before {
-  content: "\f015";
-}
-.icon-file:before {
-  content: "\f016";
-}
-.icon-time:before {
-  content: "\f017";
-}
-.icon-road:before {
-  content: "\f018";
-}
-.icon-download-alt:before {
-  content: "\f019";
-}
-.icon-download:before {
-  content: "\f01a";
-}
-.icon-upload:before {
-  content: "\f01b";
-}
-.icon-inbox:before {
-  content: "\f01c";
-}
-.icon-play-circle:before {
-  content: "\f01d";
-}
-.icon-repeat:before {
-  content: "\f01e";
-}
-/* \f020 is not a valid unicode character. all shifted one down */
-.icon-refresh:before {
-  content: "\f021";
-}
-.icon-list-alt:before {
-  content: "\f022";
-}
-.icon-lock:before {
-  content: "\f023";
-}
-.icon-flag:before {
-  content: "\f024";
-}
-.icon-headphones:before {
-  content: "\f025";
-}
-.icon-volume-off:before {
-  content: "\f026";
-}
-.icon-volume-down:before {
-  content: "\f027";
-}
-.icon-volume-up:before {
-  content: "\f028";
-}
-.icon-qrcode:before {
-  content: "\f029";
-}
-.icon-barcode:before {
-  content: "\f02a";
-}
-.icon-tag:before {
-  content: "\f02b";
-}
-.icon-tags:before {
-  content: "\f02c";
-}
-.icon-book:before {
-  content: "\f02d";
-}
-.icon-bookmark:before {
-  content: "\f02e";
-}
-.icon-print:before {
-  content: "\f02f";
-}
-.icon-camera:before {
-  content: "\f030";
-}
-.icon-font:before {
-  content: "\f031";
-}
-.icon-bold:before {
-  content: "\f032";
-}
-.icon-italic:before {
-  content: "\f033";
-}
-.icon-text-height:before {
-  content: "\f034";
-}
-.icon-text-width:before {
-  content: "\f035";
-}
-.icon-align-left:before {
-  content: "\f036";
-}
-.icon-align-center:before {
-  content: "\f037";
-}
-.icon-align-right:before {
-  content: "\f038";
-}
-.icon-align-justify:before {
-  content: "\f039";
-}
-.icon-list:before {
-  content: "\f03a";
-}
-.icon-indent-left:before {
-  content: "\f03b";
-}
-.icon-indent-right:before {
-  content: "\f03c";
-}
-.icon-facetime-video:before {
-  content: "\f03d";
-}
-.icon-picture:before {
-  content: "\f03e";
-}
-.icon-pencil:before {
-  content: "\f040";
-}
-.icon-map-marker:before {
-  content: "\f041";
-}
-.icon-adjust:before {
-  content: "\f042";
-}
-.icon-tint:before {
-  content: "\f043";
-}
-.icon-edit:before {
-  content: "\f044";
-}
-.icon-share:before {
-  content: "\f045";
-}
-.icon-check:before {
-  content: "\f046";
-}
-.icon-move:before {
-  content: "\f047";
-}
-.icon-step-backward:before {
-  content: "\f048";
-}
-.icon-fast-backward:before {
-  content: "\f049";
-}
-.icon-backward:before {
-  content: "\f04a";
-}
-.icon-play:before {
-  content: "\f04b";
-}
-.icon-pause:before {
-  content: "\f04c";
-}
-.icon-stop:before {
-  content: "\f04d";
-}
-.icon-forward:before {
-  content: "\f04e";
-}
-.icon-fast-forward:before {
-  content: "\f050";
-}
-.icon-step-forward:before {
-  content: "\f051";
-}
-.icon-eject:before {
-  content: "\f052";
-}
-.icon-chevron-left:before {
-  content: "\f053";
-}
-.icon-chevron-right:before {
-  content: "\f054";
-}
-.icon-plus-sign:before {
-  content: "\f055";
-}
-.icon-minus-sign:before {
-  content: "\f056";
-}
-.icon-remove-sign:before {
-  content: "\f057";
-}
-.icon-ok-sign:before {
-  content: "\f058";
-}
-.icon-question-sign:before {
-  content: "\f059";
-}
-.icon-info-sign:before {
-  content: "\f05a";
-}
-.icon-screenshot:before {
-  content: "\f05b";
-}
-.icon-remove-circle:before {
-  content: "\f05c";
-}
-.icon-ok-circle:before {
-  content: "\f05d";
-}
-.icon-ban-circle:before {
-  content: "\f05e";
-}
-.icon-arrow-left:before {
-  content: "\f060";
-}
-.icon-arrow-right:before {
-  content: "\f061";
-}
-.icon-arrow-up:before {
-  content: "\f062";
-}
-.icon-arrow-down:before {
-  content: "\f063";
-}
-.icon-share-alt:before {
-  content: "\f064";
-}
-.icon-resize-full:before {
-  content: "\f065";
-}
-.icon-resize-small:before {
-  content: "\f066";
-}
-.icon-plus:before {
-  content: "\f067";
-}
-.icon-minus:before {
-  content: "\f068";
-}
-.icon-asterisk:before {
-  content: "\f069";
-}
-.icon-exclamation-sign:before {
-  content: "\f06a";
-}
-.icon-gift:before {
-  content: "\f06b";
-}
-.icon-leaf:before {
-  content: "\f06c";
-}
-.icon-fire:before {
-  content: "\f06d";
-}
-.icon-eye-open:before {
-  content: "\f06e";
-}
-.icon-eye-close:before {
-  content: "\f070";
-}
-.icon-warning-sign:before {
-  content: "\f071";
-}
-.icon-plane:before {
-  content: "\f072";
-}
-.icon-calendar:before {
-  content: "\f073";
-}
-.icon-random:before {
-  content: "\f074";
-}
-.icon-comment:before {
-  content: "\f075";
-}
-.icon-magnet:before {
-  content: "\f076";
-}
-.icon-chevron-up:before {
-  content: "\f077";
-}
-.icon-chevron-down:before {
-  content: "\f078";
-}
-.icon-retweet:before {
-  content: "\f079";
-}
-.icon-shopping-cart:before {
-  content: "\f07a";
-}
-.icon-folder-close:before {
-  content: "\f07b";
-}
-.icon-folder-open:before {
-  content: "\f07c";
-}
-.icon-resize-vertical:before {
-  content: "\f07d";
-}
-.icon-resize-horizontal:before {
-  content: "\f07e";
-}
-.icon-bar-chart:before {
-  content: "\f080";
-}
-.icon-twitter-sign:before {
-  content: "\f081";
-}
-.icon-facebook-sign:before {
-  content: "\f082";
-}
-.icon-camera-retro:before {
-  content: "\f083";
-}
-.icon-key:before {
-  content: "\f084";
-}
-.icon-cogs:before {
-  content: "\f085";
-}
-.icon-comments:before {
-  content: "\f086";
-}
-.icon-thumbs-up:before {
-  content: "\f087";
-}
-.icon-thumbs-down:before {
-  content: "\f088";
-}
-.icon-star-half:before {
-  content: "\f089";
-}
-.icon-heart-empty:before {
-  content: "\f08a";
-}
-.icon-signout:before {
-  content: "\f08b";
-}
-.icon-linkedin-sign:before {
-  content: "\f08c";
-}
-.icon-pushpin:before {
-  content: "\f08d";
-}
-.icon-external-link:before {
-  content: "\f08e";
-}
-.icon-signin:before {
-  content: "\f090";
-}
-.icon-trophy:before {
-  content: "\f091";
-}
-.icon-github-sign:before {
-  content: "\f092";
-}
-.icon-upload-alt:before {
-  content: "\f093";
-}
-.icon-lemon:before {
-  content: "\f094";
-}
-.icon-phone:before {
-  content: "\f095";
-}
-.icon-check-empty:before {
-  content: "\f096";
-}
-.icon-bookmark-empty:before {
-  content: "\f097";
-}
-.icon-phone-sign:before {
-  content: "\f098";
-}
-.icon-twitter:before {
-  content: "\f099";
-}
-.icon-facebook:before {
-  content: "\f09a";
-}
-.icon-github:before {
-  content: "\f09b";
-}
-.icon-unlock:before {
-  content: "\f09c";
-}
-.icon-credit-card:before {
-  content: "\f09d";
-}
-.icon-rss:before {
-  content: "\f09e";
-}
-.icon-hdd:before {
-  content: "\f0a0";
-}
-.icon-bullhorn:before {
-  content: "\f0a1";
-}
-.icon-bell:before {
-  content: "\f0a2";
-}
-.icon-certificate:before {
-  content: "\f0a3";
-}
-.icon-hand-right:before {
-  content: "\f0a4";
-}
-.icon-hand-left:before {
-  content: "\f0a5";
-}
-.icon-hand-up:before {
-  content: "\f0a6";
-}
-.icon-hand-down:before {
-  content: "\f0a7";
-}
-.icon-circle-arrow-left:before {
-  content: "\f0a8";
-}
-.icon-circle-arrow-right:before {
-  content: "\f0a9";
-}
-.icon-circle-arrow-up:before {
-  content: "\f0aa";
-}
-.icon-circle-arrow-down:before {
-  content: "\f0ab";
-}
-.icon-globe:before {
-  content: "\f0ac";
-}
-.icon-wrench:before {
-  content: "\f0ad";
-}
-.icon-tasks:before {
-  content: "\f0ae";
-}
-.icon-filter:before {
-  content: "\f0b0";
-}
-.icon-briefcase:before {
-  content: "\f0b1";
-}
-.icon-fullscreen:before {
-  content: "\f0b2";
-}
-.icon-group:before {
-  content: "\f0c0";
-}
-.icon-link:before {
-  content: "\f0c1";
-}
-.icon-cloud:before {
-  content: "\f0c2";
-}
-.icon-beaker:before {
-  content: "\f0c3";
-}
-.icon-cut:before {
-  content: "\f0c4";
-}
-.icon-copy:before {
-  content: "\f0c5";
-}
-.icon-paper-clip:before {
-  content: "\f0c6";
-}
-.icon-save:before {
-  content: "\f0c7";
-}
-.icon-sign-blank:before {
-  content: "\f0c8";
-}
-.icon-reorder:before {
-  content: "\f0c9";
-}
-.icon-list-ul:before {
-  content: "\f0ca";
-}
-.icon-list-ol:before {
-  content: "\f0cb";
-}
-.icon-strikethrough:before {
-  content: "\f0cc";
-}
-.icon-underline:before {
-  content: "\f0cd";
-}
-.icon-table:before {
-  content: "\f0ce";
-}
-.icon-magic:before {
-  content: "\f0d0";
-}
-.icon-truck:before {
-  content: "\f0d1";
-}
-.icon-pinterest:before {
-  content: "\f0d2";
-}
-.icon-pinterest-sign:before {
-  content: "\f0d3";
-}
-.icon-google-plus-sign:before {
-  content: "\f0d4";
-}
-.icon-google-plus:before {
-  content: "\f0d5";
-}
-.icon-money:before {
-  content: "\f0d6";
-}
-.icon-caret-down:before {
-  content: "\f0d7";
-}
-.icon-caret-up:before {
-  content: "\f0d8";
-}
-.icon-caret-left:before {
-  content: "\f0d9";
-}
-.icon-caret-right:before {
-  content: "\f0da";
-}
-.icon-columns:before {
-  content: "\f0db";
-}
-.icon-sort:before {
-  content: "\f0dc";
-}
-.icon-sort-down:before {
-  content: "\f0dd";
-}
-.icon-sort-up:before {
-  content: "\f0de";
-}
-.icon-envelope-alt:before {
-  content: "\f0e0";
-}
-.icon-linkedin:before {
-  content: "\f0e1";
-}
-.icon-undo:before {
-  content: "\f0e2";
-}
-.icon-legal:before {
-  content: "\f0e3";
-}
-.icon-dashboard:before {
-  content: "\f0e4";
-}
-.icon-comment-alt:before {
-  content: "\f0e5";
-}
-.icon-comments-alt:before {
-  content: "\f0e6";
-}
-.icon-bolt:before {
-  content: "\f0e7";
-}
-.icon-sitemap:before {
-  content: "\f0e8";
-}
-.icon-umbrella:before {
-  content: "\f0e9";
-}
-.icon-paste:before {
-  content: "\f0ea";
-}
-.icon-user-md:before {
-  content: "\f200";
-}
-.dropup,
-.dropdown {
-  position: relative;
-}
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding;
-  background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 20px;
-  color: #333333;
-  white-space: nowrap;
-}
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
-  text-decoration: none;
-  color: #ffffff;
-  background-color: #6e8f4a;
-  background-color: #698847;
-  background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
-  background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
-}
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
-  color: #ffffff;
-  text-decoration: none;
-  outline: 0;
-  background-color: #6e8f4a;
-  background-color: #698847;
-  background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
-  background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
-  background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
-}
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
-  color: #999999;
-}
-.dropdown-menu .disabled > a:hover {
-  text-decoration: none;
-  background-color: transparent;
-  cursor: default;
-}
-.open {
-  *z-index: 1000;
-}
-.open  > .dropdown-menu {
-  display: block;
-}
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "\2191";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-.dropdown-submenu {
-  position: relative;
-}
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-  -moz-border-radius: 0 6px 6px 6px;
-  border-radius: 0 6px 6px 6px;
-}
-.dropdown-submenu:hover .dropdown-menu {
-  display: block;
-}
-.dropdown-submenu > a:after {
-  display: block;
-  content: " ";
-  float: right;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #cccccc;
-  margin-top: 5px;
-  margin-right: -10px;
-}
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-.dropdown .dropdown-menu .nav-header {
-  padding-left: 20px;
-  padding-right: 20px;
-}
-.typeahead {
-  margin-top: 2px;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-  -moz-transition: opacity 0.15s linear;
-  -o-transition: opacity 0.15s linear;
-  transition: opacity 0.15s linear;
-}
-.fade.in {
-  opacity: 1;
-}
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  overflow: visible \9;
-  -webkit-transition: height 0.35s ease;
-  -moz-transition: height 0.35s ease;
-  -o-transition: height 0.35s ease;
-  transition: height 0.35s ease;
-}
-.collapse.in {
-  height: auto;
-}
-.close {
-  float: right;
-  font-size: 20px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-.close:hover {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-.btn {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-  color: #333333;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  background-color: #f5f5f5;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #e6e6e6;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  border: 1px solid #bbbbbb;
-  *border: 0;
-  border-bottom-color: #a2a2a2;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  *margin-left: .3em;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-.btn:first-child {
-  *margin-left: 0;
-}
-.btn:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-  /* Buttons in IE7 don't get borders, so darken on hover */
-
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-  -moz-transition: background-position 0.1s linear;
-  -o-transition: background-position 0.1s linear;
-  transition: background-position 0.1s linear;
-}
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
-  background-color: #e6e6e6;
-  background-color: #d9d9d9 \9;
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-color: #e6e6e6;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn-large {
-  padding: 9px 14px;
-  font-size: 16px;
-  line-height: normal;
-  -webkit-border-radius: 5px;
-  -moz-border-radius: 5px;
-  border-radius: 5px;
-}
-.btn-large [class^="icon-"] {
-  margin-top: 2px;
-}
-.btn-small {
-  padding: 3px 9px;
-  font-size: 12px;
-  line-height: 18px;
-}
-.btn-small [class^="icon-"] {
-  margin-top: 0;
-}
-.btn-mini {
-  padding: 2px 6px;
-  font-size: 11px;
-  line-height: 16px;
-}
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-left: 0;
-  padding-right: 0;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-.btn {
-  border-color: #c5c5c5;
-  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #658f4a;
-  background-image: -moz-linear-gradient(top, #6e8f4a, #578f4a);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#578f4a));
-  background-image: -webkit-linear-gradient(top, #6e8f4a, #578f4a);
-  background-image: -o-linear-gradient(top, #6e8f4a, #578f4a);
-  background-image: linear-gradient(to bottom, #6e8f4a, #578f4a);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff578f4a', GradientType=0);
-  border-color: #578f4a #578f4a #385d30;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #578f4a;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #578f4a;
-  *background-color: #4d7e41;
-}
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #436d39 \9;
-}
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #f89406;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #bd362f;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #51a351;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #2f96b4;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #222222;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-.btn-link,
-.btn-link:active {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-}
-.btn-link {
-  border-color: transparent;
-  cursor: pointer;
-  color: #6e8f4a;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-link:hover {
-  color: #f26a1e;
-  text-decoration: underline;
-  background-color: transparent;
-}
-.btn-group {
-  position: relative;
-  font-size: 0;
-  white-space: nowrap;
-  *margin-left: .3em;
-}
-.btn-group:first-child {
-  *margin-left: 0;
-}
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-.btn-toolbar {
-  font-size: 0;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-.btn-toolbar .btn-group {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
-  margin-left: 5px;
-}
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
-  font-size: 14px;
-}
-.btn-group > .btn-mini {
-  font-size: 11px;
-}
-.btn-group > .btn-small {
-  font-size: 12px;
-}
-.btn-group > .btn-large {
-  font-size: 16px;
-}
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  -webkit-border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-  border-top-left-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  border-bottom-left-radius: 4px;
-}
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-  -webkit-border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  border-bottom-right-radius: 4px;
-}
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-  -webkit-border-top-left-radius: 6px;
-  -moz-border-radius-topleft: 6px;
-  border-top-left-radius: 6px;
-  -webkit-border-bottom-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  border-bottom-left-radius: 6px;
-}
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-  -webkit-border-top-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-  -moz-border-radius-bottomright: 6px;
-  border-bottom-right-radius: 6px;
-}
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-  *padding-top: 5px;
-  *padding-bottom: 5px;
-}
-.btn-group > .btn-mini + .dropdown-toggle {
-  padding-left: 5px;
-  padding-right: 5px;
-  *padding-top: 2px;
-  *padding-bottom: 2px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #578f4a;
-}
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #bd362f;
-}
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #51a351;
-}
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #2f96b4;
-}
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #222222;
-}
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
-  margin-top: 6px;
-}
-.btn-large .caret {
-  border-left-width: 5px;
-  border-right-width: 5px;
-  border-top-width: 5px;
-}
-.dropup .btn-large .caret {
-  border-bottom: 5px solid #000000;
-  border-top: 0;
-}
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-.btn-group-vertical .btn {
-  display: block;
-  float: none;
-  width: 100%;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.btn-group-vertical .btn + .btn {
-  margin-left: 0;
-  margin-top: -1px;
-}
-.btn-group-vertical .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  border-radius: 4px 4px 0 0;
-}
-.btn-group-vertical .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius: 0 0 4px 4px;
-  border-radius: 0 0 4px 4px;
-}
-.btn-group-vertical .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-  -moz-border-radius: 6px 6px 0 0;
-  border-radius: 6px 6px 0 0;
-}
-.btn-group-vertical .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-}
-.alert {
-  padding: 8px 35px 8px 14px;
-  margin-bottom: 20px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  color: #c09853;
-}
-.alert h4 {
-  margin: 0;
-}
-.alert .close {
-  position: relative;
-  top: -2px;
-  right: -21px;
-  line-height: 20px;
-}
-.alert-success {
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-  color: #468847;
-}
-.alert-danger,
-.alert-error {
-  background-color: #f2dede;
-  border-color: #eed3d7;
-  color: #b94a48;
-}
-.alert-info {
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-  color: #3a87ad;
-}
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-.alert-block p + p {
-  margin-top: 5px;
-}
-.nav {
-  margin-left: 0;
-  margin-bottom: 20px;
-  list-style: none;
-}
-.nav > li > a {
-  display: block;
-}
-.nav > li > a:hover {
-  text-decoration: none;
-  background-color: #eeeeee;
-}
-.nav > .pull-right {
-  float: right;
-}
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-.nav-list {
-  padding-left: 15px;
-  padding-right: 15px;
-  margin-bottom: 0;
-}
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-left: -15px;
-  margin-right: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #6e8f4a;
-}
-.nav-list [class^="icon-"] {
-  margin-right: 2px;
-}
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-.nav-tabs > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  line-height: 20px;
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
-  color: #555555;
-  background-color: #ffffff;
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-  cursor: default;
-}
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  -webkit-border-radius: 5px;
-  -moz-border-radius: 5px;
-  border-radius: 5px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
-  color: #ffffff;
-  background-color: #6e8f4a;
-}
-.nav-stacked > li {
-  float: none;
-}
-.nav-stacked > li > a {
-  margin-right: 0;
-}
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  border-top-right-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;
-  border-top-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  border-bottom-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li > a:hover {
-  border-color: #ddd;
-  z-index: 2;
-}
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-}
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.nav .dropdown-toggle .caret {
-  border-top-color: #6e8f4a;
-  border-bottom-color: #6e8f4a;
-  margin-top: 6px;
-}
-.nav .dropdown-toggle:hover .caret {
-  border-top-color: #f26a1e;
-  border-bottom-color: #f26a1e;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover {
-  cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover {
-  border-color: #999999;
-}
-.tabbable {
-  *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.tabbable:after {
-  clear: both;
-}
-.tab-content {
-  overflow: auto;
-}
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius: 0 0 4px 4px;
-  border-radius: 0 0 4px 4px;
-}
-.tabs-below > .nav-tabs > li > a:hover {
-  border-bottom-color: transparent;
-  border-top-color: #ddd;
-}
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
-  border-color: transparent #ddd #ddd #ddd;
-}
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 19px;
-  border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-  -moz-border-radius: 4px 0 0 4px;
-  border-radius: 4px 0 0 4px;
-}
-.tabs-left > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-  -moz-border-radius: 0 4px 4px 0;
-  border-radius: 0 4px 4px 0;
-}
-.tabs-right > .nav-tabs > li > a:hover {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
-  color: #999999;
-}
-.nav > .disabled > a:hover {
-  text-decoration: none;
-  background-color: transparent;
-  cursor: default;
-}
-.navbar {
-  overflow: visible;
-  margin-bottom: 20px;
-  color: #1f444b;
-  *position: relative;
-  *z-index: 2;
-}
-.navbar-inner {
-  min-height: 70px;
-  padding-left: 20px;
-  padding-right: 20px;
-  background-color: #e9e7e0;
-  background-image: -moz-linear-gradient(top, #edece6, #e2e1d7);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#edece6), to(#e2e1d7));
-  background-image: -webkit-linear-gradient(top, #edece6, #e2e1d7);
-  background-image: -o-linear-gradient(top, #edece6, #e2e1d7);
-  background-image: linear-gradient(to bottom, #edece6, #e2e1d7);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffedece6', endColorstr='#ffe2e1d7', GradientType=0);
-  border: 1px solid #c9c6b4;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-.navbar .container {
-  width: auto;
-}
-.nav-collapse.collapse {
-  height: auto;
-}
-.navbar .brand {
-  float: left;
-  display: block;
-  padding: 25px 20px 25px;
-  margin-left: -20px;
-  font-size: 20px;
-  font-weight: 200;
-  color: #1f444b;
-  text-shadow: 0 1px 0 #edece6;
-}
-.navbar .brand:hover {
-  text-decoration: none;
-}
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 70px;
-}
-.navbar-link {
-  color: #1f444b;
-}
-.navbar-link:hover {
-  color: #f26a1e;
-}
-.navbar .divider-vertical {
-  height: 70px;
-  margin: 0 9px;
-  border-left: 1px solid #e2e1d7;
-  border-right: 1px solid #edece6;
-}
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 21px;
-}
-.navbar .btn-group .btn {
-  margin: 0;
-}
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.navbar-form:after {
-  clear: both;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 20px;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 6px;
-  white-space: nowrap;
-}
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 20px;
-  margin-bottom: 0;
-}
-.navbar-search .search-query {
-  margin-bottom: 0;
-  padding: 4px 14px;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-.navbar-static-top {
-  position: static;
-  width: 100%;
-  margin-bottom: 0;
-}
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-left: 0;
-  padding-right: 0;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-.navbar-fixed-top {
-  top: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-  -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-  box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-  -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-  box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-}
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
-  float: right;
-}
-.navbar .nav > li {
-  float: left;
-}
-.navbar .nav > li > a {
-  float: none;
-  padding: 25px 15px 25px;
-  color: #1f444b;
-  text-decoration: none;
-  text-shadow: 0 1px 0 #edece6;
-}
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  background-color: transparent;
-  color: #f26a1e;
-  text-decoration: none;
-}
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #f26a1e;
-  text-decoration: none;
-  background-color: #d8d5c8;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-left: 5px;
-  margin-right: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #dedcd1;
-  background-image: -moz-linear-gradient(top, #e2e1d7, #d8d5c8);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e2e1d7), to(#d8d5c8));
-  background-image: -webkit-linear-gradient(top, #e2e1d7, #d8d5c8);
-  background-image: -o-linear-gradient(top, #e2e1d7, #d8d5c8);
-  background-image: linear-gradient(to bottom, #e2e1d7, #d8d5c8);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2e1d7', endColorstr='#ffd8d5c8', GradientType=0);
-  border-color: #d8d5c8 #d8d5c8 #b8b49c;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #d8d5c8;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #d8d5c8;
-  *background-color: #cdcaba;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #c2bfab \9;
-}
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-  -moz-border-radius: 1px;
-  border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
-  content: '';
-  display: inline-block;
-  border-left: 7px solid transparent;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  position: absolute;
-  top: -7px;
-  left: 9px;
-}
-.navbar .nav > li > .dropdown-menu:after {
-  content: '';
-  display: inline-block;
-  border-left: 6px solid transparent;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  position: absolute;
-  top: -6px;
-  left: 10px;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  border-top: 7px solid #ccc;
-  border-top-color: rgba(0, 0, 0, 0.2);
-  border-bottom: 0;
-  bottom: -7px;
-  top: auto;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  border-top: 6px solid #ffffff;
-  border-bottom: 0;
-  bottom: -6px;
-  top: auto;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  background-color: #d8d5c8;
-  color: #f26a1e;
-}
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #1f444b;
-  border-bottom-color: #1f444b;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #f26a1e;
-  border-bottom-color: #f26a1e;
-}
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  left: auto;
-  right: 0;
-}
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  left: auto;
-  right: 12px;
-}
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  left: auto;
-  right: 13px;
-}
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  left: auto;
-  right: 100%;
-  margin-left: 0;
-  margin-right: -1px;
-  -webkit-border-radius: 6px 0 6px 6px;
-  -moz-border-radius: 6px 0 6px 6px;
-  border-radius: 6px 0 6px 6px;
-}
-.navbar-inverse {
-  color: #999999;
-}
-.navbar-inverse .navbar-inner {
-  background-color: #1b1b1b;
-  background-image: -moz-linear-gradient(top, #222222, #111111);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-  background-image: -webkit-linear-gradient(top, #222222, #111111);
-  background-image: -o-linear-gradient(top, #222222, #111111);
-  background-image: linear-gradient(to bottom, #222222, #111111);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-  border-color: #252525;
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  background-color: transparent;
-  color: #ffffff;
-}
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #111111;
-}
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-.navbar-inverse .navbar-link:hover {
-  color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
-  border-left-color: #111111;
-  border-right-color: #222222;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  background-color: #111111;
-  color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #515151;
-  border-color: #111111;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
-  -webkit-transition: none;
-  -moz-transition: none;
-  -o-transition: none;
-  transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-  outline: 0;
-}
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e0e0e;
-  background-image: -moz-linear-gradient(top, #151515, #040404);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-  background-image: -webkit-linear-gradient(top, #151515, #040404);
-  background-image: -o-linear-gradient(top, #151515, #040404);
-  background-image: linear-gradient(to bottom, #151515, #040404);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-  border-color: #040404 #040404 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  *background-color: #040404;
-  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #040404;
-  *background-color: #000000;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #000000 \9;
-}
-.pagination {
-  height: 40px;
-  margin: 20px 0;
-}
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-  margin-left: 0;
-  margin-bottom: 0;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
-  display: inline;
-}
-.pagination a,
-.pagination span {
-  float: left;
-  padding: 0 14px;
-  line-height: 38px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
-  background-color: #f5f5f5;
-}
-.pagination .active a,
-.pagination .active span {
-  color: #999999;
-  cursor: default;
-}
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
-  color: #999999;
-  background-color: transparent;
-  cursor: default;
-}
-.pagination li:first-child a,
-.pagination li:first-child span {
-  border-left-width: 1px;
-  -webkit-border-radius: 3px 0 0 3px;
-  -moz-border-radius: 3px 0 0 3px;
-  border-radius: 3px 0 0 3px;
-}
-.pagination li:last-child a,
-.pagination li:last-child span {
-  -webkit-border-radius: 0 3px 3px 0;
-  -moz-border-radius: 0 3px 3px 0;
-  border-radius: 0 3px 3px 0;
-}
-.pagination-centered {
-  text-align: center;
-}
-.pagination-right {
-  text-align: right;
-}
-.pager {
-  margin: 20px 0;
-  list-style: none;
-  text-align: center;
-  *zoom: 1;
-}
-.pager:before,
-.pager:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.pager:after {
-  clear: both;
-}
-.pager li {
-  display: inline;
-}
-.pager a {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-  -moz-border-radius: 15px;
-  border-radius: 15px;
-}
-.pager a:hover {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-.pager .next a {
-  float: right;
-}
-.pager .previous a {
-  float: left;
-}
-.pager .disabled a,
-.pager .disabled a:hover {
-  color: #999999;
-  background-color: #fff;
-  cursor: default;
-}
-.modal-open .dropdown-menu {
-  z-index: 2050;
-}
-.modal-open .dropdown.open {
-  *z-index: 2050;
-}
-.modal-open .popover {
-  z-index: 2060;
-}
-.modal-open .tooltip {
-  z-index: 2080;
-}
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-.modal-backdrop.fade {
-  opacity: 0;
-}
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-.modal {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  z-index: 1050;
-  overflow: auto;
-  width: 560px;
-  margin: -250px 0 0 -280px;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  /* IE6-7 */
-
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding-box;
-  background-clip: padding-box;
-}
-.modal.fade {
-  -webkit-transition: opacity .3s linear, top .3s ease-out;
-  -moz-transition: opacity .3s linear, top .3s ease-out;
-  -o-transition: opacity .3s linear, top .3s ease-out;
-  transition: opacity .3s linear, top .3s ease-out;
-  top: -25%;
-}
-.modal.fade.in {
-  top: 50%;
-}
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-.modal-header .close {
-  margin-top: 2px;
-}
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-.modal-body {
-  overflow-y: auto;
-  max-height: 400px;
-  padding: 15px;
-}
-.modal-form {
-  margin-bottom: 0;
-}
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-  -moz-border-radius: 0 0 6px 6px;
-  border-radius: 0 0 6px 6px;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-  -moz-box-shadow: inset 0 1px 0 #ffffff;
-  box-shadow: inset 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.modal-footer:after {
-  clear: both;
-}
-.modal-footer .btn + .btn {
-  margin-left: 5px;
-  margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  visibility: visible;
-  padding: 5px;
-  font-size: 11px;
-  opacity: 0;
-  filter: alpha(opacity=0);
-}
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-.tooltip.top {
-  margin-top: -3px;
-}
-.tooltip.right {
-  margin-left: 3px;
-}
-.tooltip.bottom {
-  margin-top: 3px;
-}
-.tooltip.left {
-  margin-left: -3px;
-}
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 5px 5px 0;
-  border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-width: 5px 5px 5px 0;
-  border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-width: 5px 0 5px 5px;
-  border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-width: 0 5px 5px;
-  border-bottom-color: #000000;
-}
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1010;
-  display: none;
-  width: 236px;
-  padding: 1px;
-  background-color: #ffffff;
-  -webkit-background-clip: padding-box;
-  -moz-background-clip: padding;
-  background-clip: padding-box;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-.popover.top {
-  margin-bottom: 10px;
-}
-.popover.right {
-  margin-left: 10px;
-}
-.popover.bottom {
-  margin-top: 10px;
-}
-.popover.left {
-  margin-right: 10px;
-}
-.popover-title {
-  margin: 0;
-  padding: 8px 14px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-  -moz-border-radius: 5px 5px 0 0;
-  border-radius: 5px 5px 0 0;
-}
-.popover-content {
-  padding: 9px 14px;
-}
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
-  margin-bottom: 0;
-}
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: inline-block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.popover .arrow:after {
-  content: "";
-  z-index: -1;
-}
-.popover.top .arrow {
-  bottom: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-width: 10px 10px 0;
-  border-top-color: #ffffff;
-}
-.popover.top .arrow:after {
-  border-width: 11px 11px 0;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  bottom: -1px;
-  left: -11px;
-}
-.popover.right .arrow {
-  top: 50%;
-  left: -10px;
-  margin-top: -10px;
-  border-width: 10px 10px 10px 0;
-  border-right-color: #ffffff;
-}
-.popover.right .arrow:after {
-  border-width: 11px 11px 11px 0;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  bottom: -11px;
-  left: -1px;
-}
-.popover.bottom .arrow {
-  top: -10px;
-  left: 50%;
-  margin-left: -10px;
-  border-width: 0 10px 10px;
-  border-bottom-color: #ffffff;
-}
-.popover.bottom .arrow:after {
-  border-width: 0 11px 11px;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  top: -1px;
-  left: -11px;
-}
-.popover.left .arrow {
-  top: 50%;
-  right: -10px;
-  margin-top: -10px;
-  border-width: 10px 0 10px 10px;
-  border-left-color: #ffffff;
-}
-.popover.left .arrow:after {
-  border-width: 11px 0 11px 11px;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  bottom: -11px;
-  right: -1px;
-}
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  content: "";
-  line-height: 0;
-}
-.thumbnails:after {
-  clear: both;
-}
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-.thumbnails > li {
-  float: left;
-  margin-bottom: 20px;
-  margin-left: 20px;
-}
-.thumbnail {
-  display: block;
-  padding: 4px;
-  line-height: 20px;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-  -moz-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover {
-  border-color: #6e8f4a;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-left: auto;
-  margin-right: auto;
-}
-.thumbnail .caption {
-  padding: 9px;
-  color: #555555;
-}
-.label,
-.badge {
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  vertical-align: baseline;
-  white-space: nowrap;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #999999;
-}
-.label {
-  padding: 1px 4px 2px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.badge {
-  padding: 1px 9px 2px;
-  -webkit-border-radius: 9px;
-  -moz-border-radius: 9px;
-  border-radius: 9px;
-}
-a.label:hover,
-a.badge:hover {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
- at -webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
- at -o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
- at keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-.progress {
-  overflow: hidden;
-  height: 20px;
-  margin-bottom: 20px;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.progress .bar {
-  width: 0%;
-  height: 100%;
-  color: #ffffff;
-  float: left;
-  font-size: 12px;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-  -moz-transition: width 0.6s ease;
-  -o-transition: width 0.6s ease;
-  transition: width 0.6s ease;
-}
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-}
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 40px 40px;
-  -moz-background-size: 40px 40px;
-  -o-background-size: 40px 40px;
-  background-size: 40px 40px;
-}
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-  -moz-animation: progress-bar-stripes 2s linear infinite;
-  -ms-animation: progress-bar-stripes 2s linear infinite;
-  -o-animation: progress-bar-stripes 2s linear infinite;
-  animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.accordion {
-  margin-bottom: 20px;
-}
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-.accordion-heading {
-  border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-.accordion-toggle {
-  cursor: pointer;
-}
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-.carousel {
-  position: relative;
-  margin-bottom: 20px;
-  line-height: 1;
-}
-.carousel-inner {
-  overflow: hidden;
-  width: 100%;
-  position: relative;
-}
-.carousel .item {
-  display: none;
-  position: relative;
-  -webkit-transition: 0.6s ease-in-out left;
-  -moz-transition: 0.6s ease-in-out left;
-  -o-transition: 0.6s ease-in-out left;
-  transition: 0.6s ease-in-out left;
-}
-.carousel .item > img {
-  display: block;
-  line-height: 1;
-}
-.carousel .active,
-.carousel .next,
-.carousel .prev {
-  display: block;
-}
-.carousel .active {
-  left: 0;
-}
-.carousel .next,
-.carousel .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-.carousel .next {
-  left: 100%;
-}
-.carousel .prev {
-  left: -100%;
-}
-.carousel .next.left,
-.carousel .prev.right {
-  left: 0;
-}
-.carousel .active.left {
-  left: -100%;
-}
-.carousel .active.right {
-  left: 100%;
-}
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-  -moz-border-radius: 23px;
-  border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-.carousel-control.right {
-  left: auto;
-  right: 15px;
-}
-.carousel-control:hover {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-.carousel-caption {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-.carousel-caption h4,
-.carousel-caption p {
-  color: #ffffff;
-  line-height: 20px;
-}
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-.carousel-caption p {
-  margin-bottom: 0;
-}
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-}
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  color: inherit;
-  letter-spacing: -1px;
-}
-.hero-unit p {
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 30px;
-  color: inherit;
-}
-html,
-body {
-  height: 100%;
-}
-.wrapper {
-  min-height: 100%;
-  height: auto !important;
-  height: 100%;
-  margin: 0 auto -92px;
-}
-.push {
-  height: 92px;
-}
-.wrapper > .container {
-  padding-top: 24px;
-}
-.hidden {
-  display: none;
-  visibility: hidden;
-}
-.visible-phone {
-  display: none !important;
-}
-.visible-tablet {
-  display: none !important;
-}
-.hidden-desktop {
-  display: none !important;
-}
-.visible-desktop {
-  display: inherit !important;
-}
- at media (min-width: 768px) and (max-width: 979px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important ;
-  }
-  .visible-tablet {
-    display: inherit !important;
-  }
-  .hidden-tablet {
-    display: none !important;
-  }
-}
- at media (max-width: 767px) {
-  .hidden-desktop {
-    display: inherit !important;
-  }
-  .visible-desktop {
-    display: none !important;
-  }
-  .visible-phone {
-    display: inherit !important;
-  }
-  .hidden-phone {
-    display: none !important;
-  }
-}
- at media (min-width: 1200px) {
-  .row {
-    margin-left: -30px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 30px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 1170px;
-  }
-  .span12 {
-    width: 1170px;
-  }
-  .span11 {
-    width: 1070px;
-  }
-  .span10 {
-    width: 970px;
-  }
-  .span9 {
-    width: 870px;
-  }
-  .span8 {
-    width: 770px;
-  }
-  .span7 {
-    width: 670px;
-  }
-  .span6 {
-    width: 570px;
-  }
-  .span5 {
-    width: 470px;
-  }
-  .span4 {
-    width: 370px;
-  }
-  .span3 {
-    width: 270px;
-  }
-  .span2 {
-    width: 170px;
-  }
-  .span1 {
-    width: 70px;
-  }
-  .offset12 {
-    margin-left: 1230px;
-  }
-  .offset11 {
-    margin-left: 1130px;
-  }
-  .offset10 {
-    margin-left: 1030px;
-  }
-  .offset9 {
-    margin-left: 930px;
-  }
-  .offset8 {
-    margin-left: 830px;
-  }
-  .offset7 {
-    margin-left: 730px;
-  }
-  .offset6 {
-    margin-left: 630px;
-  }
-  .offset5 {
-    margin-left: 530px;
-  }
-  .offset4 {
-    margin-left: 430px;
-  }
-  .offset3 {
-    margin-left: 330px;
-  }
-  .offset2 {
-    margin-left: 230px;
-  }
-  .offset1 {
-    margin-left: 130px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-    float: left;
-    margin-left: 2.564102564102564%;
-    *margin-left: 2.5109110747408616%;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.45299145299145%;
-    *width: 91.39979996362975%;
-  }
-  .row-fluid .span10 {
-    width: 82.90598290598291%;
-    *width: 82.8527914166212%;
-  }
-  .row-fluid .span9 {
-    width: 74.35897435897436%;
-    *width: 74.30578286961266%;
-  }
-  .row-fluid .span8 {
-    width: 65.81196581196582%;
-    *width: 65.75877432260411%;
-  }
-  .row-fluid .span7 {
-    width: 57.26495726495726%;
-    *width: 57.21176577559556%;
-  }
-  .row-fluid .span6 {
-    width: 48.717948717948715%;
-    *width: 48.664757228587014%;
-  }
-  .row-fluid .span5 {
-    width: 40.17094017094017%;
-    *width: 40.11774868157847%;
-  }
-  .row-fluid .span4 {
-    width: 31.623931623931625%;
-    *width: 31.570740134569924%;
-  }
-  .row-fluid .span3 {
-    width: 23.076923076923077%;
-    *width: 23.023731587561375%;
-  }
-  .row-fluid .span2 {
-    width: 14.52991452991453%;
-    *width: 14.476723040552828%;
-  }
-  .row-fluid .span1 {
-    width: 5.982905982905983%;
-    *width: 5.929714493544281%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.12820512820512%;
-    *margin-left: 105.02182214948171%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.56410256410257%;
-    *margin-left: 102.45771958537915%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.58119658119658%;
-    *margin-left: 96.47481360247316%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.01709401709402%;
-    *margin-left: 93.91071103837061%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.03418803418803%;
-    *margin-left: 87.92780505546462%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.47008547008548%;
-    *margin-left: 85.36370249136206%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.48717948717949%;
-    *margin-left: 79.38079650845607%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 76.92307692307693%;
-    *margin-left: 76.81669394435352%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 70.94017094017094%;
-    *margin-left: 70.83378796144753%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.37606837606839%;
-    *margin-left: 68.26968539734497%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.393162393162385%;
-    *margin-left: 62.28677941443899%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.82905982905982%;
-    *margin-left: 59.72267685033642%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 53.84615384615384%;
-    *margin-left: 53.739770867430444%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.28205128205128%;
-    *margin-left: 51.175668303327875%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.299145299145295%;
-    *margin-left: 45.1927623204219%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.73504273504273%;
-    *margin-left: 42.62865975631933%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 36.75213675213675%;
-    *margin-left: 36.645753773413354%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.18803418803419%;
-    *margin-left: 34.081651209310785%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.205128205128204%;
-    *margin-left: 28.0987452264048%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.641025641025642%;
-    *margin-left: 25.53464266230224%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.65811965811966%;
-    *margin-left: 19.551736679396257%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.094017094017094%;
-    *margin-left: 16.98763411529369%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.11111111111111%;
-    *margin-left: 11.004728132387708%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.547008547008547%;
-    *margin-left: 8.440625568285142%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 30px;
-  }
-  input.span12, textarea.span12, .uneditable-input.span12 {
-    width: 1156px;
-  }
-  input.span11, textarea.span11, .uneditable-input.span11 {
-    width: 1056px;
-  }
-  input.span10, textarea.span10, .uneditable-input.span10 {
-    width: 956px;
-  }
-  input.span9, textarea.span9, .uneditable-input.span9 {
-    width: 856px;
-  }
-  input.span8, textarea.span8, .uneditable-input.span8 {
-    width: 756px;
-  }
-  input.span7, textarea.span7, .uneditable-input.span7 {
-    width: 656px;
-  }
-  input.span6, textarea.span6, .uneditable-input.span6 {
-    width: 556px;
-  }
-  input.span5, textarea.span5, .uneditable-input.span5 {
-    width: 456px;
-  }
-  input.span4, textarea.span4, .uneditable-input.span4 {
-    width: 356px;
-  }
-  input.span3, textarea.span3, .uneditable-input.span3 {
-    width: 256px;
-  }
-  input.span2, textarea.span2, .uneditable-input.span2 {
-    width: 156px;
-  }
-  input.span1, textarea.span1, .uneditable-input.span1 {
-    width: 56px;
-  }
-  .thumbnails {
-    margin-left: -30px;
-  }
-  .thumbnails > li {
-    margin-left: 30px;
-  }
-  .row-fluid .thumbnails {
-    margin-left: 0;
-  }
-}
- at media (min-width: 768px) and (max-width: 979px) {
-  .row {
-    margin-left: -20px;
-    *zoom: 1;
-  }
-  .row:before,
-  .row:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row:after {
-    clear: both;
-  }
-  [class*="span"] {
-    float: left;
-    margin-left: 20px;
-  }
-  .container,
-  .navbar-static-top .container,
-  .navbar-fixed-top .container,
-  .navbar-fixed-bottom .container {
-    width: 724px;
-  }
-  .span12 {
-    width: 724px;
-  }
-  .span11 {
-    width: 662px;
-  }
-  .span10 {
-    width: 600px;
-  }
-  .span9 {
-    width: 538px;
-  }
-  .span8 {
-    width: 476px;
-  }
-  .span7 {
-    width: 414px;
-  }
-  .span6 {
-    width: 352px;
-  }
-  .span5 {
-    width: 290px;
-  }
-  .span4 {
-    width: 228px;
-  }
-  .span3 {
-    width: 166px;
-  }
-  .span2 {
-    width: 104px;
-  }
-  .span1 {
-    width: 42px;
-  }
-  .offset12 {
-    margin-left: 764px;
-  }
-  .offset11 {
-    margin-left: 702px;
-  }
-  .offset10 {
-    margin-left: 640px;
-  }
-  .offset9 {
-    margin-left: 578px;
-  }
-  .offset8 {
-    margin-left: 516px;
-  }
-  .offset7 {
-    margin-left: 454px;
-  }
-  .offset6 {
-    margin-left: 392px;
-  }
-  .offset5 {
-    margin-left: 330px;
-  }
-  .offset4 {
-    margin-left: 268px;
-  }
-  .offset3 {
-    margin-left: 206px;
-  }
-  .offset2 {
-    margin-left: 144px;
-  }
-  .offset1 {
-    margin-left: 82px;
-  }
-  .row-fluid {
-    width: 100%;
-    *zoom: 1;
-  }
-  .row-fluid:before,
-  .row-fluid:after {
-    display: table;
-    content: "";
-    line-height: 0;
-  }
-  .row-fluid:after {
-    clear: both;
-  }
-  .row-fluid [class*="span"] {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-    float: left;
-    margin-left: 2.7624309392265194%;
-    *margin-left: 2.709239449864817%;
-  }
-  .row-fluid [class*="span"]:first-child {
-    margin-left: 0;
-  }
-  .row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
-  }
-  .row-fluid .span11 {
-    width: 91.43646408839778%;
-    *width: 91.38327259903608%;
-  }
-  .row-fluid .span10 {
-    width: 82.87292817679558%;
-    *width: 82.81973668743387%;
-  }
-  .row-fluid .span9 {
-    width: 74.30939226519337%;
-    *width: 74.25620077583166%;
-  }
-  .row-fluid .span8 {
-    width: 65.74585635359117%;
-    *width: 65.69266486422946%;
-  }
-  .row-fluid .span7 {
-    width: 57.18232044198895%;
-    *width: 57.12912895262725%;
-  }
-  .row-fluid .span6 {
-    width: 48.61878453038674%;
-    *width: 48.56559304102504%;
-  }
-  .row-fluid .span5 {
-    width: 40.05524861878453%;
-    *width: 40.00205712942283%;
-  }
-  .row-fluid .span4 {
-    width: 31.491712707182323%;
-    *width: 31.43852121782062%;
-  }
-  .row-fluid .span3 {
-    width: 22.92817679558011%;
-    *width: 22.87498530621841%;
-  }
-  .row-fluid .span2 {
-    width: 14.3646408839779%;
-    *width: 14.311449394616199%;
-  }
-  .row-fluid .span1 {
-    width: 5.801104972375691%;
-    *width: 5.747913483013988%;
-  }
-  .row-fluid .offset12 {
-    margin-left: 105.52486187845304%;
-    *margin-left: 105.41847889972962%;
-  }
-  .row-fluid .offset12:first-child {
-    margin-left: 102.76243093922652%;
-    *margin-left: 102.6560479605031%;
-  }
-  .row-fluid .offset11 {
-    margin-left: 96.96132596685082%;
-    *margin-left: 96.8549429881274%;
-  }
-  .row-fluid .offset11:first-child {
-    margin-left: 94.1988950276243%;
-    *margin-left: 94.09251204890089%;
-  }
-  .row-fluid .offset10 {
-    margin-left: 88.39779005524862%;
-    *margin-left: 88.2914070765252%;
-  }
-  .row-fluid .offset10:first-child {
-    margin-left: 85.6353591160221%;
-    *margin-left: 85.52897613729868%;
-  }
-  .row-fluid .offset9 {
-    margin-left: 79.8342541436464%;
-    *margin-left: 79.72787116492299%;
-  }
-  .row-fluid .offset9:first-child {
-    margin-left: 77.07182320441989%;
-    *margin-left: 76.96544022569647%;
-  }
-  .row-fluid .offset8 {
-    margin-left: 71.2707182320442%;
-    *margin-left: 71.16433525332079%;
-  }
-  .row-fluid .offset8:first-child {
-    margin-left: 68.50828729281768%;
-    *margin-left: 68.40190431409427%;
-  }
-  .row-fluid .offset7 {
-    margin-left: 62.70718232044199%;
-    *margin-left: 62.600799341718584%;
-  }
-  .row-fluid .offset7:first-child {
-    margin-left: 59.94475138121547%;
-    *margin-left: 59.838368402492065%;
-  }
-  .row-fluid .offset6 {
-    margin-left: 54.14364640883978%;
-    *margin-left: 54.037263430116376%;
-  }
-  .row-fluid .offset6:first-child {
-    margin-left: 51.38121546961326%;
-    *margin-left: 51.27483249088986%;
-  }
-  .row-fluid .offset5 {
-    margin-left: 45.58011049723757%;
-    *margin-left: 45.47372751851417%;
-  }
-  .row-fluid .offset5:first-child {
-    margin-left: 42.81767955801105%;
-    *margin-left: 42.71129657928765%;
-  }
-  .row-fluid .offset4 {
-    margin-left: 37.01657458563536%;
-    *margin-left: 36.91019160691196%;
-  }
-  .row-fluid .offset4:first-child {
-    margin-left: 34.25414364640884%;
-    *margin-left: 34.14776066768544%;
-  }
-  .row-fluid .offset3 {
-    margin-left: 28.45303867403315%;
-    *margin-left: 28.346655695309746%;
-  }
-  .row-fluid .offset3:first-child {
-    margin-left: 25.69060773480663%;
-    *margin-left: 25.584224756083227%;
-  }
-  .row-fluid .offset2 {
-    margin-left: 19.88950276243094%;
-    *margin-left: 19.783119783707537%;
-  }
-  .row-fluid .offset2:first-child {
-    margin-left: 17.12707182320442%;
-    *margin-left: 17.02068884448102%;
-  }
-  .row-fluid .offset1 {
-    margin-left: 11.32596685082873%;
-    *margin-left: 11.219583872105325%;
-  }
-  .row-fluid .offset1:first-child {
-    margin-left: 8.56353591160221%;
-    *margin-left: 8.457152932878806%;
-  }
-  input,
-  textarea,
-  .uneditable-input {
-    margin-left: 0;
-  }
-  .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 20px;
-  }
-  input.span12, textarea.span12, .uneditable-input.span12 {
-    width: 710px;
-  }
-  input.span11, textarea.span11, .uneditable-input.span11 {
-    width: 648px;
-  }
-  input.span10, textarea.span10, .uneditable-input.span10 {
-    width: 586px;
-  }
-  input.span9, textarea.span9, .uneditable-input.span9 {
-    width: 524px;
-  }
-  input.span8, textarea.span8, .uneditable-input.span8 {
-    width: 462px;
-  }
-  input.span7, textarea.span7, .uneditable-input.span7 {
-    width: 400px;
-  }
-  input.span6, textarea.span6, .uneditable-input.span6 {
-    width: 338px;
-  }
-  input.span5, textarea.span5, .uneditable-input.span5 {
-    width: 276px;
-  }
-  input.span4, textarea.span4, .uneditable-input.span4 {
-    width: 214px;
-  }
-  input.span3, textarea.span3, .uneditable-input.span3 {
-    width: 152px;
-  }
-  input.span2, textarea.span2, .uneditable-input.span2 {
-    width: 90px;
-  }
-  input.span1, textarea.span1, .uneditable-input.span1 {
-    width: 28px;
-  }
-}
- at media (max-width: 767px) {
-  body {
-    padding-left: 20px;
-    padding-right: 20px;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    margin-left: -20px;
-    margin-right: -20px;
-  }
-  .container-fluid {
-    padding: 0;
-  }
-  .dl-horizontal dt {
-    float: none;
-    clear: none;
-    width: auto;
-    text-align: left;
-  }
-  .dl-horizontal dd {
-    margin-left: 0;
-  }
-  .container {
-    width: auto;
-  }
-  .row-fluid {
-    width: 100%;
-  }
-  .row,
-  .thumbnails {
-    margin-left: 0;
-  }
-  .thumbnails > li {
-    float: none;
-    margin-left: 0;
-  }
-  [class*="span"],
-  .row-fluid [class*="span"] {
-    float: none;
-    display: block;
-    width: auto;
-    margin-left: 0;
-  }
-  .span12,
-  .row-fluid .span12 {
-    width: 100%;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-  }
-  .input-large,
-  .input-xlarge,
-  .input-xxlarge,
-  input[class*="span"],
-  select[class*="span"],
-  textarea[class*="span"],
-  .uneditable-input {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    box-sizing: border-box;
-  }
-  .input-prepend input,
-  .input-append input,
-  .input-prepend input[class*="span"],
-  .input-append input[class*="span"] {
-    display: inline-block;
-    width: auto;
-  }
-  .modal {
-    position: fixed;
-    top: 20px;
-    left: 20px;
-    right: 20px;
-    width: auto;
-    margin: 0;
-  }
-  .modal.fade.in {
-    top: auto;
-  }
-}
- at media (max-width: 480px) {
-  .nav-collapse {
-    -webkit-transform: translate3d(0, 0, 0);
-  }
-  .page-header h1 small {
-    display: block;
-    line-height: 20px;
-  }
-  input[type="checkbox"],
-  input[type="radio"] {
-    border: 1px solid #ccc;
-  }
-  .form-horizontal .control-group > label {
-    float: none;
-    width: auto;
-    padding-top: 0;
-    text-align: left;
-  }
-  .form-horizontal .controls {
-    margin-left: 0;
-  }
-  .form-horizontal .control-list {
-    padding-top: 0;
-  }
-  .form-horizontal .form-actions {
-    padding-left: 10px;
-    padding-right: 10px;
-  }
-  .modal {
-    top: 10px;
-    left: 10px;
-    right: 10px;
-  }
-  .modal-header .close {
-    padding: 10px;
-    margin: -10px;
-  }
-  .carousel-caption {
-    position: static;
-  }
-}
- at media (max-width: 979px) {
-  body {
-    padding-top: 0;
-  }
-  .navbar-fixed-top,
-  .navbar-fixed-bottom {
-    position: static;
-  }
-  .navbar-fixed-top {
-    margin-bottom: 20px;
-  }
-  .navbar-fixed-bottom {
-    margin-top: 20px;
-  }
-  .navbar-fixed-top .navbar-inner,
-  .navbar-fixed-bottom .navbar-inner {
-    padding: 5px;
-  }
-  .navbar .container {
-    width: auto;
-    padding: 0;
-  }
-  .navbar .brand {
-    padding-left: 10px;
-    padding-right: 10px;
-    margin: 0 0 0 -5px;
-  }
-  .nav-collapse {
-    clear: both;
-  }
-  .nav-collapse .nav {
-    float: none;
-    margin: 0 0 10px;
-  }
-  .nav-collapse .nav > li {
-    float: none;
-  }
-  .nav-collapse .nav > li > a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > .divider-vertical {
-    display: none;
-  }
-  .nav-collapse .nav .nav-header {
-    color: #1f444b;
-    text-shadow: none;
-  }
-  .nav-collapse .nav > li > a,
-  .nav-collapse .dropdown-menu a {
-    padding: 9px 15px;
-    font-weight: bold;
-    color: #1f444b;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    border-radius: 3px;
-  }
-  .nav-collapse .btn {
-    padding: 4px 10px 4px;
-    font-weight: normal;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-  }
-  .nav-collapse .dropdown-menu li + li a {
-    margin-bottom: 2px;
-  }
-  .nav-collapse .nav > li > a:hover,
-  .nav-collapse .dropdown-menu a:hover {
-    background-color: #e2e1d7;
-  }
-  .navbar-inverse .nav-collapse .nav > li > a:hover,
-  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
-    background-color: #111111;
-  }
-  .nav-collapse.in .btn-group {
-    margin-top: 5px;
-    padding: 0;
-  }
-  .nav-collapse .dropdown-menu {
-    position: static;
-    top: auto;
-    left: auto;
-    float: none;
-    display: block;
-    max-width: none;
-    margin: 0 15px;
-    padding: 0;
-    background-color: transparent;
-    border: none;
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0;
-    border-radius: 0;
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
-    box-shadow: none;
-  }
-  .nav-collapse .dropdown-menu:before,
-  .nav-collapse .dropdown-menu:after {
-    display: none;
-  }
-  .nav-collapse .dropdown-menu .divider {
-    display: none;
-  }
-  .nav-collapse .navbar-form,
-  .nav-collapse .navbar-search {
-    float: none;
-    padding: 10px 15px;
-    margin: 10px 0;
-    border-top: 1px solid #e2e1d7;
-    border-bottom: 1px solid #e2e1d7;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-  }
-  .navbar .nav-collapse .nav.pull-right {
-    float: none;
-    margin-left: 0;
-  }
-  .nav-collapse,
-  .nav-collapse.collapse {
-    overflow: hidden;
-    height: 0;
-  }
-  .navbar .btn-navbar {
-    display: block;
-  }
-  .navbar-static .navbar-inner {
-    padding-left: 10px;
-    padding-right: 10px;
-  }
-}
- at media (min-width: 980px) {
-  .nav-collapse.collapse {
-    height: auto !important;
-    overflow: visible !important;
-  }
-}
-input.ng-dirty.ng-valid {
-  /*.formFieldState(@successText, @successText, @successBackground);*/
-
-  border-color: #468847;
-}
-input.ng-dirty.ng-invalid {
-  /*.formFieldState(@errorText, @errorText, @errorBackground);*/
-
-  border-color: #b94a48;
-}
-.provider-btn {
-  display: inline-block;
-  list-style: none;
-  padding: 5px;
-}
-.provider-btn .btn img {
-  width: 90px;
-  height: 30px;
-}
-.password-form {
-  padding-top: 20px;
-  border-left: 1px solid #e5e5e5;
-}
-.password-form .form-actions {
-  background-color: transparent;
-  border: none;
-}
-.aeauth-form h4 {
-  text-align: center;
-}
-.pull-right {
-  float: right;
-}
-.pull-left {
-  float: left;
-}
-.hide {
-  display: none;
-}
-.show {
-  display: block;
-}
-.invisible {
-  visibility: hidden;
-}
-.affix {
-  position: fixed;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-weight: normal;
-  padding-bottom: .3em;
-  color: #1F444B;
-}
-.nav .brand {
-  padding: 0;
-}
-#user-nav {
-  padding: 25px 15px 25px;
-}
-.clickable {
-  cursor: pointer;
-}
-.form-actions {
-  background-color: transparent;
-  border: none;
-}
-.navbar .brand a:hover {
-  text-decoration: none;
-}
-.nav-list .active > a,
-.nav-list .active > a:hover {
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-  text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
-}
-.nav-list > li > a {
-  line-height: 24px;
-  padding: 3px 10px;
-}
-section header {
-  padding-bottom: 12px;
-}
-.footer {
-  background-color: #edece6;
-  padding: 30px 0;
-  border-top: 1px solid #e5e5e5;
-  -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
-  -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
-  box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
-}
-
-.quick-links {
-  background-color: #ECEEEF;
-}
-
-.quick-links strong {
-  color: #1F444B;
-}
diff --git a/doc/_themes/bootstrap/static/jquery.js b/doc/_themes/bootstrap/static/jquery.js
deleted file mode 100644
index fa48099..0000000
--- a/doc/_themes/bootstrap/static/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement( [...]
-    f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special [...]
-    {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.re [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/sphinx-bootstrap.css b/doc/_themes/bootstrap/static/sphinx-bootstrap.css
deleted file mode 100644
index 2e7b851..0000000
--- a/doc/_themes/bootstrap/static/sphinx-bootstrap.css
+++ /dev/null
@@ -1,188 +0,0 @@
-/* To change themes. Un-comment the theme you would like to use. */
-
- at import "bootstrap-engineauth.min.css";
-/*@import "bootstrap-default.min.css";*/
-/*@import "bootstrap-sapling.css";*/
-
- at import "bootstrap-responsive.min.css";
-
-.navbar .brand {
-    font-size: 25px;
-}
-
-.logo {
-    float: left;
-    margin-bottom: 5px;
-}
-
-.content {
-    padding-top: 25px;
-}
-
-.footer {
-    /*background-color: #eee;*/
-    padding: 30px 0;
-    text-shadow: 0 1px 0 #fff;
-    border-top: 1px solid #e5e5e5;
-    -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
-    -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
-    box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
-}
-
-.row-odd {
-    background-color: #fafafa;
-}
-
-h1, h2, h3, h4, h5, h6 {
-    padding-bottom: .3em;
-}
-
-.section {
-    margin-bottom: 25px;
-}
-
-code, pre {
-    color: #000;
-}
-
-span.pre {
-    font-family: monospace;
-    color: #007000;
-}
-
-div.admonition {
-    margin: 0 0 10px;
-    padding: .2em .5em .2em .9em;
-}
-
-div.admonition.note {
-    background-color: #fffbe0;
-}
-
-div.admonition.warning {
-    background-color: #ffe0d7;
-}
-
-div.admonition p {
-    margin: .5em;
-    padding: 0;
-}
-p.admonition-title {
-    display: none;
-}
-
-.descname {
-    font-weight: bold;
-}
-
-a.headerlink {
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink {
-    color: #aeaeae;
-    text-decoration: none;
-}
-
-a.headerlink:hover {
-    color: #0E84B5;
-}
-
-.viewcode-link, .viewcode-back {
-    float: right;
-}
-
-tr > td:first-child {
-    font-family: monospace;
-    color: #007000;
-}
-
-tr > td:nth-child(2) {
-    font-family: monospace;
-    color: #4070A0;
-}
-
-.quick-links {
-    border-radius: 3px 3px 3px 3px;
-    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.03) inset;
-    list-style: none outside none;
-    /*margin: 43px 0 0;*/
-    margin: 0;
-    margin-top: 96px;
-    padding: 5px 20px;
-    margin-left: 310px;
-    text-align: center;
-    -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
-    -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
-}
-
-.quick-links li {
-    display: inline;
-    line-height: 30px;
-    margin: 0 5px;
-}
-
-.quick-links .divider {
-    color: #999999;
-}
-
-.quick-links strong {
-    font-weight: normal;
-}
-
-.quick-links .github-btn, .quick-links .tweet-btn, .quick-links .follow-btn, .plusone-container {
-    position: relative;
-    top: 5px;
-}
-
-input[type="submit"] {
-    display: inline-block;
-    padding: 5px 14px 6px;
-    font-size: 13px;
-    line-height: normal;
-    color: #333;
-    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-    background-color: #e6e6e6;
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
-    background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-    background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
-    background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-    background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-    background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
-    background-repeat: no-repeat;
-    border: 1px solid #ccc;
-    border-bottom-color: #bbb;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-    cursor: pointer;
-    -webkit-transition: 0.1s linear all;
-    -moz-transition: 0.1s linear all;
-    -ms-transition: 0.1s linear all;
-    -o-transition: 0.1s linear all;
-    transition: 0.1s linear all;
-}
-input[type="submit"]:hover {
-    color: #404040;
-    text-decoration: none;
-    background-position: 0 -15px;
-}
-
-input[type="submit"].active, input[type="submit"]:active {
-    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-    -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
diff --git a/doc/api/cpp/bounds.rst b/doc/api/cpp/bounds.rst
index 8839919..f9b2e6e 100644
--- a/doc/api/cpp/bounds.rst
+++ b/doc/api/cpp/bounds.rst
@@ -1,8 +1,13 @@
 .. _cpp-pdal-bounds:
 
 ******************************************************************************
-pdal::BOX3D
+:cpp:class:`pdal::BOX2D`
 ******************************************************************************
 
+.. doxygenclass:: pdal::BOX2D
+   :members:
+   :undoc-members:
+
 .. doxygenclass:: pdal::BOX3D
    :members:
+   :undoc-members:
diff --git a/doc/api/cpp/option.rst b/doc/api/cpp/filter.rst
similarity index 64%
rename from doc/api/cpp/option.rst
rename to doc/api/cpp/filter.rst
index ad93a42..071a676 100644
--- a/doc/api/cpp/option.rst
+++ b/doc/api/cpp/filter.rst
@@ -1,11 +1,12 @@
-.. _cpp-pdal-option:
+.. _cpp-pdal-filter:
 
 ******************************************************************************
-pdal::Option
+:cpp:class:`pdal::Filter`
 ******************************************************************************
 
 
-
-.. doxygenclass:: pdal::Option
+.. doxygenclass:: pdal::Filter
    :members:
+   :undoc-members:
+
 
diff --git a/doc/api/cpp/index.rst b/doc/api/cpp/index.rst
index 0d51b02..254955f 100644
--- a/doc/api/cpp/index.rst
+++ b/doc/api/cpp/index.rst
@@ -10,9 +10,9 @@ C++ API
 
    dimension
    bounds
+   filter
    log
    metadata
-   option
    options
    pointview
    pointtable
diff --git a/doc/api/cpp/log.rst b/doc/api/cpp/log.rst
index 7443c4f..cf0993f 100644
--- a/doc/api/cpp/log.rst
+++ b/doc/api/cpp/log.rst
@@ -1,8 +1,9 @@
 .. _cpp-pdal-log:
 
 ******************************************************************************
-pdal::Log
+:cpp:class:`pdal::Log`
 ******************************************************************************
 
 .. doxygenclass:: pdal::Log
    :members:
+   :undoc-members:
diff --git a/doc/api/cpp/metadata.rst b/doc/api/cpp/metadata.rst
index 49b1cea..3864b3b 100644
--- a/doc/api/cpp/metadata.rst
+++ b/doc/api/cpp/metadata.rst
@@ -1,11 +1,15 @@
 .. _cpp-pdal-metadata:
 
 ******************************************************************************
-pdal::Metadata
+:cpp:class:`pdal::Metadata`
 ******************************************************************************
 
 
-
 .. doxygenclass:: pdal::Metadata
    :members:
+   :undoc-members:
+
+.. doxygenclass:: pdal::MetadataNode
+   :members:
+   :undoc-members:
 
diff --git a/doc/api/cpp/options.rst b/doc/api/cpp/options.rst
index b6c4858..b60e583 100644
--- a/doc/api/cpp/options.rst
+++ b/doc/api/cpp/options.rst
@@ -1,9 +1,10 @@
 .. _cpp-pdal-options:
 
 ******************************************************************************
-pdal::Options
+:cpp:class:`pdal::Options`
 ******************************************************************************
 
 .. doxygenclass:: pdal::Options
    :members:
+   :undoc-members:
 
diff --git a/doc/api/cpp/pointtable.rst b/doc/api/cpp/pointtable.rst
index 5939286..0137b98 100644
--- a/doc/api/cpp/pointtable.rst
+++ b/doc/api/cpp/pointtable.rst
@@ -1,10 +1,11 @@
 .. _cpp-pdal-pointtable:
 
 ******************************************************************************
-pdal::PointTable
+:cpp:class:`pdal::PointTable`
 ******************************************************************************
 
 
 .. doxygenclass:: pdal::PointTable
    :members:
+   :undoc-members:
 
diff --git a/doc/api/cpp/pointview.rst b/doc/api/cpp/pointview.rst
index 4a30ffc..a1a0787 100644
--- a/doc/api/cpp/pointview.rst
+++ b/doc/api/cpp/pointview.rst
@@ -1,11 +1,12 @@
 .. _cpp-pdal-pointview:
 
 ******************************************************************************
-pdal::PointView
+:cpp:class:`pdal::PointView`
 ******************************************************************************
 
 .. doxygenclass:: pdal::PointView
    :members:
+   :undoc-members:
 
 
 
diff --git a/doc/api/cpp/reader.rst b/doc/api/cpp/reader.rst
index c644df5..4bc340a 100644
--- a/doc/api/cpp/reader.rst
+++ b/doc/api/cpp/reader.rst
@@ -10,44 +10,5 @@ format that is described via the :cpp:class:`pdal::Schema`.
 
 .. doxygenclass:: pdal::Reader
    :members:
-   :sections: public*
-
-
-`ASPRS LAS`_ Reader
-------------------------------------------------------------------------------
-
-The `ASPRS LAS`_ format is a sequential binary format used to store data from
-LiDAR sensors and by LiDAR processing software for data interchange and archival.
-
-
-.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-
-.. doxygenclass:: pdal::drivers::las::Reader
-   :members:
-
-OCI Reader
-------------------------------------------------------------------------------
-
-The OCI reader provides `Oracle Point Cloud`_ support to PDAL.
-
-.. _`Oracle Point Cloud`: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
-
-.. doxygenclass:: pdal::drivers::oci::OciReader
-   :members:
-
-QFIT Reader
-------------------------------------------------------------------------------
-`QFIT`_ is a format for the NASA IceBridge sea ice sensor.
- 
-.. _`QFIT`: http://nsidc.org/data/ilatm1b.html
-
-.. doxygenclass:: pdal::QfitReader
-  :members:
-
-TerraSolid Reader
-------------------------------------------------------------------------------
-
-.. doxygenclass:: pdal::drivers::terrasolid::Reader
- :members:
-
+    :undoc-members:
 
diff --git a/doc/api/cpp/stage.rst b/doc/api/cpp/stage.rst
index 4c2c307..0f2a357 100644
--- a/doc/api/cpp/stage.rst
+++ b/doc/api/cpp/stage.rst
@@ -1,14 +1,16 @@
 .. _cpp-pdal-stage:
 
+.. index:: Stage
+
 ******************************************************************************
-pdal::Stage
+:cpp:class:`pdal::Stage`
 ******************************************************************************
 
-:cpp:class:`pdal::Stage` is the base class of :cpp:class:`pdal::Filter`, 
-:cpp:class:`pdal::Reader`, and :cpp:class:`pdal::MultiFilter` classes that 
+:cpp:class:`pdal::Stage` is the base class of :cpp:class:`pdal::Filter`,
+:cpp:class:`pdal::Reader`, and :cpp:class:`pdal::MultiFilter` classes that
 implement the reading API in a PDAL pipeline.
 
 .. doxygenclass:: pdal::Stage
    :members:
-   :sections: public*, protected*
+   :undoc-members:
 
diff --git a/doc/api/cpp/writer.rst b/doc/api/cpp/writer.rst
index 8dd9116..c35c759 100644
--- a/doc/api/cpp/writer.rst
+++ b/doc/api/cpp/writer.rst
@@ -1,11 +1,12 @@
 .. _cpp-pdal-writer:
 
 ******************************************************************************
-pdal::Writer
+:cpp:class:`pdal::Writer`
 ******************************************************************************
 
 
 .. doxygenclass:: pdal::Writer
    :members:
+    :undoc-members:
 
 
diff --git a/doc/api/index.rst b/doc/api/index.rst
index cb23f00..35a8662 100644
--- a/doc/api/index.rst
+++ b/doc/api/index.rst
@@ -1,18 +1,19 @@
 .. _api:
 
 ******************************************************************************
-API documentation for PDAL
+API
 ******************************************************************************
 
-PDAL's primary API is its C++ API, however, more `SWIG-based`_ are expected to 
-be developed.
-    
+PDAL is a C++ library, and its primary API is in that language. There is also a
+`Python API <https://pypi.python.org/pypi/PDAL>`__ that allows reading of data
+and interaction with `Numpy`_.
+
 .. toctree::
    :maxdepth: 2
-   
+
    cpp/index
-   
-   
-   
 
-.. _`SWIG-based`: http://www.swig.org
+
+
+
+.. _`Numpy`: http://www.numpy.org/
diff --git a/doc/apps.rst b/doc/apps.rst
index 99873a5..5ae3592 100644
--- a/doc/apps.rst
+++ b/doc/apps.rst
@@ -1,14 +1,14 @@
 .. _apps:
 
 ******************************************************************************
-PDAL Applications
+Applications
 ******************************************************************************
 
 :Author: Howard Butler
 :Contact: howard at hobu.co
 :Date: 6/1/2015
 
-PDAL contains consists of a single application, called ``pdal``. The ```pdal``
+PDAL contains consists of a single application, called ``pdal``. The ``pdal``
 application currently has the following subcommands:
 
 * :ref:`delta <delta_command>`
diff --git a/doc/community.rst b/doc/community.rst
index e4a96db..3bfe967 100644
--- a/doc/community.rst
+++ b/doc/community.rst
@@ -4,24 +4,60 @@
 Community
 ******************************************************************************
 
-Mailing Lists
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 10/27/2015
+
+PDAL's community interacts through `Mailing List`_, `GitHub`_, and `IRC`_.
+Please feel welcome to ask questions and participate in all of the venues.
+The `Mailing List`_ communication channel is for general questions, development
+discussion, and feedback. The `GitHub`_ communication channel is for development
+activities, bug reports, and testing. The `IRC`_ channel is for real-time
+chat activities such as meetings and interactive debugging sessions.
+
+Mailing List
 ..............................................................................
 
-* pdal - http://lists.osgeo.org/mailman/listinfo/pdal
-* pdal-commits - http://lists.osgeo.org/mailman/listinfo/pdal-commits
+Developers and users of PDAL participate on the PDAL mailing list. It is OK to
+ask questions about how to use PDAL, how to integrate PDAL into your own software,
+and report issues that you might have.
 
+.. note::
 
-Bugs
+    Please remember that an email to the PDAL list is going to 100s of
+    individuals. Do your diligence the best you can on your question before
+    asking, but don't be afraid to ask. We won't bite. Promise.
+
+Subscribe
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can find the mailing list management page at
+
+http://lists.osgeo.org/mailman/listinfo/pdal
+
+GitHub
 ..............................................................................
 
-Visit http://github.com/PDAL/PDAL to file bugs or fork the PDAL respository and
-start hacking on it yourself.
+Visit http://github.com/PDAL/PDAL to file issues you might be having with the
+software. GitHub is also where you can obtain a current development version of the
+software in the `git`_ revision control system. The PDAL project is eager to
+take contributions in all forms, and we welcome those who are willing to roll
+up their sleeves and start filing tickets, pushing code, generating builds, and
+answering questions.
+
+.. seealso::
+
+    :ref:`development_index` provides more information on how the PDAL software
+    development activities operate.
 
 IRC
 ..............................................................................
 
-Find the PDAL developers on IRC on #pdal at `Freenode`_.
-
+You can find some PDAL developers on IRC on #pdal at `Freenode`_. This mechanism
+is usually reserved for active meetings and other outreach with the community.
+The `Mailing List`_ and `GitHub`_ avenues are going to be more productive
+communication channels in most situations.
 
 
+.. _`git`: https://en.wikipedia.org/wiki/Git_(software)
 .. _`Freenode`: http://freenode.net
diff --git a/doc/compilation/dependencies.rst b/doc/compilation/dependencies.rst
index e722e4e..4892375 100644
--- a/doc/compilation/dependencies.rst
+++ b/doc/compilation/dependencies.rst
@@ -6,22 +6,19 @@ Dependencies
 
 :Author: Howard Butler
 :Contact: howard at hobu.co
-:Date: 11/15/2013
+:Date: 11/03/2015
 
 PDAL explicitly stands on the shoulders of giants that have come before it.
-Specifically, PDAL depends on a number of libraries to do its work including:
+Specifically, PDAL depends on a number of libraries to do its work. Most are
+not required. For optional dependencies, PDAL utilizes a dynamically-linked
+plugin architecture that loads them at runtime.
 
-.. contents::
-    :depth: 1
-    :local:
 
-.. note::
-
-    :ref:`stage_index` contains explicit usages of the various
-    stage types available to PDAL.
+Required Dependencies
+------------------------------------------------------------------------------
 
 Boost
-------------------------------------------------------------------------------
+..............................................................................
 
 PDAL attempts to constrain its code-love for Boost and not always try to use the
 latest and the greatest, but the instinct is hard to control. Specifically, PDAL
@@ -32,10 +29,10 @@ work with some minor modifications or ``#ifdef``'ing, but the PDAL developers
 currently track rather late versions of Boost.
 
 
-Boost Packages Used
-..............................................................................
+Packages Used
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-An unexhaustive list includes:
+An list includes:
 
 * Accumulators
 * Filesystem
@@ -44,19 +41,19 @@ An unexhaustive list includes:
 * IO Streams
 * System
 * String Algorithms
-* Endian
 * UUID
 
 
+
 GDAL
-------------------------------------------------------------------------------
+..............................................................................
 
 PDAL uses GDAL for spatial reference system description manipulation, and image
-reading supporting for the NITF driver, and :ref:`writers.oci` support. In conjunction with GeoTIFF_,
-GDAL is used to convert GeoTIFF keys and OGC WKT SRS description strings into
-formats required by specific drivers. While PDAL can be built without GDAL
-support, if you want SRS manipulation and description ability, you must have
-GDAL (and GeoTIFF_) linked in at compile time.
+reading supporting for the NITF driver, and :ref:`writers.oci` support. In
+conjunction with GeoTIFF_, GDAL is used to convert GeoTIFF keys and OGC WKT SRS
+description strings into formats required by specific drivers. While PDAL can
+be built without GDAL support, if you want SRS manipulation and description
+ability, you must have GDAL (and GeoTIFF_) linked in at compile time.
 
 Obtain `GDAL`_ via whatever method is convenient.  Linux platforms such as
 `Debian`_ have `DebianGIS`_, Mac OS X has the `KyngChaos`_ software frameworks,
@@ -68,9 +65,12 @@ and Windows has the `OSGeo4W`_ platform.
     If you are using `OSGeo4W`_ as your provider of GDAL, you must make sure
     to use the GDAL 1.9 package.
 
-GeoTIFF
+Optional Dependencies
 ------------------------------------------------------------------------------
 
+GeoTIFF
+..............................................................................
+
 PDAL uses GeoTIFF in conjunction with GDAL for GeoTIFF key support in the
 LAS driver.  Obtain `GeoTIFF`_ from the same place you got `GDAL`_.
 
@@ -88,22 +88,22 @@ LAS driver.  Obtain `GeoTIFF`_ from the same place you got `GDAL`_.
     not need to worry about this issue.
 
 Proj.4
-------------------------------------------------------------------------------
+..............................................................................
 
 Proj.4_ is the projection engine that PDAL uses for the
-:ref:`filters.reprojection` filter. It is used by GDAL. 
+:ref:`filters.reprojection` filter. It is used by GDAL.
 
 .. note::
 
-    Proj.4 4.9.0+ is required if you need vertical datum 
-    transformation support. Otherwise, older versions should be 
+    Proj.4 4.9.0+ is required if you need vertical datum
+    transformation support. Otherwise, older versions should be
     sufficient.
 
 libxml2
-------------------------------------------------------------------------------
+..............................................................................
 
-libxml2_ is used to serialize PDAL dimension descriptions into XML for the 
-database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or 
+libxml2_ is used to serialize PDAL dimension descriptions into XML for the
+database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or
 :ref:`readers.pgpointcloud`
 
 .. note::
@@ -111,7 +111,7 @@ database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or
     libxml 2.7.0+ is required. Older versions may also work but are untested.
 
 `OCI`_
-------------------------------------------------------------------------------
+..............................................................................
 
 Obtain the `Oracle Instant Client`_ and install in a location on your system.
 Be sure to install both the "Basic" and the "SDK" modules. Set your
@@ -136,7 +136,7 @@ Point Cloud read/write support.
     MSVC should only require the oci.lib and oci.dll library and dlls.
 
 Points2Grid
-------------------------------------------------------------------------------
+..............................................................................
 
 `Points2Grid`_ is a library with a simple `CMake`-based build system that
 provides simple, out-of-process interpolation of large point sets using
@@ -144,7 +144,7 @@ Boost_. It can be obtained via github.com at https://github.com/CRREL/points2gri
 It is used by :ref:`writers.p2g` to output point cloud interpolation.
 
 Hexer
-------------------------------------------------------------------------------
+..............................................................................
 
 `Hexer`_ is a library with a simple `CMake`-based build system that
 provides simple hexagon gridding of large point sets for density surface
@@ -153,11 +153,11 @@ https://github.com/hobu/hexer It is used by :ref:`filters.hexbin` to output
 density surfaces and boundary approximations.
 
 Nitro
-------------------------------------------------------------------------------
+..............................................................................
 
 Nitro is a library that provides `NITF`_ support for PDAL to write LAS-in-NITF
-files for :ref:`writers.nitf`. PDAL can only use a fork of Nitro located at http://github.com/hobu/nitro instead
-of the mainline tree for two reasons:
+files for :ref:`writers.nitf`. PDAL can only use a fork of Nitro located at
+http://github.com/hobu/nitro instead of the mainline tree for two reasons:
 
 1) The fork contains a simple `CMake`-based build system
 2) The fork properly dynamically links on Windows to maintain LGPL compliance.
@@ -167,23 +167,38 @@ the main source tree.
 
 
 LASzip
-------------------------------------------------------------------------------
+..............................................................................
 
 `LASzip`_ is a library with a simple `CMake`-based build system that
 provides periodic compression of `ASPRS LAS`_ data. It is used by the
 :ref:`writers.las` and :ref:`readers.las` to provide
 compressed LAS support.
 
+laz-perf
+..............................................................................
+
+In addition to `LASzip`_, you can use the alternative `laz-perf`_ library.
+`laz-perf`_ provides slightly faster decompression capability for typical
+LAS files. It is also used as a compression type for :ref:`writers.oci` and
+:ref:`writers.sqlite`
+
+.. _`laz-perf`: https://github.com/verma/laz-perf/
 
 PCL
-------------------------------------------------------------------------------
+..............................................................................
 
 The `Point Cloud Library (PCL)`_ is used by the :ref:`ground_command`,
 :ref:`pcl_command`, :ref:`writers.pcd`, :ref:`readers.pcd`, and
 :ref:`filters.pclblock` to provide support for various PCL-related operations.
 
-At the moment, PCL must be built from 1.7.2+. We do our best to keep this
-up-to-date with PCL master.
+PCL must be 1.7.2+. We do our best to keep this up-to-date with PCL master.
+
+.. note::
+    `Homebrew`_-based OSX builds use PCL 1.7.2, but you may need to switch
+    of `VTK`_ support depending on the configuration.
+
+.. _`Homebrew`: http://brew.sh
+.. _`VTK`: http://vtk.org
 
 .. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
 .. _`LASzip`: http://laszip.org
diff --git a/doc/compilation/index.rst b/doc/compilation/index.rst
index 18f0543..e79d330 100644
--- a/doc/compilation/index.rst
+++ b/doc/compilation/index.rst
@@ -5,13 +5,19 @@ Installation
 ******************************************************************************
 
 This section describes how to build and install PDAL under Windows, Linux, and Mac.
+PDAL's numerous :ref:`dependencies` can make it a challenge to build a fully-featured
+build.
+
+.. seealso::
+    :ref:`download` contains links to installable binaries for Windows, OSX, and
+    RHEL Linux systems.
 
 Contents:
 
 .. toctree::
    :maxdepth: 1
-   
+
    unix
    windows
    dependencies
-   
\ No newline at end of file
+
diff --git a/doc/compilation/media/OSGeo4WInstallIConv.png b/doc/compilation/media/OSGeo4WInstallIConv.png
index f886b7a..a6f0c5a 100644
Binary files a/doc/compilation/media/OSGeo4WInstallIConv.png and b/doc/compilation/media/OSGeo4WInstallIConv.png differ
diff --git a/doc/compilation/unix.rst b/doc/compilation/unix.rst
index 0d2bc79..5ee9b97 100644
--- a/doc/compilation/unix.rst
+++ b/doc/compilation/unix.rst
@@ -6,27 +6,32 @@ Unix Compilation
 
 :Author: Howard Butler
 :Contact: howard at hobu.co
-:Date: 11/16/2013
+:Date: 10/27/2015
 
-`CMake`_ 2.8.6+ is the prescribed tool for building from source as well as
-running unit tests. `CMake`_ is a cross-platform build system that provides a
-number of benefits, and its usage ensures a single, up-to-date build system
-for all PDAL-supported operating systems and compiler platforms.
+`CMake`_ 2.8.11+ is the prescribed tool for building from source, with `CMake`_
+3.0+ being desired. `CMake`_ is a cross-platform build system that provides a
+number of benefits, and its usage ensures a single, up-to-date build system for
+all PDAL-supported operating systems and compiler platforms.
 
-Like a combination of autoconf/autotools, except that it actually works on
-Windows (and works without eye-stabbing pain in general), `CMake`_ is somewhat
-of a meta-building tool. It can be used to generate MSVC project files, GNU
-Makefiles, NMake files for MSVC, XCode projects on Mac OS X, and Eclipse
-projects (as well as many others).  This functionality allows the PDAL project 
-to avoid maintaining these build options by hand and target a single configuration
-and build platform.
+Like a combination of autoconf/autotools, except that it works on Windows with
+minimal eye-stabbing pain, `CMake`_ is somewhat of a meta-building tool. It can
+be used to generate MSVC project files, GNU Makefiles, NMake files for MSVC,
+XCode projects on Mac OS X, and Eclipse projects (as well as many others).
+This functionality allows the PDAL project to avoid maintaining these build
+options by hand and target a single configuration and build platform.
 
-This tutorial will describe how to build PDAL using CMake on a 
-Unix platform.  PDAL is known to compile on Linux 2.6's of various flavors and 
-OSX Snow Leopard and Lion with XCode 4.2.
+This tutorial will describe how to build PDAL using CMake on a Unix platform.
+PDAL is known to compile on Linux 2.6's of various flavors and OSX with XCode.
 
-:ref:`dependencies` contains more information about specific library version
-requirements and notes about building or acquiring them.
+.. seealso::
+
+    :ref:`vagrant` contains an automated way to build PDAL and all of
+    its dependencies.
+
+.. note::
+
+    :ref:`dependencies` contains more information about specific library
+    version requirements and notes about building or acquiring them.
 
 Using "Unix Makefiles" on Linux
 ..............................................................................
@@ -45,7 +50,7 @@ example, we are going to generate a "Unix Makefiles" builder
 for PDAL on Mac OS X.
 
 ::
-    
+
     $ cd PDAL
     $ mkdir makefiles
     $ cd makefiles
@@ -80,12 +85,12 @@ Configure the basic core library for the "Unix Makefiles" target:
 
 .. note::
 
-    The ``hobu-config.sh`` shell script contains a number of common 
-    settings that I use to configure my `Homebrew`-based Macintosh 
+    The ``./cmake/examples/hobu-config.sh`` shell script contains a number of common
+    settings that I use to configure my `Homebrew`-based Macintosh
     system.
 
 .. _`Homebrew`: http://brew.sh/
- 
+
 Issue the `make` command
 ------------------------------------------------------------------------------
 
@@ -98,9 +103,9 @@ configured.
 Run ``make install`` and test your installation with a :ref:`pdal_test` command
 -------------------------------------------------------------------------------
 
-``make install`` will install the :ref:`utilities <apps>` in the location
-that was specified for 'CMAKE_INSTALL_PREFIX'.  Once installed, ensure that 
-you can run `pdal info`.
+``make install`` will install the :ref:`utilities <apps>` in the location that
+was specified for 'CMAKE_INSTALL_PREFIX'.  Once installed, ensure that you can
+run `pdal info`.
 
 
 .. _configure_optional_libraries:
@@ -135,18 +140,18 @@ substituting accordingly, to values that match your system layout.
 .. _`DebianGIS`: http://wiki.debian.org/DebianGis
 .. _`Debian`: http://www.debian.org
 .. _`KyngChaos`: http://www.kyngchaos.com/software/unixport
-.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/  
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
 
 
 CCMake and cmake-gui
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. warning::
-    
-    The following was just swiped from the libLAS compilation document 
-    and it has not been updated for PDAL. The basics should be the same, however. 
+
+    The following was just swiped from the libLAS compilation document
+    and it has not been updated for PDAL. The basics should be the same, however.
     Please ask on the :ref:`mailing list<community>` if you run into any issues.
-    
+
 While `CMake`_ can be run from the command-line, and this is the preferred
 way for many individuals, it can be much easier to run CMake from a GUI.
 Now that we have a basic library building, we will use CMake's GUIs to
@@ -154,27 +159,28 @@ help us configure the rest of the optional components of the library. Run
 ``ccmake ../`` for the `Curses`_ interface or ``cmake-gui ../`` for a GUI
 version.
 
-  
+
 .. figure:: media/ccmake-osx-start.png
     :alt: Running CCMake in OS X
 
-    Running the `Curses`_ `CMake`_ interface.  This interface is available to 
-    all unix-like operating systems. 
-    
+    Running the `Curses`_ `CMake`_ interface.  This interface is available to
+    all unix-like operating systems.
+
 .. note::
-    If your arrow keys are not working with in CCMake, use CTRL-N and 
+
+    If your arrow keys are not working with in CCMake, use CTRL-N and
     CTRL-P to move back and forth between the options.
 
 .. figure:: media/cmake-gui-osx-start.png
     :alt: Running cmake-gui in OS X
 
-    Running the cmake-gui `CMake`_ interface.  This interface is available 
+    Running the cmake-gui `CMake`_ interface.  This interface is available
     on Linux, Windows, and Mac OS X.
 
-Build and install 
+Build and install
 ------------------------------------------------------------------------------
 
-Once you have configured your additional libraries, you can install the 
+Once you have configured your additional libraries, you can install the
 software.  The main pieces that will be installed are:
 
 * PDAL headers (typically in a location ./include/pdal/...)
@@ -201,7 +207,7 @@ Prepare a build directory
 
 CMake allows you to generate different builders for a project, and in this
 example, we are going to generate an "Xcode" builder for PDAL on Mac OS X.
-Additionally, we're going to use an alternative compiler -- `LLVM`_ -- which 
+Additionally, we're going to use an alternative compiler -- `LLVM`_ -- which
 under certain situations can produce much faster code on Mac OS X.
 
 ::
@@ -241,9 +247,9 @@ Configure the basic core library for the Xcode build:
     -- Build files have been written to: /Users/hobu/hg/PDAL-cmake/xcode
 
 
-Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
-`GeoTIFF`_ installed, you can provide locations for those as part of your
-``cmake`` invocation:
+Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and `GeoTIFF`_
+installed, you can provide locations for those as part of your ``cmake``
+invocation:
 
 ::
 
@@ -253,9 +259,13 @@ Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
       -D GEOTIFF_LIBRARY=/Library/Frameworks/UnixImageIO.framework/unix/lib/libgeotiff.dylib \
       ..
 
-    
-:: 
-    
+.. note::
+
+    I recommend that you use in `Homebrew`_ for `GDAL`_ and friends. Its configuration
+    is featureful and up-to-date.
+
+::
+
     $ open PDAL.xcodeproj/
 
 .. figure:: media/xcode-start.png
@@ -264,9 +274,9 @@ Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
 Set default command for XCode
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Set the default executable for the project to be ``lasinfo`` by opening the 
-"Executables" tree, choosing "lasinfo," and clicking the bubble next to 
-the "Executable name" in the right-hand panel.  
+Set the default executable for the project to be ``lasinfo`` by opening the
+"Executables" tree, choosing "lasinfo," and clicking the bubble next to
+the "Executable name" in the right-hand panel.
 
 .. figure:: media/xcode-set-default-executable.png
     :alt: Setting the default executable
@@ -287,14 +297,14 @@ location of our test file. This is similar to the :ref:`same command
 Configure :ref:`Optional Libraries <dependencies>`
 ------------------------------------------------------------------------------
 
-As :ref:`before <configure_optional_libraries>`, use ``ccmake ../`` or ``cmake-gui ../`` to 
+As :ref:`before <configure_optional_libraries>`, use ``ccmake ../`` or ``cmake-gui ../`` to
 configure your :ref:`dependencies`.
 
 
 .. figure:: media/cmake-gui-osx-configured.png
     :alt: Configuring optional libraries with CMake GUI
-    
-  
+
+
 .. _`CMake`: http://www.cmake.org/
 .. _`CTest`: http://cmake.org/cmake/help/ctest-2-8-docs.html
 .. _`CMake 2.8.0+`: http://www.cmake.org/cmake/help/cmake-2-8-docs.html
diff --git a/doc/compilation/windows.rst b/doc/compilation/windows.rst
index 5d5da4a..fc742f3 100644
--- a/doc/compilation/windows.rst
+++ b/doc/compilation/windows.rst
@@ -8,6 +8,21 @@ Building Under Windows
 :Contact: unknown at lizardtech dot com
 :Date: 3/19/2012
 
+.. note::
+
+    `OSGeo4W`_ contains a pre-built up-to-date 64 bit Windows binary. It
+    is fully-featured, and if you do not need anything custom, it is likely
+    the fastest way to get going.
+
+.. seealso::
+
+    :ref:`vagrant` contains an automated way to build PDAL and all of
+    its dependencies on Unix. If you just want to apply PDAL commandline
+    operations to data, this mechanism is likely to be much faster than
+    compiling your own.
+
+.. _`OSGeo4W`: https://trac.osgeo.org/osgeo4w/
+
 Most Users
 ------------------------------------------------------------------------------
 
diff --git a/doc/conf.py b/doc/conf.py
index 85886ef..0231f2a 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -13,6 +13,8 @@
 
 import sys, os, re
 
+import sphinx_bootstrap_theme
+
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
@@ -25,10 +27,12 @@ import sys, os, re
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['breathe', 'sphinx.ext.autodoc','rst2pdf.pdfbuilder']
+extensions = ['breathe', 'sphinx.ext.autodoc', 'rst2pdf.pdfbuilder', 'sphinx.ext.pngmath','rst2pdf.pdfbuilder']
+
+# disqus_shortname = 'pdal'
 
 # Add any paths that contain templates here, relative to this directory.
-# templates_path = ['_templates']
+templates_path = ['_templates']
 
 # The suffix of source filenames.
 source_suffix = '.rst'
@@ -37,11 +41,13 @@ source_suffix = '.rst'
 #source_encoding = 'utf-8-sig'
 
 # The master toctree document.
-master_doc = 'docs'
+master_doc = 'index'
 
 # General information about the project.
 project = u'PDAL'
-copyright = u'2015, Howard Butler, Michael Gerlek and others'
+
+import datetime
+copyright = str(datetime.datetime.now().year)
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -71,6 +77,7 @@ def read_version(filename):
     return '%s'%(version)
 
 release = read_version('../CMakeLists.txt')
+version = release
 
 
 # The language for content autogenerated by Sphinx. Refer to documentation
@@ -119,17 +126,82 @@ html_theme = 'bootstrap'
 # further.  For a list of options available for each theme, see the
 # documentation.
 html_theme_options = {
-    'analytics_code': 'UA-00000000-1',
-    'github_user': 'PDAL',
-    'github_repo': 'PDAL',
-    'twitter_username': 'pointcloudpipe',
-    'home_url': 'http://pdal.io',
-    'disqus_shortname': 'pdal',
+#     'analytics_code': 'UA-00000000-1',
+#     'github_user': 'PDAL',
+#     'github_repo': 'PDAL',
+# #     'twitter_username': 'pointcloudpipe',
+#     'home_url': 'http://pdal.io',
+#     'disqus_shortname': 'pdal',
+}
+
+html_theme_options = {
+    # Navigation bar title. (Default: ``project`` value)
+    'navbar_title': "",
+
+    # Tab name for entire site. (Default: "Site")
+    'navbar_site_name': "Docs",
+
+    # A list of tuples containing pages or urls to link to.
+    # Valid tuples should be in the following forms:
+    #    (name, page)                 # a link to a page
+    #    (name, "/aa/bb", 1)          # a link to an arbitrary relative url
+    #    (name, "http://example.com", True) # arbitrary absolute url
+    # Note the "1" or "True" value above as the third argument to indicate
+    # an arbitrary url.
+    'navbar_links': [
+        ("Download", "download"),
+        ("GitHub", "https://github.com/PDAL/PDAL", True),
+    ],
+
+    # Render the next and previous page links in navbar. (Default: true)
+    'navbar_sidebarrel': True,
+
+    # Render the current pages TOC in the navbar. (Default: true)
+    'navbar_pagenav': True,
+
+    # Tab name for the current pages TOC. (Default: "Page")
+    'navbar_pagenav_name': "Here",
+
+    # Global TOC depth for "site" navbar tab. (Default: 1)
+    # Switching to -1 shows all levels.
+    'globaltoc_depth': 2,
+
+    # Include hidden TOCs in Site navbar?
+    #
+    # Note: If this is "false", you cannot have mixed ``:hidden:`` and
+    # non-hidden ``toctree`` directives in the same page, or else the build
+    # will break.
+    #
+    # Values: "true" (default) or "false"
+    'globaltoc_includehidden': "true",
+
+    # HTML navbar class (Default: "navbar") to attach to <div> element.
+    # For black navbar, do "navbar navbar-inverse"
+    'navbar_class': "navbar",
+
+    # Fix navigation bar to top of page?
+    # Values: "true" (default) or "false"
+    'navbar_fixed_top': "true",
+
+    # Location of link to source.
+    # Options are "nav" (default), "footer" or anything else to exclude.
+    'source_link_position': "nav",
+
+    # Bootswatch (http://bootswatch.com/) theme.
+    #
+    # Options are nothing (default) or the name of a valid theme
+    # such as "amelia" or "cosmo".
+    'bootswatch_theme': "cerulean",
+
+    # Choose Bootstrap version.
+    # Values: "3" (default) or "2" (in quotes)
+    'bootstrap_version': "3",
 }
 
 # Add any paths that contain custom themes here, relative to this directory.
 html_theme_path = ['./_themes']
 
+html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
 html_title = "pdal.io"
@@ -139,12 +211,12 @@ html_short_title = "Documentation"
 
 # The name of an image file (relative to this directory) to place at the top
 # of the sidebar.
-html_logo = './_static/pdal_logo.png'
+# html_logo = './_static/pdal_logo_small.png'
 
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-#html_favicon = None
+html_favicon = './_static/logo/favicon.ico'
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
@@ -160,11 +232,11 @@ html_last_updated_fmt = '%b %d, %Y'
 #html_use_smartypants = True
 
 # Custom sidebar templates, maps document names to template names.
-html_sidebars = {
-    '**': ['localtoc.html', 'relations.html' ],
-"index":["indexsidebar.html",'searchbox.html'],
-"docs":['searchbox.html']
-}
+# html_sidebars = {
+#     '**': ['localtoc.html', 'relations.html' ],
+# "index":["indexsidebar.html",'searchbox.html'],
+# "docs":['searchbox.html']
+# }
 
 # Additional templates that should be rendered to pages, maps page names to
 # template names.
@@ -180,7 +252,7 @@ html_sidebars = {
 #html_split_index = False
 
 # If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
+html_show_sourcelink = False
 
 # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
 #html_show_sphinx = True
@@ -305,3 +377,10 @@ breathe_diagram = {
     'no-link' : False
 }
 
+pdf_documents = [
+    ('index', u'PDAL-'+release, u'PDAL Documentation', u'Howard Butler\\Michael Gerlek\\The PDAL Development Team'),
+]
+pdf_stylesheets = ['sphinx','kerning','a4']
+pdf_break_level = 3
+pdf_toc_depth = 5
+pdf_default_dpi = 144
diff --git a/doc/development/conventions.rst b/doc/development/conventions.rst
index 50cc14c..8511bf6 100644
--- a/doc/development/conventions.rst
+++ b/doc/development/conventions.rst
@@ -1,8 +1,8 @@
 .. _development_conventions:
 
-==================
+================================================================================
 Coding Conventions
-==================
+================================================================================
 
 To the extent possible and reasonable, we value consistency of source code
 formatting, class and variable naming, and so forth.
@@ -24,8 +24,8 @@ Our conventions are:
 
 * spaces, not tabs
 
-* indent to four (4) spaces ("Four shalt be the number thou shalt count, 
-  and the number of the counting shall be four. Three shalt thou not count, 
+* indent to four (4) spaces ("Four shalt be the number thou shalt count,
+  and the number of the counting shall be four. Three shalt thou not count,
   neither count thou five...")
 
 * braces shall be on their own lines, like this::
@@ -35,7 +35,7 @@ Our conventions are:
        foo();
     }
 
-* copyright header on every file 
+* copyright header, license, and author(s) on every file
 
 * two spaces between major units, e.g. function bodies
 
@@ -50,7 +50,7 @@ Naming Conventions
 * member variables should be prefixed with "m\_", followed by the name in
   lowerCamelCase -- for example, "m_numberOfPoints"
 
-* there should be only one class per file, and the name of the file should 
+* there should be only one class per file, and the name of the file should
   match the class name -- that is, class PointData should live in files
   PointData.hpp and PointData.cpp
 
@@ -60,21 +60,21 @@ Other Conventions
 
 * the use of getter and setter methods is preferred to exposing member
   variables
-  
-* Surround all code with "namespace pdal {...}"; where justifiable, you 
+
+* Surround all code with "namespace pdal {...}"; where justifiable, you
   may introduce a nested namespace.
-  
-* Use exceptions for exceptional events that are not going to be handled 
+
+* Use exceptions for exceptional events that are not going to be handled
   directly within the context of where the event occurs.  Avoid status
-  codes.  See exceptions.hpp for a set of pdal-specific exception types 
-  you may throw.  (See Note on error handling)
+  codes.  See pdal_error.hpp for a set of pdal-specific exception types
+  you may throw.
 
 * Describe use of "debug" and "verbose" settings.
 
 * Don't put member function bodies in the class declaration in the
   header file, unless clearly justified for performance reasons.
   Use the "inline" keyword in these cases(?).
-  
+
 * Use const.
 
 * Don't put "using" declarations in headers.
@@ -86,7 +86,7 @@ Layout/Organization of Source Tree
 ==================================
 
 * public headers in ./include
-    
+
 * private headers alongside source files in src/
 
 * ...
@@ -109,13 +109,14 @@ Layout/Organization of Source Tree
 * Exception to the above: source files (.cpp) should #include their
   corresponding .hpp file first.  This assures that the header is including
   all the files it needs to.
-  
+
 * Don't #include a file where a simple forward declaration will do.
   (Note: this only applies to pdal files; don't forward declare from system
   or 3rd party headers.)
 
 * Don't include a file unless it actually is required to compile the source unit.
 
-* Include guards should spell out the full path, like this:
-  #ifndef INCLUDED_DRIVERS_FAUX_READER_ITERATOR_HPP
- 
+* Don't use manual include guards. All reasonable compilers support the once pragma::
+
+  #pragma once
+
diff --git a/doc/development/docs.rst b/doc/development/docs.rst
index 1bf2ff8..1d93e9c 100644
--- a/doc/development/docs.rst
+++ b/doc/development/docs.rst
@@ -1,41 +1,106 @@
 .. _development_docs:
 
-====
+================================================================================
 Docs
-====
+================================================================================
 
 
-Building the Documentation
-==========================
+Requirements
+================================================================================
 
-To build the PDAL documentation yourself, you need to install sphinx_, breathe_, and other python dependencies, preferably with PyPI_.
-If you have `pip installed <http://www.pip-installer.org/en/latest/installing.html>`_, install the documentation dependencies with:
+To build the PDAL documentation yourself, you need to install the following
+items:
+
+* Sphinx_
+* Breathe_
+* `sphinx_bootstrap_theme`_
+* `Doxygen`_
+* `Latex`_
+* `dvipng`_
+
+.. _`dvipng`: https://en.wikipedia.org/wiki/Dvipng
+.. _`sphinx_bootstrap_theme`: https://pypi.python.org/pypi/sphinx-bootstrap-theme/
+.. _`Latex`: https://en.wikipedia.org/wiki/LaTeX
+
+Sphinx, Breathe_ and Bootstrap
+--------------------------------------------------------------------------------
+
+Python dependencies should be installed from PyPI_ with ``pip`` or
+``easy_install``.
 
 .. code-block:: bash
 
-    (sudo) pip install sphinx breathe rst2pdf
+    (sudo) pip install sphinx breathe rst2pdf sphinx_bootstrap_theme
+
+.. note::
+
+    If you are installing these packages to a system-wide directory, you may need
+    the **sudo** in front of the **pip**, though it might be better that instead
+    you use `virtual environments`_ instead of installing the packages system-wide.
+
+Doxygen
+--------------------------------------------------------------------------------
+
+The PDAL documentation also depends on `Doxygen`_, which can be installed from
+source or from binaries from the `doxygen website
+<http://www.stack.nl/~dimitri/doxygen/download.html>`_.  If you are on Max OS X
+and use `homebrew`_, you can install doxygen with a simple ``brew install
+doxygen``.
+
+Latex
+--------------------------------------------------------------------------------
+
+`Latex`_ is used for equation editing inside of Sphinx. It is used to generate
+figures and graphs.
+
+dvipng
+--------------------------------------------------------------------------------
 
-If you are installing these packages to a system-wide directory, you may need the **sudo** in front of the **pip**, though it might be better that instead you use `virtual environments`_ instead of installing the packages system-wide.
+For math output, we depend on `dvipng`_ to turn `Latex`_ output into math PNGs.
 
-The PDAL documentation also depends on `doxygen`_, which can be installed from source or from binaries from the `doxygen website <http://www.stack.nl/~dimitri/doxygen/download.html>`_.
-If you are on Max OS X and use `homebrew`_, you can install doxygen with a simple ``brew install doxygen``.
+Generation
+================================================================================
 
-Once you have installed all the doc dependencies, you can then build the documentation itself.
-The :file:`doc/` directory in the PDAL source tree contains a Makefile which can be used to build all documentation.
-For a list of the output formats supported by Sphinx, simply type ``make``.
-For example, to build html documentation:
+Once you have installed all the doc dependencies, you can then build the
+documentation itself.  The :file:`doc/` directory in the PDAL source tree
+contains a Makefile which can be used to build all documentation.  For a list
+of the output formats supported by Sphinx, simply type ``make``.  For example,
+to build html documentation:
 
 .. code-block:: bash
 
     cd doc
     make doxygen html
 
-The html docs will be placed in :file:`doc/build/html/`.
-The ``make doxygen`` is necessary to re-generate the API documentation from the source code.
+The html docs will be placed in :file:`doc/build/html/`.  The ``make doxygen``
+is necessary to re-generate the API documentation from the source code using
+`Breathe`_ and `Sphinx`_.
+
+
+
+
+Website
+================================================================================
+
+The http://pdal.io website is regenerated from the master branch at the following
+cron schedule:
+
+::
+
+    30 2,8,12,16,20 * * * /home/pdal/periodic/pdal.sh
+
+It is generated by a `Digital Ocean`_ droplet that uses the ``PDAL-docs`` `GitHub`_
+user to write to the https://github.com/PDAL/pdal.github.io repository. The website
+is then served via `GitHub Pages`_.
+
+.. _`GitHub Pages`: https://pages.github.com/
+.. _`GitHub`: http://github.com/PDAL/PDAL
+
+.. _`Digital Ocean`: digitalocean.com
 
-.. _sphinx: http://sphinx-doc.org/
-.. _breathe: https://github.com/michaeljones/breathe
+.. _Sphinx: http://sphinx-doc.org/
+.. _Breathe: https://github.com/michaeljones/breathe
 .. _virtual environments: https://pypi.python.org/pypi/virtualenv
 .. _pypi: https://pypi.python.org/pypi
-.. _doxygen: http://www.stack.nl/~dimitri/doxygen/
+.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/
 .. _homebrew: http://mxcl.github.io/homebrew/
diff --git a/doc/development/errorhandling.rst b/doc/development/errorhandling.rst
index 947f336..e4c0a7d 100644
--- a/doc/development/errorhandling.rst
+++ b/doc/development/errorhandling.rst
@@ -1,19 +1,17 @@
 .. _development_errorhandling:
 
-=========================
+================================================================================
 Errors and Error Handling
-=========================
+================================================================================
 
 Exceptions
-==========
-
-* throw exceptions, don't use status codes
-
-* use the pdal_error hiearchy (list)
+================================================================================
 
+PDAL typically throws a ``std::runtime_error`` for error conditions that is
+catchable as ``pdal::pdal_error``.
 
 PDAL Position on (Non)conformance
-==================================
+================================================================================
 
 PDAL proudly and unabashedly supports formal standards/specifications for
 file formats.  We recognize, however, that in some cases files will not
@@ -22,20 +20,20 @@ carelessness.
 
 When reading files that are not formatted correctly:
 
-* PDAL may try to compensate for the error.  This is typically done when as 
+* PDAL may try to compensate for the error.  This is typically done when as
   a practical matter the market needs support for well-known or pervasive,
   but nonetheless "broken", upstream implementations.
 
-* PDAL may explicitly reject such files.  This is typically done where we do 
-  not wish to continue to promote or support mistakes that should be fixed 
+* PDAL may explicitly reject such files.  This is typically done where we do
+  not wish to continue to promote or support mistakes that should be fixed
   upstream.
 
-PDAL will always write correctly formatted files.  In some cases, however,
+PDAL will strive to write correctly formatted files.  In some cases, however,
 PDAL may choose to offer as an option the ability to break the standard if,
 as a practical matter, doing so would significantly aid the market.  Such an
 option would never be the default behavior, however.
 
 For files that are conformant but which lie, such as the extents in the
-header being wrong, we will generally offer both the ability to propagate 
+header being wrong, we will generally offer both the ability to propagate
 the "wrong" information and the ability to helpfully correct it on the fly;
 the latter is generally our default position.
diff --git a/doc/development/goals.rst b/doc/development/goals.rst
index e89ef61..4718537 100644
--- a/doc/development/goals.rst
+++ b/doc/development/goals.rst
@@ -1,29 +1,32 @@
 .. _development_goals:
 
-=============
+================================================================================
 Project Goals
-=============
-
-1. PDAL is a library which provides APIs for reading, writing, and 
-   processing geospatial point cloud data of various formats.  Additionally, some 
-   command line tools are provided.  As GDAL is to 2D pixels, PDAL is to 
-   multidimensional points.
-    
-2. From a market perspective, PDAL is "version 2" of libLAS.  The actual 
+================================================================================
+
+1. PDAL is a library which provides APIs for reading, writing, and
+   processing geospatial point cloud data of various formats.  Additionally, some
+   command line tools are provided.  As `GDAL`_ is to 2D pixels, `OGR`_ is to
+   geospatial vector geometry, PDAL is to multidimensional points.
+
+2. From a market perspective, PDAL is "version 2" of libLAS.  The actual
    code base will be different, however, and the APIs will not be
    compatible.
 
-3. The PDAL implementation has high performance, yet the API remains 
-   flexible.  We recognize that these two goals will conflict at times and 
+3. The PDAL implementation has high performance, yet the API remains
+   flexible.  We recognize that these two goals will conflict at times and
    will weigh the tradeoffs pragmatically.
-  
-4. The architecture of a PDAL-based workflow will be a pipeline of 
+
+4. The architecture of a PDAL-based workflow will be a pipeline of
    connected stages, each stage being either a data source (such as a file
    reader), a filter (such as a point thinner), or data sink (such as a
    file writer).
 
-5. The PDAL library will be in C++, but will have SWIG bindings for languages
-   like Python and C#. PDAL will support multiple platforms, specifically
+5. The PDAL library will be written in C++. PDAL will support multiple platforms, specifically
    Windows, Linux, and Mac.
 
-6. PDAL is open source and is released under a BSD license.
+6. PDAL is open source and is released under a BSD license. See :ref:`license` for
+   more information.
+
+.. _`GDAL`: http://gdal.org
+.. _`OGR`: http://gdal.org/ogr/
diff --git a/doc/development/index.rst b/doc/development/index.rst
index 22575b8..456f1d6 100644
--- a/doc/development/index.rst
+++ b/doc/development/index.rst
@@ -1,7 +1,7 @@
 .. _development_index:
 
 ******************************************************************************
-Development 
+Development
 ******************************************************************************
 
 The design, architecture, and implementation of PDAL is captured in this
@@ -15,23 +15,26 @@ Editorial comments, and points yet to be resolved, are noted in the text
 The proper spelling of the project name is PDAL, in uppercase.  It is
 pronounced to rhyme with "GDAL".
 
-Contents:
+
+Build and Test Status
+------------------------------------------------------------------------------
+
+.. |travis|
+.. |appveyor|
+
+.. |travis| image:: https://travis-ci.org/PDAL/PDAL.png?branch=master
+   :target: https://travis-ci.org/PDAL/PDAL
+
+.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/github/pdal/pdal?branch=master&svg=true
+   :target: https://ci.appveyor.com/project/hobu/pdal
 
 .. toctree::
    :maxdepth: 2
-   
+
    conventions
    docs
    errorhandling
    goals
    testing
-   usecases
-  
- 
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
+
 
diff --git a/doc/development/testing.rst b/doc/development/testing.rst
index d614bab..d3cab6a 100644
--- a/doc/development/testing.rst
+++ b/doc/development/testing.rst
@@ -1,32 +1,37 @@
 .. _pdal_test:
 
-=======
+================================================================================
 Testing
-=======
+================================================================================
 
 
 Unit Tests
-==========
+================================================================================
 
 A unit test framework is provided, with the goal that all (nontrivial) classes
 will have unit tests.  At the very least, each new class should have a
 corresponding unit test file stubbed in, even if there aren't any tests yet.
 
-Our unit tests also include testing of each of the command line apps and
-(known) plugins.
+*   Our unit tests also include testing of the command line :ref:`apps` and
+    (known) :ref:`plugins <stage_index>`.
 
-We use the Google C++ Test Framework.
+*    We use the `Google C++ Test Framework`_, but a local copy of it is
+     embedded in the PDAL source tree, and you don't have to have it available
+     as a dependency.
 
-Unit tests for features that are configuration-dependent, e.g. laszip
-compression, should be put under the same ``#ifdef`` guards as the classes
-being tested.
+.. _`Google C++ Test Framework`: https://code.google.com/p/googletest/
 
-The Support class, in the ``./test/unit`` directory, provides some functions
-for comparing files, etc, that are useful in writing test cases.
+*    Unit tests for features that are configuration-dependent, e.g. laszip
+     compression, should be put under the same ``#ifdef`` guards as the classes
+     being tested.
 
-Unit tests should not be long-running. (As of this writing, a full test run
-executes 163 tests in under 10 seconds in Debug mode on mpg's little laptop.
-This is good.)
+*    The Support class, in the ``./test/unit`` directory, provides some functions
+     for comparing files, etc, that are useful in writing test cases.
+
+*    Unit tests should not be long-running.
+
+Running the Tests
+================================================================================
 
 To run all unit tests, issue the following command from your build directory::
 
@@ -37,116 +42,267 @@ To run all unit tests, issue the following command from your build directory::
 Depending on the which optional components you've chose to build, your output
 should resemble the following::
 
-  Test project /path/to/pdal/build
-        Start  1: pdal_base_test
-   1/10 Test  #1: pdal_base_test ...................   Passed    3.13 sec
-        Start  2: pdal_io_test
-   2/10 Test  #2: pdal_io_test .....................   Passed    1.19 sec
-        Start  3: pdal_filters_test
-   3/10 Test  #3: pdal_filters_test ................   Passed    6.27 sec
-        Start  4: pdal_plang_test
-   4/10 Test  #4: pdal_plang_test ..................   Passed    1.32 sec
-        Start  5: pc2pc_test
-   5/10 Test  #5: pc2pc_test .......................   Passed    5.62 sec
-        Start  6: xml_schema_test
-   6/10 Test  #6: xml_schema_test ..................   Passed    0.02 sec
-        Start  7: hexbintest
-   7/10 Test  #7: hexbintest .......................   Passed    1.15 sec
-        Start  8: icetest
-   8/10 Test  #8: icetest ..........................   Passed    1.12 sec
-        Start  9: nitftest
-   9/10 Test  #9: nitftest .........................   Passed    1.28 sec
-        Start 10: pcltest
-  10/10 Test #10: pcltest ..........................   Passed    1.47 sec
-
-  100% tests passed, 0 tests failed out of 10
-
-  Total Test time (real) =  22.61 sec
+    Test project /Users/hobu/dev/git/pdal
+          Start  1: pdal_bounds_test
+     1/61 Test  #1: pdal_bounds_test ...................   Passed    0.02 sec
+          Start  2: pdal_config_test
+     2/61 Test  #2: pdal_config_test ...................   Passed    0.02 sec
+          Start  3: pdal_file_utils_test
+     3/61 Test  #3: pdal_file_utils_test ...............   Passed    0.02 sec
+          Start  4: pdal_georeference_test
+     4/61 Test  #4: pdal_georeference_test .............   Passed    0.02 sec
+          Start  5: pdal_kdindex_test
+     5/61 Test  #5: pdal_kdindex_test ..................   Passed    0.03 sec
+          Start  6: pdal_log_test
+     6/61 Test  #6: pdal_log_test ......................   Passed    0.03 sec
+          Start  7: pdal_metadata_test
+     7/61 Test  #7: pdal_metadata_test .................   Passed    0.02 sec
+          Start  8: pdal_options_test
+     8/61 Test  #8: pdal_options_test ..................   Passed    0.02 sec
+          Start  9: pdal_pdalutils_test
+     9/61 Test  #9: pdal_pdalutils_test ................   Passed    0.02 sec
+          Start 10: pdal_pipeline_manager_test
+    10/61 Test #10: pdal_pipeline_manager_test .........   Passed    0.03 sec
+          Start 11: pdal_point_view_test
+    11/61 Test #11: pdal_point_view_test ...............   Passed    2.03 sec
+          Start 12: pdal_point_table_test
+    12/61 Test #12: pdal_point_table_test ..............   Passed    0.03 sec
+          Start 13: pdal_spatial_reference_test
+    13/61 Test #13: pdal_spatial_reference_test ........   Passed    0.07 sec
+          Start 14: pdal_support_test
+    14/61 Test #14: pdal_support_test ..................   Passed    0.02 sec
+          Start 15: pdal_user_callback_test
+    15/61 Test #15: pdal_user_callback_test ............   Passed    0.02 sec
+          Start 16: pdal_utils_test
+    16/61 Test #16: pdal_utils_test ....................   Passed    0.02 sec
+          Start 17: pdal_lazperf_test
+    17/61 Test #17: pdal_lazperf_test ..................   Passed    0.04 sec
+          Start 18: pdal_io_bpf_test
+    18/61 Test #18: pdal_io_bpf_test ...................   Passed    0.20 sec
+          Start 19: pdal_io_buffer_test
+    19/61 Test #19: pdal_io_buffer_test ................   Passed    0.02 sec
+          Start 20: pdal_io_faux_test
+    20/61 Test #20: pdal_io_faux_test ..................   Passed    0.04 sec
+          Start 21: pdal_io_ilvis2_test
+    21/61 Test #21: pdal_io_ilvis2_test ................   Passed    0.06 sec
+          Start 22: pdal_io_las_reader_test
+    22/61 Test #22: pdal_io_las_reader_test ............   Passed    0.49 sec
+          Start 23: pdal_io_las_writer_test
+    23/61 Test #23: pdal_io_las_writer_test ............   Passed    2.27 sec
+          Start 24: pdal_io_optech_test
+    24/61 Test #24: pdal_io_optech_test ................   Passed    0.03 sec
+          Start 25: pdal_io_ply_reader_test
+    25/61 Test #25: pdal_io_ply_reader_test ............   Passed    0.03 sec
+          Start 26: pdal_io_ply_writer_test
+    26/61 Test #26: pdal_io_ply_writer_test ............   Passed    0.02 sec
+          Start 27: pdal_io_qfit_test
+    27/61 Test #27: pdal_io_qfit_test ..................   Passed    0.03 sec
+          Start 28: pdal_io_sbet_reader_test
+    28/61 Test #28: pdal_io_sbet_reader_test ...........   Passed    0.04 sec
+          Start 29: pdal_io_sbet_writer_test
+    29/61 Test #29: pdal_io_sbet_writer_test ...........   Passed    0.03 sec
+          Start 30: pdal_io_terrasolid_test
+    30/61 Test #30: pdal_io_terrasolid_test ............   Passed    0.03 sec
+          Start 31: pdal_filters_chipper_test
+    31/61 Test #31: pdal_filters_chipper_test ..........   Passed    0.03 sec
+          Start 32: pdal_filters_colorization_test
+    32/61 Test #32: pdal_filters_colorization_test .....   Passed   11.40 sec
+          Start 33: pdal_filters_crop_test
+    33/61 Test #33: pdal_filters_crop_test .............   Passed    0.04 sec
+          Start 34: pdal_filters_decimation_test
+    34/61 Test #34: pdal_filters_decimation_test .......   Passed    0.02 sec
+          Start 35: pdal_filters_divider_test
+    35/61 Test #35: pdal_filters_divider_test ..........   Passed    0.03 sec
+          Start 36: pdal_filters_ferry_test
+    36/61 Test #36: pdal_filters_ferry_test ............   Passed    0.04 sec
+          Start 37: pdal_filters_merge_test
+    37/61 Test #37: pdal_filters_merge_test ............   Passed    0.03 sec
+          Start 38: pdal_filters_reprojection_test
+    38/61 Test #38: pdal_filters_reprojection_test .....   Passed    0.03 sec
+          Start 39: pdal_filters_range_test
+    39/61 Test #39: pdal_filters_range_test ............   Passed    0.05 sec
+          Start 40: pdal_filters_randomize_test
+    40/61 Test #40: pdal_filters_randomize_test ........   Passed    0.02 sec
+          Start 41: pdal_filters_sort_test
+    41/61 Test #41: pdal_filters_sort_test .............   Passed    0.39 sec
+          Start 42: pdal_filters_splitter_test
+    42/61 Test #42: pdal_filters_splitter_test .........   Passed    0.03 sec
+          Start 43: pdal_filters_stats_test
+    43/61 Test #43: pdal_filters_stats_test ............   Passed    0.03 sec
+          Start 44: pdal_filters_transformation_test
+    44/61 Test #44: pdal_filters_transformation_test ...   Passed    0.03 sec
+          Start 45: pdal_merge_test
+    45/61 Test #45: pdal_merge_test ....................   Passed    0.07 sec
+          Start 46: pc2pc_test
+    46/61 Test #46: pc2pc_test .........................   Passed    0.15 sec
+          Start 47: xml_schema_test
+    47/61 Test #47: xml_schema_test ....................   Passed    0.02 sec
+          Start 48: pdal_filters_attribute_test
+    48/61 Test #48: pdal_filters_attribute_test ........   Passed    0.09 sec
+          Start 49: pdal_plugins_cpd_kernel_test
+    49/61 Test #49: pdal_plugins_cpd_kernel_test .......***Exception: Other  0.08 sec
+          Start 50: hexbintest
+    50/61 Test #50: hexbintest .........................   Passed    0.03 sec
+          Start 51: icetest
+    51/61 Test #51: icetest ............................   Passed    0.04 sec
+          Start 52: mrsidtest
+    52/61 Test #52: mrsidtest ..........................   Passed    0.06 sec
+          Start 53: pdal_io_nitf_writer_test
+    53/61 Test #53: pdal_io_nitf_writer_test ...........   Passed    0.08 sec
+          Start 54: pdal_io_nitf_reader_test
+    54/61 Test #54: pdal_io_nitf_reader_test ...........   Passed    0.04 sec
+          Start 55: ocitest
+    55/61 Test #55: ocitest ............................***Failed    0.06 sec
+          Start 56: pcltest
+    56/61 Test #56: pcltest ............................   Passed    0.28 sec
+          Start 57: pgpointcloudtest
+    57/61 Test #57: pgpointcloudtest ...................   Passed    1.66 sec
+          Start 58: plangtest
+    58/61 Test #58: plangtest ..........................   Passed    0.14 sec
+          Start 59: python_predicate_test
+    59/61 Test #59: python_predicate_test ..............   Passed    0.16 sec
+          Start 60: python_programmable_test
+    60/61 Test #60: python_programmable_test ...........   Passed    0.15 sec
+          Start 61: sqlitetest
+    61/61 Test #61: sqlitetest .........................   Passed    0.55 sec
+
+    97% tests passed, 2 tests failed out of 61
+
+    Total Test time (real) =  21.57 sec
+
+    The following tests FAILED:
+         49 - pdal_plugins_cpd_kernel_test (OTHER_FAULT)
+         55 - ocitest (Failed)
 
 For a more verbose output, use the ``-V`` flag. Or, to run an individual test
 suite, use ``-R <suite name>``. For example::
 
-  $ ctest -V -R pdal_io_test
+  $ ctest -V -R pdal_io_bpf_test
 
 Should produce output similar to::
 
-  UpdateCTestConfiguration  from :/path/to/pdal/build/DartConfiguration.tcl
-  UpdateCTestConfiguration  from :/path/to/pdal/build/DartConfiguration.tcl
-  Test project /path/to/pdal/build
-  Constructing a list of tests
-  Done constructing a list of tests
-  Checking test dependency graph...
-  Checking test dependency graph end
-  test 2
-      Start 2: pdal_io_test
-
-  2: Test command: /path/to/pdal/build/bin/pdal_io_test
-  2: Test timeout computed to be: 9.99988e+06
-  2: Running main() from gtest_main.cc
-  2: [==========] Running 28 tests from 8 test cases.
-  2: [----------] Global test environment set-up.
-  2: [----------] 7 tests from BPFTest
-  2: [ RUN      ] BPFTest.test_point_major
-  2: [       OK ] BPFTest.test_point_major (8 ms)
-  2: [ RUN      ] BPFTest.test_dim_major
-  2: [       OK ] BPFTest.test_dim_major (2 ms)
-  2: [ RUN      ] BPFTest.test_byte_major
-  2: [       OK ] BPFTest.test_byte_major (3 ms)
-  2: [ RUN      ] BPFTest.test_point_major_zlib
-  2: [       OK ] BPFTest.test_point_major_zlib (4 ms)
-  2: [ RUN      ] BPFTest.test_dim_major_zlib
-  2: [       OK ] BPFTest.test_dim_major_zlib (3 ms)
-  2: [ RUN      ] BPFTest.test_byte_major_zlib
-  2: [       OK ] BPFTest.test_byte_major_zlib (4 ms)
-  2: [ RUN      ] BPFTest.inspect
-  2: [       OK ] BPFTest.inspect (0 ms)
-  2: [----------] 7 tests from BPFTest (24 ms total)
-  2:
-         ...
-  2:
-  2: [----------] Global test environment tear-down
-  2: [==========] 28 tests from 8 test cases ran. (1195 ms total)
-  2: [  PASSED  ] 28 tests.
-  1/1 Test #2: pdal_io_test .....................   Passed    1.24 sec
-
-  The following tests passed:
-          pdal_io_test
-
-  100% tests passed, 0 tests failed out of 1
-
-  Total Test time (real) =   1.24 sec
-
-Alternately, one can run individual unit tests directly::
+    UpdateCTestConfiguration  from :/Users/hobu/dev/git/pdal/DartConfiguration.tcl
+    UpdateCTestConfiguration  from :/Users/hobu/dev/git/pdal/DartConfiguration.tcl
+    Test project /Users/hobu/dev/git/pdal
+    Constructing a list of tests
+    Done constructing a list of tests
+    Checking test dependency graph...
+    Checking test dependency graph end
+    test 18
+        Start 18: pdal_io_bpf_test
+
+    18: Test command: /Users/hobu/dev/git/pdal/bin/pdal_io_bpf_test
+    18: Environment variables:
+    18:  PDAL_DRIVER_PATH=/Users/hobu/dev/git/pdal/lib
+    18: Test timeout computed to be: 9.99988e+06
+    18: [==========] Running 20 tests from 1 test case.
+    18: [----------] Global test environment set-up.
+    18: [----------] 20 tests from BPFTest
+    18: [ RUN      ] BPFTest.test_point_major
+    18: [       OK ] BPFTest.test_point_major (8 ms)
+    18: [ RUN      ] BPFTest.test_dim_major
+    18: [       OK ] BPFTest.test_dim_major (3 ms)
+    18: [ RUN      ] BPFTest.test_byte_major
+    18: [       OK ] BPFTest.test_byte_major (4 ms)
+    18: [ RUN      ] BPFTest.test_point_major_zlib
+    18: [       OK ] BPFTest.test_point_major_zlib (6 ms)
+    18: [ RUN      ] BPFTest.test_dim_major_zlib
+    18: [       OK ] BPFTest.test_dim_major_zlib (4 ms)
+    18: [ RUN      ] BPFTest.test_byte_major_zlib
+    18: [       OK ] BPFTest.test_byte_major_zlib (5 ms)
+    18: [ RUN      ] BPFTest.roundtrip_byte
+    18: [       OK ] BPFTest.roundtrip_byte (15 ms)
+    18: [ RUN      ] BPFTest.roundtrip_dimension
+    18: [       OK ] BPFTest.roundtrip_dimension (10 ms)
+    18: [ RUN      ] BPFTest.roundtrip_point
+    18: [       OK ] BPFTest.roundtrip_point (11 ms)
+    18: [ RUN      ] BPFTest.roundtrip_byte_compression
+    18: [       OK ] BPFTest.roundtrip_byte_compression (16 ms)
+    18: [ RUN      ] BPFTest.roundtrip_dimension_compression
+    18: [       OK ] BPFTest.roundtrip_dimension_compression (13 ms)
+    18: [ RUN      ] BPFTest.roundtrip_point_compression
+    18: [       OK ] BPFTest.roundtrip_point_compression (14 ms)
+    18: [ RUN      ] BPFTest.roundtrip_scaling
+    18: [       OK ] BPFTest.roundtrip_scaling (10 ms)
+    18: [ RUN      ] BPFTest.extra_bytes
+    18: [       OK ] BPFTest.extra_bytes (15 ms)
+    18: [ RUN      ] BPFTest.bundled
+    18: [       OK ] BPFTest.bundled (17 ms)
+    18: [ RUN      ] BPFTest.inspect
+    18: [       OK ] BPFTest.inspect (1 ms)
+    18: [ RUN      ] BPFTest.mueller
+    18: [       OK ] BPFTest.mueller (0 ms)
+    18: [ RUN      ] BPFTest.flex
+    18: [       OK ] BPFTest.flex (9 ms)
+    18: [ RUN      ] BPFTest.flex2
+    18: [       OK ] BPFTest.flex2 (7 ms)
+    18: [ RUN      ] BPFTest.outputdims
+    18: [       OK ] BPFTest.outputdims (14 ms)
+    18: [----------] 20 tests from BPFTest (182 ms total)
+    18:
+    18: [----------] Global test environment tear-down
+    18: [==========] 20 tests from 1 test case ran. (182 ms total)
+    18: [  PASSED  ] 20 tests.
+    1/1 Test #18: pdal_io_bpf_test .................   Passed    0.20 sec
+
+    The following tests passed:
+        pdal_io_bpf_test
+
+    100% tests passed, 0 tests failed out of 1
+
 
   $ bin/pdal_io_test
 
 Again, the output should resemble the following::
 
-  Running main() from gtest_main.cc
-  [==========] Running 28 tests from 8 test cases.
-  [----------] Global test environment set-up.
-  [----------] 7 tests from BPFTest
-  [ RUN      ] BPFTest.test_point_major
-  [       OK ] BPFTest.test_point_major (5 ms)
-  [ RUN      ] BPFTest.test_dim_major
-  [       OK ] BPFTest.test_dim_major (2 ms)
-  [ RUN      ] BPFTest.test_byte_major
-  [       OK ] BPFTest.test_byte_major (3 ms)
-  [ RUN      ] BPFTest.test_point_major_zlib
-  [       OK ] BPFTest.test_point_major_zlib (4 ms)
-  [ RUN      ] BPFTest.test_dim_major_zlib
-  [       OK ] BPFTest.test_dim_major_zlib (3 ms)
-  [ RUN      ] BPFTest.test_byte_major_zlib
-  [       OK ] BPFTest.test_byte_major_zlib (3 ms)
-  [ RUN      ] BPFTest.inspect
-  [       OK ] BPFTest.inspect (0 ms)
-  [----------] 7 tests from BPFTest (21 ms total)
-
-      ...
-
-  [----------] Global test environment tear-down
-  [==========] 28 tests from 8 test cases ran. (1180 ms total)
-  [  PASSED  ] 28 tests.
+    [==========] Running 20 tests from 1 test case.
+    [----------] Global test environment set-up.
+    [----------] 20 tests from BPFTest
+    [ RUN      ] BPFTest.test_point_major
+    [       OK ] BPFTest.test_point_major (7 ms)
+    [ RUN      ] BPFTest.test_dim_major
+    [       OK ] BPFTest.test_dim_major (3 ms)
+    [ RUN      ] BPFTest.test_byte_major
+    [       OK ] BPFTest.test_byte_major (4 ms)
+    [ RUN      ] BPFTest.test_point_major_zlib
+    [       OK ] BPFTest.test_point_major_zlib (5 ms)
+    [ RUN      ] BPFTest.test_dim_major_zlib
+    [       OK ] BPFTest.test_dim_major_zlib (5 ms)
+    [ RUN      ] BPFTest.test_byte_major_zlib
+    [       OK ] BPFTest.test_byte_major_zlib (6 ms)
+    [ RUN      ] BPFTest.roundtrip_byte
+    [       OK ] BPFTest.roundtrip_byte (17 ms)
+    [ RUN      ] BPFTest.roundtrip_dimension
+    [       OK ] BPFTest.roundtrip_dimension (10 ms)
+    [ RUN      ] BPFTest.roundtrip_point
+    [       OK ] BPFTest.roundtrip_point (11 ms)
+    [ RUN      ] BPFTest.roundtrip_byte_compression
+    [       OK ] BPFTest.roundtrip_byte_compression (15 ms)
+    [ RUN      ] BPFTest.roundtrip_dimension_compression
+    [       OK ] BPFTest.roundtrip_dimension_compression (14 ms)
+    [ RUN      ] BPFTest.roundtrip_point_compression
+    [       OK ] BPFTest.roundtrip_point_compression (14 ms)
+    [ RUN      ] BPFTest.roundtrip_scaling
+    [       OK ] BPFTest.roundtrip_scaling (11 ms)
+    [ RUN      ] BPFTest.extra_bytes
+    [       OK ] BPFTest.extra_bytes (16 ms)
+    [ RUN      ] BPFTest.bundled
+    [       OK ] BPFTest.bundled (17 ms)
+    [ RUN      ] BPFTest.inspect
+    [       OK ] BPFTest.inspect (1 ms)
+    [ RUN      ] BPFTest.mueller
+    [       OK ] BPFTest.mueller (0 ms)
+    [ RUN      ] BPFTest.flex
+    [       OK ] BPFTest.flex (8 ms)
+    [ RUN      ] BPFTest.flex2
+    [       OK ] BPFTest.flex2 (7 ms)
+    [ RUN      ] BPFTest.outputdims
+    [       OK ] BPFTest.outputdims (14 ms)
+    [----------] 20 tests from BPFTest (185 ms total)
+
+    [----------] Global test environment tear-down
+    [==========] 20 tests from 1 test case ran. (185 ms total)
+    [  PASSED  ] 20 tests.
 
 This invocation allows us to alter Google Test's default behavior. For more on
 the available flags type::
diff --git a/doc/development/usecases.rst b/doc/development/usecases.rst
deleted file mode 100644
index bad513d..0000000
--- a/doc/development/usecases.rst
+++ /dev/null
@@ -1,99 +0,0 @@
-.. _development_usecases:
-
-================================
-Use Cases
-================================
-
-This document lists some use cases that we would like PDAL to be able to
-satisfy.  We are speaking here about PDAL at the API level, and not the 
-command line apps that come with it (although in many cases the apps will
-directly address these use cases).
-
-Note we have the cases explicitly numbered, so we can refer back to them 
-from elsewhere.
-
-Many of these cases these use cases are composable (such as 1a and 3a).
-
-This list is intended to be representative of workflows we want to target, 
-but is by no means intended to be an exhaustive list.
-
-
-The Use Cases
-=============
-
-1. straight format conversion
-
-   a. convert an ASCII file to LAS
-
-   b. compress LAS to lossless LAZ
-   
-2. mosaicking and demosaicking
-
-   a. user has a set of N tiles and wants to merge them into 1 file
-
-   b. user has 1 large file and wants to chop up into N files, based on
-      a given bbox size or a given target file size (or point count)
-   
-3. basic filtering/processing operations
-
-   a. crop a file to a given spatial extent
-
-   b. remove points with a given classification
-
-   c. decimate the file (discard 9 of every 10 points)
-
-   d. ...
-   
-4. info and metadata
-
-   a. display (or dump to XML) the properties of the point cloud (extents,
-      number of points, etc)
-
-   b. display/dump the spatial reference system of the file
-
-   c. display/dump any metadata in the file, such as creation date, weather
-      conditions, etc
-
-   d. collect and display statistics about the file, such as the elevation
-      distribution, point density, etc
-
-5. projection
-
-   a. assign an SRS to a file that does not have one (or overwrite the
-      existing one)
-
-   b. reproject the points in a file to a new SRS
-
-6. indexing and caching
-
-   a. construct a spatial index for a point cloud, such that points within a
-      relatively small given region can quickly be accessed
-
-   b. merge (mosaic) two files that are both indexed
-
-   c. given a file, allow for repeated access to a point during a single run
-      without additional I/O
-
-7. DEM construction, rasterization, colorization
-
-   a. given an XYZ point cloud, produce a regular XY grid of the Z elevation
-      points
-
-   b. similar to 7a, but colorize each point based on a given color ramp and
-      the elevation height Z
-
-8. 3D visualization
-
-   a. basic, static display of a point cloud
-
-   b. same as (a), but with colorization of Z, simple filtering, etc
-
-   c. use indexing and caching (6a and 6c) to provide useful interactive 
-      behaviour
-
-   d. given a DEM and a raster, display the raster draped over the surface
-
-9. Fixup, Cleanup
-
-   a. given a file with an incorrect header (such as incorrect extents),
-      create a file with the header corrected by otherwise identical
diff --git a/doc/docbuild/Dockerfile b/doc/docbuild/Dockerfile
new file mode 100644
index 0000000..475441d
--- /dev/null
+++ b/doc/docbuild/Dockerfile
@@ -0,0 +1,28 @@
+FROM ubuntu:15.10
+
+RUN apt-get -y update && apt-get install -y python-dev python-pip
+RUN apt-get install -y g++
+RUN apt-get install -y doxygen dvipng
+RUN apt-get install -y cmake libjpeg8-dev zlib1g-dev texlive-latex-base texlive-latex-extra
+RUN apt-get install -y git
+RUN apt-get install -y graphviz
+
+RUN pip install Sphinx rst2pdf breathe sphinx_bootstrap_theme awscli
+
+RUN useradd pdal
+RUN mkdir /home/pdal&& chown -R pdal: /home/pdal
+
+RUN mkdir /root/.ssh
+RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
+WORKDIR /home/pdal
+RUN git clone https://github.com/PDAL/PDAL.git pdal
+RUN git config --global push.default matching
+RUN git config --global user.email "pdal at hobu.net"
+RUN git config --global user.name "PDAL Automated Dockerfile"
+
+VOLUME /data
+
+ADD run.sh /home/pdal/run.sh
+
+# docker run --rm --volumes-from docbuild pdal-doc-build ls -al /data
+# docker create -v $(pwd)/output:/data --name docbuild pdal-doc-build
diff --git a/doc/docbuild/run.sh b/doc/docbuild/run.sh
new file mode 100755
index 0000000..ef51575
--- /dev/null
+++ b/doc/docbuild/run.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+BUILDDIR=/data
+cd /home/pdal/pdal
+git pull
+cd doc
+make doxygen BUILDDIR=$BUILDDIR
+make html BUILDDIR=$BUILDDIR
diff --git a/doc/docs.rst b/doc/docs.rst
deleted file mode 100644
index 7dd4e25..0000000
--- a/doc/docs.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-.. _docs:
-
-******************************************************************************
-PDAL Documentation
-******************************************************************************
-
-
-Contents:
-
-.. toctree::
-   :maxdepth: 2
-
-   download
-   compilation/index
-   commandline/index
-   apps
-   stages/index
-   pipeline
-   vagranttutorial
-   community
-   faq
-   development/index
-   tutorial/index
-   api/index
-   metadata
-   copyright
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
diff --git a/doc/download.rst b/doc/download.rst
index ee3f43f..a79978e 100644
--- a/doc/download.rst
+++ b/doc/download.rst
@@ -8,16 +8,20 @@ Download
 Current Release(s)
 ------------------------------------------------------------------------------
 
-* **2015-09-10** `PDAL-1.0.0-src.tar.gz`_ (`md5`_)
+* **2015-09-11** `PDAL-1.0.1-src.tar.gz`_ (`md5`_)
 
-.. _`PDAL-1.0.0-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz
-.. _`md5`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz.md5
+.. _`PDAL-1.0.1-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.1-src.tar.gz
+.. _`md5`: http://download.osgeo.org/pdal/PDAL-1.0.1-src.tar.gz.md5
 .. _`DebianGIS`: http://wiki.debian.org/DebianGis
 
 
 Past Releases
 ------------------------------------------------------------------------------
 
+* **2015-09-10** `PDAL-1.0.0-src.tar.gz`_
+
+.. _`PDAL-1.0.0-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz
+
 
 .. _source:
 
@@ -35,8 +39,11 @@ You can obtain a copy of the active source code by issuing the following command
 Binaries
 ------------------------------------------------------------------------------
 
-A 1.0.0 release of PDAL is available via `OSGeo4W`_, however it is only
-64-bit at this time.
+Windows
+................................................................................
+
+A 1.0.1 release of PDAL is available via `OSGeo4W`_. It is only 64-bit at this
+time.
 
 RPMs
 ................................................................................
diff --git a/doc/faq.rst b/doc/faq.rst
index f4a660c..bfe1969 100644
--- a/doc/faq.rst
+++ b/doc/faq.rst
@@ -4,6 +4,8 @@
 FAQ
 ******************************************************************************
 
+.. index:: pronounce
+
 * How do you pronounce PDAL?
 
   The proper spelling of the project name is PDAL, in uppercase. It is
@@ -30,6 +32,11 @@ FAQ
   under an open source license (this applies to the whole library and
   all command line tools).
 
+  .. seealso::
+
+        :ref:`apps` describes application operations you can
+        achieve with PDAL.
+
 * Is there any compatibility with libLAS's LAS Utility Applications or LAStools?
 
   No. The the command line interface was developed from scratch with
diff --git a/doc/index.rst b/doc/index.rst
index c8c5e4d..8f3167f 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -4,42 +4,80 @@
 PDAL - Point Data Abstraction Library
 ******************************************************************************
 
-PDAL is a `BSD licensed`_ library for translating and manipulating `point cloud
-data`_ of various formats.  PDAL can be used to read, write and translate
-point cloud data in many formats.  Support is included for input files of
-LAS, LAZ, SBET, BPF, QFIT and others.  PDAL can also read from and write to
-databases that support point cloud storage, including Oracle, Postgres
-and SQLite.
+.. image:: ./_static/pdal_logo.png
+   :alt: PDAL logo
+   :align: right
 
-PDAL should not be confused with `PCL`_ (Point Cloud Library).  PCL is a
-library specifically designed
-to provide algorithmic analysis and modification of point clouds.  PDAL
-provides a limited interface to the facilities of PCL, but does not in
-general attempt to duplicate its capabilites.  See :ref:`filters.pclblock`
-for more background
+PDAL is a C++ `BSD`_ library for translating and manipulating `point cloud data`_.
+It is very much like the `GDAL`_ library which handles raster and vector data.
+See :ref:`readers` and :ref:`writers` for data formats PDAL supports, and see
+:ref:`filters` for filtering operations that you can apply with PDAL.
+
+In addition to the library code, PDAL provides a suite of command-line
+applications that users can conveniently use to process, filter, translate, and
+query point cloud data.  See :ref:`apps` for more information.
+
+
+Documentation
+=================
+
+.. toctree::
+   :maxdepth: 2
+
+   download
+   compilation/index
+   apps
+   community
+   stages/index
+   tutorial/index
+   vagrant
+   pipeline
+   faq
+   development/index
+   api/index
+   metadata
+   copyright
 
 
 Developers and Sponsorship
 ------------------------------------------------------------------------------
 
 PDAL is developed by `Howard Butler`_, `Michael Gerlek`_, `Andrew Bell`_,
-`Brad Chambers`_ and others.
+`Brad Chambers`_ and `others`_.
+
+PDAL's development is supported in coordination with efforts by the `U.S. Army
+Cold Regions Research and Engineering Laboratory`_.
+
+
+.. note::
+
+    PDAL should not be confused with `PCL`_ (Point Cloud Library).  PCL is a
+    library specifically designed to provide algorithmic analysis and
+    modification of point clouds.  PDAL provides a limited interface to the
+    facilities of PCL, but does not in general attempt to duplicate its
+    capabilites.  PDAL is focused more on data access and translation than
+    PCL. See :ref:`filters.pclblock` for more background.
+
+
+
+
+Indices and tables
+==================
 
-PDAL's development is in coordination with efforts by the
-`U.S. Army Cold Regions Research and Engineering Laboratory`_.
+* :ref:`genindex`
+* :ref:`search`
 
-.. _`Aerial Services, Inc`: http://www.asi-gis.com/
-.. _`Point Cloud Library (PCL)`: http://pointclouds.org
+.. _`PCL`: http://pointclouds.org
 .. _`GDAL`: http://www.gdal.org
-.. _`BSD licensed`: http://www.opensource.org/licenses/bsd-license.php
+.. _`BSD`: http://www.opensource.org/licenses/bsd-license.php
 .. _`point cloud data`: http://en.wikipedia.org/wiki/Point_cloud
 .. _`LIDAR`: http://en.wikipedia.org/wiki/LIDAR
 .. _`U.S. Army Cold Regions Research and Engineering Laboratory` : http://www.crrel.usace.army.mil/
-.. _`PDL`: http://pointclouds.org
-.. _`Howard Butler`: http://hobu.co
-.. _`Andrew Bell`: http://hobu.co
-.. _`Michael Gerlek`: http://www.radiantblue.com
-.. _`Brad Chambers`: http://www.radiantblue.com
+.. _`Howard Butler`: http://github.com/hobu
+.. _`Andrew Bell`: http://github.com/abellgithub
+.. _`Michael Gerlek`: http://github.com/mpgerlek
+.. _`Brad Chambers`: http://github.com/chambbj
+.. _`others`: http://github.com/PDAL/PDAL/graphs/contributors
 
 
 
diff --git a/doc/metadata.rst b/doc/metadata.rst
index e362ff5..7882f5c 100644
--- a/doc/metadata.rst
+++ b/doc/metadata.rst
@@ -152,7 +152,7 @@ A more interesting metadata tree might come from the
         }
     }
 
-.. _metadataxml:
+.. _metadatajson:
 
 :ref:`Pipeline` XML representation
 ------------------------------------------------------------------------------
diff --git a/doc/stages/filters.attribute.rst b/doc/stages/filters.attribute.rst
index b60c9cf..0e468be 100644
--- a/doc/stages/filters.attribute.rst
+++ b/doc/stages/filters.attribute.rst
@@ -4,12 +4,13 @@ filters.attribute
 ===================
 
 The attribute filter allows you to set the values of a
-selected dimension. There are three possible scenarios that
-are currently supported:
+selected dimension. Two scenarios are supported:
 
-* Set all points in a dimension to single value
+* Set the value of a dimension of all points to single value
+  (use option 'value')
 
 * Set points inside an OGR-readable Polygon or MultiPolygon
+  (use option 'datasource')
 
 OGR SQL support
 ----------------
@@ -28,21 +29,52 @@ but that may be added in the future.
 
 .. _`ExecuteSQL`: http://www.gdal.org/ogr__api_8h.html#a9892ecb0bf61add295bd9decdb13797a
 
+Example 1
+---------
 
-.. warning::
+In this scenario, we are altering the attributes of the dimension
+'Classification'.  Points from autzen-dd.las that lie within a feature will
+have their classification to match the 'CLS' field associated with that
+feature.
 
-    If no `datasource` is given, it is assumed that the query
-    is setting all of the values for the given dimension to the
-    `value` option.
+.. code-block:: xml
 
-Example
--------
+    <?xml version="2.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                attributed.las
+            </Option>
+            <Option name="forward">
+                all
+            </Option>
+            <Filter type="filters.attribute">
+                <Option name="dimension">
+                    Classification
+                </Option>
+                <Option name="datasource">
+                    ./test/data/autzen/attributes.shp
+                </Option>
+                <Option name="layer">
+                    attributes
+                </Option>
+                <Option name="column">
+                    CLS
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        ../autzen/autzen-dd.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
 
-In this scenario, we are altering the attributes of three
-dimensions -- `Classification`, `PointSourceId`, and `Intensity`. The
-`PointSourceId` will simply be set to the single value `26`, while
-`Classification` and `Intensity` will have their values set when the
-candidate point is inside a polygon with that polygon's attribute.
+Example 2
+---------
+
+This pipeline sets the PointSourceId of all points from 'autzen-dd.las'
+to the value '26'.
 
 .. code-block:: xml
 
@@ -52,48 +84,59 @@ candidate point is inside a polygon with that polygon's attribute.
             <Option name="filename">
                 attributed.las
             </Option>
-            <Option name="scale_x">
-                0.0000001
-            </Option>
-            <Option name="scale_y">
-                0.0000001
+            <Option name="forward">
+                all
             </Option>
             <Filter type="filters.attribute">
                 <Option name="dimension">
-                    Classification
-                    <Options>
-                        <Option name="datasource">
-                            ./test/data/autzen/attributes.shp
-                        </Option>
-                        <Option name="layer">
-                            attributes
-                        </Option>
-                        <Option name="column">
-                            CLS
-                        </Option>
-                    </Options>
+                    PointSourceId
+                </Option>
+                <Option name="value">
+                    26
                 </Option>
+                <Option name="datasource">
+                    ./test/data/autzen/attributes.shp
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        ../autzen/autzen-dd.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+Example 3
+--------------------------------------------------------------------------------
+
+This example sets the Intensity attribute to ``CLS`` values read from the
+`OGR SQL`_ query.
+
+.. _`OGR SQL`: http://www.gdal.org/ogr_sql_sqlite.html
+
+.. code-block:: xml
+
+    <?xml version="2.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                attributed.las
+            </Option>
+            <Option name="forward">
+                all
+            </Option>
+            <Filter type="filters.attribute">
                 <Option name="dimension">
                     Intensity
-                    <Options>
-                        <Option name="datasource">
-                            ./test/data/autzen/attributes.shp
-                        </Option>
-                        <Option name="query">
-                            SELECT CLS FROM attributes where cls!=6
-                        </Option>
-                        <Option name="column">
-                            CLS
-                        </Option>
-                    </Options>
                 </Option>
-                <Option name="dimension">
-                    PointSourceId
-                    <Options>
-                        <Option name="value">
-                            26
-                        </Option>
-                    </Options>
+                <Option name="datasource">
+                    ./test/data/autzen/attributes.shp
+                </Option>
+                <Option name="query">
+                    SELECT CLS FROM attributes where cls != 6
+                </Option>
+                <Option name="column">
+                    CLS
                 </Option>
                 <Reader type="readers.las">
                     <Option name="filename">
@@ -104,24 +147,26 @@ candidate point is inside a polygon with that polygon's attribute.
         </Writer>
     </Pipeline>
 
-
 Options
 -------
 
 dimension
-  A dimension Option with an Options block containing at least a "value"
-  Option to set all points.
+  Name of the dimension whose value should be altered.  [Default: none]
 
-  * value: The value to set all points to for the given dimension
+value
+  Value to apply to the dimension.  [Default: none]
 
-  * datasource: OGR-readable datasource for Polygon or MultiPolygon data
+datasource
+  OGR-readable datasource for Polygon or MultiPolygon data.  [Default: none]
 
-  * column: The column from which to read the attribute. If none is
-    specified, the first column is used.
+column
+  The OGR datasource column from which to read the attribute.
+  [Default: first column]
 
-  * query: The OGR SQL query to execute on the datasource to fetch
-    geometry and attributes.
+query
+  OGR SQL query to execute on the datasource to fetch geometry and attributes.
+  [Default: none]
 
-  * layer: The data source's layer to use. If none is specified, the
-    first one is used.
+layer
+  The data source's layer to use. [Defalt: first layer]
 
diff --git a/doc/stages/filters.chipper.rst b/doc/stages/filters.chipper.rst
index 77803a9..0fb44b8 100644
--- a/doc/stages/filters.chipper.rst
+++ b/doc/stages/filters.chipper.rst
@@ -7,6 +7,11 @@ The chipper filter takes a single large point cloud and converts it into a set
 of smaller clouds, or chips. The chips are all spatially contiguous and
 non-overlapping, so the result is a an irregular tiling of the input data.
 
+.. seealso::
+
+    :ref:`split_command` utilizes the :ref:`filters.chipper` to split
+    data by capacity.
+
 .. figure:: filters.chipper.img1.png
     :scale: 100 %
     :alt: Points before chipping
@@ -19,10 +24,10 @@ non-overlapping, so the result is a an irregular tiling of the input data.
     :alt: Points after chipping
 
     After chipping, the points are tiled into smaller contiguous chips.
-   
+
 Chipping is usually applied to data read from files (which produce one large
 stream of points) before the points are written to a database (which prefer
-data segmented into smaller blocks). 
+data segmented into smaller blocks).
 
 Example
 -------
@@ -49,4 +54,4 @@ capacity
   How many points to fit into each chip. The number of points in each chip will
   not exceed this value, and will sometimes be less than it. [Default:
   **5000**]
-  
+
diff --git a/doc/stages/filters.colorization.rst b/doc/stages/filters.colorization.rst
index 64bc0be..cffcd69 100644
--- a/doc/stages/filters.colorization.rst
+++ b/doc/stages/filters.colorization.rst
@@ -20,26 +20,8 @@ The bands of the raster to apply to each are selected using the "band" option, a
     <Writer type="writers.las">
       <Option name="filename">colorized.las</Option>
       <Filter type="filters.colorization">
-        <Option name="dimension">
-          Red
-          <Options>
-            <Option name="band">1</Option>
-            <Option name="scale">1.0</Option>
-          </Options>
-        </Option>
-        <Option name="dimension">
-          Green
-          <Options>
-              <Option name="band">2</Option>
-              <Option name="scale">1.0</Option>
-          </Options>
-        </Option>
-        <Option name="dimension">
-          Blue
-          <Options>
-            <Option name="band">3</Option>
-            <Option name="scale">256</Option>
-          </Options>
+        <Option name="dimensions">
+          Red:1:1.0, Blue, Green::256.0
         </Option>
         <Option name="raster">aerial.tif</Option>
         <Reader type="readers.las">
@@ -50,6 +32,61 @@ The bands of the raster to apply to each are selected using the "band" option, a
   </Pipeline>
 
 
+Considerations
+--------------------------------------------------------------------------------
+
+Certain data configurations can cause degenerate filter behavior. One significant
+knob to adjust is the ``GDAL_CACHEMAX`` environment variable. One driver which
+can have issues is when a `TIFF`_ file is striped vs. tiled. GDAL's data access
+in that situation is likely to cause lots of re-reading if the cache isn't large
+enough.
+
+Consider a striped TIFF file of 286mb:
+
+::
+
+    -rw-r-----@  1 hobu  staff   286M Oct 29 16:58 orth-striped.tif
+
+::
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">coloured-striped.las</Option>
+      <Filter type="filters.colorization">
+        <Option name="raster">orth-striped.tif</Option>
+        <Reader type="readers.las">
+          <Option name="filename">colourless.laz</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+    </Pipeline>
+
+Simple application of the :ref:`filters.colorization` using the striped `TIFF`_
+with a 268mb :ref:`readers.las` file will take nearly 1:54.
+
+.. _`TIFF`: http://www.gdal.org/frmt_gtiff.html
+
+::
+
+    [hobu at pyro knudsen (master)]$ time ~/dev/git/pdal/bin/pdal pipeline -i striped.xml
+
+    real	1m53.477s
+    user	1m20.018s
+    sys	0m33.397s
+
+
+Setting the ``GDAL_CACHEMAX`` variable to a size larger than the TIFF file
+dramatically speeds up the color fetching:
+
+::
+
+    [hobu at pyro knudsen (master)]$ export GDAL_CACHEMAX=500
+    [hobu at pyro knudsen (master)]$ time ~/dev/git/pdal/bin/pdal pipeline striped.xml
+
+    real	0m19.034s
+    user	0m15.557s
+    sys	0m1.102s
 
 Options
 -------
@@ -57,20 +94,13 @@ Options
 raster
   The raster file to read the band from. Any format supported by `GDAL`_ may be read.
 
-dimension
-  A dimension to populate with values from the raster file. There may be multiple dimension options declared. The dimension name should be supplied, and an options list indicating the raster band to read from and the scaling to apply.
-  
-  band
-    The raster band from which to read values for this dimension.
-  
-  scale
-    The scaling factor to apply to the value read from the raster. [Default: **1.0**]
-
-x_dim
-  The point dimension to use for the x dimension [Default: **X**]
-  
-y_dim
-  The point dimension to use for the y dimension [Default: **Y**]
-
+dimensions
+  A comma separated list of dimensions to populate with values from the raster
+  file. The format of each dimension is <name>:<band_number>:<scale_factor>.
+  Either or both of band number and scale factor may be omitted as may ':'
+  separators if the data is not ambiguous.  If not supplied, band numbers
+  begin at 1 and increment from the band number of the previous dimension.
+  If not supplied, the scaling factor is 1.0.
+  [Default: "Red:1:1.0, Green:2:1.0, Blue:3:1.0"]
 
 .. _GDAL: http://gdal.org
diff --git a/doc/stages/filters.dartsample.rst b/doc/stages/filters.dartsample.rst
new file mode 100644
index 0000000..ddff730
--- /dev/null
+++ b/doc/stages/filters.dartsample.rst
@@ -0,0 +1,24 @@
+.. _filters.dartthrowing:
+
+===============================================================================
+filters.dartthrowing
+===============================================================================
+
+The practice of performing Poisson sampling via "Dart Throwing" was introduced in the mid-1980's by [Cook1986]_ and [Dippe1985]_, and has been applied to point clouds in other software [Mesh2009]_. Our implementation is a brute force approach that randomly selects points from the input ``PointView``, adding them to the output ``PointView`` subject to the minimum distance constraint (the ``radius``). The full layout (i.e., the dimensions) of the input ``PointView`` is kept in tact (the sa [...]
+
+.. seealso::
+
+    :ref:`filters.decimation` and :ref:`filters.voxelgrid` also perform
+    decimation.
+
+.. [Cook1986] Cook, Robert L. "Stochastic sampling in computer graphics." *ACM Transactions on Graphics (TOG)* 5.1 (1986): 51-72.
+
+.. [Dippe1985] Dippé, Mark AZ, and Erling Henry Wold. "Antialiasing through stochastic sampling." *ACM Siggraph Computer Graphics* 19.3 (1985): 69-78.
+
+.. [Mesh2009] ALoopingIcon. "Meshing Point Clouds." *MESHLAB STUFF*. n.p., 7 Sept. 2009. Web. 13 Nov. 2015.
+
+Options
+-------------------------------------------------------------------------------
+
+radius
+  Minimum distance between samples. [Default: **1.0**]
diff --git a/doc/stages/filters.decimation.rst b/doc/stages/filters.decimation.rst
index 49efc22..c6c8f77 100644
--- a/doc/stages/filters.decimation.rst
+++ b/doc/stages/filters.decimation.rst
@@ -1,9 +1,12 @@
-.. _filters_decimation:
+.. _filters.decimation:
 
 filters.decimation
 ==================
 
-The decimation filter takes a stream of points and steps through it, taking only every Nth point. With a step of 2, the filter takes every second point, for a reduction of 50%. With a step of 10, the filter takes every tenth point, for a reduction of 90%.
+The decimation filter takes a stream of points and steps through it, taking
+only every Nth point. With a step of 2, the filter takes every second point,
+for a reduction of 50%. With a step of 10, the filter takes every tenth point,
+for a reduction of 90%.
 
 Example
 -------
@@ -23,11 +26,15 @@ Example
     </Writer>
   </Pipeline>
 
+.. seealso::
+
+    :ref:`filters.voxelgrid` provides grid-style point decimation.
+
 Options
 -------
 
 step
   How many points to skip between each sample point? A step of 1 will skip no point, and leave the stream unchanged. A step of 100 will reduce the stream by 99%. [Default: **1**]
-  
+
 offset
   Start sampling with what point? [Default: **0**]
diff --git a/doc/stages/filters.divider.rst b/doc/stages/filters.divider.rst
new file mode 100644
index 0000000..636f04e
--- /dev/null
+++ b/doc/stages/filters.divider.rst
@@ -0,0 +1,55 @@
+.. _filters.divider:
+
+filters.divider
+===============================================================================
+
+The divider filter breaks a point view into a set of smaller point views
+based on simple criteria.  The number of subsets can be specified explicitly,
+or one can specify a maximum point count for each subset.  Additionally,
+points can be placed into each subset sequentially (as they appear in the
+input) or in round-robin fashion.
+
+Normally points are divided into subsets to facilitate output by writers
+that support creating multiple output files with a template (LAS and BPF
+are notable examples).
+
+Example
+-------
+
+This pipeline will create 10 output files from the input file readers.las.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">out_#.las</Option>
+      <Filter type="filters.divider">
+        <Option name="count">10</Option>
+        <Reader type="readers.las">
+            <Option name="filename">example.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+mode
+  A mode of 'partition' will write sequential points to an output view until
+  the view meets its predetermined size. 'round_robin' mode will iterate
+  through the output views as it writes sequential points.
+  [Default: 'partition']
+
+count
+  Number of output views.  [Default: none]
+
+capacity
+  Maximum number of points in each output view.  Views will contain
+  approximately equal numbers of points.  [Default: none]
+
+.. warning::
+
+    You must specify exactly one of either 'count' or 'capacity'.
+
diff --git a/doc/stages/filters.ferry.rst b/doc/stages/filters.ferry.rst
index 3a9c5af..b9acfb5 100644
--- a/doc/stages/filters.ferry.rst
+++ b/doc/stages/filters.ferry.rst
@@ -1,7 +1,7 @@
 .. _filters.ferry:
 
 filters.ferry
-============
+================================================================================
 
 The ferry filter is used to stash intermediate variables as part of
 processing data. For example, a common scenario is to keep both the
@@ -39,21 +39,8 @@ processing, can then operate on these data.
                     0.0000001
                 </Option>
                 <Filter type="filters.ferry">
-                    <Option name="dimension">
-                        X
-                        <Options>
-                            <Option name="to">
-                                StatePlaneX
-                            </Option>
-                        </Options>
-                    </Option>
-                    <Option name="dimension">
-                        Y
-                        <Options>
-                            <Option name="to">
-                                StatePlaneY
-                            </Option>
-                        </Options>
+                    <Option name="dimensions">
+                        X = StatePlaneX, Y=StatePlaneY
                     </Option>
                     <Reader type="readers.las">
                         <Option name="filename">
@@ -71,10 +58,9 @@ processing, can then operate on these data.
 Options
 -------
 
-dimension
-  A dimension Option with an Options block containing at least a "to" dimension
-  name.  If the "to" dimension already exists, it will be used. If it does not,
-  it will be created as a dimension of type `double`.
-
-  * to: The dimension to copy the data to. The data are currently read as
-    doubles and put into the output dimension as double.
+dimensions
+  A list of dimensions whose values should be copied to the specified
+  dimensions.
+  The format of the option is <from>=<to>, <from>=<to>,... Spaces are ignored.
+  'from' dimensions must exist and have been created by a reader or filter.
+  'to' dimensions will be created if necessary.
diff --git a/doc/stages/filters.greedyprojection.rst b/doc/stages/filters.greedyprojection.rst
new file mode 100644
index 0000000..7482a99
--- /dev/null
+++ b/doc/stages/filters.greedyprojection.rst
@@ -0,0 +1,20 @@
+.. _filters.greedyprojection:
+
+===============================================================================
+filters.greedyprojection
+===============================================================================
+
+The Greedy Projection filter passes data through the Point Cloud Library
+(`PCL`_) GreedyProjectionTriangulation algorithm.
+
+GreedyProjectionTriangulation is an implementation of a greedy triangulation
+algorithm for 3D points based on local 2D projections. It assumes locally smooth
+surfaces and relatively smooth transitions between areas with different point
+densities.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.gridprojection.rst b/doc/stages/filters.gridprojection.rst
new file mode 100644
index 0000000..783c0b7
--- /dev/null
+++ b/doc/stages/filters.gridprojection.rst
@@ -0,0 +1,20 @@
+.. _filters.gridprojection:
+
+===============================================================================
+filters.gridprojection
+===============================================================================
+
+The Grid Projection filter passes data through the Point Cloud Library (`PCL`_)
+GridProjection algorithm.
+
+GridProjection is an implementation of the surface reconstruction method
+described in [Li2010]_.
+
+.. [Li2010] Li, Ruosi, et al. "Polygonizing extremal surfaces with manifold guarantees." Proceedings of the 14th ACM Symposium on Solid and Physical Modeling. ACM, 2010.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.ground.rst b/doc/stages/filters.ground.rst
new file mode 100644
index 0000000..25ff08f
--- /dev/null
+++ b/doc/stages/filters.ground.rst
@@ -0,0 +1,42 @@
+.. _filters.ground:
+
+===============================================================================
+filters.ground
+===============================================================================
+
+The Ground filter passes data through the Point Cloud Library (`PCL`_)
+ProgressiveMorphologicalFilter algorithm.
+
+ProgressiveMorphologicalFilter is an implementation of the method described in
+[Zhang2003]_.
+
+.. [Zhang2003] Zhang, Keqi, et al. "A progressive morphological filter for removing nonground measurements from airborne LIDAR data." Geoscience and Remote Sensing, IEEE Transactions on 41.4 (2003): 872-882.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+maxWindowSize
+  Maximum window size. [Default: **33**]
+
+slope
+  Slope. [Default: **1.0**]
+
+max_distance
+  Maximum distance. [Default: **2.5**]
+
+initial_distance
+  Initial distance. [Default: **0.15**]
+
+cell_size
+  Cell Size. [Default: **1**]
+
+classify
+  Apply classification labels? [Default: **true**]
+
+extract
+  Extract ground returns? [Default: **false**]
+
+approximate
+  Use approximate algorithm? [Default:: **false**]
diff --git a/doc/stages/filters.height.rst b/doc/stages/filters.height.rst
new file mode 100644
index 0000000..19136cd
--- /dev/null
+++ b/doc/stages/filters.height.rst
@@ -0,0 +1,12 @@
+.. _filters.height:
+
+===============================================================================
+filters.height
+===============================================================================
+
+The Height filter takes as input a point cloud with a Classification dimension, with ground points assigned the classification label of 2 (per LAS specification). It returns a point cloud with a new dimension ``Height`` that contains the normalized height value.
+
+Options
+-------------------------------------------------------------------------------
+
+None
diff --git a/doc/stages/filters.hexbin.rst b/doc/stages/filters.hexbin.rst
index 86547aa..7f420fd 100644
--- a/doc/stages/filters.hexbin.rst
+++ b/doc/stages/filters.hexbin.rst
@@ -61,8 +61,6 @@ Example
         file-output.las
       </Option>
       <Filter type="filters.hexbin">
-        <Option name="x_dim">readers.las.X</Option>
-        <Option name="y_dim">readers.las.Y</Option>
         <Option name="threshold">10</Option>
         <Reader type="readers.las">
           <Option name="filename">
@@ -77,14 +75,10 @@ Example
 Options
 -------
 
-x_dim
-  The name of the dimension to use as the X coordinate in the cropping process. [Default: **X**]
-
-y_dim
-  The name of the dimension to use as the Y coordinate in the cropping process. [Default: **Y**]
-
 edge_size
-  If not set, the hexbin filter will estimate a hex size based on a sample of the data. If set, hexbin will use the provided size in constructing the hexbins to test.
+  If not set, the hexbin filter will estimate a hex size based on a sample of
+  the data. If set, hexbin will use the provided size in constructing the
+  hexbins to test.
 
 sample_size
   How many points to sample when automatically calculating the edge size? [Default: **5000**]
diff --git a/doc/stages/filters.merge.rst b/doc/stages/filters.merge.rst
index 3aee80d..08ea7b3 100644
--- a/doc/stages/filters.merge.rst
+++ b/doc/stages/filters.merge.rst
@@ -1,13 +1,13 @@
 .. _filters.merge:
 
 filters.merge
-============
+===============================================================================
 
 The merge filter combines input from multiple sources into a single output.
 No checks are made to ensure that points from the various sources have similar
 dimensions or are generally compatible.  Notably, dimensions are not
 initialized when points merged from various sources do not have dimensions in
-common. 
+common.
 
 Example
 -------
diff --git a/doc/stages/filters.mortonorder.rst b/doc/stages/filters.mortonorder.rst
index a24e0ff..60e8e4b 100644
--- a/doc/stages/filters.mortonorder.rst
+++ b/doc/stages/filters.mortonorder.rst
@@ -1,7 +1,7 @@
 .. _filters.mortonorder:
 
 filters.mortonorder
-===========
+================================================================================
 
 Sorts the XY data using `Morton ordering`_.
 
diff --git a/doc/stages/filters.movingleastsquares.rst b/doc/stages/filters.movingleastsquares.rst
new file mode 100644
index 0000000..ef829e3
--- /dev/null
+++ b/doc/stages/filters.movingleastsquares.rst
@@ -0,0 +1,22 @@
+.. _filters.movingleastsquares:
+
+===============================================================================
+filters.movingleastsquares
+===============================================================================
+
+The Moving Least Squares filter passes data through the Point Cloud Library
+(`PCL`_) MovingLeastSquares algorithm.
+
+MovingLeastSquares is an implementation of the MLS (Moving Least Squares)
+algorithm for data smoothing and improved normal estimation described in
+[Alexa2003]_. It also contains methods for upsampling the resulting cloud based
+on the parametric fit.
+
+.. [Alexa2003] Alexa, Marc, et al. "Computing and rendering point set surfaces." Visualization and Computer Graphics, IEEE Transactions on 9.1 (2003): 3-15.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.poisson.rst b/doc/stages/filters.poisson.rst
new file mode 100644
index 0000000..3326448
--- /dev/null
+++ b/doc/stages/filters.poisson.rst
@@ -0,0 +1,23 @@
+.. _filters.poisson:
+
+===============================================================================
+filters.poisson
+===============================================================================
+
+The Poisson filter passes data through the Point Cloud Library (`PCL`_) Poisson
+surface reconstruction algorithm.
+
+Poisson is an implementation of the method described in [Kazhdan2006]_.
+
+.. [Kazhdan2006] Kazhdan, Michael, Matthew Bolitho, and Hugues Hoppe. "Poisson surface reconstruction." Proceedings of the fourth Eurographics symposium on Geometry processing. Vol. 7. 2006.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+depth
+  Maximum depth of the tree used for reconstruction. [Default: **8**]
+
+point_weight
+  Importance of interpolation of point samples in the screened Poisson equation. [Default: **4.0**]
diff --git a/doc/stages/filters.predicate.rst b/doc/stages/filters.predicate.rst
index 4c50ec2..707375e 100644
--- a/doc/stages/filters.predicate.rst
+++ b/doc/stages/filters.predicate.rst
@@ -3,7 +3,10 @@
 filters.predicate
 =================
 
-Like the ref:`filters.programmable` filter, the predicate filter applies a `Python`_ function to a stream of points. Points can be retained/removed from the stream by setting true/false values into a special "Mask" dimension in the output point array.
+Like the :ref:`filters.programmable` filter, the predicate filter applies a
+`Python`_ function to a stream of points. Points can be retained/removed from
+the stream by setting true/false values into a special "Mask" dimension in the
+output point array.
 
 .. code-block:: python
 
@@ -26,7 +29,23 @@ Like the ref:`filters.programmable` filter, the predicate filter applies a `Pyth
      outs['Mask'] = keep
      return True
 
-The example above sets the "mask" to true for points that are in classifications 1 or 2 and to false otherwise, causing points that are not classified 1 or 2 to be dropped from the point stream.
+The example above sets the "mask" to true for points that are in
+classifications 1 or 2 and to false otherwise, causing points that are not
+classified 1 or 2 to be dropped from the point stream.
+
+.. note::
+
+    :ref:`filters.range` is a specialized filter that implements the exact
+    functionality described in this Python operation. It is likely to be
+    much faster than Python, but not as flexible. :ref:`filters.predicate` and
+    :ref:`filters.programmable` are tools you can use for prototyping
+    point stream processing operations.
+
+.. seealso::
+
+    If you want to just read a :ref:`pipeline` of operations into a numpy
+    array, the PDAL Python extension might be what you want. See it at
+    https://pypi.python.org/pypi/PDAL
 
 Example
 -------
@@ -41,29 +60,29 @@ Example
       </Option>
       <Filter type="filters.predicate">
       <Option name="function">filter</Option>
-      <Option name="module">anything</Option>        
+      <Option name="module">anything</Option>
       <Option name="source">
 
   import numpy as np
-  
+
   def filter(ins,outs):
      cls = ins['Classification']
-  
+
      keep_classes = [1,2]
-  
+
      # Use the first test for our base array.
      keep = np.equal(cls, keep_classes[0])
-  
+
      # For 1:n, test each predicate and join back
      # to our existing predicate array
      for k in range(1,len(keep_classes)):
          t = np.equal(cls, keep_classes[k])
          keep = keep + t
-  
+
      outs['Mask'] = keep
      return True
-     
-          </Option>      
+
+          </Option>
           <Reader type="readers.las">
             <Option name="filename">
               file-input.las
diff --git a/doc/stages/filters.radiusoutlier.rst b/doc/stages/filters.radiusoutlier.rst
new file mode 100644
index 0000000..65c553e
--- /dev/null
+++ b/doc/stages/filters.radiusoutlier.rst
@@ -0,0 +1,31 @@
+.. _filters.radiusoutlier:
+
+===============================================================================
+filters.radiusoutlier
+===============================================================================
+
+The Radius Outlier filter passes data through the Point Cloud Library (`PCL`_)
+RadiusOutlierRemoval algorithm.
+
+RadiusOutlierRemoval filters points in a cloud based on the number of neighbors
+they have. Iterates through the entire input once, and for each point, retrieves
+the number of neighbors within a certain radius. The point will be considered an
+outlier if it has too few neighbors, as determined by ``min_neighbors``. The
+radius can be changed using ``radius``.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+min_neighbors
+  Minimum number of neighbors in radius. [Default: **2**]
+
+radius
+  Radius. [Default: **1.0**]
+
+classify
+  Apply classification labels? [Default: **true**]
+
+extract
+  Extract ground returns? [Default: **false**]
diff --git a/doc/stages/filters.mortonorder.rst b/doc/stages/filters.randomize.rst
similarity index 60%
copy from doc/stages/filters.mortonorder.rst
copy to doc/stages/filters.randomize.rst
index a24e0ff..8f0b818 100644
--- a/doc/stages/filters.mortonorder.rst
+++ b/doc/stages/filters.randomize.rst
@@ -1,11 +1,9 @@
-.. _filters.mortonorder:
+.. _filters.randomize:
 
-filters.mortonorder
-===========
+filters.randomize
+=================
 
-Sorts the XY data using `Morton ordering`_.
-
-.. _`Morton ordering`: http://en.wikipedia.org/wiki/Z-order_curve
+The randomize filter reorders the points in a point view randomly.
 
 Example
 -------
@@ -16,9 +14,9 @@ Example
   <Pipeline version="1.0">
     <Writer type="writers.las">
       <Option name="filename">
-        sorted.las
+        randomized.las
       </Option>
-      <Filter type="filters.mortonorder">
+      <Filter type="filters.randomize">
         <Reader type="readers.las">
           <Option name="filename">
             unsorted.las
@@ -28,8 +26,3 @@ Example
     </Writer>
   </Pipeline>
 
-
-
-Notes
------
-
diff --git a/doc/stages/filters.range.rst b/doc/stages/filters.range.rst
index b9775d4..f55c714 100644
--- a/doc/stages/filters.range.rst
+++ b/doc/stages/filters.range.rst
@@ -6,8 +6,8 @@ filters.range
 The range filter applies rudimentary filtering to the input point cloud
 based on a set of criteria on the given dimensions.
 
-Example
--------
+Pipeline Example
+----------------
 
 This example passes through all points whose Z value is in the range [0,100]
 and whose classification equals 2 (corresponding to ground in LAS).
@@ -21,18 +21,8 @@ and whose classification equals 2 (corresponding to ground in LAS).
         filtered.las
       </Option>
       <Filter type="filters.range">
-        <Option name="dimension">
-          Z
-          <Options>
-            <Option name="min">0</Option>
-            <Option name="max">100</Option>
-          </Options>
-        </Option>
-        <Option name="dimension">
-          Classification
-          <Options>
-            <Option name="equals">2</Option>
-          </Options>
+        <Option name="limits">
+          Z[0:100],Classification[2:2]
         </Option>
         <Reader type="readers.las">
           <Option name="filename">
@@ -43,16 +33,31 @@ and whose classification equals 2 (corresponding to ground in LAS).
     </Writer>
   </Pipeline>
 
+Command-line Example
+--------------------
+
+The equivalent pipeline invoked via the PDAL ``translate`` command would be
+
+.. code-block:: bash
+
+  $ pdal translate -i input.las -o filtered.las -f range --filters.range.limits="Z[0:100],Classification[2:2]"
 
 Options
 -------
 
-dimension
-  A dimension Option with an Options block containing the range criteria.
+limits
+  A comma-separated list of :ref:`ranges`.  If more than one range is
+  specified for a dimension, the criteria are treated as being logically
+  ORed together.  Ranges for different dimensions are treated as being
+  logically ANDed.
+
+  Example:
 
-  * min: The minimum allowable value (inclusive) to pass through to the filtered point cloud.
+  ::
 
-  * max: The maximum allowable value (inclusive) to pass through to the filtered point cloud.
+    Classification[1:2], Red[1:50], Blue[25:75], Red[75:255], Classification[6:7]
 
-  * equals: The exact value to pass through to the filtered point cloud (i.e., min = max).
+  This specification will select points that have the classification of
+  1, 2, 6 or 7 and have a blue value or 25-75 and have a red value of
+  1-50 or 75-255.  In this case, all values are inclusive.
 
diff --git a/doc/stages/filters.sort.rst b/doc/stages/filters.sort.rst
index f4da854..0d9ce6b 100644
--- a/doc/stages/filters.sort.rst
+++ b/doc/stages/filters.sort.rst
@@ -3,7 +3,7 @@
 filters.sort
 ============
 
-The sort filter orders a point buffer based on the values of a dimension.
+The sort filter orders a point view based on the values of a dimension.
 The current filter only supports sorting based on a single dimension in
 increasing order.
 
diff --git a/doc/stages/filters.splitter.rst b/doc/stages/filters.splitter.rst
index 28917dc..91ac6c9 100644
--- a/doc/stages/filters.splitter.rst
+++ b/doc/stages/filters.splitter.rst
@@ -1,7 +1,7 @@
 .. _filters.splitter:
 
 filters.splitter
-===============
+===============================================================================
 
 The splitter filter breaks a point cloud into square tiles of a size that
 you choose.  The origin of the tiles is chosen arbitrarily unless specified
@@ -12,7 +12,7 @@ for each tile as its output.
 
 Splitting is usually applied to data read from files (which produce one large
 stream of points) before the points are written to a database (which prefer
-data segmented into smaller blocks). 
+data segmented into smaller blocks).
 
 Example
 -------
@@ -40,10 +40,10 @@ Options
 length
   Length of the sides of the tiles that are created to hold points.
   [Default: 1000]
-  
+
 origin_x
   X Origin of the tiles.  [Default: none (chosen arbitarily)]
 
 origin_y
   Y Origin of the tiles.  [Default: none (chosen arbitarily)]
-  
+
diff --git a/doc/stages/filters.statisticaloutlier.img1.png b/doc/stages/filters.statisticaloutlier.img1.png
new file mode 100755
index 0000000..b8289f8
Binary files /dev/null and b/doc/stages/filters.statisticaloutlier.img1.png differ
diff --git a/doc/stages/filters.statisticaloutlier.img2.png b/doc/stages/filters.statisticaloutlier.img2.png
new file mode 100755
index 0000000..c09efed
Binary files /dev/null and b/doc/stages/filters.statisticaloutlier.img2.png differ
diff --git a/doc/stages/filters.statisticaloutlier.rst b/doc/stages/filters.statisticaloutlier.rst
new file mode 100644
index 0000000..39d6f20
--- /dev/null
+++ b/doc/stages/filters.statisticaloutlier.rst
@@ -0,0 +1,53 @@
+.. _filters.statisticaloutlier:
+
+===============================================================================
+filters.statisticaloutlier
+===============================================================================
+
+The Statistical Outlier filter passes data through the Point Cloud Library
+(`PCL`_) StatisticalOutlierRemoval algorithm.
+
+StatisticalOutlierRemoval uses point neighborhood statistics to filter outlier
+data. The algorithm iterates through the entire input twice. During the first
+iteration it will compute the average distance that each point has to its
+nearest k neighbors. The value of k can be set using ``mean_k``. Next, the mean
+and standard deviation of all these distances are computed in order to determine
+a distance threshold. The distance threshold will be equal to:
+:math:`mean + stddev_{mult} * stddev`. The multiplier for the standard deviation
+can be set using ``multiplier``. During the next iteration the points will be
+classified as inlier or outlier if their average neighbor distance is below or
+above this threshold respectively.
+
+.. figure:: filters.statisticaloutlier.img1.png
+    :scale: 70 %
+    :alt: Points before outlier removal
+
+    Before outlier removal, noise points can be found both above and below the scene.
+
+
+.. figure:: filters.statisticaloutlier.img2.png
+    :scale: 60 %
+    :alt: Points after outlier removal
+
+    After outlier removal, the noise points are removed.
+
+See [Rusu2008]_ for more information.
+
+.. [Rusu2008] Rusu, Radu Bogdan, et al. "Towards 3D point cloud based object maps for household environments." Robotics and Autonomous Systems 56.11 (2008): 927-941.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+mean_k
+  Mean number of neighbors. [Default: **8**]
+
+multiplier
+  Standard deviation threshold. [Default: **2.0**]
+
+classify
+  Apply classification labels? [Default: **true**]
+
+extract
+  Extract ground returns? [Default: **false**]
diff --git a/doc/stages/filters.stats.rst b/doc/stages/filters.stats.rst
index fa58692..cf64244 100644
--- a/doc/stages/filters.stats.rst
+++ b/doc/stages/filters.stats.rst
@@ -1,7 +1,7 @@
 .. _filters.stats:
 
 filters.stats
-============
+===============================================================================
 
 The stats filter calculates the minimum, maximum and average (mean) values
 of dimensions.  On request it will also provide an enumeration of values of
@@ -41,7 +41,7 @@ Options
 dimensions
   A comma-separated list of dimensions whose statistics should be
   processed.  If not provided, statistics for all dimensions are calculated.
-  
+
 enumerate
   A comma-separated list of dimensions whose values should be enumerated.
   Note that this list does not add to the list of dimensions that may be
diff --git a/doc/stages/filters.transformation.rst b/doc/stages/filters.transformation.rst
index 5a9fe98..0aeea79 100644
--- a/doc/stages/filters.transformation.rst
+++ b/doc/stages/filters.transformation.rst
@@ -3,9 +3,17 @@
 filters.transformation
 ======================
 
-The transformation filter applies an arbitrary rotation+translation transformation, represented as a 4x4 matrix, to each xyz triplet.
-The filter does *no* checking to ensure the matrix is a valid affine transformation — buyer beware.
+The transformation filter applies an arbitrary rotation+translation
+transformation, represented as a 4x4 matrix, to each xyz triplet.
 
+The filter does *no* checking to ensure the matrix is a valid affine
+transformation — buyer beware.
+
+.. note::
+
+    The transformation filter does not apply any spatial reference information
+    — if spatial reference information is desired, it must be specified on
+    another filter.
 
 Example
 -------
diff --git a/doc/stages/filters.voxelgrid.rst b/doc/stages/filters.voxelgrid.rst
new file mode 100644
index 0000000..4924653
--- /dev/null
+++ b/doc/stages/filters.voxelgrid.rst
@@ -0,0 +1,34 @@
+.. _filters.voxelgrid:
+
+===============================================================================
+filters.voxelgrid
+===============================================================================
+
+The Voxel Grid filter passes data through the Point Cloud Library (`PCL`_)
+VoxelGrid algorithm.
+
+VoxelGrid assembles a local 3D grid over a given PointCloud, and downsamples +
+filters the data. The VoxelGrid class creates a *3D voxel grid* (think about a
+voxel grid as a set of tiny 3D boxes in space) over the input point cloud data.
+Then, in each *voxel* (i.e., 3D box), all the points present will be
+approximated (i.e., *downsampled*) with their centroid. This approach is a bit
+slower than approximating them with the center of the voxel, but it represents
+the underlying surface more accurately.
+
+.. seealso::
+
+    :ref:`filters.decimation` does simple every-other-X -style decimation.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+leaf_x
+  Leaf size in X dimension. [Default: **1.0**]
+
+leaf_y
+  Leaf size in Y dimension. [Default: **1.0**]
+
+leaf_z
+  Leaf size in Z dimension. [Default: **1.0**]
diff --git a/doc/stages/index.rst b/doc/stages/index.rst
index a032f21..58c6854 100644
--- a/doc/stages/index.rst
+++ b/doc/stages/index.rst
@@ -1,74 +1,67 @@
 .. _stage_index:
 
 ******************************************************************************
-Stage Reference
+Readers, Writers, and Filters
 ******************************************************************************
 
+The :cpp:class:`pdal::Stage` object encapsulates the reading, writing, and
+filtering capabilities for PDAL.
+
+.. _readers:
 
 Readers
 =======
 
+Readers provide data to :ref:`pipeline` operations. Readers might be a simple
+file type, like :ref:`readers.las`, a complex database like :ref:`readers.oci`, or
+a network service like :ref:`readers.greyhound`.
+
+.. note::
+
+    Readers provide :cpp:class:`pdal::Dimension` to :ref:`pipeline`. PDAL attempts
+    to normalize common dimension types, like X, Y, Z, or Intensity, which are
+    often found in LiDAR point clouds. Not all dimension types need to be fixed, however.
+    Database drivers typically return unstructured lists of dimensions.
+
 .. toctree::
    :maxdepth: 1
+   :glob:
+
+   readers.*
 
-   readers.buffer
-   readers.faux
-   readers.geowave
-   readers.greyhound
-   readers.las
-   readers.mrsid
-   readers.nitf
-   readers.oci
-   readers.optech
-   readers.pcd
-   readers.pgpointcloud
-   readers.ply
-   readers.qfit
-   readers.rxp
-   readers.sbet
-   readers.sqlite
+.. _writers:
 
 Writers
 =======
 
+Writers consume data provided by :ref:`readers`. Some writers can consume any
+dimension type, while others only understand fixed dimension names.
+
+.. note::
+
+    Some writers can only consume known dimension names, while PDAL doesn't
+    yet have a registery for the dimension types, you can see the
+    base dimension types at https://github.com/PDAL/PDAL/blob/master/include/pdal/Dimension.hpp
+
 .. toctree::
    :maxdepth: 1
+   :glob:
 
-   writers.derivative
-   writers.geowave
-   writers.las
-   writers.matlab
-   writers.nitf
-   writers.oci
-   writers.ply
-   writers.p2g
-   writers.pcd
-   writers.pgpointcloud
-   writers.pclvisualizer
-   writers.rialto
-   writers.sqlite
-   writers.text
+   writers.*
+
+.. _filters:
 
 Filters
 =======
 
+Filters operate on data as inline operations. They can remove, modify, reorganize,
+and add points to the data stream as it goes by. Some filters can only operate on
+dimensions they understand (consider :ref:`filters.reprojection` doing geographic
+reprojection on XYZ coordinates), while others do not interrogate the point data at
+all and simply reorganize or split data.
+
 .. toctree::
    :maxdepth: 1
+   :glob:
 
-   filters.attribute
-   filters.colorization
-   filters.chipper
-   filters.crop
-   filters.decimation
-   filters.ferry
-   filters.hexbin
-   filters.mortonorder
-   filters.merge
-   filters.pclblock
-   filters.predicate
-   filters.programmable
-   filters.range
-   filters.reprojection
-   filters.sort
-   filters.stats
-   filters.transformation
+   filters.*
diff --git a/doc/stages/ranges.rst b/doc/stages/ranges.rst
new file mode 100644
index 0000000..70bccb1
--- /dev/null
+++ b/doc/stages/ranges.rst
@@ -0,0 +1,57 @@
+.. _ranges:
+
+Ranges
+======
+
+A range specification is a dimension name, followed by an optional negation
+character ('!'), and a starting and ending value separated by a colon, 
+surrounded by parentheses or square brackets.  Either the starting or ending
+values can be omitted.  Parentheses indicate an open endpoint that doesn't
+include the adjacent value.  Square brackets indicate a closed endpoint
+that includes the adjacent value.
+
+Example 1:
+----------
+
+::
+
+  Z[10:]
+
+Selects all points with a Z value greater than or equal to 10.
+  
+Example 2:
+----------
+
+::
+
+  Classification[2:2]
+
+Selects all points with a classification of 2.
+
+Example 3:
+----------
+
+::
+
+  Red!(20:40]
+
+Selects all points with red values less than or equal to 20 and those with
+values greater than 40
+
+Example 4:
+----------
+
+::
+
+  Blue[:255)
+  
+Selects all points with a blue value less than 255.
+
+Example 5:
+----------
+
+::
+
+  Intesity![25:25]
+
+Selects all points with an intensity not equal to 25.
diff --git a/doc/stages/readers.bpf.rst b/doc/stages/readers.bpf.rst
index 0d70e28..e6f5863 100644
--- a/doc/stages/readers.bpf.rst
+++ b/doc/stages/readers.bpf.rst
@@ -1,7 +1,8 @@
 .. _readers.bpf:
 
+******************************************************************************
 readers.bpf
-===========
+******************************************************************************
 
 BPF is an NGA specification for point cloud data. The specification can be
 found at https://nsgreg.nga.mil/doc/view?i=4202 The **BPF Reader** supports
@@ -16,7 +17,7 @@ Data that follows the standard header but precedes point data is taken to
 be metadata and is UTF-encoded and added to the reader's metadata.
 
 Example
--------
+------------------------------------------------------------------------------
 
 .. code-block:: xml
 
@@ -31,7 +32,7 @@ Example
   </Pipeline>
 
 Options
--------
+------------------------------------------------------------------------------
 
 filename
     BPF file to read [Required]
diff --git a/doc/stages/readers.buffer.rst b/doc/stages/readers.buffer.rst
index 7dc11fa..4afc03d 100644
--- a/doc/stages/readers.buffer.rst
+++ b/doc/stages/readers.buffer.rst
@@ -1,9 +1,9 @@
-.. _readers.buffer.
+.. _readers.buffer:
 
 readers.buffer
 ==============
 
-The `readers.buffer`_ stage is a special stage that allows
+The :ref:`readers.buffer` stage is a special stage that allows
 you to read data from your own PointView rather than
 fetching the data from a specific reader. In the :ref:`writing` example,
 it is used to take a simple listing of points and turn them into an
@@ -13,7 +13,7 @@ LAS file.
 Example
 -------
 
-See :ref:`writing` for an example usage scenario for `readers.buffer`.
+See :ref:`writing` for an example usage scenario for :ref:`readers.buffer`.
 
 Options
 -------
diff --git a/doc/stages/readers.gdal.rst b/doc/stages/readers.gdal.rst
new file mode 100644
index 0000000..69f7f94
--- /dev/null
+++ b/doc/stages/readers.gdal.rst
@@ -0,0 +1,78 @@
+.. _readers.gdal:
+
+readers.gdal
+================================================================================
+
+The `GDAL`_ reader reads `GDAL readable raster`_ data sources as point clouds.
+
+.. _`GDAL`: http://gdal.org
+.. _`GDAL readable raster`: http://www.gdal.org/formats_list.html
+
+Each pixel is given an X and Y coordinate (and corresponding PDAL dimensions)
+that are center pixel, and each band is represented by "band-1", "band-2", or
+"band-n". The user must know what the bands correspond to, and use
+:ref:`filters.ferry` to copy data into known dimensions as needed.
+
+
+.. note::
+
+    :ref:`filters.ferry` is needed because raster data do not map to
+    typical dimension names. For output to formats such as :ref:`LAS <writers.las>`,
+    this mapping is required.
+
+
+Basic Example
+--------------------------------------------------------------------------------
+
+.. code-block:: xml
+
+    <?xml version="1.0"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.text">
+            <Option name="filename">
+                out.asc
+            </Option>
+            <Reader type="readers.gdal">
+                <Option name="filename">
+                    /Users/hobu/dev/git/pdal/test/data/autzen/autzen.jpg
+                </Option>
+            </Reader>
+        </Writer>
+    </Pipeline>
+
+LAS Example
+--------------------------------------------------------------------------------
+
+The following example writes a JPG as an `ASPRS LAS`_ file.
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+
+.. code-block:: xml
+
+    <?xml version="1.0"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                out.las
+            </Option>
+            <Filter type="filters.ferry">
+               <Option name="dimensions">
+                    Red=band-1, Green=band-2, Blue=band-3
+                </Option>
+            <Reader type="readers.gdal">
+                <Option name="filename">
+                    /Users/hobu/dev/git/pdal/test/data/autzen/autzen.jpg
+                </Option>
+            </Reader>
+        </Filter>
+        </Writer>
+    </Pipeline>
+
+
+Options
+--------------------------------------------------------------------------------
+
+filename
+  GDALOpen'able raster file to read [Required]
+
+
diff --git a/doc/stages/readers.geowave.rst b/doc/stages/readers.geowave.rst
index f991da5..c6dab35 100644
--- a/doc/stages/readers.geowave.rst
+++ b/doc/stages/readers.geowave.rst
@@ -1,9 +1,13 @@
 .. _readers.geowave:
 
 readers.geowave
-============
+===============================================================================
 
-The **GeoWave reader** uses `GeoWave`_ to read from Accumulo.  GeoWave entries are stored using EPSG:4326.  Instructions for configuring the GeoWave plugin can be found `here`_
+.. index:: GeoWave
+
+The **GeoWave reader** uses `GeoWave`_ to read from Accumulo.  GeoWave entries
+are stored using `EPSG:4326 <http://epsg.io/4326/>`__.  Instructions for
+configuring the GeoWave plugin can be found `here`_.
 
 Example
 -------
@@ -15,14 +19,14 @@ Example
     <Writer type="writers.text">
       <Option name="filename">outputfile.txt</Option>
       <Reader type="readers.geowave">
-        <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
-        <Option name="instanceName">GeoWave</Option>
+        <Option name="zookeeper_url">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+        <Option name="instance_name">GeoWave</Option>
         <Option name="username">user</Option>
         <Option name="password">pass</Option>
-        <Option name="tableNamespace">PDAL_Table</Option>
-        <Option name="featureTypeName">PDAL_Point</Option>
-        <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
-        <Option name="pointsPerEntry">5000u</Option>
+        <Option name="table_namespace">PDAL_Table</Option>
+        <Option name="feature_type_name">PDAL_Point</Option>
+        <Option name="data_adapter">FeatureCollectionDataAdapter</Option>
+        <Option name="points_per_entry">5000u</Option>
         <Option name="bounds">([0,1000000],[0,1000000],[0,100])</Option>
       </Reader>
     </Writer>
@@ -32,11 +36,11 @@ Example
 Options
 -------
 
-zookeeperUrl
+zookeeper_url
   The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
 
-instanceName
-  The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
+instance_name
+  the zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
 
 username
   The username for the account to establish an Accumulo connector. [Required]
@@ -44,20 +48,20 @@ username
 password
   The password for the account to establish an Accumulo connector. [Required]
 
-tableNamespace
+table_namespace
   The table name to be used when interacting with GeoWave. [Required]
 
-featureTypeName
+feature_type_name
   The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
 
-dataAdapter
+data_adapter
   FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
 
-pointsPerEntry
+points_per_entry
   Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
 
 bounds
-  The extent of the bounding rectangle to use to query points, expressed as a string, eg: “([xmin,xmax],[ymin,ymax],[zmin,zmax])”. [Default: unit cube] 
+  The extent of the bounding rectangle to use to query points, expressed as a string, eg: “([xmin,xmax],[ymin,ymax],[zmin,zmax])”. [Default: unit cube]
 
 
 .. _GeoWave: https://ngageoint.github.io/geowave/
diff --git a/doc/stages/readers.greyhound.rst b/doc/stages/readers.greyhound.rst
index 04b3b5d..d3ff780 100644
--- a/doc/stages/readers.greyhound.rst
+++ b/doc/stages/readers.greyhound.rst
@@ -17,7 +17,7 @@ Example
       <Option name="spatialreference">EPSG:26910</Option>
       <Reader type="readers.greyhound">
         <Option name="url">greyhound.organization.com:8080</Option>
-        <Option name="pipelineId">a87d0a50e03a880c75e9f872c925f984</Option>
+        <Option name="pipeline_id">a87d0a50e03a880c75e9f872c925f984</Option>
       </Reader>
     </Writer>
   </Pipeline>
@@ -28,7 +28,7 @@ Options
 url
   Greyhound server URL string. [Required]
 
-pipelineId
+pipeline_id
   Greyhound pipelineId to read. [Required]
 
 
diff --git a/doc/stages/readers.ilvis2.metadata.png b/doc/stages/readers.ilvis2.metadata.png
new file mode 100644
index 0000000..c4d1dec
Binary files /dev/null and b/doc/stages/readers.ilvis2.metadata.png differ
diff --git a/doc/stages/readers.ilvis2.rst b/doc/stages/readers.ilvis2.rst
new file mode 100644
index 0000000..5144fb5
--- /dev/null
+++ b/doc/stages/readers.ilvis2.rst
@@ -0,0 +1,39 @@
+.. _readers.ilvis2:
+
+readers.ilvis2
+===============
+
+The **ILVIS2 reader** read from files in the ILVIS2 format. See http://nsidc.org/data/docs/daac/icebridge/ilvis2/index.html
+for more information
+
+
+.. figure:: readers.ilvis2.metadata.png
+
+    Dimensions provided by the ILVIS2 reader
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">output.las</Option>
+      <Reader type="readers.ilvis2">
+        <Option name="filename">
+          ILVIS2_GL2009_0414_R1401_042504.TXT
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  File to read from [Required]
+
+mapping
+  Which ILVIS2 field type to map to X, Y, Z dimensions
+  'LOW', 'CENTROID', or 'HIGH' ['CENTROID']
diff --git a/doc/stages/readers.las.rst b/doc/stages/readers.las.rst
index 0a46294..5c58879 100644
--- a/doc/stages/readers.las.rst
+++ b/doc/stages/readers.las.rst
@@ -7,15 +7,43 @@ The **LAS Reader** supports reading from `LAS format`_ files, the standard
 interchange format for LIDAR data.  The reader does NOT support point formats
 containing waveform data (4, 5, 9 and 10).
 
-The reader will accept version 1.4 LAS files and will interpret the extra bytes
-VLR (User ID: LASF_Spec, Record ID: 4) if present.  Two dimensions are
-created for each
-extra byte field with types 11 - 20, "0" and "1" being appended to the field
-name to create the dimension names. Three dimensions are created for each
-extra byte field with types 21-30, "0", "1" and "2" being appended to the field
-name to create the dimension names.  Field type 0 is understood, but the data
-associated with field type 0 is ignored (no PDAL dimension is created).  The
-presence of this VLR overrides the **extra_dims** option.
+The reader also supports compressed LAS files, known as LAZ files or
+`LASzip`_ files.
+In order to use compresed LAS, your version of PDAL must be built with one of
+the two supported decompressors, `LASzip`_ or `LAZperf`_.  See the
+`compression`_ option below for more information.
+
+.. _LASzip: http://www.laszip.org
+.. _LAZperf: https://github.com/verma/laz-perf
+
+.. note::
+
+  LAS stores X, Y and Z dimensions as scaled integers.  Users converting an
+  input LAS file to an output LAS file will frequently want to use the same
+  scale factors and offsets in the output file as existed in the input
+  file in order to
+  maintain the precision of the data.  Use the 'forward' option on the
+  :ref:`writers.las` to facilitate transfer of header information from
+  source to destination LAS/LAZ files.
+
+.. note::
+
+  LAS 1.4 files can contain datatypes that are actually arrays rather than
+  individual dimensions.  Since PDAL doesn't support these datatypes, it
+  must map them into datatypes it supports.  This is done by appending the
+  array index to the name of the datatype.  For example, datatypes 11 - 20
+  are two dimensional array types and if a field had the name Foo for
+  datatype 11, PDAL would create the dimensions Foo0 and Foo1 to hold the
+  values associated with LAS field Foo.  Similarly, datatypes 21 - 30 are
+  three dimensional arrays and a field of type 21 with the name Bar would
+  cause PDAL to create dimensions Bar0, Bar1 and Bar2.  See the information
+  on the extra bytes VLR in the `LAS Specification`_ for more information
+  on the extra bytes VLR and array datatypes.
+
+.. note::
+  LAS 1.4 files that use the extra bytes VLR and datatype 0 will be accepted,
+  but the data associated with a dimension of datatype 0 will be ignored
+  (no PDAL dimension will be created).
 
 Example
 -------
@@ -35,15 +63,24 @@ Example
 Options
 -------
 
-filename
-  LAS file to read [Required] 
+_`filename`
+  LAS file to read [Required]
 
-extra_dims
+_`extra_dims`
   Extra dimensions to be read as part of each point beyond those specified by
   the LAS point format.  The format of the option is
   <dimension_name>=<type>, ... where type is one of:
-      int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
-  '_t' may be added to any of the type names as well (e.g., uint32_t)
+  int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+  '_t' may be added to any of the type names as well (e.g., uint32_t).  NOTE:
+  the presence of an extra bytes VLR causes when reading a version 1.4 LAS
+  file causes this option to be ignored.
 
 .. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-  
+.. _LAS Specification: http://www.asprs.org/a/society/committees/standards/LAS_1_4_r13.pdf
+
+_`compression`
+  May be set to "lazperf" or "laszip" to choose either the LazPerf decompressor
+  or the LasZip decompressor for LAZ files.  PDAL must have been build with
+  support for the decompressor being requested.  The LazPerf decompressor
+  doesn't support version 1 LAZ files or version 1.4 of LAS.
+  [Default: "laszip"]
diff --git a/doc/stages/readers.ply.rst b/doc/stages/readers.ply.rst
index 862ef64..14af230 100644
--- a/doc/stages/readers.ply.rst
+++ b/doc/stages/readers.ply.rst
@@ -1,4 +1,4 @@
-.. _readers.pcd:
+.. _readers.ply:
 
 readers.ply
 ===========
diff --git a/doc/stages/readers.tindex.rst b/doc/stages/readers.tindex.rst
new file mode 100644
index 0000000..10d7530
--- /dev/null
+++ b/doc/stages/readers.tindex.rst
@@ -0,0 +1,125 @@
+.. _readers.tindex:
+
+readers.tindex
+================================================================================
+
+
+A `GDAL tile index`_ is an `OGR`_-readable data source of boundary information.
+PDAL provides a similar concept for PDAL-readable point cloud data. You can use
+the :ref:`tindex_command` application to generate tile index files in any
+format that `OGR`_ supports writing. Once you have the tile index, you can then
+use the :ref:`readers.tindex` driver to automatically merge and query the
+data described by the tiles.
+
+.. _`GDAL`: http://gdal.org
+.. _`OGR`: http://gdal.org/ogr/
+.. _`GDAL tile index`: http://www.gdal.org/gdaltindex.html
+
+
+
+
+
+Basic Example
+--------------------------------------------------------------------------------
+
+Given a tile index that was generated with the following scenario:
+
+::
+
+    pdal tindex index.sqlite \
+        "/Users/hobu/dev/git/pdal/test/data/las/interesting.las" \
+        -f "SQLite" \
+        --lyr_name "pdal" \
+        --t_srs "EPSG:4326"
+
+Use the following :ref:`pipeline` example to read and automatically
+merge the data.
+
+.. code-block:: xml
+
+    <?xml version="1.0"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                out.las
+            </Option>
+            <Reader type="readers.tindex">
+                <Option name="sql">
+                    SELECT * from pdal
+                </Option>
+               <Option name="filter_srs">
+                    +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+                </Option>
+               <Option name="merge">
+                   true
+                </Option>
+                <Option name="filename">
+                    /Users/hobu/dev/git/pdal/test/temp/index.sqlite
+                </Option>
+                <Option name="where">
+                    location LIKE '%nteresting.las%'
+                </Option>
+                <Option name="boundary">
+                    ([635629.85, 638982.55], [848999.70 , 853535.43])
+                </Option>
+                <Option name="polygon">
+                    POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+                </Option>
+            </Reader>
+        </Writer>
+    </Pipeline>
+
+
+Options
+--------------------------------------------------------------------------------
+
+filename
+  OGROpen'able raster file to read [Required]
+
+lyr_name
+  The OGR layer name for the data source to use to
+  fetch the tile index information.
+
+srs_column
+  The column in the layer that provides the SRS
+  information for the file. Use this if you wish to
+  override or set coordinate system information for
+  files.
+
+tindex_name
+  The column name that defines the file location for
+  the tile index file.
+  [Default: **location**]
+
+sql
+  `OGR SQL`_ to use to define the tile index layer.
+
+wkt
+  A geometry to pre-filter the tile index using
+  OGR
+
+boundary
+  A 2D box to pre-filter the tile index. If it is set,
+  it will override any ``wkt`` option.
+
+t_srs
+  Reproject the layer SRS, otherwise default to the
+  tile index layer's SRS.
+
+filter_srs
+  Transforms any ``wkt`` or ``boundary`` option to this
+  coordinate system before filtering or reading data.
+
+where
+  `OGR SQL`_ filter clause to use on the layer. It only
+  works in combination with tile index layers that are
+  defined with ``lyr_name``
+
+dialect
+  `OGR SQL`_ dialect to use when querying tile index layer
+  [Default: OGRSQL]
+
+.. _`OGR SQL`: http://www.gdal.org/ogr_sql.html
+
+
+
diff --git a/doc/stages/writers.bpf.rst b/doc/stages/writers.bpf.rst
index 91b3a8a..2e01816 100644
--- a/doc/stages/writers.bpf.rst
+++ b/doc/stages/writers.bpf.rst
@@ -36,7 +36,8 @@ filename
     the placeholder will be replaced with an incrementing integer.  If no
     placeholder is found, all PointViews provided to the writer are
     aggregated into a single file for output.  Multiple PointViews are usually
-    the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+    the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+    :ref:`filters.divider`.
     [Required]
 
 compression
@@ -48,8 +49,8 @@ format
 
     * dim == Dimension-major (non-interleaved).  All data for a single dimension
       are stored contiguously.
-    * point == Point-major (interleaved).  All data for a single point are stored
-      contiguously.
+    * point == Point-major (interleaved).  All data for a single point
+      are stored contiguously.
     * byte == Byte-major (byte-segregated).  All data for a single dimension are
       stored contiguously, but bytes are arranged such that the first bytes for
       all points are stored contiguously, followed by the second bytes of all
@@ -82,8 +83,19 @@ offset_x, offset_y, offset_z
     Offset to be subtracted from the X, Y and Z nominal values, respectively,
     before the value is scaled.  The special value "auto" can be specified,
     which causes the writer to set the offset to the minimum value of the
-    dimension.  [Default: 0]
+    dimension.  [Default: auto]
 
     .. note::
 
         written value = (nominal value - offset) / scale.
+
+    .. note::
+
+        Because BPF data is always stored in UTM, the XYZ offsets are set to
+        "auto" by default. This is to avoid truncation of the decimal digits
+        (which may occur with offsets left at 0).
+
+output_dims
+    If specified, limits the dimensions written for each point.  Dimensions
+    are listed by name and separated by commas.  X, Y and Z are required and
+    must be explicitly listed.
diff --git a/doc/stages/writers.geowave.rst b/doc/stages/writers.geowave.rst
index 06d921f..7e5031b 100644
--- a/doc/stages/writers.geowave.rst
+++ b/doc/stages/writers.geowave.rst
@@ -1,27 +1,31 @@
 .. _writers.geowave:
 
 writers.geowave
-============
+================================================================================
 
-The **GeoWave writer** uses `GeoWave`_ to write to Accumulo.  GeoWave entries are stored using EPSG:4326.  Instructions for configuring the GeoWave plugin can be found `here`_
+.. index:: GeoWave
+
+The **GeoWave writer** uses `GeoWave`_ to write to Accumulo.  GeoWave entries
+are stored using `EPSG:4326 <http://epsg.io/4326/>`__.  Instructions for
+configuring the GeoWave plugin can be found `here`_.
 
 
 Example
--------
+--------------------------------------------------------------------------------
 
 .. code-block:: xml
 
   <?xml version="1.0" encoding="utf-8"?>
   <Pipeline version="1.0">
     <Writer type="writers.geowave">
-      <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
-      <Option name="instanceName">GeoWave</Option>
+      <Option name="zookeeper_url">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+      <Option name="instance_name">GeoWave</Option>
       <Option name="username">user</Option>
       <Option name="password">pass</Option>
-      <Option name="tableNamespace">PDAL_Table</Option>
-      <Option name="featureTypeName">PDAL_Point</Option>
-      <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
-      <Option name="pointsPerEntry">5000u</Option>
+      <Option name="table_namespace">PDAL_Table</Option>
+      <Option name="feature_type_name">PDAL_Point</Option>
+      <Option name="data_adapter">FeatureCollectionDataAdapter</Option>
+      <Option name="points_per_entry">5000u</Option>
       <Filter type="filters.reprojection">
         <Option name="out_srs">EPSG:4326</Option>
         <Reader type="readers.qfit">
@@ -36,10 +40,10 @@ Example
 Options
 -------
 
-zookeeperUrl
+zookeeper_url
   The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
 
-instanceName
+instance_name
   The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
 
 username
@@ -48,17 +52,17 @@ username
 password
   The password for the account to establish an Accumulo connector. [Required]
 
-tableNamespace
+table_namespace
   The table name to be used when interacting with GeoWave. [Required]
 
-featureTypeName
+feature_type_name
   The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
 
-dataAdapter
+data_adapter
   FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
 
-pointsPerEntry
-  Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]  
+points_per_entry
+  Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
 
 
 .. _GeoWave: https://ngageoint.github.io/geowave/
diff --git a/doc/stages/writers.las.rst b/doc/stages/writers.las.rst
index 2492a4a..acc982b 100644
--- a/doc/stages/writers.las.rst
+++ b/doc/stages/writers.las.rst
@@ -6,6 +6,9 @@ writers.las
 The **LAS Writer** supports writing to `LAS format`_ files, the standard
 interchange file format for LIDAR data.
 
+IMPORTANT NOTE: Scale/offset are not preserved from an input LAS file.  See
+below for information on the scale/offset options and the 'forward' option.
+
 Example
 -------
 
@@ -35,7 +38,8 @@ filename
   the placeholder will be replaced with an incrementing integer.  If no
   placeholder is found, all PointViews provided to the writer are
   aggregated into a single file for output.  Multiple PointViews are usually
-  the result of using :ref:`filters.splitter` or :ref:`filters.chipper`. 
+  the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+  :ref:`filters.divider`.
   [Required]
 
 forward
@@ -65,7 +69,7 @@ forward
   output file as necessary.  Unlike header values, VLRs from multiple input
   files are accumulated and each is written to the output file.  Forwarded
   VLRs may contain duplicate User ID/Record ID pairs.
-  
+
 minor_version
   All LAS files are version 1, but the minor version (0 - 4) can be specified
   with this option. [Default: 3]
@@ -77,18 +81,18 @@ software_id
 creation_doy
   Number of the day of the year (January 1 == 0, Dec 31 == 365) this file is
   being created.
-  
+
 creation_year
   Year (Gregorian) this file is being created.
-  
+
 dataformat_id
   Controls whether information about color and time are stored with the point
   information in the LAS file. [Default: 3]
-  
+
   * 0 == no color or time stored
   * 1 == time is stored
   * 2 == color is stored
-  * 3 == color and time are stored 
+  * 3 == color and time are stored
   * 4 [Not Currently Supported]
   * 5 [Not Currently Supported]
   * 6 == time is stored (version 1.4+ only)
@@ -96,13 +100,13 @@ dataformat_id
   * 8 == time, color and near infrared are stored (version 1.4+ only)
   * 9 [Not Currently Supported]
   * 10 [Not Currently Supported]
-  
+
 system_id
   String identifying the system that created this LAS file. [Default: "PDAL"]
-  
+
 a_srs
   The spatial reference system of the file to be written. Can be an EPSG string (eg "EPSG:268910") or a WKT string. [Default: Not set]
-  
+
 global_encoding
   Various indicators to describe the data.  See the LAS documentation.  Note
   that PDAL will always set bit four when creating LAS version output.
@@ -112,9 +116,10 @@ project_id
   UID reserved for the user [Default: Nil UID]
 
 compression
-  Set to true to apply compression to the output, creating a LAZ file instead
-  of an LAS file.  Requires PDAL to have been built with compression support
-  by linking with LASzip.  [Default: false]
+  Set to "lazperf" or "laszip" to apply compression to the output, creating
+  a LAZ file instead of an LAS file.  "lazperf" selects the LazPerf compressor
+  and "laszip" (or "true") selects the LasZip compressor. PDAL must have
+  been built with support for the requested compressor.  [Default: "none"]
 
 scale_x, scale_y, scale_z
   Scale to be divided from the X, Y and Z nominal values, respectively, after
@@ -131,7 +136,7 @@ offset_x, offset_y, offset_z
    dimension.  [Default: 0]
 
    Note: written value = (nominal value - offset) / scale.
-  
+
 filesource_id
   The file source id number to use for this file (a value between
   1 and 65535) [Default: 0]
@@ -145,11 +150,16 @@ extra_dims
   Extra dimensions to be written as part of each point beyond those specified
   by the LAS point format.  The format of the option is
   <dimension_name>=<type>, ... where type is one of:
-      int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+  int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
   '_t' may be added to any of the type names as well (e.g., uint32_t).  When
   the version of the output file is specified as 1.4 or greater, an extra
   bytes VLR (User ID: LASF_Spec, Record ID: 4), is created that describes the
   extra dimensions specified by this option.
 
+  The special value 'all' can be used in place of a dimension/type list
+  to request
+  that all dimensions that can't be stored in the predefined LAS point
+  record get added as extra data at the end of each point record.
+
 .. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-  
+
diff --git a/doc/stages/writers.nitf.rst b/doc/stages/writers.nitf.rst
index 3f75326..9171eab 100644
--- a/doc/stages/writers.nitf.rst
+++ b/doc/stages/writers.nitf.rst
@@ -16,8 +16,8 @@ Example
   <Pipeline version="1.0">
     <Writer type="writers.nitf">
       <Option name="filename">mynitf.nitf</Option>
-      <Option name="ONAME">James Alexander</Option>
-      <Option name="OPHONE">646-322-3123</Option>
+      <Option name="oname">James Alexander</Option>
+      <Option name="ophone">646-322-3123</Option>
       <Reader type="readers.las">
         <Option name="filename">inputfile.las</Option>
       </Reader>
@@ -35,51 +35,52 @@ filename
   the placeholder will be replaced with an incrementing integer.  If no
   placeholder is found, all PointViews provided to the writer are
   aggregated into a single file for output.  Multiple PointViews are usually
-  the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+  the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+  :ref:`filters.divider`.
 
-CLEVEL
+clevel
   File complexity level (2 characters) [Default: **03**]
   
-STYPE
+stype
   Standard type (4 characters) [Default: **BF01**]
 
-OSTAID
+ostaid
   Originating station ID (10 characters) [Default: **PDAL**]
 
-FTITLE
+ftitle
   File title (80 characters) [Default: <spaces>]
 
-FSCLAS
+fsclas
   File security classification ('T', 'S', 'C', 'R' or 'U') [Default: **U**]
 
-ONAME
+oname
   Originator name (24 characters) [Default: <spaces>]
 
-OPHONE
+ophone
   Originator phone (18 characters) [Default: <spaces>]
 
-FSCTLH
+fsctlh
   File control and handling (2 characters) [Default: <spaces>]
 
-FSCLSY
+fsclsy
   File classification system (2 characters) [Default: <spaces>]
 
-IDATIM
+idatim
   Image date and time (format: 'CCYYMMDDhhmmss') [Default: <spaces>]
 
-IID2
+iid2
   Image identifier 2 (80 characters) [Default: <spaces>]
 
-FSCLTX
+fscltx
   File classification text (43 characters) [Default: <spaces>]
 
-AIMIDB
-  Option tag that should contain further options to complete the AIMIDB
-  (Additional Image ID) TRE record [Default: None]
+aimidb
+  Comma separated list of name/value pairs to complete the AIMIDB
+  (Additional Image ID) TRE record (format name:value) [Default: None]
 
-ACFTB
-  Option tag that should contain further options to complete the ACFTB
-  (Aircraft Information) TRE record [Default: None]
+acftb
+  Comma separated list of name/value pairs to complete the ACFTB
+  (Aircraft Information) TRE record (format name:value) [Default: None]
 
 
 .. _NITF: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
diff --git a/doc/stages/writers.null.rst b/doc/stages/writers.null.rst
index 7f7d90d..bf11c95 100644
--- a/doc/stages/writers.null.rst
+++ b/doc/stages/writers.null.rst
@@ -1,4 +1,4 @@
-.. _writers.text:
+.. _writers.null:
 
 writers.null
 ============
diff --git a/doc/stages/writers.oci.rst b/doc/stages/writers.oci.rst
index 415d994..b68f662 100644
--- a/doc/stages/writers.oci.rst
+++ b/doc/stages/writers.oci.rst
@@ -74,7 +74,7 @@ connection
   Oracle connection string to connect to database
 
 is3d
-  Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, and indexing [Default: **false**]
+  Should we use 3D objects (include the z dimension) for SDO_PC PC_EXTENT, BLK_EXTENT, and indexing [Default: **false**]
 
 solid
   Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) instead of the normal (1,1003,3), and use gtype 3008/2008 vs 3003/2003 for BLK_EXTENT geometry values.  [Default: **false**]
diff --git a/doc/stages/writers.p2g.rst b/doc/stages/writers.p2g.rst
index 52f2864..2443dba 100644
--- a/doc/stages/writers.p2g.rst
+++ b/doc/stages/writers.p2g.rst
@@ -58,25 +58,11 @@ Example
       <Option name="output_format">
         grid
       </Option>
-        <Filter type="filters.inplacereprojection">
-          <Option name="out_srs">
-            EPSG:26910
-          </Option>
-          <Option name="scale_x">
-            0.01
-          </Option>
-          <Option name="scale_y">
-            0.01
-          </Option>
-          <Reader type="readers.las">
-            <Option name="filename">
-              ../1.2-with-color.las
-            </Option>
-            <Option name="spatialreference">
-              ../1.2-with-color.las.wkt
-            </Option>
-          </Reader>
-      </Filter>
+      <Reader type="readers.las">
+        <Option name="filename">
+            .a./1.2-with-color.las
+        </Option>
+      </Reader>
     </Writer>
   </Pipeline>
 
@@ -101,3 +87,5 @@ output_type
 output_format
   File output format to use, one of "grid", "tif", or "asc". [Default: **grid**]
 
+z
+  Name of the 'z' dimension to use. [Default: 'Z']
diff --git a/doc/stages/writers.text.rst b/doc/stages/writers.text.rst
index e7e8c26..a8a4e32 100644
--- a/doc/stages/writers.text.rst
+++ b/doc/stages/writers.text.rst
@@ -3,7 +3,9 @@
 writers.text
 ============
 
-The **text writer** writes out to a text file. This is useful for debugging or getting smaller files into an easily parseable format.  The text writer supports both `GeoJson`_ and `CSV`_ output.
+The **text writer** writes out to a text file. This is useful for debugging or
+getting smaller files into an easily parseable format.  The text writer
+supports both `GeoJSON`_ and `CSV`_ output.
 
 
 Example
@@ -33,27 +35,27 @@ filename
   File to write to, or "STDOUT" to write to standard out [Required]
 
 format
-  Output format to use. One of "geojson" or "csv". [Default: **csv**] 
+  Output format to use. One of "geojson" or "csv". [Default: **csv**]
 
 order
   Comma-separated list of dimension names, giving the desired column order in the output file, for example "X,Y,Z,Red,Green,Blue". [Default: none]
-  
+
 keep_unspecified
   Should we output any fields that are not specified in the dimension order? [Default: **true**]
 
 jscallback
   When producing GeoJSON, the callback allows you to wrap the data in a function, so the output can be evaluated in a <script> tag.
-  
+
 quote_header
   When producing CSV, should the column header named by quoted? [Default: **true**]
-  
+
 newline
   When producing CSV, what newline character should be used? (For Windows, "\\r\\n" is common.) [Default: **\\n**]
-  
+
 delimiter
-  When producing CSV, what character to use as a delimiter? [Default: **,**]  
+  When producing CSV, what character to use as a delimiter? [Default: **,**]
 
 
-.. _GeoJson: http://geojson.org
+.. _GeoJSON: http://geojson.org
 .. _CSV: http://en.wikipedia.org/wiki/Comma-separated_values
 
diff --git a/doc/tutorial/autzen-elevation.png b/doc/tutorial/autzen-elevation.png
new file mode 100644
index 0000000..083b320
Binary files /dev/null and b/doc/tutorial/autzen-elevation.png differ
diff --git a/doc/tutorial/autzen-height.png b/doc/tutorial/autzen-height.png
new file mode 100644
index 0000000..fe5c3f2
Binary files /dev/null and b/doc/tutorial/autzen-height.png differ
diff --git a/doc/tutorial/autzen-shapes-clipped.png b/doc/tutorial/autzen-shapes-clipped.png
new file mode 100644
index 0000000..b6e4f4b
Binary files /dev/null and b/doc/tutorial/autzen-shapes-clipped.png differ
diff --git a/doc/tutorial/autzen-shapes-point-cloud.png b/doc/tutorial/autzen-shapes-point-cloud.png
new file mode 100644
index 0000000..c6fb598
Binary files /dev/null and b/doc/tutorial/autzen-shapes-point-cloud.png differ
diff --git a/doc/tutorial/autzen-shapes-to-clip.png b/doc/tutorial/autzen-shapes-to-clip.png
new file mode 100644
index 0000000..7e78580
Binary files /dev/null and b/doc/tutorial/autzen-shapes-to-clip.png differ
diff --git a/doc/tutorial/calculating-normalized-heights.rst b/doc/tutorial/calculating-normalized-heights.rst
new file mode 100644
index 0000000..0560b15
--- /dev/null
+++ b/doc/tutorial/calculating-normalized-heights.rst
@@ -0,0 +1,192 @@
+.. height:
+
+==============================
+Calculating Normalized Heights
+==============================
+
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/11/2015
+
+
+This tutorial will describe the creation of a new filter for calculating normalized heights, :ref:`filters.height`.
+
+Introduction
+-------------------------------------------------------------------------------
+
+Normalized heights are a commonly used attribute of point cloud data. This can also be referred to as *height above ground* (HAG) or *above ground level* (AGL) heights. In the end, it is simply a measure of a point's relative height as opposed to its raw elevation value.
+
+The process of computing normalized heights is straightforward. First, we must have an estimate of the underlying terrain model. With this we can compute the difference between each point's elevation and the elevation of the terrain model at the same XY coordinate. The quality of the normalized heights will be a function of the quality of the terrain model, which of course depends on the quality of the ground segmentation approach and any interpolation that is required to arrive at the t [...]
+
+We will use a nearest neighbor interpolation scheme to estimate terrain elevations. While this may not be the most accurate approach, it is available in PDAL today, and we hope it will inspire you to implement your own methods!
+
+Approach
+-------------------------------------------------------------------------------
+
+For the height filter, we only assume that our input point cloud has an already existing ``Classification`` dimension with some subset of points marked as ground (``Classification=2``). This could, for example, be generated by :ref:`filters.ground` (see :ref:`pcl_ground`), but you can use whichever method you choose, as long as the ground returns are marked.
+
+.. note::
+
+   We expect ground returns to have the classification value of 2 in keeping with the ASPRS Standard LIDAR Point Classes (see http://www.asprs.org/a/society/committees/standards/LAS_1_4_r13.pdf).
+
+For the full source, please see ``HeightFilter.cpp`` in the ``plugins/pcl/filters`` folder. Below, we dissect the key aspects of the algorithm and its implementation.
+
+The bulk of our processing is actually taking place within PCL. For convenience, we've defined:
+
+.. code-block:: cpp
+
+    typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+
+Our first step is to convert the filter's incoming PDAL ``PointView`` to a PCL ``PointCloud``, which requires that we first calculate our bounds so that we can subtract our XYZ offsets in the conversion step.
+
+.. code-block:: cpp
+
+    BOX3D bounds;
+    view.calculateBounds(bounds);
+
+    Cloud::Ptr cloud_in(new Cloud);
+    pclsupport::PDALtoPCD(std::make_shared<PointView>(view), *cloud_in, bounds);
+
+Next, we will create two vectors of indices - one for ground returns, one for non-ground returns - and make our first pass through the point cloud to populate these.
+
+.. code-block:: cpp
+
+    pcl::PointIndices::Ptr ground(new pcl::PointIndices());
+    ground->indices.reserve(view.size());
+
+    std::vector<PointId> nonground;
+    nonground.reserve(view.size());
+
+    for (PointId id = 0; id < view.size(); ++id)
+    {
+        double c = view.getFieldAs<double>(Dimension::Id::Classification, id);
+
+        if (c == 2)
+            ground->indices.push_back(id);
+        else
+            nonground.push_back(id);
+    }
+
+With our ground indices identified, we can use PCL to extract the ground returns into a new ``PointCloud``.
+
+.. code-block:: cpp
+
+    pcl::ExtractIndices<pcl::PointXYZ> extract;
+    extract.setInputCloud(cloud_in);
+    extract.setIndices(ground);
+
+    Cloud::Ptr cloud_ground(new Cloud);
+    extract.setNegative(false);
+    extract.filter(*cloud_ground);
+
+We repeat the extraction now, flipping ``setNegative`` from false to true to extract the non-ground returns into a new ``PointCloud``.
+
+.. code-block:: cpp
+
+    Cloud::Ptr cloud_nonground(new Cloud);
+    extract.setNegative(true);
+    extract.filter(*cloud_nonground);
+
+To compute the normalized height, we wish to find the nearest ground point for each non-ground point. Here, we achieve this by using a nearest neighbor interpolation scheme. One may prefer to use a more sophisticated interpolation scheme, but that is beyond the scope of this tutorial. We begin by defining model coefficients that will allow us to project the ground and non-ground clouds into the XY plane.
+
+.. code-block:: cpp
+
+    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
+    coefficients->values.resize(4);
+    coefficients->values[0] = coefficients->values[1] = 0;
+    coefficients->values[2] = 1.0;
+    coefficients->values[3] = 0;
+
+We can now project the ground points
+
+.. code-block:: cpp
+
+    pcl::ProjectInliers<pcl::PointXYZ> proj;
+    proj.setModelType(pcl::SACMODEL_PLANE);
+
+    Cloud::Ptr cloud_ground_projected(new Cloud);
+    proj.setInputCloud(cloud_ground);
+    proj.setModelCoefficients(coefficients);
+    proj.filter(*cloud_ground_projected);
+
+followed by the non-ground points
+
+.. code-block:: cpp
+
+    Cloud::Ptr cloud_nonground_projected(new Cloud);
+    proj.setInputCloud(cloud_nonground);
+    proj.setModelCoefficients(coefficients);
+    proj.filter(*cloud_nonground_projected);
+
+Next, we create a KdTree to accelerate our nearest neighbor search. The tree is composed of only ground returns, as our non-ground returns will serve as query points for the nearest neighbor search.
+
+.. code-block:: cpp
+
+    pcl::search::KdTree<pcl::PointXYZ>::Ptr ground_tree;
+    ground_tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+    ground_tree->setInputCloud(cloud_ground_projected);
+
+We iterate over each of our projected non-ground points, searching for our nearest neighbor in the ground points. Using the indices of each the query (non-ground) and nearest neighbor (ground), we can retrieve the Z dimension from the input cloud, compute the height, and set this field in our original ``PointView``.
+
+.. code-block:: cpp
+
+    for (int i = 0; i < cloud_nonground_projected->size(); ++i)
+    {
+        pcl::PointXYZ nonground_query = cloud_nonground_projected->points[i];
+        std::vector<int> neighbors(1);
+        std::vector<float> sqr_distances(1);
+        ground_tree->nearestKSearch(nonground_query, 1, neighbors, sqr_distances);
+
+        double nonground_Z = view.getFieldAs<double>(Dimension::Id::Z, nonground[i]);
+        double ground_Z = view.getFieldAs<double>(Dimension::Id::Z, ground->indices[neighbors[0]]);
+        double height = nonground_Z - ground_Z;
+
+        view.setField(m_heightDim, nonground[i], height);
+    }
+
+The only thing left is to set the height field to 0.0 for each of the ground points.
+
+.. code-block:: cpp
+
+    for (auto const& ground_idx : ground->indices)
+        view.setField(m_heightDim, ground_idx, 0.0);
+
+Example #1
+-------------------------------------------------------------------------------
+
+Using the autzen dataset (here shown colored by elevation)
+
+.. image:: autzen-elevation.png
+   :height: 400px
+
+we run the following PDAL CLI command
+
+::
+
+    $ pdal translate autzen.laz autzen-height.bpf height \
+      --writers.bpf.output_dims="X,Y,Z,Height"
+
+The result, when colored by the normalized height instead of elevation is
+
+.. image:: autzen-height.png
+   :height: 400px
+
+Example #2
+-------------------------------------------------------------------------------
+
+If you'd like to overwrite your Z values, follow the height filter with :ref:`filters.ferry`.
+
+::
+
+    $ pdal translate input.laz output-height-as-Z.bpf height ferry \
+      --writers.bpf.output_dims="X,Y,Z" --filters.ferry.dimensions="Height=Z"
+
+Example #3
+-------------------------------------------------------------------------------
+
+If you don't yet have points classified as ground, start with :ref:`filters.ground`.
+
+::
+
+    $ pdal translate input.laz output-ground-height.bpf ground height \
+      --writers.bpf.output_dims="X,Y,Z,Height"
diff --git a/doc/tutorial/clipping-with-shapefile.rst b/doc/tutorial/clipping-with-shapefile.rst
new file mode 100644
index 0000000..cdf3f6a
--- /dev/null
+++ b/doc/tutorial/clipping-with-shapefile.rst
@@ -0,0 +1,208 @@
+.. _clipping:
+
+================================================================================
+Clipping with Geometries
+================================================================================
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 11/09/2015
+
+
+Introduction
+-------------------------------------------------------------------------------
+
+This tutorial describes how to construct a pipeline that takes in geometries
+and clips out data with given geometry attributes.  It is common to desire
+being able to cut or clip point cloud data with 2D geometries, often from
+auxillary data sources such as `OGR`_-readable `Shapefiles`_.  This tutorial
+describes how to construct a pipeline that takes in geometries and clips out
+point cloud data inside geometries with matching attributes.
+
+.. contents::
+   :depth: 4
+   :backlinks: none
+
+
+.. _`OGR`: http://www.gdal.org
+.. _`Shapefiles`: https://en.wikipedia.org/wiki/Shapefile
+
+Example Data
+-------------------------------------------------------------------------------
+
+This tutorial utilizes the Autzen dataset. In addition to typical PDAL
+software (fetch it from :ref:`download`), you will need to download the
+following two files:
+
+* http://www.liblas.org/samples/autzen/autzen.laz
+* https://github.com/PDAL/PDAL/raw/master/test/data/autzen/attributes.json
+
+Stage Operations
+-------------------------------------------------------------------------------
+
+This operation depends on two :ref:`stages <stage_index>` PDAL provides.
+The first is the :ref:`filters.attribute` stage, which allows you to assign
+point values based on polygons read from `OGR`_. The second is the :ref:`filters.range`,
+which allows you to keep or reject points from the set that match given
+criteria.
+
+.. seealso::
+
+    :ref:`filters.predicate` allows you to construct sophisticated logic
+    for keeping or rejecting points in a more expressive environment (`Python`_).
+
+.. _`Python`: http://www.python.org
+
+Data Preparation
+-------------------------------------------------------------------------------
+
+.. figure:: autzen-shapes-point-cloud.png
+    :scale: 30%
+
+    Autzen Stadium, a 100 million+ point cloud file.
+
+The data are mixed in two different coordinate systems. The :ref:`LAZ
+<readers.las>` file is in `Oregon State Plane Ft.`_ and the `GeoJSON`_ defining
+the polygons is in `EPSG:4326`_. We have two options -- project the point cloud
+into the coordinate system of the attribute polygons, or project the attribute
+polygons into the coordinate system of the points. The latter is preferable in
+this case because it will be less math and therefore less computation. To make
+it convenient, we can utilize `OGR`_'s `VRT`_ capability to reproject the data
+for us on-the-fly:
+
+.. code-block:: xml
+
+    <OGRVRTDataSource>
+        <OGRVRTWarpedLayer>
+            <OGRVRTLayer name="OGRGeoJSON">
+                <SrcDataSource>attributes.json</SrcDataSource>
+                <LayerSRS>EPSG:4326</LayerSRS>
+            </OGRVRTLayer>
+            <TargetSRS>+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs</TargetSRS>
+        </OGRVRTWarpedLayer>
+    </OGRVRTDataSource>
+
+.. note::
+
+    The GeoJSON file does not have an externally-defined coordinate system,
+    so we are explictly setting one with the LayerSRS parameter. If your
+    data does have coordinate system information, you don't need to do that.
+
+Save this VRT definition to a file, called ``attributes.vrt`` in the same location where you
+stored the ``autzen.laz`` and ``attributes.json`` files.
+
+
+The attribute GeoJSON file has a couple of features with different attributes.
+For our scenario, we want to clip out the yellow-green polygon, marked number "5",
+in the upper right hand corner.
+
+
+
+.. figure:: autzen-shapes-to-clip.png
+    :scale: 30%
+
+    We want to clip out the polygon in the upper right hand corner. We can
+    view the `GeoJSON`_ geometry using something like `QGIS`_
+
+.. _`QGIS`: http://qgis.org
+
+Pipeline
+-------------------------------------------------------------------------------
+
+A PDAL :ref:`pipeline` is how you define a set of actions to happen to data
+as they are read, filtered, and written.
+
+.. code-block:: xml
+
+    <?xml version="2.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                output.las
+            </Option>
+            <Filter type="filters.range">
+                <Option name="limits">
+                   Classification[5:5]
+                 </Option>
+                <Filter type="filters.attribute">
+                    <Option name="dimension">
+                        Classification
+                    </Option>
+                    <Option name="datasource">
+                        attributes.vrt
+                    </Option>
+                    <Option name="layer">
+                        OGRGeoJSON
+                    </Option>
+                    <Option name="column">
+                        CLS
+                    </Option>
+                    <Reader type="readers.las">
+                        <Option name="filename">
+                            autzen.laz
+                        </Option>
+                    </Reader>
+                </Filter>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+
+:ref:`Pipeline <pipeline>` files are read inside-out, so we will start with the
+:ref:`readers.las` and move up until we hit the :ref:`writers.las`.
+
+* :ref:`readers.las`: Define a reader that can read `ASPRS LAS`_ or `LASzip`_
+  data.
+* :ref:`filters.attribute`: Using the VRT we defined in `Data Preparation`_,
+  read attribute polygons out of the data source and assign the values from the
+  ``CLS`` column to the ``Classification`` field.
+* :ref:`filters.range`: Given that we have set the ``Classification`` values
+  for the points that have coincident polygons to 2, 5, and 6, only keep
+  ``Classification`` values in the range of ``5:5``. This functionally means
+  we're only keeping those points with a classification value of 5.
+* :ref:`writers.las`: write our content back out using an `ASPRS LAS`_ writer.
+
+.. note::
+
+    You don't have to use only ``Classification`` to set the attributes
+    with :ref:`filters.attribute`. Any valid dimension name could work, but
+    most LiDAR softwares will display categorical coloring for the
+    ``Classification`` field, and we can leverage that behavior in this
+    scenario.
+
+Processing
+-------------------------------------------------------------------------------
+
+1) Save the pipeline to a file called ``shape-clip.xml`` in the same directory as
+   your ``attributes.json`` and ``autzen.laz`` files.
+
+2) Call ``pdal pipeline`` on the :ref:`pipeline`.
+
+    ::
+
+        $ pdal pipeline shape-clip.xml
+
+3) Visualize ``output.las`` in an environment capable of viewing it. http://plas.io
+   or `CloudCompare`_ should do the trick.
+
+    .. image:: autzen-shapes-clipped.png
+        :scale: 30%
+
+Conclusion
+-------------------------------------------------------------------------------
+
+PDAL allows the composition of point cloud operations. This tutorial demonstrated
+how to use the :ref:`filters.attribute` and :ref:`filters.range` stages to clip
+points with shapefiles.
+
+.. _`CloudCompare`: http://www.danielgm.net/cc/
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+.. _`LASzip`: http://laszip.org
+
+.. _`VRT`: http://www.gdal.org/drv_vrt.html
+
+.. _`EPSG:4326`: http://epsg.io/4326
+.. _`GeoJSON`: http://geojson.org
+
+.. _`Oregon State Plane Ft.`: http://www.oregon.gov/DAS/CIO/GEO/pages/coordination/projections/projections.aspx
diff --git a/doc/tutorial/dart-throwing.rst b/doc/tutorial/dart-throwing.rst
new file mode 100644
index 0000000..5ada621
--- /dev/null
+++ b/doc/tutorial/dart-throwing.rst
@@ -0,0 +1,77 @@
+.. dart-throwing:
+
+===============================================================
+Performing Poisson Sampling of Point Clouds Using Dart Throwing
+===============================================================
+
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/13/2015
+
+
+This tutorial will describe the creation of a new filter for sampling point cloud data, :ref:`filters.dartsample`.
+
+Introduction
+-------------------------------------------------------------------------------
+
+Sampling of point cloud data can be advantageous for a number of reasons. It can be used with care to create a lower resolution version of the point cloud for visualization, or to accelerate processing of derivative products at a coarser resolution. "Duplicate" points can be removed by subsampling. And the effects of overlapping and uneven scan patterns can be removed by sampling.
+
+Approach
+-------------------------------------------------------------------------------
+
+We have chosen to implement the dart throwing filter as a PCL filter. The reason for this is simple. While it is often the case that we want to create a filter that can be included as stage in a PDAL pipeline, there are other, more primitive filters, that we may wish to reuse within another filter. While we may not want to subsample our point cloud, thus discarding points from our output ``PointView``, we may be perfectly content to subsample the data as a transient representation of the [...]
+
+Our implementation is a no frills, brute force approach (there are more advanced methods that have been published over the years).
+
+We begin by creating a random permutation of the input ``PointView`` indices. The first point in this randomized set is appended to the output ``PointView`` and its associated octree. For the remaining points in the input cloud, we first test to see if there is a neighbor in the output cloud within the specified ``radius``. If so, we discard the point. If not, it too is added to the output ``PointView`` and octree.
+
+That's it! It's really that simple.
+
+Example #1
+-------------------------------------------------------------------------------
+
+We will again be working with the autzen dataset. The dart sampling filter is easily invoked via the PDAL ``translate`` command. Here, we enforce a minimum distance of three feet.
+
+::
+
+    $ pdal translate autzen.laz autzen-dart-sampled.laz dartsample \
+    --filters.dartsample.radius=3
+
+For comparison, we will process autzen using both :ref:`filters.decimation`, with a step size of 6, and :ref:`filters.voxelgrid`, with a leaf size of 4.5 feet in X, Y, and Z, to arrive at a subsampled point cloud of roughly 1.6 million points, which closely approximates the number of points returned in our dart sampling run.
+
+::
+
+    $ pdal translate autzen.laz autzen-randomly-sampled.laz decimation \
+    --filters.decimation.step=6
+
+::
+
+    $ pdal translate autzen.laz autzen-voxelgrid-sampled.laz voxelgrid \
+    --filters.voxelgrid.leaf_x=4.5 --filters.voxelgrid.leaf_y=4.5 --filters.voxelgrid.leaf_z=4.5
+
+First, we inspect a fixture located in the middle of an open field, displaying the original point cloud, Poisson (dart sampled), voxel grid, and randomly sampled results in clockwise order from top-left.
+
+.. image:: subsample-ex1.png
+   :height: 400px
+
+The Poisson and voxel gridded clouds both appear to do a good job retaining key elements of the structure, while significantly reducing the number of points allocated to the ground plane. The randomly sampled cloud however, exhibits the opposite behavior, noticeably degrading the structure, while heavily sampling the ground. This is not an unexpected result, as both the Poisson and voxel grid approaches take the data and its distribution into account during the subsampling process, while [...]
+
+The second example shows a very similar result, this time with a set of point pylons and power lines. The random sampling approach severely degrades the structures in the scene, while the Poisson and voxel grid techniques both preserve signal.
+
+.. image:: subsample-ex2.png
+   :height: 400px
+
+In the next example, we can see that there is an increased number of points in a scan overlap region. This is not uncommon, as data collectors strive to avoid gaps in coverage and overlap datasets to aid in registration of multiple passes. The appearance of these denser regions can be distracting to the eye, and the Poisson and voxel grid subsampling method can both be used to make the collected points appear more uniform by culling those points that are very near other other points. The [...]
+
+.. image:: subsample-ex3.png
+   :height: 400px
+
+In this top-down view of a football stadium, we again see that the random sampling technique preserves (and perhaps even accentuates) scan pattern and overlap artifacts. It also introduces a side effect to the voxel grid approach, an aliasing of the data, seen as staircasing in the sloping surfaces of the stadium.
+
+.. image:: subsample-ex4.png
+   :height: 400px
+
+Our last example once again demonstrates each of the issues we have identified. The random sampling result eliminates a majority of points from each of the towers and highlights a scan overlap region. The voxel grid method results in ringing in the sloped terrain. The Poisson approach preserves a good amount of detail in the original signal and does not introduce any visual artifacts.
+
+.. image:: subsample-ex5.png
+   :height: 400px
diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst
index bcf7754..16b8986 100644
--- a/doc/tutorial/index.rst
+++ b/doc/tutorial/index.rst
@@ -26,6 +26,10 @@ Using PDAL
    writing
    pcl_block_tutorial
    pcl_ground
+   clipping-with-shapefile
+   calculating-normalized-heights
+   dart-throwing
+
 
 Developing
 ----------
diff --git a/doc/tutorial/liblas_to_pdal.rst b/doc/tutorial/liblas_to_pdal.rst
index 3192493..dd99ed8 100644
--- a/doc/tutorial/liblas_to_pdal.rst
+++ b/doc/tutorial/liblas_to_pdal.rst
@@ -3,6 +3,10 @@
 libLAS C API to PDAL transition guide
 =====================================
 
+:Author: Vaclav Petras
+:Contact: wenzeslaus at gmail.com
+:Date: 09/04/2015
+
 This page shows how to port code using libLAS C API to PDAL API
 (which is C++). The new code is not using full power of PDAL but
 it uses just what is necessary to read content of a LAS file.
@@ -68,9 +72,9 @@ pointer was used with libLAS:
 
 .. code-block:: cpp
 
-if (LAS_header == NULL) {
-    /* fail */
-}
+    if (LAS_header == NULL) {
+        /* fail */
+    }
 
 In general, PDAL will throw a ``pdal_error`` exception in case something
 is wrong and it can't recover such in the case when the file can't be opened.
@@ -79,11 +83,11 @@ in ``try-catch`` block:
 
 .. code-block:: cpp
 
-try {
-    /* actual code */
-} catch {
-    /* fail in your own way */
-}
+    try {
+        /* actual code */
+    } catch {
+        /* fail in your own way */
+    }
 
 
 Dataset properties
diff --git a/doc/tutorial/overview.rst b/doc/tutorial/overview.rst
index 44b2633..86b412b 100644
--- a/doc/tutorial/overview.rst
+++ b/doc/tutorial/overview.rst
@@ -1,4 +1,4 @@
-.. _overview
+.. _overview:
 
 ******************************************************************************
 PDAL Architecture Overview
@@ -15,6 +15,9 @@ manipulations and can calculate some statistical, boundary and density data.
 PDAL provides an API that can be used by programmers for integration into their
 own projects or to allow extension of existing capabilities.
 
+
+.. _the-pdal-model::
+
 The PDAL model
 --------------------------------------------------------------------------------
 
@@ -340,6 +343,8 @@ point_count_t read(PointViewPtr view, point_count_t count)
     read.
 
 
+.. _implementing-a-filter::
+
 Implementing a Filter
 ................................................................................
 
diff --git a/doc/tutorial/pcl_ground.rst b/doc/tutorial/pcl_ground.rst
index d8ab794..4f3bb4d 100644
--- a/doc/tutorial/pcl_ground.rst
+++ b/doc/tutorial/pcl_ground.rst
@@ -4,8 +4,13 @@
 Identifying ground returns using ProgressiveMorphologicalFilter segmentation
 ===============================================================================
 
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 10/28/2015
+
+
 Implements the Progressive Morphological Filter for segmentation of ground
-points. 
+points.
 
 Background
 ------------------------------------------------------------------------------
diff --git a/doc/tutorial/pcl_spec.rst b/doc/tutorial/pcl_spec.rst
index 4c7ac35..f64560c 100644
--- a/doc/tutorial/pcl_spec.rst
+++ b/doc/tutorial/pcl_spec.rst
@@ -156,7 +156,10 @@ Any JSON keys not recognized by the spec are blissfully ignored.
 ApproximateProgressiveMorphologicalFilter (APMF)
 ````````````````````````````````````````````````
 
-:pcl:`ApproximateProgressiveMorphologicalFilter <pcl::ApproximateProgressiveMorphologicalFilter>`
+.. seealso:
+
+    :ref:`filters.ground` utilizes ApproximateProgressiveMorphologicalFilter in
+    the context of a PDAL filter
 
 This filter removes nonground points to produce a bare-earth point cloud. It is
 similar to the ProgressiveMorphologicalFilter, but is potentially faster (and
@@ -225,7 +228,10 @@ setNegative: bool
 ConditionalRemoval
 ``````````````````
 
-:pcl:`ConditionalRemoval <pcl::ConditionalRemoval>`
+.. seealso::
+
+    :ref:`filters.range` implements support for this PCL operation as a
+    PDAL filter
 
 This filter removes normals outside of a given Z range.
 
@@ -263,8 +269,6 @@ normalZ: object `{"min": float, "max": float}`
 GridMinimum
 ```````````
 
-:pcl:`GridMinimum <pcl::GridMinimum>`
-
 This filter assembles a local 2D grid over a given PointCloud, then downsamples
 the data.
 
@@ -297,7 +301,6 @@ setResolution: float
 NormalEstimation
 ````````````````
 
-:pcl:`NormalEstimation <pcl::NormalEstimation>`
 
 **Description**
 
@@ -337,8 +340,6 @@ setRadiusSearch: float
 PassThrough
 ```````````
 
-:pcl:`PassThrough <pcl::PassThrough>`
-
 **Description**
 
 This filter allows the user to set min/max bounds on one dimension of the data.
@@ -376,9 +377,9 @@ setFilterFieldName: string (required)
 
     Only the `X`, `Y`, `Z`, `R`, `G`, `B`, and `Intensity` dimensions are
     supported.
-    
+
 .. note::
-    
+
     Although PDAL capitalizes the dimension names ("Z", "Intensity"), PCL
     requires the names be given in lower case ("z", "intensity").
 
@@ -391,7 +392,11 @@ setFilterLimits: object `{"min": float, "max": float}`
 ProgressiveMorphologicalFilter (PMF)
 ````````````````````````````````````
 
-:pcl:`ProgressiveMorphologicalFilter <pcl::ProgressiveMorphologialFilter>`
+
+.. seealso::
+
+    :ref:`filters.ground` implements support for this operation as a
+    PDAL filter
 
 **Description**
 
@@ -422,7 +427,7 @@ Example:
             ]
         }
     }
-   
+
 **Parameters**
 
 setMaxWindowSize: int
@@ -460,7 +465,11 @@ setNegative: bool
 RadiusOutlierRemoval
 ````````````````````
 
-:pcl:`RadiusOutlierRemoval <pcl::RadiusOutlierRemoval>`
+.. seealso::
+
+    :ref:`filters.radiusoutlier` implements support for this operation
+    as a PDAL filter
+
 
 **Description**
 
@@ -502,7 +511,10 @@ setRadiusSearch: float
 StatisticalOutlierRemoval
 `````````````````````````
 
-:pcl:`StatisticalOutlierRemoval <pcl::StatisticalOutlierRemoval>`
+.. seealso::
+
+    :ref:`filters.statisticaloutlier` implements support for this
+    operation as a PDAL filter
 
 **Description**
 
@@ -543,7 +555,11 @@ setStddevMulThresh: float
 VoxelGrid
 `````````
 
-:pcl:`VoxelGrid <pcl::VoxelGrid>`
+.. seealso::
+
+    :ref:`filters.voxelgrid` implements support for this operation as a
+    PDAL filter
+
 
 This filter assembles a local 3D grid over a given PointCloud, then downsamples
 and filters the data.
diff --git a/doc/tutorial/reading.rst b/doc/tutorial/reading.rst
index 23dfad9..fbbf81e 100644
--- a/doc/tutorial/reading.rst
+++ b/doc/tutorial/reading.rst
@@ -4,6 +4,11 @@
 Reading with PDAL
 ===============================================================================
 
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
 
 .. contents:: Contents
    :depth: 3
@@ -41,115 +46,44 @@ Our first example to demonstrate PDAL's utility will be to simply query an
 
     The `interesting.las`_ file in these examples can be found on github.
 
-`reStructuredText`_ output
-................................................................................
-
-By default, PDAL outputs `reStructuredText`_. This makes it convenient for
-transforming the output into more pleasing formats like PDF (using `rst2pdf`_)
-or HTML (using `rst2html`_) as part of a processing pipeline.
-
-.. _`rst2pdf`: https://code.google.com/p/rst2pdf/
-.. _`rst2html`: http://docutils.sourceforge.net/docs/user/tools.html#rst2html-py
-
-.. _`reStructuredText`: http://docutils.sourceforge.net/rst.html
-
-::
-
-    $ pdal info interesting.las -p 0
-
-::
-
-    Point 0
-    --------------------------------------------------------------------------------
-
-    =================== ======================================= ===================
-                Name                                Value        Namespace
-    =================== ======================================= ===================
-    X                                        637012.23999999999  readers.las
-    Y                                        849028.31000000006  readers.las
-    Z                                        431.66000000000003  readers.las
-    Intensity                                               143  readers.las
-    ReturnNumber                                              1  readers.las
-    NumberOfReturns                                           1  readers.las
-    ScanDirectionFlag                                         1  readers.las
-    EdgeOfFlightLine                                          0  readers.las
-    Classification                                            1  readers.las
-    ScanAngleRank                                            -9  readers.las
-    UserData                                                132  readers.las
-    PointSourceId                                          7326  readers.las
-    Time                                     245380.78254962614  readers.las
-    Red                                                      68  readers.las
-    Green                                                    77  readers.las
-    Blue                                                     88  readers.las
-    =================== ======================================= ===================
-
-JavaScript output
-................................................................................
-
-JavaScript `JSON`_ can also be output.
+`pdal info` outputs JavaScript `JSON`_.
 
 .. _`JSON`: http://www.json.org/
 
 ::
 
-    $ pdal info interesting.las -p 0 --json
+    $ pdal info interesting.las -p 0
 
 .. code-block:: javascript
 
     {
-        "X": "637012.23999999999",
-        "Y": "849028.31000000006",
-        "Z": "431.66000000000003",
-        "Intensity": "143",
-        "ReturnNumber": "1",
-        "NumberOfReturns": "1",
-        "ScanDirectionFlag": "1",
-        "EdgeOfFlightLine": "0",
-        "Classification": "1",
-        "ScanAngleRank": "-9",
-        "UserData": "132",
-        "PointSourceId": "7326",
-        "Time": "245380.78254962614",
-        "Red": "68",
-        "Green": "77",
-        "Blue": "88"
+      "filename": "interesting.las",
+      "pdal_version": "1.0.1 (git-version: 80644d)",
+      "points":
+      {
+        "point":
+        {
+          "Blue": 88,
+          "Classification": 1,
+          "EdgeOfFlightLine": 0,
+          "GpsTime": 245381,
+          "Green": 77,
+          "Intensity": 143,
+          "NumberOfReturns": 1,
+          "PointId": 0,
+          "PointSourceId": 7326,
+          "Red": 68,
+          "ReturnNumber": 1,
+          "ScanAngleRank": -9,
+          "ScanDirectionFlag": 1,
+          "UserData": 132,
+          "X": 637012,
+          "Y": 849028,
+          "Z": 431.66
+        }
+      }
     }
 
-
-
-XML output
-................................................................................
-
-XML output of this same point is as simple as adding the appropriate
-switch:
-
-::
-
-    $ pdal info interesting.las -p 0 --xml
-
-.. code-block:: xml
-
-    <?xml version="1.0" encoding="utf-8"?>
-    <point>
-      <X>637012.23999999999</X>
-      <Y>849028.31000000006</Y>
-      <Z>431.66000000000003</Z>
-      <Intensity>143</Intensity>
-      <ReturnNumber>1</ReturnNumber>
-      <NumberOfReturns>1</NumberOfReturns>
-      <ScanDirectionFlag>1</ScanDirectionFlag>
-      <EdgeOfFlightLine>0</EdgeOfFlightLine>
-      <Classification>1</Classification>
-      <ScanAngleRank>-9</ScanAngleRank>
-      <UserData>132</UserData>
-      <PointSourceId>7326</PointSourceId>
-      <Time>245380.78254962614</Time>
-      <Red>68</Red>
-      <Green>77</Green>
-      <Blue>88</Blue>
-    </point>
-
-
 A conversion example
 ------------------------------------------------------------------------------
 
@@ -200,12 +134,12 @@ We can capture this metadata using the :ref:`info_command` utility.
 
 ::
 
-    $ pdal info --metadata --xml interesting.las
+    $ pdal info --metadata interesting.las
 
-This produces metadata that looks like :ref:`this <metadataxml>`. You can use
-your favorite `XML`_ or `JSON`_ manipulation tools to extract this information
-and do what you need with it. For formats that do not have the ability to
-preserve this metadata internally, you can keep a ``.xml`` or ``.json`` file
+This produces metadata that looks like :ref:`this <metadatajson>`. You can use
+your `JSON`_ manipulation tools to extract this information.
+For formats that do not have the ability to
+preserve this metadata internally, you can keep a ``.json`` file
 alongside the ``.txt`` file as auxiliary information.
 
 .. seealso::
@@ -238,7 +172,7 @@ effects.
 Simple conversion
 ..............................................................................
 
-The following XML document defines a :ref:`pipeline` that takes the ``file.las``
+The following `XML`_ document defines a :ref:`pipeline` that takes the ``file.las``
 `ASPRS LAS`_ file and converts it to a new file called ``output.las``.
 
 ::
diff --git a/doc/tutorial/subsample-ex1.png b/doc/tutorial/subsample-ex1.png
new file mode 100644
index 0000000..28316a1
Binary files /dev/null and b/doc/tutorial/subsample-ex1.png differ
diff --git a/doc/tutorial/subsample-ex2.png b/doc/tutorial/subsample-ex2.png
new file mode 100644
index 0000000..60c82c8
Binary files /dev/null and b/doc/tutorial/subsample-ex2.png differ
diff --git a/doc/tutorial/subsample-ex3.png b/doc/tutorial/subsample-ex3.png
new file mode 100644
index 0000000..9485128
Binary files /dev/null and b/doc/tutorial/subsample-ex3.png differ
diff --git a/doc/tutorial/subsample-ex4.png b/doc/tutorial/subsample-ex4.png
new file mode 100644
index 0000000..13241ae
Binary files /dev/null and b/doc/tutorial/subsample-ex4.png differ
diff --git a/doc/tutorial/subsample-ex5.png b/doc/tutorial/subsample-ex5.png
new file mode 100644
index 0000000..88cd492
Binary files /dev/null and b/doc/tutorial/subsample-ex5.png differ
diff --git a/doc/tutorial/using.rst b/doc/tutorial/using.rst
index 86ad4bf..de6ece7 100644
--- a/doc/tutorial/using.rst
+++ b/doc/tutorial/using.rst
@@ -4,6 +4,10 @@
 Using PDAL with CMake
 ===============================================================================
 
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
 This tutorial will explain how to use PDAL in your own projects using CMake. A
 more complete, working example can be found :ref:`here <writing>`.
 
diff --git a/doc/tutorial/writing-filter.rst b/doc/tutorial/writing-filter.rst
index a16d8c5..8167401 100644
--- a/doc/tutorial/writing-filter.rst
+++ b/doc/tutorial/writing-filter.rst
@@ -4,73 +4,109 @@
 Writing a filter
 ===============================================================================
 
-PDAL's command-line application can be extended through the development of
-kernel functions. In this tutorial, we will give a brief example.
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/11/2015
+
+
+PDAL can be extended through the development of filter functions.
+
+.. seealso::
+
+    For more on filters and their role in PDAL, please refer to :ref:`the-pdal-model` and :ref:`implementing-a-filter`.
+
+Every filter stage in PDAL is implemented as a plugin (sometimes referred to as a "driver"). Filters native to PDAL, such as :ref:`filters.ferry`, are implemented as _static_ filters and are statically linked into the PDAL library. Filters that require extra/optional dependencies, or are external to the core PDAL codebase altogether, such as :ref:`filters.ground`, are implemented as _shared_ filters, and are built as individual shared libraries, discoverable by PDAL at runtime.
+
+In this tutorial, we will give a brief example of a filter, with notes on how to make it static or shared.
+
 
 The header
--------------------------------------------------------------------------------
+...............................................................................
 
 First, we provide a full listing of the filter header.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
    :language: cpp
 
-In your MyFilter class, you will use two macros defined in Filter.hpp to
-register some useful information about your filter. SET_STAGE_NAME sets the
-filter name and description. These are extracted by the PDAL application to
-inform the user of the filter's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+This header should be relatively straightforward, but we will point out three methods that must be declared for the plugin interface to be satisfied.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
    :language: cpp
-   :lines: 25
+   :lines: 23-25
 
-SET_STAGE_LINK will provide a link to a webpage that documents the filter.
+In many instances, you should be able to copy this header template verbatim, changing only the filter class name, includes, and member functions/variables as required by your implementation.
 
-.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+The source
+...............................................................................
+
+Again, we start with a full listing of the filter source.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 26
 
-Plugin filters should also SET_PLUGIN_VERSION to register the version number of
-the plugin.
+For your filter to be available to PDAL at runtime, it must adhere to the PDAL plugin interface. As a convenience, we provide the macros in ``pdal_macros.hpp`` to do just this.
 
-.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+We begin by creating a ``PluginInfo`` struct containing three identifying elements - the filter name, description, and a link to documentation.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 27
+   :lines: 14-16
 
-The source
--------------------------------------------------------------------------------
+PDAL requires that filter names always begin with ``filters.``, and end with a string that uniquely identifies the filter. The description will be displayed to users of the PDAL CLI (``pdal --drivers``).
 
-Again, we start with a full listing of the filter source.
+Next, we pass the following to the ``CREATE_STATIC_PLUGIN`` macro, in order: PDAL plugin ABI major version, PDAL plugin ABI minor version, filter class name, stage type (``Filter``), and our ``PluginInfo`` struct.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
+   :lines: 18
+
+To create a shared plugin, we simply change ``CREATE_STATIC_PLUGIN`` to ``CREATE_SHARED_PLUGIN``.
 
-In your filter implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Filter factory. It is
-only required by plugins.
+Finally, we implement a method to get the plugin name, which is primarily used by the PDAL CLI when using the ``--drivers`` or ``--options`` arguments.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 11
+   :lines: 20-23
 
-Native filters will use a different set of macros added directly to the
-StageFactory.cpp file to register themselves.
+Now that the filter has implemented the proper plugin interface, we will begin to implement some methods that actually implement the filter. First, ``getDefaultOptions()`` is used to advertise those options that the filter provides. Within PDAL, this is primarily used as a means of displaying options via the PDAL CLI with the ``--options`` argument. It provides the user with the option names, descriptions, and default values.
 
-.. code-block:: cpp
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+   :lines: 25-30
 
-  MAKE_FILTER_CREATOR(myfilter, pdal::MyFilter)
-  REGISTER_FILTER(myfilter, pdal::MyFilter);
+The ``processOptions()`` method is used to parse any provided options. Here, we get the value of ``param``, if provided, else we populate ``m_value`` with the default value of ``1.0``.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 13-16
+   :lines: 32-35
+
+In ``addDimensions()`` we make sure that the known ``Intensity`` dimension is registered. We can also add a custom dimension, ``MyDimension``, which will be populated within ``run()``.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 18-21
+   :lines: 37-41
+
+Finally, we define ``run()``, which takes as input a ``PointViewPtr`` and returns a ``PointViewSet``. It is here that we can transform existing dimensions, add data to new dimensions, or selectively add/remove individual points.
 
 .. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
    :language: cpp
-   :lines: 23-28
+   :lines: 43-48
+
+We suggest you take a closer look at our existing filters to get an idea of the power of the ``Filter`` stage and inspiration for your own filters!
+
+StageFactory
+...............................................................................
+
+As of this writing, users must also make a couple of changes to ``StageFactory.cpp`` to properly register static plugins only (this is not required for shared plugins). It is our goal to eventually remove this requirement to further streamline development of add-on plugins.
+
+First, add the following line to the beginning of ``StageFactory.cpp`` (adjusting the path and filename as necessary).
+
+.. code-block:: cpp
+
+    #include <MyFilter.hpp>
+
+Next, add the following line of code to the ``StageFactory`` constructor.
+
+.. code-block:: cpp
 
+    PluginManager::initializePlugin(MyFilter_InitPlugin);
diff --git a/doc/tutorial/writing-kernel.rst b/doc/tutorial/writing-kernel.rst
index b128720..5a466ff 100644
--- a/doc/tutorial/writing-kernel.rst
+++ b/doc/tutorial/writing-kernel.rst
@@ -4,6 +4,11 @@
 Writing a kernel
 ===============================================================================
 
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
 PDAL's command-line application can be extended through the development of
 kernel functions. In this tutorial, we will give a brief example.
 
@@ -15,21 +20,12 @@ First, we provide a full listing of the kernel header.
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
    :language: cpp
 
-In your MyKernel class, you will use two macros defined in Kernel.hpp to
-register some useful information about your kernel. SET_KERNEL_NAME sets the
-kernel name and description. These are extracted by the PDAL application to
-inform the user of the kernel's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+As with other plugins, the MyKernel class needs to have the following three methods declared for the plugin interface to be satisfied:
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
    :language: cpp
-   :lines: 12
-
-SET_KERNEL_LINK will provide a link to a webpage that documents the kernel.
+   :lines: 16-18
 
-.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
-   :language: cpp
-   :lines: 13
 
 The source
 -------------------------------------------------------------------------------
@@ -39,31 +35,26 @@ Again, we start with a full listing of the kernel source.
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
 
-In your kernel implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Kernel factory. It is
+In your kernel implementation, you will use a macro defined in pdal_macros.
+This macro registers the plugin with the Kernel factory. It is
 only required by plugins.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 24
+   :lines: 23-29
 
-Native kernels will use a different set of macros added directly to the
-KernelFactory.cpp file to register themselves.
-
-.. code-block:: cpp
-
-  MAKE_KERNEL_CREATOR(mykernel, pdal::MyKernel)
-  REGISTER_KERNEL(mykernel, pdal::MyKernel);
+A static plugin macro can also be used to integrate the kernel with the main code.
+This will not be described here.  Using this as a shared plugin will be described later.
 
 To build up a processing pipeline in this
 example, we need to create two objects: the
-PointContext and the StageFactory. The latter is
+PointTable and the StageFactory. The latter is
 used to create the various stages that will be
 used within the kernel.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 50-51
+   :lines: 60
 
 The Reader is created from the StageFactory, and
 is specified by the stage name, in this case an
@@ -73,7 +64,7 @@ read.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 53-56
+   :lines: 62-65
 
 The Filter is also created from the StageFactory.
 Here, we create a decimation filter that will
@@ -83,7 +74,7 @@ the reader.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 58-62
+   :lines: 67-71
 
 Finally, the Writer is created from the
 StageFactory. This text writer, takes as input
@@ -92,7 +83,7 @@ the output filename as its sole option.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 64-68
+   :lines: 73-77
 
 The final two steps are to prepare and execute
 the pipeline. This is achieved by calling prepare
@@ -100,4 +91,10 @@ and execute on the final stage.
 
 .. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
    :language: cpp
-   :lines: 69-70
+   :lines: 78-79
+
+When compiled, a dynamic library file will be created; in this case, ``libpdal_plugin_kernel_mykernel.dylib``
+
+Put this file in whatever directory ``PDAL_DRIVER_PATH`` is pointing to.  Then, if you run ``pdal --help``, you should see ``mykernel`` listed in the possible commands.
+
+To run this kernel, you would use ``pdal mykernel -i <input las file> -o <output text file>``.
diff --git a/doc/tutorial/writing-reader.rst b/doc/tutorial/writing-reader.rst
index b88f87a..b0448b6 100644
--- a/doc/tutorial/writing-reader.rst
+++ b/doc/tutorial/writing-reader.rst
@@ -4,6 +4,11 @@
 Writing a reader
 ===============================================================================
 
+:Authors: Bradley Chambers, Scott Lewis
+:Contact: brad.chambers at gmail.com
+:Date: 11/13/2015
+
+
 PDAL's command-line application can be extended through the development of
 reader functions. In this tutorial, we will give a brief example.
 
@@ -15,21 +20,35 @@ First, we provide a full listing of the reader header.
 .. literalinclude:: ../../examples/writing-reader/MyReader.hpp
    :language: cpp
 
-In your MyReader class, you will use two macros defined in Reader.hpp to
-register some useful information about your reader. SET_STAGE_NAME sets the
-reader name and description. These are extracted by the PDAL application to
-inform the user of the reader's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+In your MyReader class, you will declare the necessary methods and variables
+needed to make the reader work and meet the plugin specifications.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.hpp
    :language: cpp
-   :lines: 12
+   :lines: 16-18
 
-SET_STAGE_LINK will provide a link to a webpage that documents the reader.
+These methods are required to fulfill the specs for defining a new plugin.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.hpp
    :language: cpp
-   :lines: 13
+   :lines: 20-21
+
+These methods are used for setting various defaults for the Reader.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+   :language: cpp
+   :lines: 24-26
+
+``m_stream`` is used to process the input, while ``m_index`` is used to track
+the index of the records.  ``m_scale_z`` is specific to MyReader, and will
+be described later.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+   :language: cpp
+   :lines: 28-32
+
+Various other override methods for the stage.  There are a few others that
+could be overridden, which will not be discussed in this tutorial.
 
 The source
 -------------------------------------------------------------------------------
@@ -39,57 +58,155 @@ Again, we start with a full listing of the reader source.
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
 
-In your reader implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Reader factory. It is
-only required by plugins.
+In your reader implementation, you will use a macro defined in pdal_macros.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 7-12
+
+This macro registers the plugin with the PDAL code.  In this case, we are
+declaring this as a SHARED plugin, meaning that it will be located external
+to the main PDAL instalation.  The macro is supplied with a version number
+(major and minor), the class of the plugin, the parent class (in this case,
+to identify it as a reader), and an object with information.  This information
+includes the name of the plugin, a description, and a link to documentation.
+
+Creating STATIC plugins requires a few more steps which will not be covered
+in this tutorial.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 16-22
+
+This method will process a set of default options for the reader.  In this
+example, we are setting the z_scale value to a default of 1.0, indicating
+that the Z values we read should remain as-is.  (In our reader, this could
+be changed if, for example, the Z values in the file represented mm values,
+and we want to represent them as m in the storage model).
+
+The options will then be processed elsewhere and will be supplied values from
+the pipeline configuration, etc.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 24-27
+
+This method takes an Options object and populates the reader's private
+variables with values found in the options object.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 24
+   :lines: 29-35
 
-Native readers will use a different set of macros added directly to the
-ReaderFactory.cpp file to register themselves.
+This method registers the various dimensions the reader will use.  In our case,
+we are using the X, Y, and Z built-in dimensions, as well as a custom
+dimension MyData.
 
-.. code-block:: cpp
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 48-52
 
-  MAKE_READER_CREATOR(myreader, pdal::MyReader)
-  REGISTER_READER(myreader, pdal::MyReader);
+This method is called when the Reader is ready for use.  It will only be
+called once, regardless of the number of PointViews that are to be
+processed.
 
-To build up a processing pipeline in this example, we need to create two
-objects: the PointContext and the StageFactory. The latter is used to create
-the various stages that will be used within the reader.
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 55-68
+
+This is a helper function, which will convert a string value into the type
+specified when it's called.  In our example, it will be used to convert
+strings to doubles when reading from the input stream.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 50-51
+   :lines: 71-78
 
-The Reader is created from the StageFactory, and is specified by the stage
-name, in this case an LAS reader. For brevity, we provide the reader a single
-option, the filename of the file to be read.
+This method is the main processing method for the reader.  It takes a
+pointer to a Point View which we will build as we read from the file.  We
+initialize some variables as well, and then reset the input stream with
+the filename used for the reader.  Note that in other readers, the contents
+of this method could be very different depending on the format of the file
+being read, but this should serve as a good start for how to build the
+PointView ojbect.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 53-56
+   :lines: 80-82
 
-The Filter is also created from the StageFactory.  Here, we create a decimation
-filter that will pass every tenth point to subsequent stages. We also specify
-the input to this stage, which is the reader.
+In prepration for reading the file, we prepare to skip some header lines.  In
+our case, the header is only a single line.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 58-62
+   :lines: 83-87
 
-Finally, the Writer is created from the StageFactory. This text writer, takes
-as input the previous stage (the decimation filter) and the output filename as
-its sole option.
+Here we begin our main loop.  In our example file, the first line is a header,
+and each line thereafter is a single point.  If the file had a different format
+the method of looping and reading would have to change as appropriate.  We make
+sure we are skipping the header lines here before moving on.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 64-68
+   :lines: 91-99
 
-The final two steps are to prepare and execute the pipeline. This is achieved
-by calling prepare and execute on the final stage.
+Here we take the line we read in the for block header, split it, and make sure
+that we have the proper number of fields.
 
 .. literalinclude:: ../../examples/writing-reader/MyReader.cpp
    :language: cpp
-   :lines: 69-70
+   :lines: 101-112
+
+Here we take the values we read and put them into the PointView object.  The
+X and Y fields are simply converted from the file and put into the respective
+fields.  MyData is done likewise with the custom dimension we defined.  The Z
+value is read, and multiplied by the scale_z option (defaulted to 1.0), before
+the converted value is put into the field.
+
+When putting the value into the PointView object, we pass in the Dimension
+that we are assigning it to, the ID of the point (which is incremented in
+each iteration of the loop), and the dimension value.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 111-122
+
+Finally, we increment the nextId.  After the loop is done, we set the index
+and number read, and return that value as the number of points read.
+This could differ in cases where we read multiple streams, but that won't
+be covered here.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 124-127
+
+When the read method is finished, the done method is called for any cleanup.
+In this case, we simply make sure the stream is reset.
+
+
+Compiling and Usage
+-------------------------------------------------------------------------------
+The MyReader.cpp code can be compiled.  For this example, we'll use cmake.
+Here is the CMakeLists.txt file we will use:
+
+.. literalinclude:: ../../examples/writing-reader/CMakeLists.txt
+
+If this file is in the directory containing MyReader.hpp and MyReader.cpp,
+simply run ``cmake .``, followed by ``make``.  This will generate a file called
+``libpdal_plugin_reader_myreader.dylib``.
+
+Put this dylib file into the directory pointed to by ``PDAL_DRIVER_PATH``, and
+then when you run ``pdal --drivers``, you should see an entry for
+readers.myreader.
+
+To test the reader, we will put it into a pipeline and output a text file.
+
+Please download the `pipeline-myreader.xml`_ and `test-reader-input.txt`_ files.
+
+In the directory with those two files, run
+``pdal pipeline pipeline-myreader.xml``.  You should have an output file
+called ``output.txt``, which will have the same data as in the input file,
+except in a CSV style format, and with the Z values scaled by .001.
+
+.. _`pipeline-myreader.xml`: https://github.com/PDAL/PDAL/blob/master/examples/writing-reader/pipeline-myreader.xml?raw=true
+.. _`test-reader-input.txt`: https://github.com/PDAL/PDAL/blob/master/examples/writing-reader/test-reader-input.txt?raw=true
diff --git a/doc/tutorial/writing-writer.rst b/doc/tutorial/writing-writer.rst
index 41e6b7a..e93c4c2 100644
--- a/doc/tutorial/writing-writer.rst
+++ b/doc/tutorial/writing-writer.rst
@@ -4,6 +4,11 @@
 Writing a writer
 ===============================================================================
 
+:Authors: Bradley Chambers, Scott Lewis
+:Contact: brad.chambers at gmail.com
+:Date: 11/18/2015
+
+
 PDAL's command-line application can be extended through the development of
 writer functions. In this tutorial, we will give a brief example.
 
@@ -15,89 +20,152 @@ First, we provide a full listing of the writer header.
 .. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
    :language: cpp
 
-In your MyWriter class, you will use two macros defined in Writer.hpp to
-register some useful information about your writer. SET_STAGE_NAME sets the
-writer name and description. These are extracted by the PDAL application to
-inform the user of the writer's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+In your MyWriter class, you will declare the necessary methods and variables
+needed to make the writer work and meet the plugin specifications.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+   :lines: 11
+
+FileStreamPtr is defined to make the declaration of the stream easier to manage
+later on.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+   :lines: 19-21
+
+These three methods are required to fulfill the specs for defining a new plugin.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+   :lines: 23
+
+This method will be used to specify default options for the Writer.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
    :language: cpp
-   :lines: 12
+   :lines: 26-29
 
-SET_STAGE_LINK will provide a link to a webpage that documents the writer.
+These methods are used during various phases of the pipeline.  There are also
+more methods, which will not be covered in this tutorial.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
    :language: cpp
-   :lines: 13
+   :lines: 31-37
+
+These are variables our Writer will use, such as the file to write to, the
+newline character to use, the name of the data field to use to write the MyData
+field, precision of the double outputs, the output stream, and the dimension
+that corresponds to the data field for easier lookup.
+
+As mentioned, there cen be additional configurations done as needed.
 
-The source
+
+The header
 -------------------------------------------------------------------------------
 
-Again, we start with a full listing of the writer source.
+We will start with a full listing of the writer source.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
 
-In your writer implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Writer factory. It is
-only required by plugins.
+In the writer implementation, we will use a macro defined in pdal_macros,
+which is included in the include chain we are using.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 25
+   :lines: 11-16
 
-Native writers will use a different set of macros added directly to the
-WriterFactory.cpp file to register themselves.
+Here we define a struct with information regarding the writer, such as the
+name, a description, and a path to documentation.  We then use the macro
+to create a SHARED plugin, which means it will be external to the main PDAL
+installation.  When using the macro, we specify the version (major and minor),
+the class of the plugin, the class of the parent (Writer, in this case), and
+the struct we defined earlier.
 
-.. code-block:: cpp
+Creating STATIC plugins, which would be part of the main PDAL installation, is
+also possible, but requires some extra steps and will not be covered here.
 
-  MAKE_WRITER_CREATOR(mywriter, pdal::MyWriter)
-  REGISTER_WRITER(mywriter, pdal::MyWriter);
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 20-31
 
-To build up a processing pipeline in this
-example, we need to create two objects: the
-PointContext and the StageFactory. The latter is
-used to create the various stages that will be
-used within the writer.
+This struct is used for helping with the FileStreamPtr for cleanup.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 50-51
+   :lines: 34-44
 
-The Reader is created from the StageFactory, and
-is specified by the stage name, in this case an
-LAS reader. For brevity, we provide the reader a
-single option, the filename of the file to be
-read.
+This method sets various default parameters.  They can be overridden via the
+pipeline, if desired.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 53-56
+   :lines: 47-63
 
-The Filter is also created from the StageFactory.
-Here, we create a decimation filter that will
-pass every tenth point to subsequent stages. We
-also specify the input to this stage, which is
-the reader.
+This method processes the options, including the default options given, and in
+this case also opens the output file stream for use.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 58-62
+   :lines: 66-82
 
-Finally, the Writer is created from the
-StageFactory. This text writer, takes as input
-the previous stage (the decimation filter) and
-the output filename as its sole option.
+The ready method is used to prepare the writer for any number of PointViews that
+may be passed in.  In this case, we are setting the precision for our double
+writes, looking up the dimension specified as the one to write into MyData,
+and writing the header of the output file.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 64-68
-
-The final two steps are to prepare and execute
-the pipeline. This is achieved by calling prepare
-and execute on the final stage.
+   :lines: 85-101
+
+This method is the main method for writing.  In our case, we are writing a very
+simple file, with data in the format of X:Y:Z:MyData.  We loop through each
+index in the PointView, and for each one we take the X, Y, and Z values, as well
+as the value for the specified MyData dimension, and write this to the output
+file.   In particular, note the reading of MyData; in our case, MyData is an
+integer, but the field we are reading might be a double.  Converting from double
+to integer is done via truncation, not rounding, so by adding .5 before making
+the conversion will ensure rounding is done properly.
+
+Note that in this case, the output format is pretty simple.  For more complex
+outputs, you may need to generate helper methods (and possibly helper classes)
+to help generate the proper output.  The key is reading in the appropriate
+values from the PointView, and then writing those in whatever necessary format
+to the output stream.
 
 .. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
    :language: cpp
-   :lines: 69-70
+   :lines: 104-107
+
+This method is called when the writing is done.  In this case, it simply cleans
+up the output stream by resetting it.
+
+
+Compiling and Usage
+-------------------------------------------------------------------------------
+To compile this reader, we will use cmake.  Here is the CMakeLists.txt file we
+will use for this process:
+
+.. literalinclude:: ../../examples/writing-writer/CMakeLists.text
+
+If this file is in the directory with the MyWriter.hpp and MyWriter.cpp files,
+simply run ``cmake .`` followed by ``make``.  This will generate a file called
+``libpdal_plugin_writer_mywriter.dylib``.
+
+Put this dylib file into the directory pointed to by ``PDAL_DRIVER_PATH``, and
+then when you run ``pdal --drivers``, you will see an entry for
+writers.mywriter.
+
+To test the writer, we will put it into a pipeline and read in a LAS file and
+covert it to our output format.  For this example, use `interesting.las`_, and
+run it through `pipeline-mywriter.xml`_.
+
+If those files are in the same directory, you would just run the command
+``pdal pipeline pipeline-mywriter.xml``, and it will generate an output file
+called output.txt, which will be in the proper format.  From there, if you
+wanted, you could run that output file through the MyReader that was created
+in the previous tutorial, as well.
+
+.. _`interesting.las`: https://github.com/PDAL/PDAL/blob/master/test/data/interesting.las?raw=true
+.. _`pipeline_mywriter.xml`: https://github.com/PDAL/PDAL/blob/master/examples/writing-writer/pipeline-mywriter.xml?raw=true
\ No newline at end of file
diff --git a/doc/tutorial/writing.rst b/doc/tutorial/writing.rst
index 9103d7e..5e38c2a 100644
--- a/doc/tutorial/writing.rst
+++ b/doc/tutorial/writing.rst
@@ -4,13 +4,18 @@
 Writing with PDAL
 =====================
 
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
 This tutorial will describe a complete example of using PDAL C++ objects to write
 a LAS file. The example will show fetching data from your own data source rather than
 interacting with a :ref:`reader stage <stage_index>`.
 
 .. note::
 
-     If you implement your own :ref:`reader <stage_index>` that conforms to
+     If you implement your own :ref:`readers` that conforms to
      PDAL's :cpp:class:`pdal::Stage`, you can implement a simple read-filter-write
      pipeline using :ref:`pipeline` and not have to code anything explicit
      yourself.
@@ -45,11 +50,14 @@ z dimensions.
 
 .. literalinclude:: ../../examples/writing/tutorial.cpp
    :language: cpp
-   :lines: 32-41
+   :lines: 33-42
+
+Finally, the main code which creates the dummy data, puts it into a BufferReader
+and sends it to a writer.
 
 .. literalinclude:: ../../examples/writing/tutorial.cpp
    :language: cpp
-   :lines: 43-70
+   :lines: 45-74
 
 Compiling and running the program
 -------------------------------------------------------------------------------
@@ -84,5 +92,3 @@ After the project is built, you can run it by typing:
 .. code-block:: bash
 
   $ ./tutorial
-
-
diff --git a/doc/vagrant.rst b/doc/vagrant.rst
index c9cf98b..f23e5af 100644
--- a/doc/vagrant.rst
+++ b/doc/vagrant.rst
@@ -1,29 +1,30 @@
 .. _vagrant:
 
 ******************************************************************************
-Getting Started with PDAL using `Vagrant`_ and `VirtualBox`_
+Vagrant
 ******************************************************************************
 
-
 :Author: Howard Butler
-:Contact: hobu.inc at gmail dot com
-:Date: 11/04/2013
+:Contact: howard at hobu.co
+:Date: 10/27/2015
+
+.. index:: Vagrant
 
 Introduction
 ------------------------------------------------------------------------------
 
-Because of PDAL's relatively short lifespan, there are not so many 
-distributions and packaging solutions that have it available. This means that 
-prospective users of PDAL are pretty much on their own to build up PDAL 
-and use it. Folks who've climbed this mountain with other well-entangled 
-software like `GDAL`_, `MapServer`_, or `Mapnik`_ should be able to manage 
-the compilation challenges listed in the full set of dependencies in :ref:`building_unix`.
-
-For everyone else, suffering all of the compilation challenges, including 
-at least three different build systems is simply too much. "Give me a 
-binary and be done with it," they might ask, and for them, there is an 
-answer. Surrender the requirement of running PDAL in your own customized 
-system for the buildout of PDAL on a known quantity -- a pre-configured 
+Because of PDAL's relatively short lifespan, there are not so many
+distributions and packaging solutions that have it available. This means that
+prospective users of PDAL are pretty much on their own to build up PDAL and use
+it. Folks who've climbed this mountain with other well-entangled software like
+`GDAL`_, `MapServer`_, or `Mapnik`_ should be able to manage the compilation
+challenges listed in the full set of dependencies in :ref:`building_unix`.
+
+For everyone else, suffering all of the compilation challenges, including
+at least three different build systems is simply too much. "Give me a
+binary and be done with it," they might ask, and for them, there is an
+answer. Surrender the requirement of running PDAL in your own customized
+system for the buildout of PDAL on a known quantity -- a pre-configured
 virtual machine.
 
 Installation
@@ -31,34 +32,34 @@ Installation
 
 .. note::
 
-    This document assumes you are starting with a basic Macintosh system 
-    because this is the only system the author assumes people could 
-    ever want to run :). This document has not been tested on any other 
-    platforms, but it is expected that things should work if you're 
+    This document assumes you are starting with a basic Macintosh system
+    because this is the only system the author assumes people could
+    ever want to run :). This document has not been tested on any other
+    platforms, but it is expected that things should work if you're
     starting from Windows or some Linux.
 
-`Vagrant`_ is configuration management for virtual machines. Its focus is 
-on reproducibility of configuration. The idea is to codify the configuration 
-using simple text files, press a button, and out spits a fully configured 
-virtual machine with the specified options. And for the most part, this is 
+`Vagrant`_ is configuration management for virtual machines. Its focus is
+on reproducibility of configuration. The idea is to codify the configuration
+using simple text files, press a button, and out spits a fully configured
+virtual machine with the specified options. And for the most part, this is
 what actually happens.
 
-`Vagrant`_ is simply the configuration management software, however. `VirtualBox`_ 
-is the virtual machine container. These two tools are used in concert, 
+`Vagrant`_ is simply the configuration management software, however. `VirtualBox`_
+is the virtual machine container. These two tools are used in concert,
 and both are required to complete this tutorial.
 
 1) Download and install `VirtualBox <https://www.virtualbox.org/wiki/Downloads>`__.
 2) Download and install `Vagrant <http://downloads.vagrantup.com/>`__.
 3) Clone PDAL to your environment:
-  
+
     ::
-  
+
         $ git clone https://github.com/PDAL/PDAL.git
 
 4) Execute the vagrant configuration:
 
     ::
-    
+
         vagrant up
 
 5) Wait ...
@@ -67,7 +68,7 @@ and both are required to complete this tutorial.
 8) Look for the following when it's all done:
 
     ::
-    
+
         vagrant at pdal-development:~$ pdal info --input readpgpointcloud.xml -p 0
         {
             "X": "560974.95000000007",
@@ -89,14 +90,14 @@ and both are required to complete this tutorial.
             "PointID": "772536",
             "BlockID": "0"
         }
-        
+
 9) Start playing around:
 
     ::
-        
+
         $ vagrant ssh
         $ pdal
-        
+
         ------------------------------------------------------------------------------------------
         pdal (PDAL 0.9.9 (b632df) with GeoTIFF 1.4.0 GDAL 1.11dev LASzip 2.1.0 System )
         ------------------------------------------------------------------------------------------
@@ -105,26 +106,27 @@ and both are required to complete this tutorial.
              - pipeline
              - query
              - translate
-        
+
 What you get
 ------------------------------------------------------------------------------
 
-The `Vagrant`_ configuration that PDAL provides contains nearly 
-every possible feature except for `Oracle Point Cloud`_ support. Things it 
+The `Vagrant`_ configuration that PDAL provides contains nearly
+every possible feature except for `Oracle Point Cloud`_ support. Things it
 includes are:
 
 * Full `pgpointcloud`_ support including example database
 * :ref:`filters.hexbin`
-* :ref:`filters.reprojection` 
-* :ref:`readers.nitf` and :ref:`writers.nitf` 
+* :ref:`filters.reprojection`
+* :ref:`readers.nitf` and :ref:`writers.nitf`
 * `LASzip`_ support in :ref:`readers.las` and :ref:`writers.las`
 * Interpolation with `Points2Grid`_ using :ref:`writers.p2g`
 * Python manipulation using :ref:`filters.predicate` and :ref:`filters.programmable`
 * `PCL`_ support via :ref:`filters.pclblock`, :ref:`readers.pcd`,
   :ref:`writers.pcd`, :ref:`ground_command`, and :ref:`pcl_command`
+* :ref:`writers.geowave`
 
-Head to :ref:`pipeline` for more information on using PDAL pipelines. Two pipelines 
-are provided in ``/home/vagrant`` that are used to load the ``st-helens-small.las`` 
+Head to :ref:`pipeline` for more information on using PDAL pipelines. Two pipelines
+are provided in ``/home/vagrant`` that are used to load the ``st-helens-small.las``
 file into `pgpointcloud`_.
 
 .. _`Points2Grid`: https://github.com/CRREL/points2grid
diff --git a/examples/writing-filter/MyFilter.cpp b/examples/writing-filter/MyFilter.cpp
index f8ef958..0ec98d6 100644
--- a/examples/writing-filter/MyFilter.cpp
+++ b/examples/writing-filter/MyFilter.cpp
@@ -4,26 +4,47 @@
 
 #include <pdal/Options.hpp>
 #include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
 #include <pdal/StageFactory.hpp>
 
-CREATE_FILTER_PLUGIN(myfilter, MyFilter)
+namespace pdal
+{
+
+static PluginInfo const s_info =
+    PluginInfo("filters.name", "My awesome filter",
+               "http://link/to/documentation");
+
+CREATE_STATIC_PLUGIN(1, 0, MyFilter, Filter, s_info)
+
+std::string MyFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options MyFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("param", 1.0, "My parameter");
+    return options;
+}
 
 void MyFilter::processOptions(const pdal::Options& options)
 {
-  m_value = options.getValueOrDefault<double>("param", 1.0);
+    m_value = options.getValueOrDefault<double>("param", 1.0);
 }
 
-void MyFilter::addDimensions(PointContextRef ctx)
+void MyFilter::addDimensions(PointLayoutPtr layout)
 {
-  ctx.registerDim(pdal::Dimension::Id::Intensity);
+    layout->registerDim(Dimension::Id::Intensity);
+    m_myDimension = layout->registerOrAssignDim("MyDimension", Dimension::Type::Unsigned8);
 }
 
-PointBufferSet MyFilter::run(PointBufferPtr input)
+PointViewSet MyFilter::run(PointViewPtr input)
 {
-  PointBufferSet pbSet;
-  pbSet.insert(input);
-  return pbSet;
+    PointViewSet viewSet;
+    viewSet.insert(input);
+    return viewSet;
 }
 
+} // namespace pdal
diff --git a/examples/writing-filter/MyFilter.hpp b/examples/writing-filter/MyFilter.hpp
index cc1fa9f..9ff3cae 100644
--- a/examples/writing-filter/MyFilter.hpp
+++ b/examples/writing-filter/MyFilter.hpp
@@ -6,34 +6,36 @@
 #include <pdal/Stage.hpp>
 
 #include <memory>
-#include <set>
 
 namespace pdal
 {
-class Options;
-class PointBuffer;
-class PointContext;
-}
 
-typedef std::shared_ptr<pdal::PointBuffer> PointBufferPtr;
-typedef std::set<PointBufferPtr> PointBufferSet;
-typedef PointContext PointContextRef;
+class Options;
+class PointLayout;
+class PointView;
 
-class MyFilter : public pdal::Filter
+class PDAL_DLL MyFilter : public Filter
 {
 public:
-  SET_STAGE_NAME ("filters.name", "My Awesome Filter")
-  SET_STAGE_LINK ("http://link/to/documentation")
-  SET_PLUGIN_VERSION("1.0.0")
+    MyFilter() : Filter()
+    {}
 
-  MyFilter() : Filter() {};
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
 
 private:
-  virtual void addDimensions(PointContextRef ctx);
-  virtual void processOptions(const Options& options);
-  virtual PointBufferSet run(PointBufferPtr buf);
+    double m_value;
+    Dimension::Id::Enum m_myDimension;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
+    virtual PointViewSet run(PointViewPtr view);
 
-  MyFilter& operator=(const MyFilter&); // not implemented
-  MyFilter(const MyFilter&); // not implemented
+    MyFilter& operator=(const MyFilter&); // not implemented
+    MyFilter(const MyFilter&); // not implemented
 };
 
+} // namespace pdal
diff --git a/examples/writing-kernel/MyKernel.cpp b/examples/writing-kernel/MyKernel.cpp
index 693ba36..7a7430f 100644
--- a/examples/writing-kernel/MyKernel.cpp
+++ b/examples/writing-kernel/MyKernel.cpp
@@ -10,64 +10,75 @@
 #include <pdal/KernelSupport.hpp>
 #include <pdal/Options.hpp>
 #include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Reader.hpp>
 #include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
+#include <pdal/PointTable.hpp>
 
 #include <memory>
 #include <string>
 
 namespace po = boost::program_options;
 
-CREATE_KERNEL_PLUGIN(mykernel, MyKernel)
-
-void MyKernel::validateSwitches()
-{
-  if (m_input_file == "")
-    throw pdal::app_usage_error("--input/-i required");
-  if (m_output_file == "")
-    throw pdal::app_usage_error("--output/-o required");
-}
-
-void MyKernel::addSwitches()
-{
-  po::options_description* options = new po::options_description("file options");
-  options->add_options()
-  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
-  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
-  ;
-
-  addSwitchSet(options);
-  addPositionalSwitch("input", 1);
-  addPositionalSwitch("output", 1);
-}
-
-int MyKernel::execute()
-{
-  pdal::PointContextRef ctx;
-  pdal::StageFactory f;
-
-  std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
-  pdal::Options readerOptions;
-  readerOptions.add("filename", m_input_file);
-  reader->setOptions(readerOptions);
-
-  std::unique_ptr<pdal::Filter> filter(f.createFilter("filters.decimation"));
-  pdal::Options filterOptions;
-  filterOptions.add("step", 10);
-  filter->setOptions(filterOptions);
-  filter->setInput(reader.get());
-
-  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
-  pdal::Options writerOptions;
-  writerOptions.add("filename", m_output_file);
-  writer->setOptions(writerOptions);
-  writer->setInput(filter.get());
-  writer->prepare(ctx);
-  writer->execute(ctx);
-
-  return 0;
-}
+namespace pdal {
 
+  static PluginInfo const s_info {
+    "kernels.mykernel",
+    "MyKernel",
+    "http://link/to/documentation"
+  };
+
+  CREATE_SHARED_PLUGIN(1, 0, MyKernel, Kernel, s_info);
+
+  std::string MyKernel::getName() const { return s_info.name; }
+
+  MyKernel::MyKernel() : Kernel()
+  {}
+
+  void MyKernel::validateSwitches()
+  {
+    if (m_input_file == "")
+      throw pdal::app_usage_error("--input/-i required");
+    if (m_output_file == "")
+      throw pdal::app_usage_error("--output/-o required");
+  }
+
+  void MyKernel::addSwitches()
+  {
+    po::options_description* options = new po::options_description("file options");
+    options->add_options()
+    ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+    ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+    ;
+
+    addSwitchSet(options);
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+  }
+
+  int MyKernel::execute()
+  {
+    PointTable table;
+    StageFactory f;
+
+    Stage * reader = f.createStage("readers.las");
+    Options readerOptions;
+    readerOptions.add("filename", m_input_file);
+    reader->setOptions(readerOptions);
+
+    Stage * filter = f.createStage("filters.decimation");
+    Options filterOptions;
+    filterOptions.add("step", 10);
+    filter->setOptions(filterOptions);
+    filter->setInput(*reader);
+
+    Stage * writer = f.createStage("writers.text");
+    Options writerOptions;
+    writerOptions.add("filename", m_output_file);
+    writer->setOptions(writerOptions);
+    writer->setInput(*filter);
+    writer->prepare(table);
+    writer->execute(table);
+
+    return 0;
+  }
+
+} // namespace pdal
diff --git a/examples/writing-kernel/MyKernel.hpp b/examples/writing-kernel/MyKernel.hpp
index 4f6f22b..1ba5a7a 100644
--- a/examples/writing-kernel/MyKernel.hpp
+++ b/examples/writing-kernel/MyKernel.hpp
@@ -3,23 +3,28 @@
 #pragma once
 
 #include <pdal/Kernel.hpp>
+#include <pdal/plugin.hpp>
 
 #include <string>
 
-class MyKernel : public pdal::Kernel
+namespace pdal
 {
-public:
-  SET_KERNEL_NAME ("MyKernel", "My Awesome Kernel")
-  SET_KERNEL_LINK ("http://link/to/documentation")
 
-  MyKernel() : Kernel() {};
-  int execute();
+  class PDAL_DLL MyKernel : public Kernel
+  {
+  public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute(); // override
 
-private:
-  void validateSwitches();
-  void addSwitches();
+  private:
+    MyKernel();
+    void validateSwitches();
+    void addSwitches();
 
-  std::string m_input_file;
-  std::string m_output_file;
-};
+    std::string m_input_file;
+    std::string m_output_file;
+  };
 
+} // namespace pdal
diff --git a/examples/writing-reader/MyReader.cpp b/examples/writing-reader/MyReader.cpp
index 3419593..91a486f 100644
--- a/examples/writing-reader/MyReader.cpp
+++ b/examples/writing-reader/MyReader.cpp
@@ -2,72 +2,128 @@
 
 #include "MyReader.hpp"
 
-#include <boost/program_options.hpp>
+namespace pdal
+{
+  static PluginInfo const s_info = PluginInfo(
+    "readers.myreader",
+    "My Awesome Reader",
+    "http://link/to/documentation" );
 
-#include <pdal/Reader.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/KernelFactory.hpp>
-#include <pdal/KernelSupport.hpp>
-#include <pdal/Options.hpp>
-#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Reader.hpp>
-#include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
+  CREATE_SHARED_PLUGIN(1, 0, MyReader, Reader, s_info)
 
-#include <memory>
-#include <string>
+  std::string MyReader::getName() const { return s_info.name; }
 
-namespace po = boost::program_options;
+  Options MyReader::getDefaultOptions()
+  {
+    Options options;
+    Option z_scale("z_scale", 1.0);
+    options.add(z_scale);
+    return options;
+  }
 
-CREATE_FILTER_PLUGIN(myfilter, MyReader)
+  void MyReader::processOptions(const Options& options)
+  {
+    m_scale_z = options.getValueOrDefault<double>("z_scale", 1.0);
+  }
 
-void MyReader::validateSwitches()
-{
-  if (m_input_file == "")
-    throw pdal::app_usage_error("--input/-i required");
-  if (m_output_file == "")
-    throw pdal::app_usage_error("--output/-o required");
-}
+  void MyReader::addDimensions(PointLayoutPtr layout)
+  {
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+    layout->registerOrAssignDim("MyData", Dimension::Type::Unsigned64);
+  }
 
-void MyReader::addSwitches()
-{
-  po::options_description* options = new po::options_description("file options");
-  options->add_options()
-  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
-  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
-  ;
-
-  addSwitchSet(options);
-  addPositionalSwitch("input", 1);
-  addPositionalSwitch("output", 1);
-}
-
-int MyReader::execute()
-{
-  pdal::PointContextRef ctx;
-  pdal::StageFactory f;
-
-  std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
-  pdal::Options readerOptions;
-  readerOptions.add("filename", m_input_file);
-  reader->setOptions(readerOptions);
-
-  std::unique_ptr<pdal::Reader> filter(f.createReader("filters.decimation"));
-  pdal::Options filterOptions;
-  filterOptions.add("step", 10);
-  filter->setOptions(filterOptions);
-  filter->setInput(reader.get());
-
-  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
-  pdal::Options writerOptions;
-  writerOptions.add("filename", m_output_file);
-  writer->setOptions(writerOptions);
-  writer->setInput(filter.get());
-  writer->prepare(ctx);
-  writer->execute(ctx);
-
-  return 0;
-}
+  Dimension::IdList MyReader::getDefaultDimensions()
+  {
+    Dimension::IdList ids;
+
+    ids.push_back(Dimension::Id::X);
+    ids.push_back(Dimension::Id::Y);
+    ids.push_back(Dimension::Id::Z);
+
+    return ids;
+  }
+
+  void MyReader::ready(PointTableRef)
+  {
+    SpatialReference ref("EPSG:4385");
+    setSpatialReference(ref);
+  }
+
+
+  template <typename T>
+  T convert(const StringList& s, const std::string& name, size_t fieldno)
+  {
+      T output;
+      bool bConverted = Utils::fromString(s[fieldno], output);
+      if (!bConverted)
+      {
+          std::stringstream oss;
+          oss << "Unable to convert " << name << ", " << s[fieldno] << ", to double";
+          throw pdal_error(oss.str());
+      }
+
+      return output;
+  }
+
+
+  point_count_t MyReader::read(PointViewPtr view, point_count_t count)
+  {
+    PointLayoutPtr layout = view->layout();
+    PointId nextId = view->size();
+    PointId idx = m_index;
+    point_count_t numRead = 0;
+
+    m_stream.reset(new ILeStream(m_filename));
+
+    size_t HEADERSIZE(1);
+    size_t skip_lines(std::max(HEADERSIZE, (size_t)m_index));
+    size_t line_no(1);
+    for (std::string line; std::getline(*m_stream->stream(), line); line_no++)
+    {
+      if (line_no <= skip_lines)
+      {
+        continue;
+      }
+
+      // MyReader format:  X::Y::Z::Data
+      StringList s = Utils::split2(line, ':');
+
+      unsigned long u64(0);
+      if (s.size() != 4)
+      {
+        std::stringstream oss;
+        oss << "Unable to split proper number of fields.  Expected 4, got " << s.size();
+        throw pdal_error(oss.str());
+      }
+
+      std::string name("X");
+      view->setField(Dimension::Id::X, nextId, convert<double>(s, name, 0));
+
+      name = "Y";
+      view->setField(Dimension::Id::Y, nextId, convert<double>(s, name, 1));
+
+      name = "Z";
+      double z = convert<double>(s, name, 2) * m_scale_z;
+      view->setField(Dimension::Id::Z, nextId, z);
+
+      name = "MyData";
+      view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 3));
+
+      nextId++;
+      if (m_cb)
+        m_cb(*view, nextId);
+    }
+    m_index = nextId;
+    numRead = nextId;
+
+    return numRead;
+  }
+
+  void MyReader::done(PointTableRef)
+  {
+    m_stream.reset();
+  }
 
+} //namespace pdal
diff --git a/examples/writing-reader/MyReader.hpp b/examples/writing-reader/MyReader.hpp
index 46ba8f0..8fd9f88 100644
--- a/examples/writing-reader/MyReader.hpp
+++ b/examples/writing-reader/MyReader.hpp
@@ -2,24 +2,33 @@
 
 #pragma once
 
-#include "Reader.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
 
-#include <string>
-
-class MyReader : public pdal::Reader
+namespace pdal
 {
-public:
-  SET_STAGE_NAME ("MyReader", "My Awesome Reader")
-  SET_STAGE_LINK ("http://link/to/documentation")
-
-  MyReader() : Reader() {};
-  int execute();
-
-private:
-  void validateSwitches();
-  void addSwitches();
-
-  std::string m_input_file;
-  std::string m_output_file;
-};
-
+  class MyReader : public Reader
+  {
+  public:
+    MyReader() : Reader() {};
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions();
+
+  private:
+    std::unique_ptr<ILeStream> m_stream;
+    point_count_t m_index;
+    double m_scale_z;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+  };
+}
diff --git a/examples/writing-reader/pipeline-myreader.xml b/examples/writing-reader/pipeline-myreader.xml
new file mode 100644
index 0000000..5ac244b
--- /dev/null
+++ b/examples/writing-reader/pipeline-myreader.xml
@@ -0,0 +1,16 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+  <Writer type="writers.text">
+    <Option name="filename">
+      output.txt
+    </Option>
+    <Reader type="readers.myreader">
+      <Option name="filename">
+        test-reader-input.txt
+      </Option>
+      <Option name="z_scale">
+        .001
+      </Option>
+    </Reader>
+  </Writer>
+</Pipeline>
diff --git a/examples/writing-reader/test-reader-input.txt b/examples/writing-reader/test-reader-input.txt
new file mode 100644
index 0000000..0544525
--- /dev/null
+++ b/examples/writing-reader/test-reader-input.txt
@@ -0,0 +1,16 @@
+#X:Y:Z:MyData
+1:1:1000:99
+1:2:1000:98
+1:3:1100:99
+1:4:1050:50
+1:5:1055:98
+2:5:1000:99
+2:4:1111:99
+2:3:1500:50
+2:2:1200:55
+2:1:1210:95
+3:1:1500:25
+3:2:1100:99
+3:3:1100:98
+3:4:1000:97
+3:5:1000:93
diff --git a/examples/writing-writer/MyWriter.cpp b/examples/writing-writer/MyWriter.cpp
index 6d92281..a344991 100644
--- a/examples/writing-writer/MyWriter.cpp
+++ b/examples/writing-writer/MyWriter.cpp
@@ -4,70 +4,106 @@
 
 #include <boost/program_options.hpp>
 
-#include <pdal/Writer.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/KernelFactory.hpp>
-#include <pdal/KernelSupport.hpp>
-#include <pdal/Options.hpp>
-#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Writer.hpp>
-#include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
-
-#include <memory>
-#include <string>
-
 namespace po = boost::program_options;
 
-CREATE_FILTER_PLUGIN(myfilter, MyWriter)
-
-void MyWriter::validateSwitches()
+namespace pdal
 {
-  if (m_input_file == "")
-    throw pdal::app_usage_error("--input/-i required");
-  if (m_output_file == "")
-    throw pdal::app_usage_error("--output/-o required");
-}
+  static PluginInfo const s_info = PluginInfo(
+    "writers.mywriter",
+    "My Awesome Writer",
+    "http://path/to/documentation" );
 
-void MyWriter::addSwitches()
-{
-  po::options_description* options = new po::options_description("file options");
-  options->add_options()
-  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
-  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
-  ;
-
-  addSwitchSet(options);
-  addPositionalSwitch("input", 1);
-  addPositionalSwitch("output", 1);
-}
+  CREATE_SHARED_PLUGIN(1, 0, MyWriter, Writer, s_info);
 
-int MyWriter::execute()
-{
-  pdal::PointContextRef ctx;
-  pdal::StageFactory f;
-
-  std::unique_ptr<pdal::Writer> reader(f.createWriter("readers.las"));
-  pdal::Options readerOptions;
-  readerOptions.add("filename", m_input_file);
-  reader->setOptions(readerOptions);
-
-  std::unique_ptr<pdal::Writer> filter(f.createWriter("filters.decimation"));
-  pdal::Options filterOptions;
-  filterOptions.add("step", 10);
-  filter->setOptions(filterOptions);
-  filter->setInput(reader.get());
-
-  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
-  pdal::Options writerOptions;
-  writerOptions.add("filename", m_output_file);
-  writer->setOptions(writerOptions);
-  writer->setInput(filter.get());
-  writer->prepare(ctx);
-  writer->execute(ctx);
-
-  return 0;
-}
+  std::string MyWriter::getName() const { return s_info.name; }
+
+  struct FileStreamDeleter
+  {
+    template <typename T>
+    void operator()(T* ptr)
+    {
+      if (ptr)
+      {
+        ptr->flush();
+        FileUtils::closeFile(ptr);
+      }
+    }
+  };
+
+
+  Options MyWriter::getDefaultOptions()
+  {
+    Options options;
+
+    options.add("newline", "\n", "Newline character to use for additional lines");
+    options.add("filename", "", "filename to write output to");
+    options.add("datafield", "", "field to use as the User Data field");
+    options.add("precision", 3, "Precision to use for data fields");
+
+    return options;
+  }
+
+
+  void MyWriter::processOptions(const Options& options)
+  {
+    m_filename = options.getValueOrThrow<std::string>("filename");
+    m_stream = FileStreamPtr(FileUtils::createFile(m_filename, true),
+      FileStreamDeleter());
+    if (!m_stream)
+    {
+      std::stringstream out;
+      out << "writers.mywriter couldn't open '" << m_filename <<
+        "' for output.";
+      throw pdal_error(out.str());
+    }
 
+    m_newline = options.getValueOrDefault<std::string>("newline", "\n");
+    m_datafield = options.getValueOrDefault<std::string>("datafield", "UserData");
+    m_precision = options.getValueOrDefault<int>("precision", 3);
+  }
+
+
+  void MyWriter::ready(PointTableRef table)
+  {
+    m_stream->precision(m_precision);
+    *m_stream << std::fixed;
+
+    Dimension::Id::Enum d = table.layout()->findDim(m_datafield);
+    if (d == Dimension::Id::Unknown)
+    {
+      std::ostringstream oss;
+      oss << "Dimension not found with name '" << m_datafield << "'";
+      throw pdal_error(oss.str());
+    }
+
+    m_dataDim = d;
+
+    *m_stream << "#X:Y:Z:MyData" << m_newline;
+  }
+
+
+  void MyWriter::write(PointViewPtr view)
+  {
+      for (PointId idx = 0; idx < view->size(); ++idx)
+      {
+        double x = view->getFieldAs<double>(Dimension::Id::X, idx);
+        double y = view->getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = view->getFieldAs<double>(Dimension::Id::Z, idx);
+        unsigned int myData = 0;
+
+        if (!m_datafield.empty()) {
+          myData = (int)(view->getFieldAs<double>(m_dataDim, idx) + 0.5);
+        }
+
+        *m_stream << x << ":" << y << ":" << z << ":"
+          << myData << m_newline;
+      }
+  }
+
+
+  void MyWriter::done(PointTableRef)
+  {
+    m_stream.reset();
+  }
+
+}
diff --git a/examples/writing-writer/MyWriter.hpp b/examples/writing-writer/MyWriter.hpp
index 23f86ae..977894d 100644
--- a/examples/writing-writer/MyWriter.hpp
+++ b/examples/writing-writer/MyWriter.hpp
@@ -2,24 +2,39 @@
 
 #pragma once
 
-#include "Writer.hpp"
+#include <pdal/Writer.hpp>
 
 #include <string>
 
-class MyWriter : public pdal::Writer
-{
-public:
-  SET_STAGE_NAME ("MyWriter", "My Awesome Writer")
-  SET_STAGE_LINK ("http://link/to/documentation")
+namespace pdal{
 
-  MyWriter() : Writer() {};
-  int execute();
+  typedef std::shared_ptr<std::ostream> FileStreamPtr;
 
-private:
-  void validateSwitches();
-  void addSwitches();
+  class MyWriter : public Writer
+  {
+  public:
+    MyWriter()
+    {}
 
-  std::string m_input_file;
-  std::string m_output_file;
-};
+    static void  * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
 
+    Options getDefaultOptions();
+
+  private:
+    virtual void processOptions(const Options&);
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    std::string m_filename;
+    std::string m_newline;
+    std::string m_datafield;
+    int m_precision;
+
+    FileStreamPtr m_stream;
+    Dimension::Id::Enum m_dataDim;
+  };
+
+} // namespace pdal
diff --git a/examples/writing-writer/pipeline-mywriter.xml b/examples/writing-writer/pipeline-mywriter.xml
new file mode 100644
index 0000000..20d913b
--- /dev/null
+++ b/examples/writing-writer/pipeline-mywriter.xml
@@ -0,0 +1,19 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+  <Writer type="writers.mywriter">
+    <Option name="filename">
+      output.txt
+    </Option>
+    <Option name="datafield">
+      Intensity
+    </Option>
+    <Option name="precision">
+      0
+    </Option>
+    <Reader type="readers.las">
+      <Option name="filename">
+        interesting.las
+      </Option>
+    </Reader>
+  </Writer>
+</Pipeline>
diff --git a/examples/writing/tutorial.cpp b/examples/writing/tutorial.cpp
index bf814c6..584b3fe 100644
--- a/examples/writing/tutorial.cpp
+++ b/examples/writing/tutorial.cpp
@@ -1,8 +1,9 @@
 #include <pdal/PointView.hpp>
 #include <pdal/BufferReader.hpp>
-#include <pdal/Pointtable->hpp>
+#include <pdal/PointTable.hpp>
 #include <pdal/Dimension.hpp>
 #include <pdal/Options.hpp>
+#include <pdal/StageFactory.hpp>
 
 #include <vector>
 
@@ -49,9 +50,9 @@ int main(int argc, char* argv[])
     options.add("filename", "myfile.las");
 
     PointTable table;
-    table.registerDim(Dimension::Id::X);
-    table.registerDim(Dimension::Id::Y);
-    table.registerDim(Dimension::Id::Z);
+    table.layout()->registerDim(Dimension::Id::X);
+    table.layout()->registerDim(Dimension::Id::Y);
+    table.layout()->registerDim(Dimension::Id::Z);
 
     {
         PointViewPtr view(new PointView(table));
@@ -59,14 +60,15 @@ int main(int argc, char* argv[])
         std::vector<Point> data = getMyData();
         fillView(view, data);
 
-        BufferReader reader;
-        reader.addView(view);
+        BufferReader *reader = new BufferReader();
+        reader->addView(view);
 
-        LasWriter writer;
+        StageFactory factory;
+        Stage *writer = factory.createStage("writers.las");
 
-        writer.setInput(&reader);
-        writer.setOptions(options);
-        writer.prepare(table);
-        writer.execute(table);
+        writer->setInput(*reader);
+        writer->setOptions(options);
+        writer->prepare(table);
+        writer->execute(table);
     }
 }
diff --git a/filters/CMakeLists.txt b/filters/CMakeLists.txt
index 8dc67d4..5756f60 100644
--- a/filters/CMakeLists.txt
+++ b/filters/CMakeLists.txt
@@ -2,9 +2,11 @@ add_subdirectory(chipper)
 add_subdirectory(colorization)
 add_subdirectory(crop)
 add_subdirectory(decimation)
+add_subdirectory(divider)
 add_subdirectory(ferry)
 add_subdirectory(merge)
 add_subdirectory(mortonorder)
+add_subdirectory(randomize)
 add_subdirectory(range)
 add_subdirectory(reprojection)
 add_subdirectory(sort)
diff --git a/filters/colorization/ColorizationFilter.cpp b/filters/colorization/ColorizationFilter.cpp
index 96767fb..57747f8 100644
--- a/filters/colorization/ColorizationFilter.cpp
+++ b/filters/colorization/ColorizationFilter.cpp
@@ -54,15 +54,6 @@ CREATE_STATIC_PLUGIN(1, 0, ColorizationFilter, Filter, s_info)
 
 std::string ColorizationFilter::getName() const { return s_info.name; }
 
-struct GDALSourceDeleter
-{
-    template <typename T>
-    void operator()(T* ptr)
-    {
-        ::GDALClose(ptr);
-    }
-};
-
 
 void ColorizationFilter::initialize()
 {
@@ -74,72 +65,104 @@ Options ColorizationFilter::getDefaultOptions()
 {
     Options options;
 
-    pdal::Option red("dimension", "Red", "");
-    pdal::Option b0("band",1, "");
-    pdal::Option s0("scale", 1.0f, "scale factor for this dimension");
-    pdal::Options redO;
-    redO.add(b0);
-    redO.add(s0);
-    red.setOptions(redO);
-
-    pdal::Option green("dimension", "Green", "");
-    pdal::Option b1("band",2, "");
-    pdal::Option s1("scale", 1.0f, "scale factor for this dimension");
-    pdal::Options greenO;
-    greenO.add(b1);
-    greenO.add(s1);
-    green.setOptions(greenO);
-
-    pdal::Option blue("dimension", "Blue", "");
-    pdal::Option b2("band",3, "");
-    pdal::Option s2("scale", 1.0f, "scale factor for this dimension");
-    pdal::Options blueO;
-    blueO.add(b2);
-    blueO.add(s2);
-    blue.setOptions(blueO);
-
-    pdal::Option reproject("reproject", false,
-        "Reproject the input data into the same coordinate system as "
-        "the raster?");
-
-    options.add(red);
-    options.add(green);
-    options.add(blue);
-    options.add(reproject);
+    options.add("dimensions", "Red:1:1.0, Green:2:1.0, Blue:3");
 
     return options;
 }
 
+namespace
+{
 
-void ColorizationFilter::processOptions(const Options& options)
+ColorizationFilter::BandInfo parseDim(const std::string& dim,
+    uint32_t defaultBand)
 {
-    m_rasterFilename = options.getValueOrThrow<std::string>("raster");
-    std::vector<Option> dimensions = options.getOptions("dimension");
+    std::string::size_type pos, count;
+    const char *start;
+    char *end;
+    std::string name;
+    uint32_t band = defaultBand;
+    double scale = 1.0;
+
+    try
+    {
+        pos = 0;
+        // Skip leading whitespace.
+        count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        count = Utils::extract(dim, pos, (int(*)(int))std::isalpha);
+        if (count == 0)
+           throw std::string("No dimension name.");
+        name = dim.substr(pos, count);
+        pos += count;
+
+        count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        if (pos < dim.size() && dim[pos] == ':')
+        {
+            pos++;
+            start = dim.data() + pos;
+            band = std::strtoul(start, &end, 10);
+            if (start == end)
+                band = defaultBand;
+            pos += (end - start);
+
+            count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+            pos += count;
+
+            if (pos < dim.size() && dim[pos] == ':')
+            {
+                pos++;
+                start = dim.data() + pos;
+                scale = std::strtod(start, &end);
+                if (start == end)
+                    scale = 1.0;
+                pos += (end - start);
+            }
+        }
+
+        count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+        pos += count;
 
-    if (dimensions.size() == 0)
+        if (pos != dim.size())
+            throw std::string("Invalid characters following dimension "
+                "specification.");
+    }
+    catch (std::string s)
     {
-        m_bands.emplace_back("Red", Dimension::Id::Red, 1, 1.0);
-        m_bands.emplace_back("Green", Dimension::Id::Green, 2, 1.0);
-        m_bands.emplace_back("Blue", Dimension::Id::Blue, 3, 1.0);
-        log()->get(LogLevel::Debug) << "No dimension mappings were given. "
-            "Using default mappings." << std::endl;
+        std::ostringstream oss;
+        oss << "filters.colorization: invalid --dimensions option: '" << dim <<
+            "': " << s;
+        throw pdal_error(oss.str());
     }
-    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    return ColorizationFilter::BandInfo(name, band, scale);
+}
+
+} // unnamed namespace
+
+void ColorizationFilter::processOptions(const Options& options)
+{
+    m_rasterFilename = options.getValueOrThrow<std::string>("raster");
+
+    if (options.hasOption("dimension") && !options.hasOption("dimensions"))
+        throw pdal_error("Option 'dimension' no longer supported.  Use "
+            "'dimensions' instead.");
+
+    StringList defaultDims;
+    defaultDims.push_back("Red");
+    defaultDims.push_back("Green");
+    defaultDims.push_back("Blue");
+
+    StringList dims =
+        options.getValueOrDefault<StringList>("dimensions", defaultDims);
+
+    uint32_t defaultBand = 1;
+    for (std::string& dim : dims)
     {
-        std::string name = i->getValue<std::string>();
-        boost::optional<Options const&> dimensionOptions = i->getOptions();
-        if (!dimensionOptions)
-        {
-            std::ostringstream oss;
-            oss << "No band and scaling information given for dimension '" <<
-                name << "'";
-            throw pdal_error(oss.str());
-        }
-        uint32_t bandId =
-            dimensionOptions->getValueOrThrow<uint32_t>("band");
-        double scale =
-            dimensionOptions->getValueOrDefault<double>("scale", 1.0);
-        m_bands.emplace_back(name, Dimension::Id::Unknown, bandId, scale);
+        BandInfo bi = parseDim(dim, defaultBand);
+        defaultBand = bi.m_band + 1;
+        m_bands.push_back(bi);
     }
 }
 
@@ -154,101 +177,32 @@ void ColorizationFilter::addDimensions(PointLayoutPtr layout)
 
 void ColorizationFilter::ready(PointTableRef table)
 {
-    m_forward_transform.assign(0.0);
-    m_inverse_transform.assign(0.0);
-
-    log()->get(LogLevel::Debug) << "Using " << m_rasterFilename <<
-        " for raster" << std::endl;
-    m_ds = GDALOpen(m_rasterFilename.c_str(), GA_ReadOnly);
-    if (m_ds == NULL)
-        throw pdal_error("Unable to open GDAL datasource!");
-
-    if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None)
-        throw pdal_error("unable to fetch forward geotransform for raster!");
-
-    if (!GDALInvGeoTransform(&(m_forward_transform.front()),
-        &(m_inverse_transform.front())))
-        throw pdal_error("unable to fetch inverse geotransform for raster!");
-
-    for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
-    {
-        if (bi->m_dim == Dimension::Id::Unknown)
-            bi->m_dim = table.layout()->findDim(bi->m_name);
-        if (bi->m_dim == Dimension::Id::Unknown)
-            throw pdal_error((std::string)"Can't colorize - no dimension " +
-                bi->m_name);
-    }
+    m_raster =
+        std::unique_ptr<gdal::Raster>(new gdal::Raster(m_rasterFilename));
+    m_raster->open();
 }
 
 
 void ColorizationFilter::filter(PointView& view)
 {
-    int32_t pixel(0);
-    int32_t line(0);
+    std::vector<double> data;
 
-    std::array<double, 2> pix = { {0.0, 0.0} };
     for (PointId idx = 0; idx < view.size(); ++idx)
     {
         double x = view.getFieldAs<double>(Dimension::Id::X, idx);
         double y = view.getFieldAs<double>(Dimension::Id::Y, idx);
 
-        if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel,
-                line, m_ds))
+        if (!m_raster->read(x, y, data))
             continue;
 
+        int i(0);
         for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
         {
             BandInfo& b = *bi;
-            GDALRasterBandH hBand = GDALGetRasterBand(m_ds, b.m_band);
-            if (hBand == NULL)
-            {
-                std::ostringstream oss;
-                oss << "Unable to get band " << b.m_band <<
-                    " from data source!";
-                throw pdal_error(oss.str());
-            }
-            if (GDALRasterIO(hBand, GF_Read, pixel, line, 1, 1,
-                &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None)
-                view.setField(b.m_dim, idx, pix[0] * b.m_scale);
+            view.setField(b.m_dim, idx, data[i] * b.m_scale);
+            ++i;
         }
     }
 }
 
-
-// Determines the pixel/line position given an x/y.
-// No reprojection is done at this time.
-bool ColorizationFilter::getPixelAndLinePosition(double x, double y,
-    boost::array<double, 6> const& inverse, int32_t& pixel,
-    int32_t& line, void *ds)
-{
-    pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) +
-        (inverse[2] * y));
-    line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) +
-        (inverse[5] * y));
-
-    int xs = GDALGetRasterXSize(ds);
-    int ys = GDALGetRasterYSize(ds);
-
-    if (!xs || !ys)
-        throw pdal_error("Unable to get X or Y size from raster!");
-
-    if (pixel < 0 || line < 0 || pixel >= xs || line  >= ys)
-    {
-        // The x, y is not coincident with this raster
-        return false;
-    }
-
-    return true;
-}
-
-
-void ColorizationFilter::done(PointTableRef /*table*/)
-{
-    if (m_ds != 0)
-    {
-        GDALClose(m_ds);
-        m_ds = 0;
-    }
-}
-
 } // namespace pdal
diff --git a/filters/colorization/ColorizationFilter.hpp b/filters/colorization/ColorizationFilter.hpp
index 9095850..ea4e686 100644
--- a/filters/colorization/ColorizationFilter.hpp
+++ b/filters/colorization/ColorizationFilter.hpp
@@ -50,28 +50,29 @@ extern "C" PF_ExitFunc ColorizationFilter_InitPlugin();
 namespace pdal
 {
 
-namespace gdal
-{ class GlobalDebug; }
-
 // Provides GDAL-based raster overlay that places output data in
 // specified dimensions. It also supports scaling the data by a multiplier
 // on a per-dimension basis.
 class PDAL_DLL ColorizationFilter : public Filter
 {
+public:
+    struct BandInfo
+    {
+        BandInfo(const std::string& name, uint32_t band, double scale) :
+            m_name(name), m_band(band), m_scale(scale),
+            m_dim(Dimension::Id::Unknown)
+        {}
 
-struct BandInfo
-{
-    BandInfo(const std::string& name, Dimension::Id::Enum dim, uint32_t band,
-        double scale) : m_name(name), m_dim(dim), m_band(band), m_scale(scale)
-    {}
+        BandInfo() : m_band(0), m_scale(1.0), m_dim(Dimension::Id::Unknown)
+        {}
+
+        std::string m_name;
+        uint32_t m_band;
+        double m_scale;
+        Dimension::Id::Enum m_dim;
+    };
 
-    std::string m_name;
-    Dimension::Id::Enum m_dim;
-    uint32_t m_band;
-    double m_scale;
-};
 
-public:
     ColorizationFilter()
     {}
 
@@ -87,19 +88,11 @@ private:
     virtual void addDimensions(PointLayoutPtr layout);
     virtual void ready(PointTableRef table);
     virtual void filter(PointView& view);
-    virtual void done(PointTableRef table);
-
-    bool getPixelAndLinePosition(double x, double y,
-        boost::array<double, 6> const& inverse, int32_t& pixel,
-        int32_t& line, void *ds);
 
     std::string m_rasterFilename;
     std::vector<BandInfo> m_bands;
 
-    boost::array<double, 6> m_forward_transform;
-    boost::array<double, 6> m_inverse_transform;
-
-    GDALDatasetH m_ds;
+    std::unique_ptr<gdal::Raster> m_raster;
 
     ColorizationFilter& operator=(const ColorizationFilter&); // not implemented
     ColorizationFilter(const ColorizationFilter&); // not implemented
diff --git a/filters/crop/CropFilter.cpp b/filters/crop/CropFilter.cpp
index 683c39c..0e1d18f 100644
--- a/filters/crop/CropFilter.cpp
+++ b/filters/crop/CropFilter.cpp
@@ -34,6 +34,8 @@
 
 #include "CropFilter.hpp"
 
+#include <iomanip>
+
 #include <pdal/PointView.hpp>
 #include <pdal/StageFactory.hpp>
 #include <pdal/GDALUtils.hpp>
@@ -65,7 +67,6 @@ static void _GEOSErrorHandler(const char *fmt, ...)
     char buf[1024];
 
     vsnprintf(buf, sizeof(buf), fmt, args);
-    std::cerr << "GEOS Error: " << buf << std::endl;
 
     va_end(args);
 }
@@ -96,7 +97,7 @@ CropFilter::CropFilter() : pdal::Filter()
 void CropFilter::processOptions(const Options& options)
 {
     m_cropOutside = options.getValueOrDefault<bool>("outside", false);
-    m_assignedSRS = options.getValueOrDefault<SpatialReference>("a_srs");
+    m_assignedSrs = options.getValueOrDefault<SpatialReference>("a_srs");
     try
     {
         m_bounds = options.getValues<BOX2D>("bounds");
@@ -108,7 +109,6 @@ void CropFilter::processOptions(const Options& options)
             std::vector<BOX3D>  b3d = options.getValues<BOX3D>("bounds");
             for (auto& i: b3d)
                 m_bounds.push_back(i.to2d());
-//             m_bounds = b3d.to2d();
         }
         catch (boost::bad_lexical_cast)
         {
@@ -123,8 +123,12 @@ void CropFilter::processOptions(const Options& options)
 #ifdef PDAL_HAVE_GEOS
     if (m_polys.size())
     {
-        m_geosEnvironment = initGEOS_r(pdal::geos::_GEOSWarningHandler,
-            pdal::geos::_GEOSErrorHandler);
+        m_geoms.clear();
+        if (!m_geosEnvironment)
+        {
+            m_geosEnvironment = initGEOS_r(pdal::geos::_GEOSWarningHandler,
+                pdal::geos::_GEOSErrorHandler);
+        }
         for (std::string poly : m_polys)
         {
             GeomPkg g;
@@ -147,15 +151,6 @@ void CropFilter::processOptions(const Options& options)
 }
 
 
-void CropFilter::ready(PointTableRef table)
-{
-#ifdef PDAL_HAVE_GEOS
-    for (auto& g : m_geoms)
-        preparePolygon(g, table.spatialRef());
-#endif
-}
-
-
 #ifdef PDAL_HAVE_GEOS
 GEOSGeometry *CropFilter::validatePolygon(const std::string& poly)
 {
@@ -194,19 +189,38 @@ void CropFilter::preparePolygon(GeomPkg& g, const SpatialReference& to)
 {
     char* out_wkt = GEOSGeomToWKT_r(m_geosEnvironment, g.m_geom);
     std::string poly(out_wkt);
-    poly = transformWkt(poly, m_assignedSRS, to);
+    poly = transformWkt(poly, m_assignedSrs, to);
     log()->get(LogLevel::Debug2) << "Ingested WKT for filters.crop: " <<
-        poly <<std::endl;
+        poly << std::endl;
     GEOSFree_r(m_geosEnvironment, out_wkt);
 
     // Store transformed geometry.
-    GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
-    g.m_geom = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
+    g.m_geomXform = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
     g.m_prepGeom = GEOSPrepare_r(m_geosEnvironment, g.m_geom);
     if (!g.m_prepGeom)
         throw pdal_error("unable to prepare geometry for index-accelerated "
             "intersection");
 }
+
+
+void CropFilter::freePolygon(GeomPkg& g, bool freeBase)
+{
+    if (g.m_geom && freeBase)
+    {
+        GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
+        g.m_geom = NULL;
+    }
+    if (g.m_prepGeom)
+    {
+        GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom);
+        g.m_prepGeom = NULL;
+    }
+    if (g.m_geomXform)
+    {
+        GEOSGeom_destroy_r(m_geosEnvironment, g.m_geomXform);
+        g.m_geomXform = NULL;
+    }
+}
 #endif
 
 
@@ -226,6 +240,7 @@ Options CropFilter::getDefaultOptions()
 PointViewSet CropFilter::run(PointViewPtr view)
 {
     PointViewSet viewSet;
+    SpatialReference srs = view->spatialReference();
 
     // Don't do anything if no bounds have been specified.
     if (m_geoms.empty() && m_bounds.empty())
@@ -235,12 +250,21 @@ PointViewSet CropFilter::run(PointViewPtr view)
     }
 
 #ifdef PDAL_HAVE_GEOS
-    for (const auto& geom : m_geoms)
+    for (auto& geom : m_geoms)
     {
+        // If this is the first time through or the SRS has changed,
+        // prepare the crop polygon.
+        if (!geom.m_prepGeom || srs != m_lastSrs)
+        {
+            freePolygon(geom, false);
+            preparePolygon(geom, srs);
+        }
+
         PointViewPtr outView = view->makeNew();
         crop(geom, *view, *outView);
         viewSet.insert(outView);
     }
+    m_lastSrs = srs;
 #endif
     for (auto& box : m_bounds)
     {
@@ -251,6 +275,7 @@ PointViewSet CropFilter::run(PointViewPtr view)
     return viewSet;
 }
 
+
 void CropFilter::crop(const BOX2D& box, PointView& input, PointView& output)
 {
     for (PointId idx = 0; idx < input.size(); ++idx)
@@ -264,6 +289,7 @@ void CropFilter::crop(const BOX2D& box, PointView& input, PointView& output)
     }
 }
 
+
 #ifdef PDAL_HAVE_GEOS
 GEOSGeometry *CropFilter::createPoint(double x, double y, double z)
 {
@@ -285,7 +311,6 @@ GEOSGeometry *CropFilter::createPoint(double x, double y, double z)
 }
 
 
-
 void CropFilter::crop(const GeomPkg& g, PointView& input, PointView& output)
 {
     bool logOutput = (log()->getLevel() > LogLevel::Debug4);
@@ -320,12 +345,11 @@ void CropFilter::done(PointTableRef /*table*/)
 {
 #ifdef PDAL_HAVE_GEOS
     for (auto& g : m_geoms)
-    {
-        GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom);
-        GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
-    }
+        freePolygon(g, true);
+    m_geoms.clear();
     if (m_geosEnvironment)
         finishGEOS_r(m_geosEnvironment);
+    m_geosEnvironment = 0;
 #endif
 }
 
diff --git a/filters/crop/CropFilter.hpp b/filters/crop/CropFilter.hpp
index 7e1d324..b6f6644 100644
--- a/filters/crop/CropFilter.hpp
+++ b/filters/crop/CropFilter.hpp
@@ -63,7 +63,8 @@ private:
     std::vector<BOX2D> m_bounds;
     bool m_cropOutside;
     StringList m_polys;
-    SpatialReference m_assignedSRS;
+    SpatialReference m_assignedSrs;
+    SpatialReference m_lastSrs;
 
 #ifndef PDAL_HAVE_GEOS
     typedef void *GEOSContextHandle_t;
@@ -74,14 +75,17 @@ private:
 	GEOSContextHandle_t m_geosEnvironment;
     struct GeomPkg
     {
+        GeomPkg() : m_geom(NULL), m_geomXform(NULL), m_prepGeom(NULL)
+        {}
+
         GEOSGeometry *m_geom;
+        GEOSGeometry *m_geomXform;
         const GEOSPreparedGeometry *m_prepGeom;
     };
 
     std::vector<GeomPkg> m_geoms;
 
     virtual void processOptions(const Options& options);
-    virtual void ready(PointTableRef table);
     virtual PointViewSet run(PointViewPtr view);
     virtual void done(PointTableRef table);
     void crop(const BOX2D& box, PointView& input, PointView& output);
@@ -89,6 +93,7 @@ private:
 #ifdef PDAL_HAVE_GEOS
     GEOSGeometry *validatePolygon(const std::string& poly);
     void preparePolygon(GeomPkg& g, const SpatialReference& to);
+    void freePolygon(GeomPkg& g, bool freeBase);
     BOX2D computeBounds(GEOSGeometry const *geometry);
     GEOSGeometry *createPoint(double x, double y, double z);
 #endif
diff --git a/filters/divider/CMakeLists.txt b/filters/divider/CMakeLists.txt
new file mode 100644
index 0000000..6af45b7
--- /dev/null
+++ b/filters/divider/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+# Divider filter CMake configuration
+#
+
+set(srcs
+    DividerFilter.cpp
+)
+
+set(incs
+    DividerFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter divider "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/divider/DividerFilter.cpp b/filters/divider/DividerFilter.cpp
new file mode 100644
index 0000000..56d6d1d
--- /dev/null
+++ b/filters/divider/DividerFilter.cpp
@@ -0,0 +1,137 @@
+/******************************************************************************
+ * Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. nor the names of its contributors
+ *       may be used to endorse or promote products derived from this
+ *       software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "DividerFilter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.divider",
+    "Divide points into approximately equal sized groups based on a simple "
+      "scheme",
+    "http://pdal.io/stages/filters.divider.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, DividerFilter, Filter, s_info)
+
+std::string DividerFilter::getName() const { return s_info.name; }
+
+void DividerFilter::processOptions(const Options& options)
+{
+    std::string mode = options.getValueOrDefault<std::string>("mode");
+    mode = Utils::tolower(mode);
+    if (mode.empty() || mode == "partition")
+        m_mode = Mode::Partition;
+    else if (mode == "round_robin")
+        m_mode = Mode::RoundRobin;
+    else
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Invalid 'mode' option '" << mode << "'. "
+            "Valid options are 'partition' and 'round_robin'";
+        throw pdal_error(oss.str());
+    }
+    if (options.hasOption("count") && options.hasOption("capacity"))
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Can't specify both option 'count' and "
+            "option 'capacity.";
+        throw pdal_error(oss.str());
+    }
+    if (!options.hasOption("count") && !options.hasOption("capacity"))
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Must specify either option 'count' or "
+            "option 'capacity.";
+        throw pdal_error(oss.str());
+    }
+    if (options.hasOption("count"))
+    {
+        m_size = options.getValueOrThrow<int>("count");
+        m_sizeMode = SizeMode::Count;
+        if (m_size < 2 || m_size > 1000)
+        {
+            std::ostringstream oss;
+            oss << getName() << ": Option 'count' must be in the range "
+                "[2, 1000].";
+            throw pdal_error(oss.str());
+        }
+    }
+    if (options.hasOption("capacity"))
+    {
+        m_size = options.getValueOrThrow<point_count_t>("capacity");
+        m_sizeMode = SizeMode::Capacity;
+    }
+}
+
+
+PointViewSet DividerFilter::run(PointViewPtr inView)
+{
+    if (m_sizeMode == SizeMode::Capacity)
+        m_size = ((inView->size() - 1) / m_size) + 1;
+
+    PointViewSet result;
+    std::vector<PointViewPtr> views;
+    for (point_count_t i = 0; i < m_size; ++i)
+    {
+        PointViewPtr v(inView->makeNew());
+        views.push_back(v);
+        result.insert(v);
+    }
+
+    if (m_mode == Mode::Partition)
+    {
+        point_count_t limit = ((inView->size() - 1) / m_size) + 1;
+        unsigned viewNum = 0;
+        for (PointId i = 0; i < inView->size();)
+        {
+            views[viewNum]->appendPoint(*inView, i++);
+            if (i % limit == 0)
+                viewNum++;
+        }
+    }
+    else // RoundRobin
+    {
+        unsigned viewNum = 0;
+        for (PointId i = 0; i < inView->size(); ++i)
+        {
+            views[viewNum]->appendPoint(*inView, i);
+            viewNum++;
+            if (viewNum == m_size)
+                viewNum = 0;
+        }
+    }
+    return result;
+}
+
+} // pdal
diff --git a/filters/range/RangeFilter.hpp b/filters/divider/DividerFilter.hpp
similarity index 65%
copy from filters/range/RangeFilter.hpp
copy to filters/divider/DividerFilter.hpp
index 48daafe..fad46b9 100644
--- a/filters/range/RangeFilter.hpp
+++ b/filters/divider/DividerFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+ * Copyright (c) 2015, Hobu Inc. (info at hobu.co)
  *
  * All rights reserved.
  *
@@ -13,10 +13,9 @@
  *       notice, this list of conditions and the following disclaimer in
  *       the documentation and/or other materials provided
  *       with the distribution.
- *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
- *       names of its contributors may be used to endorse or promote
- *       products derived from this software without specific prior
- *       written permission.
+ *     * Neither the name of Hobu, Inc. nor the names of its contributors
+ *       may be used to endorse or promote products derived from this
+ *       software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -36,44 +35,47 @@
 
 #include <pdal/Filter.hpp>
 
-#include <memory>
-#include <map>
-#include <string>
-
-extern "C" int32_t RangeFilter_ExitFunc();
-extern "C" PF_ExitFunc RangeFilter_InitPlugin();
+extern "C" int32_t DividerFilter_ExitFunc();
+extern "C" PF_ExitFunc DividefFilter_InitPlugin();
 
 namespace pdal
 {
 
-class Options;
-
-struct Range
+class PDAL_DLL DividerFilter : public pdal::Filter
 {
-    double min;
-    double max;
-};
+public:
 
-class PDAL_DLL RangeFilter : public pdal::Filter
-{
 public:
-    RangeFilter() : Filter()
-    {}
+    DividerFilter() : Filter()
+        {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
 private:
-    std::map<std::string, Range> m_name_map;
-    std::map<Dimension::Id::Enum, Range> m_dimensions_map;
 
-    virtual void processOptions(const Options&options);
-    virtual void ready(PointTableRef table);
+    enum Mode
+    {
+        Partition,
+        RoundRobin
+    };
+
+    enum SizeMode
+    {
+        Count,
+        Capacity
+    };
+
+    Mode m_mode;
+    SizeMode m_sizeMode;
+    point_count_t m_size;
+
+    virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    RangeFilter& operator=(const RangeFilter&); // not implemented
-    RangeFilter(const RangeFilter&); // not implemented
+    DividerFilter& operator=(const DividerFilter&); // not implemented
+    DividerFilter(const DividerFilter&); // not implemented
 };
 
 } // namespace pdal
diff --git a/filters/ferry/FerryFilter.cpp b/filters/ferry/FerryFilter.cpp
index 197770f..8811ee3 100644
--- a/filters/ferry/FerryFilter.cpp
+++ b/filters/ferry/FerryFilter.cpp
@@ -52,15 +52,7 @@ Options FerryFilter::getDefaultOptions()
 {
     Options options;
 
-    pdal::Option red("dimension", "Red", "");
-    pdal::Option b0("to","Red2", "");
-    pdal::Option def("def","Red2", "");
-    pdal::Options redO;
-    redO.add(b0);
-    redO.add(def);
-    red.setOptions(redO);
-
-    options.add(red);
+    options.add("dimensions", "", "Dimensions to copy (<in>=<out>,...)");
 
     return options;
 }
@@ -68,30 +60,35 @@ Options FerryFilter::getDefaultOptions()
 
 void FerryFilter::processOptions(const Options& options)
 {
-    std::vector<Option> dimensions = options.getOptions("dimension");
-    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    if (options.hasOption("dimension"))
+        throw pdal_error("Option 'dimension' no longer supported.  Use "
+            "'dimensions' instead.");
+
+    StringList dims = options.getValueOrThrow<StringList>("dimensions");
+    for (auto& dim : dims)
     {
-        std::string name = i->getValue<std::string>();
-        boost::optional<Options const&> dimensionOptions = i->getOptions();
-        if (!dimensionOptions)
+        StringList s = Utils::split2(dim, '=');
+        if (s.size() != 2)
         {
             std::ostringstream oss;
-            oss << "No 'to' dimension given for dimension '" <<
-                name << "'";
+            oss << "Invalid dimension specified '" << dim <<
+                "'.  Need <from dimension>=<to dimension>.  See "
+                "documentation for details.";
             throw pdal_error(oss.str());
         }
-        std::string to_dim =
-            dimensionOptions->getValueOrThrow<std::string>("to");
-        if (boost::algorithm::iequals(name, to_dim))
+        Utils::trim(s[0]);
+        Utils::trim(s[1]);
+        if (s[0] == s[1])
         {
             std::ostringstream oss;
-            oss << "The from and to dimension cannot be the same"
-                << " name for dimension '" << name << "'";
+            oss << "Can't ferry dimension '" << s[0] << "' to itself.";
             throw pdal_error(oss.str());
         }
-        m_name_map.insert(std::make_pair(name, to_dim));
+        m_name_map[s[0]] = s[1];
     }
 }
+
+
 void FerryFilter::addDimensions(PointLayoutPtr layout)
 {
     for (const auto& dim_par : m_name_map)
@@ -100,6 +97,19 @@ void FerryFilter::addDimensions(PointLayoutPtr layout)
     }
 }
 
+
+void FerryFilter::prepared(PointTableRef table)
+{
+    for (const auto& dims : m_name_map)
+        if (table.layout()->findDim(dims.first) == Dimension::Id::Unknown)
+        {
+            std::ostringstream oss;
+            oss << "Can't ferry dimension '" << dims.first << "'. "
+                "Dimension doesn't exist.";
+            throw pdal_error(oss.str());
+        }
+}
+
 void FerryFilter::ready(PointTableRef table)
 {
     const PointLayoutPtr layout(table.layout());
@@ -124,5 +134,5 @@ void FerryFilter::filter(PointView& view)
     }
 }
 
-
 } // namespace pdal
+
diff --git a/filters/ferry/FerryFilter.hpp b/filters/ferry/FerryFilter.hpp
index 6305728..b733b91 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/filters/ferry/FerryFilter.hpp
@@ -60,6 +60,7 @@ public:
 private:
     virtual void processOptions(const Options&);
     virtual void addDimensions(PointLayoutPtr layout);
+    virtual void prepared(PointTableRef table);
     virtual void ready(PointTableRef table);
     virtual void filter(PointView& view);
 
diff --git a/filters/merge/MergeFilter.cpp b/filters/merge/MergeFilter.cpp
index d0b409b..41251eb 100644
--- a/filters/merge/MergeFilter.cpp
+++ b/filters/merge/MergeFilter.cpp
@@ -46,5 +46,30 @@ CREATE_STATIC_PLUGIN(1, 0, MergeFilter, Filter, s_info)
 
 std::string MergeFilter::getName() const { return s_info.name; }
 
+void MergeFilter::ready(PointTableRef table)
+{
+    SpatialReference srs = getSpatialReference();
+
+    if (srs.empty())
+        srs = table.anySpatialReference();
+    m_view.reset(new PointView(table, srs));
+}
+
+
+PointViewSet MergeFilter::run(PointViewPtr in)
+{
+    PointViewSet viewSet;
+
+    // If the SRS of all the point views aren't the same, print a warning
+    // unless we're explicitly overriding the SRS.
+    if (getSpatialReference().empty() &&
+      (in->spatialReference() != m_view->spatialReference()))
+        log()->get(LogLevel::Warning) << getName() << ": merging points "
+            "with inconsistent spatial references." << std::endl;
+    m_view->append(*in.get());
+    viewSet.insert(m_view);
+    return viewSet;
+}
+
 } // namespace pdal
 
diff --git a/filters/merge/MergeFilter.hpp b/filters/merge/MergeFilter.hpp
index e71b77a..d1311be 100644
--- a/filters/merge/MergeFilter.hpp
+++ b/filters/merge/MergeFilter.hpp
@@ -55,17 +55,8 @@ public:
 private:
     PointViewPtr m_view;
 
-    virtual void ready(PointTableRef table)
-        { m_view.reset(new PointView(table)); }
-
-    virtual PointViewSet run(PointViewPtr in)
-    {
-        PointViewSet viewSet;
-
-        m_view->append(*in.get());
-        viewSet.insert(m_view);
-        return viewSet;
-    }
+    virtual void ready(PointTableRef table);
+    virtual PointViewSet run(PointViewPtr in);
 
     MergeFilter& operator=(const MergeFilter&); // not implemented
     MergeFilter(const MergeFilter&); // not implemented
diff --git a/filters/randomize/CMakeLists.txt b/filters/randomize/CMakeLists.txt
new file mode 100644
index 0000000..81b44cc
--- /dev/null
+++ b/filters/randomize/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(srcs RandomizeFilter.cpp)
+set(incs RandomizeFilter.hpp)
+
+PDAL_ADD_DRIVER(filter randomize "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/merge/MergeFilter.cpp b/filters/randomize/RandomizeFilter.cpp
similarity index 81%
copy from filters/merge/MergeFilter.cpp
copy to filters/randomize/RandomizeFilter.cpp
index d0b409b..b310355 100644
--- a/filters/merge/MergeFilter.cpp
+++ b/filters/randomize/RandomizeFilter.cpp
@@ -1,6 +1,5 @@
 /******************************************************************************
- * Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
- * Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+ * Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
  *
  * All rights reserved.
  *
@@ -32,19 +31,19 @@
  * OF SUCH DAMAGE.
  ****************************************************************************/
 
-#include "MergeFilter.hpp"
+#include "RandomizeFilter.hpp"
 
 namespace pdal
 {
 
 static PluginInfo const s_info = PluginInfo(
-    "filters.merge",
-    "Merge data from two different readers into a single stream.",
-    "http://pdal.io/stages/filters.merge.html" );
+    "filters.randomize",
+    "Randomize points in a view.",
+    "http://pdal.io/stages/filters.randomize.html" );
 
-CREATE_STATIC_PLUGIN(1, 0, MergeFilter, Filter, s_info)
+CREATE_STATIC_PLUGIN(1, 0, RandomizeFilter, Filter, s_info)
 
-std::string MergeFilter::getName() const { return s_info.name; }
+std::string RandomizeFilter::getName() const { return s_info.name; }
 
 } // namespace pdal
 
diff --git a/filters/merge/MergeFilter.hpp b/filters/randomize/RandomizeFilter.hpp
similarity index 75%
copy from filters/merge/MergeFilter.hpp
copy to filters/randomize/RandomizeFilter.hpp
index e71b77a..f632237 100644
--- a/filters/merge/MergeFilter.hpp
+++ b/filters/randomize/RandomizeFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
 *
 * All rights reserved.
 *
@@ -35,17 +35,18 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
+#include <pdal/PointViewIter.hpp>
 
-extern "C" int32_t MergeFilter_ExitFunc();
-extern "C" PF_ExitFunc MergeFilter_InitPlugin();
+extern "C" int32_t RandomizeFilter_ExitFunc();
+extern "C" PF_ExitFunc RandomizeFilter_InitPlugin();
 
 namespace pdal
 {
 
-class PDAL_DLL MergeFilter : public MultiFilter
+class PDAL_DLL RandomizeFilter : public Filter
 {
 public:
-    MergeFilter ()
+    RandomizeFilter()
     {}
 
     static void * create();
@@ -53,23 +54,11 @@ public:
     std::string getName() const;
 
 private:
-    PointViewPtr m_view;
+    virtual void filter(PointView& view)
+        { std::random_shuffle(view.begin(), view.end()); }
 
-    virtual void ready(PointTableRef table)
-        { m_view.reset(new PointView(table)); }
-
-    virtual PointViewSet run(PointViewPtr in)
-    {
-        PointViewSet viewSet;
-
-        m_view->append(*in.get());
-        viewSet.insert(m_view);
-        return viewSet;
-    }
-
-    MergeFilter& operator=(const MergeFilter&); // not implemented
-    MergeFilter(const MergeFilter&); // not implemented
+    RandomizeFilter& operator=(const RandomizeFilter&); // not implemented
+    RandomizeFilter(const RandomizeFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/filters/range/RangeFilter.cpp b/filters/range/RangeFilter.cpp
index f4d6b64..74e10be 100644
--- a/filters/range/RangeFilter.cpp
+++ b/filters/range/RangeFilter.cpp
@@ -34,68 +34,195 @@
 
 #include "RangeFilter.hpp"
 
-#include <cmath>
+#include <pdal/util/Utils.hpp>
+
+#include <cctype>
 #include <limits>
 #include <map>
 #include <string>
-#include <utility>
 #include <vector>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.range",
-    "Pass only points given a dimension/range.",
-    "http://pdal.io/stages/filters.range.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.range", "Pass only points given a dimension/range.",
+               "http://pdal.io/stages/filters.range.html");
 
 CREATE_STATIC_PLUGIN(1, 0, RangeFilter, Filter, s_info)
 
-std::string RangeFilter::getName() const { return s_info.name; }
+std::string RangeFilter::getName() const
+{
+    return s_info.name;
+}
 
-void RangeFilter::processOptions(const Options& options)
+namespace
 {
-    std::vector<Option> dimensions = options.getOptions("dimension");
-    if (dimensions.size() == 0)
-        throw pdal_error("No dimensions given");
 
-    for (auto const& d : dimensions)
+RangeFilter::Range parseRange(const std::string& r)
+{ 
+    std::string::size_type pos, count;
+    bool ilb = true;
+    bool iub = true;
+    bool negate = false;
+    const char *start;
+    char *end;
+    std::string name;
+    double ub, lb;
+
+    try
     {
-        std::string name = d.getValue<std::string>();
-        boost::optional<Options const&> dimensionOptions = d.getOptions();
-        if (!dimensionOptions)
-            throw pdal_error("No dimension options");
-
-        double val =dimensionOptions->getValueOrDefault<double>("equals",
-            (std::numeric_limits<double>::max)());
-        double min = dimensionOptions->getValueOrDefault<double>("min",
-            -(std::numeric_limits<double>::max)());
-        double max = dimensionOptions->getValueOrDefault<double>("max",
-            (std::numeric_limits<double>::max)());
-
-        if (val != (std::numeric_limits<double>::max)())
-            min = max = val;
-
-        Range range;
-        range.min = min;
-        range.max = max;
-
-        m_name_map.insert(std::make_pair(name, range));
+        pos = 0;
+        // Skip leading whitespace.
+        count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        count = Utils::extract(r, pos, (int(*)(int))std::isalpha);
+        if (count == 0)
+           throw std::string("No dimension name.");
+        name = r.substr(pos, count);
+        pos += count;
+
+        if (r[pos] == '!')
+        {
+            negate = true;
+            pos++;
+        }
+
+        if (r[pos] == '(')
+            ilb = false;
+        else if (r[pos] != '[')
+            throw std::string("Missing '(' or '['.");
+        pos++;
+
+        // Extract lower bound.
+        start = r.data() + pos;
+        lb = std::strtod(start, &end);
+        if (start == end)
+            lb = std::numeric_limits<double>::min();
+        pos += (end - start);
+
+        count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        if (r[pos] != ':')
+            throw std::string("Missing ':' limit separator.");
+        pos++;
+
+        start = r.data() + pos;
+        ub = std::strtod(start, &end);
+        if (start == end)
+            ub = std::numeric_limits<double>::max();
+        pos += (end - start);
+
+        count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        if (r[pos] == ')')
+            iub = false;
+        else if (r[pos] != ']')
+            throw std::string("Missing ')' or ']'.");
+        pos++;
+
+        count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+        pos += count;
+
+        if (pos != r.size())
+            throw std::string("Invalid characters following valid range.");
+    }
+    catch (std::string s)
+    {
+        std::ostringstream oss;
+        oss << "filters.range: invalid 'limits' option: '" << r << "': " << s;
+        throw pdal_error(oss.str());
     }
+    return RangeFilter::Range(name, lb, ub, ilb, iub, negate);
+}
+
+} // unnamed namespace
+
+
+bool operator < (const RangeFilter::Range& r1, const RangeFilter::Range& r2)
+{
+    return (r1.m_name < r2.m_name ? true :
+        r1.m_name > r2.m_name ? false :
+        &r1 < &r2);
+}
+
+
+void RangeFilter::processOptions(const Options& options)
+{
+    StringList rangeString = options.getValueOrDefault<StringList>("limits");
+
+    if (rangeString.empty())
+        throw pdal_error("filters.range missing required 'limits' option.");
+
+    for (auto const& r : rangeString)
+        m_range_list.push_back(parseRange(r));
 }
 
-void RangeFilter::ready(PointTableRef table)
+
+void RangeFilter::prepared(PointTableRef table)
 {
     const PointLayoutPtr layout(table.layout());
-    for (auto const& d : m_name_map)
+
+    for (auto& r : m_range_list)
     {
-        m_dimensions_map.insert(
-                std::make_pair(
-                    layout->findDim(d.first),
-                    d.second));
+        r.m_id = layout->findDim(r.m_name);
+        if (r.m_id == Dimension::Id::Unknown)
+        {
+            std::ostringstream oss;
+            oss << "Invalid dimension name in filters.range 'limits' "
+                "option: '" << r.m_name << "'.";
+            throw pdal_error(oss.str());
+        }
     }
+    std::sort(m_range_list.begin(), m_range_list.end());
 }
 
+// Determine if a point passes a single range.
+bool RangeFilter::dimensionPasses(double v, const Range& r) const
+{
+    bool fail = ((r.m_inclusive_lower_bound && v < r.m_lower_bound) ||
+        (!r.m_inclusive_lower_bound && v <= r.m_lower_bound) ||
+        (r.m_inclusive_upper_bound && v > r.m_upper_bound) ||
+        (!r.m_inclusive_upper_bound && v >= r.m_upper_bound));
+    if (r.m_negate)
+        fail = !fail;
+    return !fail;
+}
+
+// The range list is sorted by dimension, so the logic here should work
+// as ORs between ranges of the same dimension and ANDs between ranges
+// of different dimensions.  This is simple logic, but is probably the most
+// common case.
+bool RangeFilter::pointPasses(PointView *view, PointId idx) const
+{
+    Dimension::Id::Enum lastId = m_range_list.front().m_id;
+    bool passes = false;
+    for (auto const& r : m_range_list)
+    {
+        // If we're at a new dimension, return false if we haven't passed
+        // the dimension, otherwise reset passes to false for the next
+        // dimension and keep checking.
+        if (r.m_id != lastId)
+        {
+            if (!passes)
+                return false;
+            lastId = r.m_id;
+            passes = false;
+        }
+        // If we've already passed this dimension, continue until we find
+        // a new dimension.
+        else if (passes)
+            continue;
+        double v = view->getFieldAs<double>(r.m_id, idx);
+        passes = dimensionPasses(v, r);
+    }
+    return passes;
+}
+
+
 PointViewSet RangeFilter::run(PointViewPtr inView)
 {
     PointViewSet viewSet;
@@ -105,25 +232,11 @@ PointViewSet RangeFilter::run(PointViewPtr inView)
     PointViewPtr outView = inView->makeNew();
 
     for (PointId i = 0; i < inView->size(); ++i)
-    {
-        bool keep_point = true;
-        for (auto const& d : m_dimensions_map)
-        {
-            double v = inView->getFieldAs<double>(d.first, i);
-            if (v < d.second.min || v > d.second.max)
-            {
-                keep_point = false;
-                break;
-            }
-        }
-        if (keep_point)
+        if (pointPasses(inView.get(), i))
             outView->appendPoint(*inView, i);
-    }
 
     viewSet.insert(outView);
-
     return viewSet;
 }
 
 } // pdal
-
diff --git a/filters/range/RangeFilter.hpp b/filters/range/RangeFilter.hpp
index 48daafe..b0eec6a 100644
--- a/filters/range/RangeFilter.hpp
+++ b/filters/range/RangeFilter.hpp
@@ -48,15 +48,38 @@ namespace pdal
 
 class Options;
 
-struct Range
-{
-    double min;
-    double max;
-};
-
 class PDAL_DLL RangeFilter : public pdal::Filter
 {
 public:
+
+    struct Range
+    {
+        Range(const std::string name,
+              double lower_bound,
+              double upper_bound,
+              bool inclusive_lower_bound,
+              bool inclusive_upper_bound,
+              bool negate) :
+            m_name(name), m_id(Dimension::Id::Unknown),
+            m_lower_bound(lower_bound), m_upper_bound(upper_bound),
+            m_inclusive_lower_bound(inclusive_lower_bound),
+            m_inclusive_upper_bound(inclusive_upper_bound),
+            m_negate(negate)
+        {}
+
+        Range()
+            {}
+
+        std::string m_name;
+        Dimension::Id::Enum m_id;
+        double m_lower_bound;
+        double m_upper_bound;
+        bool m_inclusive_lower_bound;
+        bool m_inclusive_upper_bound;
+        bool m_negate;
+    };
+
+
     RangeFilter() : Filter()
     {}
 
@@ -65,12 +88,13 @@ public:
     std::string getName() const;
 
 private:
-    std::map<std::string, Range> m_name_map;
-    std::map<Dimension::Id::Enum, Range> m_dimensions_map;
+    std::vector<Range> m_range_list;
 
     virtual void processOptions(const Options&options);
-    virtual void ready(PointTableRef table);
+    virtual void prepared(PointTableRef table);
     virtual PointViewSet run(PointViewPtr view);
+    bool dimensionPasses(double v, const Range& r) const;
+    bool pointPasses(PointView *view, PointId idx) const;
 
     RangeFilter& operator=(const RangeFilter&); // not implemented
     RangeFilter(const RangeFilter&); // not implemented
diff --git a/filters/reprojection/ReprojectionFilter.cpp b/filters/reprojection/ReprojectionFilter.cpp
index ad35927..ff8083f 100644
--- a/filters/reprojection/ReprojectionFilter.cpp
+++ b/filters/reprojection/ReprojectionFilter.cpp
@@ -94,6 +94,7 @@ void ReprojectionFilter::processOptions(const Options& options)
         try
         {
             m_inSRS = options.getValueOrThrow<pdal::SpatialReference>("in_srs");
+            m_inferInputSRS = false;
         }
         catch (std::invalid_argument)
         {
@@ -104,86 +105,135 @@ void ReprojectionFilter::processOptions(const Options& options)
                 "specification for 'in_srs' option: '" << srs << "'.";
             throw pdal_error(oss.str());
         }
-        m_inferInputSRS = false;
     }
 }
 
+
 void ReprojectionFilter::initialize()
 {
     GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+
+    m_out_ref_ptr = OSRNewSpatialReference(0);
+
+    int result = OSRSetFromUserInput(m_out_ref_ptr,
+        m_outSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
+    if (result != OGRERR_NONE)
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Invalid output spatial reference '" <<
+            m_outSRS.getWKT() << "'.  This is usually caused by a bad value "
+            "for the 'out_srs' option.";
+        throw pdal_error(oss.str());
+    }
 }
 
-void ReprojectionFilter::ready(PointTableRef table)
+
+void ReprojectionFilter::createTransform(PointView *view)
 {
     if (m_inferInputSRS)
     {
-        m_inSRS = table.spatialRef();
-        if (m_inSRS.getWKT().empty())
-            throw pdal_error("Source data has no spatial reference and none "
-                "is specified with the 'in_srs' option.");
+        m_inSRS = view->spatialReference();
+        if (m_inSRS.empty())
+        {
+            std::ostringstream oss;
+            oss << getName() << ": source data has no spatial reference and "
+                "none is specified with the 'in_srs' option.";
+            throw pdal_error(oss.str());
+        }
     }
 
+    if (m_in_ref_ptr)
+        OSRDestroySpatialReference(m_in_ref_ptr);
     m_in_ref_ptr = OSRNewSpatialReference(0);
-    m_out_ref_ptr = OSRNewSpatialReference(0);
 
     int result =
         OSRSetFromUserInput(m_in_ref_ptr,
             m_inSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
     if (result != OGRERR_NONE)
     {
-        std::ostringstream msg;
-        msg << "Invalid input spatial reference '" << m_inSRS.getWKT() <<
-            "'.  This is usually caused by a bad value for the 'in_srs'"
-            "option or an invalid spatial reference in the source file.";
-        throw pdal_error(msg.str());
-    }
-
-
-    result = OSRSetFromUserInput(m_out_ref_ptr,
-        m_outSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
-    if (result != OGRERR_NONE)
-    {
-        std::ostringstream msg;
-        msg << "Invalid output spatial reference '" << m_outSRS.getWKT() <<
-            "'.  This is usually caused by a bad value for the 'out_srs'"
-            "option.";
-        throw pdal_error(msg.str());
+        std::ostringstream oss;
+        oss << getName() << ": Invalid input spatial reference '" <<
+            m_inSRS.getWKT() << "'.  This is usually caused by a bad " <<
+            "value for the 'in_srs' option or an invalid spatial reference " <<
+            "in the source file.";
+        throw pdal_error(oss.str());
     }
-
-    m_transform_ptr = OCTNewCoordinateTransformation(m_in_ref_ptr, m_out_ref_ptr);
+    if (m_transform_ptr)
+        OCTDestroyCoordinateTransformation(m_transform_ptr);
+    m_transform_ptr = OCTNewCoordinateTransformation(m_in_ref_ptr,
+        m_out_ref_ptr);
     if (!m_transform_ptr)
     {
-        std::string msg = "Could not construct CoordinateTransformation in "
-            "ReprojectionFilter:: ";
-        throw std::runtime_error(msg);
+        std::ostringstream oss;
+        oss << getName() << ": Could not construct transformation.";
+        throw pdal_error(oss.str());
     }
-
-    setSpatialReference(m_outSRS);
 }
 
 
-void ReprojectionFilter::transform(double& x, double& y, double& z)
+bool ReprojectionFilter::transform(double& x, double& y, double& z)
 {
-    int ret = OCTTransform(m_transform_ptr, 1, &x, &y, &z);
-    if (ret == 0)
+    // OCTTransform will throw via GDAL error handler
+    // if there is an error. We don't expect the return value
+    // unless the GDAL handler gets shut off for whatever reason. In
+    // that case, we'll just throw.
+    if (OCTTransform(m_transform_ptr, 1, &x, &y, &z))
+    {
+        return true;
+    }
+    else
     {
         std::ostringstream msg;
         msg << "Could not project point for ReprojectionTransform::" <<
-            CPLGetLastErrorMsg() << ret;
+            CPLGetLastErrorMsg();
         throw pdal_error(msg.str());
     }
 }
 
 
+PointViewSet ReprojectionFilter::run(PointViewPtr view)
+{
+    PointViewSet viewSet;
+    PointViewPtr outView = view->makeNew();
+
+    createTransform(view.get());
+
+    double x, y, z;
+
+    for (PointId id = 0; id < view->size(); ++id)
+    {
+        x = view->getFieldAs<double>(Dimension::Id::X, id);
+        y = view->getFieldAs<double>(Dimension::Id::Y, id);
+        z = view->getFieldAs<double>(Dimension::Id::Z, id);
+
+        if (transform(x, y, z))
+        {
+            view->setField(Dimension::Id::X, id, x);
+            view->setField(Dimension::Id::Y, id, y);
+            view->setField(Dimension::Id::Z, id, z);
+            outView->appendPoint(*view, id);
+        }
+    }
+
+    viewSet.insert(outView);
+    view->setSpatialReference(m_outSRS);
+    outView->setSpatialReference(m_outSRS);
+
+    return viewSet;
+}
+
+
 void ReprojectionFilter::filter(PointView& view)
 {
+    double x, y, z;
+
     for (PointId id = 0; id < view.size(); ++id)
     {
-        double x = view.getFieldAs<double>(Dimension::Id::X, id);
-        double y = view.getFieldAs<double>(Dimension::Id::Y, id);
-        double z = view.getFieldAs<double>(Dimension::Id::Z, id);
+        x = view.getFieldAs<double>(Dimension::Id::X, id);
+        y = view.getFieldAs<double>(Dimension::Id::Y, id);
+        z = view.getFieldAs<double>(Dimension::Id::Z, id);
 
-        transform(x, y, z);
+        OCTTransform(m_transform_ptr, 1, &x, &y, &z);
 
         view.setField(Dimension::Id::X, id, x);
         view.setField(Dimension::Id::Y, id, y);
@@ -191,4 +241,5 @@ void ReprojectionFilter::filter(PointView& view)
     }
 }
 
+
 } // namespace pdal
diff --git a/filters/reprojection/ReprojectionFilter.hpp b/filters/reprojection/ReprojectionFilter.hpp
index e7898bf..a860646 100644
--- a/filters/reprojection/ReprojectionFilter.hpp
+++ b/filters/reprojection/ReprojectionFilter.hpp
@@ -61,12 +61,13 @@ public:
 
 private:
     virtual void processOptions(const Options& options);
-    virtual void ready(PointTableRef table);
     virtual void initialize();
+    virtual PointViewSet run(PointViewPtr view);
     virtual void filter(PointView& view);
 
     void updateBounds();
-    void transform(double& x, double& y, double& z);
+    void createTransform(PointView *view);
+    bool transform(double& x, double& y, double& z);
 
     SpatialReference m_inSRS;
     SpatialReference m_outSRS;
@@ -78,6 +79,8 @@ private:
     ReferencePtr m_out_ref_ptr;
     TransformPtr m_transform_ptr;
 
+    bool m_cullBadPoints;
+
     ReprojectionFilter& operator=(const ReprojectionFilter&); // not implemented
     ReprojectionFilter(const ReprojectionFilter&); // not implemented
 };
diff --git a/include/pdal/Compression.hpp b/include/pdal/Compression.hpp
index de0f802..03f17f0 100644
--- a/include/pdal/Compression.hpp
+++ b/include/pdal/Compression.hpp
@@ -44,10 +44,12 @@
 #include <laz-perf/encoder.hpp>
 #include <laz-perf/decoder.hpp>
 #include <laz-perf/formats.hpp>
+#include <laz-perf/io.hpp>
 #include <laz-perf/las.hpp>
 #endif
 
 #include <pdal/Dimension.hpp>
+#include <pdal/util/OStream.hpp>
 
 #include <map>
 #include <vector>
@@ -167,7 +169,7 @@ public:
     ~LazPerfCompressor()
     {
         if (!m_done)
-            std::cerr << "LasPerfCompressor destroyed without a call "
+            std::cerr << "LazPerfCompressor destroyed without a call "
                "to done()";
     }
 
@@ -203,6 +205,117 @@ private:
     bool m_done;
 };
 
+class LazPerfVlrCompressor
+{
+    typedef laszip::io::__ofstream_wrapper<std::ostream> OutputStream;
+    typedef laszip::encoders::arithmetic<OutputStream> Encoder;
+    typedef laszip::formats::dynamic_compressor Compressor;
+    typedef laszip::factory::record_schema Schema;
+
+public:
+    LazPerfVlrCompressor(std::ostream& stream, const Schema& schema,
+        uint32_t chunksize) :
+        m_stream(stream), m_outputStream(stream), m_schema(schema),
+        m_chunksize(chunksize), m_chunkPointsWritten(0), m_chunkInfoPos(0),
+        m_chunkOffset(0)
+    {}
+
+    ~LazPerfVlrCompressor()
+    {
+        if (m_encoder)
+            std::cerr << "LazPerfVlrCompressor destroyed without a call "
+               "to done()";
+    }
+
+
+    void compress(const char *inbuf)
+    {
+        // First time through.
+        if (!m_encoder || !m_compressor)
+        {
+            // Get the position 
+            m_chunkInfoPos = m_stream.tellp();
+            // Seek over the chunk info offset value
+            m_stream.seekp(sizeof(uint64_t), std::ios::cur);
+            m_chunkOffset = m_stream.tellp();
+            resetCompressor();
+        }
+        else if (m_chunkPointsWritten == m_chunksize)
+        {
+            resetCompressor();
+            newChunk();
+        }
+        m_compressor->compress(inbuf);
+        m_chunkPointsWritten++;
+    }
+
+    void done()
+    {
+        // Close and clear the point encoder.
+        m_encoder->done();
+        m_encoder.reset();
+
+        newChunk();
+
+        // Save our current position.  Go to the location where we need
+        // to write the chunk table offset at the beginning of the point data.
+        std::streampos chunkTablePos = m_stream.tellp();
+        m_stream.seekp(m_chunkInfoPos);
+        OLeStream out(&m_stream);
+        out << (uint64_t)chunkTablePos;
+
+        // Move to the start of the chunk table.
+        m_stream.seekp(chunkTablePos);
+
+        // Write the chunk table header.
+        out << (uint32_t)0;  // Version (?)
+        out << (uint32_t)m_chunkTable.size();
+
+        // Encode and write the chunk table.
+        OutputStream outputStream(m_stream);
+        Encoder encoder(outputStream);
+        laszip::compressors::integer compressor(32, 2);
+        compressor.init();
+
+        uint32_t predictor = 0;
+        for (uint32_t offset : m_chunkTable)
+        {
+            offset = htole32(offset);
+            compressor.compress(encoder, predictor, offset, 1);
+            predictor = offset;
+        }
+        encoder.done();
+    }
+
+private:
+    void resetCompressor()
+    {
+        if (m_encoder)
+            m_encoder->done();
+        m_encoder.reset(new Encoder(m_outputStream));
+        m_compressor = laszip::factory::build_compressor(*m_encoder, m_schema);
+    }
+
+    void newChunk()
+    {
+        std::streampos offset = m_stream.tellp();
+        m_chunkTable.push_back((uint32_t)(offset - m_chunkOffset));
+        m_chunkOffset = offset;
+        m_chunkPointsWritten = 0;
+    }
+
+    std::ostream& m_stream;
+    OutputStream m_outputStream;
+    std::unique_ptr<Encoder> m_encoder;
+    Compressor::ptr m_compressor;
+    Schema m_schema;
+    uint32_t m_chunksize;
+    uint32_t m_chunkPointsWritten;
+    std::streampos m_chunkInfoPos;
+    std::streampos m_chunkOffset;
+    std::vector<uint32_t> m_chunkTable;
+};
+
 
 template<typename InputStream>
 class LazPerfDecompressor
@@ -237,6 +350,62 @@ private:
     Decompressor m_decompressor;
     size_t m_pointSize;
 };
+
+class LazPerfVlrDecompressor
+{
+public:
+    LazPerfVlrDecompressor(std::istream& stream, const char *vlrData,
+        std::streamoff pointOffset) :
+        m_stream(stream), m_inputStream(stream), m_chunksize(0),
+        m_chunkPointsRead(0)
+    {
+        laszip::io::laz_vlr zipvlr(vlrData);
+        m_chunksize = zipvlr.chunk_size;
+        m_schema = laszip::io::laz_vlr::to_schema(zipvlr);
+        m_stream.seekg(pointOffset + sizeof(int64_t));
+    }
+
+    size_t pointSize() const
+        { return (size_t)m_schema.size_in_bytes(); }
+
+    void decompress(char *outbuf)
+    {
+        if (m_chunkPointsRead == m_chunksize || !m_decoder || !m_decompressor)
+        {
+            resetDecompressor();
+            m_chunkPointsRead = 0;
+        }
+        m_decompressor->decompress(outbuf);
+        m_chunkPointsRead++;
+    }
+
+private:
+    void resetDecompressor()
+    {
+        m_decoder.reset(new Decoder(m_inputStream));
+        m_decompressor =
+            laszip::factory::build_decompressor(*m_decoder, m_schema);
+    }
+
+    typedef laszip::io::__ifstream_wrapper<std::istream> InputStream;
+    typedef laszip::decoders::arithmetic<InputStream> Decoder;
+    typedef laszip::formats::dynamic_decompressor Decompressor;
+    typedef laszip::factory::record_schema Schema;
+
+    std::istream& m_stream;
+    InputStream m_inputStream;
+    std::unique_ptr<Decoder> m_decoder;
+    Decompressor::ptr m_decompressor;
+    Schema m_schema;
+    uint32_t m_chunksize;
+    uint32_t m_chunkPointsRead;
+};
+
+#else
+
+typedef char LazPerfVlrCompressor;
+typedef char LazPerfVlrDecompressor;
+
 #endif  // PDAL_HAVE_LAZPERF
 
 } // namespace pdal
diff --git a/include/pdal/FlexWriter.hpp b/include/pdal/FlexWriter.hpp
index 726dc32..8c287d9 100644
--- a/include/pdal/FlexWriter.hpp
+++ b/include/pdal/FlexWriter.hpp
@@ -33,6 +33,7 @@
 
 #pragma once
 
+#include <pdal/PDALUtils.hpp>
 #include <pdal/Writer.hpp>
 
 namespace pdal
@@ -92,13 +93,22 @@ private:
     {
         readyTable(table);
         if (m_hashPos == std::string::npos)
-            readyFile(generateFilename());
+        {
+            if (!table.spatialReferenceUnique())
+            {
+                std::ostringstream oss;
+                oss << getName() << ": Attempting to write '" << m_filename <<
+                    "' with multiple spatial references.";
+                Utils::printError(oss.str());
+            }
+            readyFile(generateFilename(), table.spatialReference());
+        }
     }
 
     virtual void write(const PointViewPtr view) final
     {
         if (m_hashPos != std::string::npos)
-            readyFile(generateFilename());
+            readyFile(generateFilename(), view->spatialReference());
         writeView(view);
         if (m_hashPos != std::string::npos)
             doneFile();
@@ -119,7 +129,8 @@ private:
     virtual void doneTable(PointTableRef table)
     {}
 
-    virtual void readyFile(const std::string& filename) = 0;
+    virtual void readyFile(const std::string& filename,
+        const SpatialReference& srs) = 0;
     virtual void writeView(const PointViewPtr view) = 0;
     virtual void doneFile()
     {}
diff --git a/include/pdal/GDALUtils.hpp b/include/pdal/GDALUtils.hpp
index 0459d21..eb5a128 100644
--- a/include/pdal/GDALUtils.hpp
+++ b/include/pdal/GDALUtils.hpp
@@ -35,17 +35,19 @@
 #pragma once
 
 #include <pdal/pdal_internal.hpp>
+#include <pdal/Dimension.hpp>
 
 #include <pdal/Log.hpp>
 
 #include <sstream>
 #include <vector>
+#include <array>
 
 #include <boost/function.hpp>
 #include <boost/bind.hpp>
 
 #include <cpl_port.h>
-#include "gdal.h"
+#include <gdal.h>
 #include <cpl_vsi.h>
 #include <cpl_conv.h>
 #include <ogr_api.h>
@@ -73,18 +75,35 @@ public:
     }
 
     void setFromLayer(OGRLayerH layer)
-        { newRef(OSRClone(OGR_L_GetSpatialRef(layer))); }
+        {
+            if (layer)
+            {
+                OGRSpatialReferenceH s = OGR_L_GetSpatialRef(layer);
+                if (s)
+                {
+                    OGRSpatialReferenceH clone = OSRClone(s);
+                    newRef(clone);
+                }
+
+            }
+        }
     operator bool () const
         { return m_ref.get() != NULL; }
     OGRSpatialReferenceH get() const
         { return m_ref.get(); }
-    bool empty() const
+    std::string wkt() const
     {
         char *pszWKT = NULL;
         OSRExportToWkt(m_ref.get(), &pszWKT);
         bool valid = (bool)*pszWKT;
+        std::string output(pszWKT);
         CPLFree(pszWKT);
-        return (!valid);
+        return output;
+    }
+
+    bool empty() const
+    {
+        return wkt().empty();
     }
 
 private:
@@ -106,7 +125,14 @@ public:
         OGRGeometryH geom;
 
         char *p_wkt = const_cast<char *>(wkt.data());
-        OGR_G_CreateFromWkt(&p_wkt, srs.get(), &geom);
+        OGRSpatialReferenceH ref = srs.get();
+        if (srs.empty())
+        {
+            ref = NULL;
+        }
+        OGRErr err = OGR_G_CreateFromWkt(&p_wkt, ref, &geom);
+        if (err != OGRERR_NONE)
+            throw pdal::pdal_error("unable to construct OGR geometry from wkt!");
         newRef(geom);
     }
 
@@ -127,6 +153,11 @@ public:
         return std::string(p_wkt);
     }
 
+    void setFromGeometry(OGRGeometryH geom)
+        {
+            if (geom)
+                newRef(OGR_G_Clone(geom));
+        }
 
 private:
     void newRef(void *v)
@@ -166,6 +197,54 @@ private:
     pdal::LogPtr m_log;
 };
 
+class PDAL_DLL Raster
+
+{
+
+public:
+    Raster(const std::string& filename);
+    ~Raster();
+    bool open();
+    void close();
+
+    bool read(double x, double y, std::vector<double>& data);
+    std::vector<pdal::Dimension::Type::Enum> getPDALDimensionTypes() const
+    {
+        return m_types;
+    }
+    bool readBand(std::vector<uint8_t>& band, int nBand);
+
+    void pixelToCoord(int column, int row, std::array<double, 2>& output) const;
+
+    SpatialReference getSpatialRef() const;
+
+    std::string m_filename;
+
+    std::array<double, 6> m_forward_transform;
+    std::array<double, 6> m_inverse_transform;
+
+    int m_raster_x_size;
+    int m_raster_y_size;
+
+    int m_block_x;
+    int m_block_y;
+
+    size_t m_size;
+    int m_band_count;
+    std::vector<pdal::Dimension::Type::Enum> m_types;
+    std::vector<std::array<double, 2>> m_block_sizes;
+
+    GDALDatasetH m_ds;
+
+private:
+    bool getPixelAndLinePosition(double x, double y,
+                                 std::array<double, 6> const& inverse,
+                                 int32_t& pixel, int32_t& line);
+    std::vector<pdal::Dimension::Type::Enum> computePDALDimensionTypes() const;
+    std::vector<std::array<int, 2>> fetchGDALBlockSizes() const;
+
+};
+
 } // namespace gdal
 
 
diff --git a/include/pdal/Geometry.hpp b/include/pdal/Geometry.hpp
new file mode 100644
index 0000000..319bbbb
--- /dev/null
+++ b/include/pdal/Geometry.hpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_types.hpp>
+
+#include <cstdarg>
+
+#ifdef PDAL_HAVE_GEOS
+#include <geos_c.h>
+#endif
+
+#pragma once
+
+namespace pdal
+{
+
+#ifdef PDAL_HAVE_GEOS
+namespace
+{
+
+static GEOSContextHandle_t s_environment(NULL);
+static int s_contextCnt(0);
+
+static void GEOSErrorHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    va_start(args, fmt);
+    char buf[1024];
+
+    vsnprintf(buf, sizeof(buf), fmt, args);
+    std::cout << "GEOS error: " << buf << std::endl;
+
+    va_end(args);
+}
+
+static void GEOSWarningHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    char buf[1024];
+    vsnprintf(buf, sizeof(buf), fmt, args);
+    std::cout << "GEOS warning: " << buf << std::endl;
+
+    va_end(args);
+}
+
+static GEOSContextHandle_t init()
+{
+    if (s_contextCnt == 0)
+        s_environment = initGEOS_r(GEOSWarningHandler, GEOSErrorHandler);
+    s_contextCnt++;
+    return s_environment;
+}
+
+static void finish()
+{
+    s_contextCnt--;
+    if (s_contextCnt == 0)
+        finishGEOS_r(s_environment);
+}
+
+} // Unnamed namespace
+
+namespace Geometry
+{
+
+static std::string smoothPolygon(const std::string& wkt, double tolerance)
+{
+    GEOSContextHandle_t env = init();
+
+    GEOSGeometry *geom = GEOSGeomFromWKT_r(env, wkt.c_str());
+    if (!geom)
+        return "";
+
+    GEOSGeometry *smoothed = GEOSTopologyPreserveSimplify_r(env, geom,
+        tolerance);
+    if (!smoothed)
+        return "";
+    char *smoothedWkt = GEOSGeomToWKT_r(env, smoothed);
+    std::string outWkt(smoothedWkt);
+    GEOSFree_r(env, smoothedWkt);
+    GEOSGeom_destroy_r(env, geom);
+    GEOSGeom_destroy_r(env, smoothed);
+    finish();
+    return outWkt;
+}
+
+static double computeArea(const std::string& wkt)
+{
+    GEOSContextHandle_t env = init();
+
+    GEOSGeometry *geom = GEOSGeomFromWKT_r(env, wkt.c_str());
+    if (!geom)
+        return 0.0;
+
+    double output(0.0);
+    int er = GEOSArea_r(env, geom, &output);
+    GEOSGeom_destroy_r(env, geom);
+    finish();
+    return output;
+}
+#else
+
+static std::string smoothPolygon(const std::string& wkt, double tolerance)
+{
+    throw pdal_error("Can't call smoothPolygon.  PDAL not built with GEOS.");
+}
+
+#endif
+
+} // namespace Geometry
+
+} // namespace pdal
+
diff --git a/include/pdal/Kernel.hpp b/include/pdal/Kernel.hpp
index 9d418ae..8b03f7f 100644
--- a/include/pdal/Kernel.hpp
+++ b/include/pdal/Kernel.hpp
@@ -72,8 +72,7 @@ typedef std::shared_ptr<PointView> PointViewPtr;
 class PDAL_DLL Kernel
 {
 public:
-    virtual ~Kernel()
-    {}
+    virtual ~Kernel();
 
     // call this, to start the machine
     int run(int argc, const char* argv[], const std::string& appName);
@@ -128,7 +127,12 @@ public:
 
     void applyExtraStageOptionsRecursive(Stage *s)
     {
-        s->addOptions(extraStageOptions(s->getName()));
+        // if options provided via command-line, we assume they should overwrite
+        // existing options, remove first, and then add
+        Options ops = extraStageOptions(s->getName());
+
+        s->removeOptions(ops);
+        s->addOptions(ops);
         auto stages = s->getInputs();
         for (Stage *s : stages)
             applyExtraStageOptionsRecursive(s);
@@ -192,4 +196,3 @@ private:
 PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Kernel&);
 
 } // namespace pdal
-
diff --git a/include/pdal/KernelSupport.hpp b/include/pdal/KernelSupport.hpp
index cbf1189..ece49c4 100644
--- a/include/pdal/KernelSupport.hpp
+++ b/include/pdal/KernelSupport.hpp
@@ -68,7 +68,7 @@ class PDAL_DLL KernelSupport
 public:
     // makes a writer, from just the filename and some other
     // options (and the input stage)
-    static PipelineManager* makePipeline(const std::string& filename);
+    static PipelineManagerPtr makePipeline(const std::string& filename);
 
 private:
     KernelSupport& operator=(const KernelSupport&); // not implemented
diff --git a/include/pdal/Metadata.hpp b/include/pdal/Metadata.hpp
index 6d2a052..18cab83 100644
--- a/include/pdal/Metadata.hpp
+++ b/include/pdal/Metadata.hpp
@@ -690,7 +690,7 @@ inline std::string Metadata::inferType(const std::string& val)
 {
     size_t pos;
 
-    long l;
+    long l = 0;
     try
     {
         pos = 0;
diff --git a/include/pdal/Options.hpp b/include/pdal/Options.hpp
index 8ca769a..4b0ecde 100644
--- a/include/pdal/Options.hpp
+++ b/include/pdal/Options.hpp
@@ -55,7 +55,6 @@ class Option;
 namespace options
 {
 typedef std::multimap<std::string, Option> map_t;
-typedef std::shared_ptr<Options> OptionsPtr;
 }
 
 /*!
@@ -101,8 +100,7 @@ public:
 
 /// @name Constructors
 
-    /// Empty constructor
-    Option() : m_options(0)
+    Option()
     {}
 
     /// Primary constructor
@@ -123,43 +121,48 @@ public:
     /// Construct from an existing boost::property_tree
     Option(const boost::property_tree::ptree& tree);
 
-/// @name Equality
-    /// Equality
-    bool equals(const Option& rhs) const
-    {
-        return (m_name == rhs.getName() &&
-            m_value == rhs.getValue<std::string>() &&
-            m_description == rhs.getDescription() &&
-            m_options == rhs.m_options);
-    }
-
     /// Equality operator
     bool operator==(const Option& rhs) const
     {
-        return equals(rhs);
+        return (m_name == rhs.getName() &&
+            m_value == rhs.getValue<std::string>() &&
+            m_description == rhs.getDescription());
     }
 
     /// Inequality operator
     bool operator!=(const Option& rhs) const
     {
-        return (!equals(rhs));
+        return (! operator == (rhs));
     }
 
 /// @name Attribute access
 
-    /// Overwrites the name given in the constructor
-    /// @param name new value to use for the name of the Option
-    inline void setName(const std::string& name)
+    /// @return the name for the Option instance
+    std::string const& getName() const
     {
-        m_name = name;
+        return m_name;
     }
 
-    /// @return the name for the Option instance
-    inline std::string const& getName() const
+    static std::string::size_type
+    parse(const std::string& name, std::string::size_type p)
     {
-        return m_name;
+        std::string::size_type count = 0;
+
+        if (std::islower(name[p++]))
+        {
+            count++;
+
+            auto isname = [](char c)
+                { return (std::islower(c) || std::isdigit(c) || c == '_'); };
+            count += Utils::extract(name, p, isname);
+        }
+        return count;
     }
 
+    // Make sure that the option name consists of lowercase characters or
+    // underscores.
+    static bool nameValid(const std::string& name, bool reportError);
+
     /// Overwrites the description given in the constructor
     /// @param description new value to use for the description of the Option
     inline void setDescription(const std::string& description)
@@ -201,12 +204,6 @@ public:
     \endverbatim
     */
 
-    boost::optional<Options const&> getOptions() const;
-
-    /// sets the Options set for this Option instance
-    /// @param op Options set to use
-    void setOptions(Options const& op);
-
     bool empty() const;
 
 #if defined(PDAL_COMPILER_MSVC)
@@ -231,7 +228,6 @@ private:
     std::string m_name;
     std::string m_value;
     std::string m_description; // optional field
-    options::OptionsPtr m_options; // Sub-options.
 
     template <typename T>
     void getValue(T& t) const
@@ -282,27 +278,6 @@ template<> void Option::setValue(const bool& value);
 template<> void Option::setValue(const std::string& value);
 #endif
 
-/*!
-    \verbatim embed:rst
-     An Options object is just a map of names to Option objects.
-
-     Dumped as XML, an Options object with two Option objects looks like this:
-
-     ::
-
-        <?xml...>
-        <Option>
-          <Name>myname</name>
-          <Value>17</value>
-          <Description>my descr</description>
-        </Option>
-        <Option>
-          <Name>myname2</name>
-          <Value>13</value>
-          <Description>my descr2</description>
-        </Option>
-    \endverbatim
-*/
 class PDAL_DLL Options
 {
 public:
@@ -363,7 +338,7 @@ public:
     void add(const Option& option);
 
     // if option name not present, just returns
-    void remove(const std::string& name);
+    void remove(const Option& option);
 
     MetadataNode toMetadata() const
     {
@@ -434,7 +409,7 @@ public:
 
     // get value of an option, or use given default if option not present
     template<typename T>
-    T getValueOrDefault(std::string const& name, T defaultValue) const
+    T getValueOrDefault(std::string const& name, const T& defaultValue) const
     {
         T result;
 
@@ -481,84 +456,15 @@ public:
     // returns true iff the option name is valid
     bool hasOption(std::string const& name) const;
 
-    // the empty options list
-    // BUG: this should be a member variable, not a function, but doing so
-    // causes vs2010 to fail to link
-    static const Options& none();
-
     void dump() const;
 
     std::vector<Option> getOptions(std::string const& name="") const;
 
 
-    template<typename T>
-    boost::optional<T> getMetadataOption(std::string const& name) const
-    {
-        // <Reader type="writers.las">
-        //     <Option name="metadata">
-        //         <Options>
-        //             <Option name="dataformatid">
-        //             3
-        //             </Option>
-        //             <Option name="filesourceid">
-        //             forward
-        //             </Option>
-        //             <Option name="year">
-        //             forward
-        //             </Option>
-        //             <Option name="day_of_year">
-        //             forward
-        //             </Option>
-        //             <Option name="vlr">
-        //             forward
-        //             <Options>
-        //                 <Option name="user_id">
-        //                 hobu
-        //                 </Option>
-        //                 <Option name="record">
-        //                 1234
-        //                 </Option>
-        //             </Options>
-        //             </Option>
-        //         </Options>
-        //     </Option>
-        // </Reader>
-
-        Option const* doMetadata(0);
-        try
-        {
-            doMetadata = &getOption("metadata");
-        }
-        catch (Option::not_found)
-        {
-            return boost::optional<T>();
-        }
-
-        boost::optional<Options const&> meta = doMetadata->getOptions();
-        if (meta)
-        {
-            try
-            {
-                meta->getOption(name);
-            }
-            catch (Option::not_found)
-            {
-                return boost::optional<T>();
-            }
-
-            return boost::optional<T>(meta->getOption(name).getValue<T>());
-        }
-        return boost::optional<T>();
-    }
-
 private:
     options::map_t m_options;
 };
 
-
-
 PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Options&);
 
-
 } // namespace pdal
-
diff --git a/include/pdal/PDALUtils.hpp b/include/pdal/PDALUtils.hpp
index e493e11..bd92d1c 100644
--- a/include/pdal/PDALUtils.hpp
+++ b/include/pdal/PDALUtils.hpp
@@ -44,6 +44,10 @@
 #include <pdal/PointView.hpp>
 #include <pdal/Options.hpp>
 
+#ifndef _WIN32
+#include <sys/fcntl.h>
+#endif
+
 namespace pdal
 {
 
@@ -225,15 +229,8 @@ inline ptree toPTree(const Option& option)
     t.put("Name", option.getName());
     t.put("Value", option.getValue<std::string>());
     if (option.getDescription() != "")
-    {
         t.put("Description", option.getDescription());
-    }
-    boost::optional<Options const&> options = option.getOptions();
 
-    if (options != boost::none)
-    {
-        t.add_child("Options", toPTree(*options));
-    }
     return t;
 }
 
diff --git a/include/pdal/PipelineManager.hpp b/include/pdal/PipelineManager.hpp
index 9d45e96..286fbf3 100644
--- a/include/pdal/PipelineManager.hpp
+++ b/include/pdal/PipelineManager.hpp
@@ -100,7 +100,7 @@ private:
     PipelineManager& operator=(const PipelineManager&); // not implemented
     PipelineManager(const PipelineManager&); // not implemented
 };
-
+typedef std::unique_ptr<PipelineManager> PipelineManagerPtr;
 
 } // namespace pdal
 
diff --git a/include/pdal/PointTable.hpp b/include/pdal/PointTable.hpp
index 41ad128..ca83771 100644
--- a/include/pdal/PointTable.hpp
+++ b/include/pdal/PointTable.hpp
@@ -34,8 +34,7 @@
 
 #pragma once
 
-#include <map>
-#include <memory>
+#include <set>
 #include <vector>
 
 #include "pdal/Dimension.hpp"
@@ -62,8 +61,23 @@ public:
     // Metadata operations.
     MetadataNode metadata()
         { return m_metadata->getNode(); }
-    SpatialReference spatialRef() const;
-    void setSpatialRef(const SpatialReference& sref);
+    void clearSpatialReferences()
+        { m_spatialRefs.clear(); }
+    void addSpatialReference(const SpatialReference& srs)
+        { m_spatialRefs.insert(srs); }
+    bool spatialReferenceUnique() const
+        { return m_spatialRefs.size() == 1; }
+    SpatialReference spatialReference() const
+    {
+        return spatialReferenceUnique() ? anySpatialReference() :
+            SpatialReference();
+    }
+    SpatialReference anySpatialReference() const
+    {
+        return m_spatialRefs.size() ?
+            *m_spatialRefs.begin() : SpatialReference();
+    }
+
     MetadataNode privateMetadata(const std::string& name);
 
 private:
@@ -77,6 +91,7 @@ private:
 
 protected:
     MetadataPtr m_metadata;
+    std::set<SpatialReference> m_spatialRefs;
 };
 typedef BasePointTable& PointTableRef;
 typedef BasePointTable const & ConstPointTableRef;
diff --git a/include/pdal/PointView.hpp b/include/pdal/PointView.hpp
index d4260e0..390a816 100644
--- a/include/pdal/PointView.hpp
+++ b/include/pdal/PointView.hpp
@@ -76,6 +76,13 @@ public:
         m_id = ++lastId;
     }
 
+    PointView(PointTableRef pointTable, const SpatialReference& srs) :
+        m_pointTable(pointTable), m_size(0), m_id(0), m_spatialReference(srs)
+    {
+        static int lastId = 0;
+        m_id = ++lastId;
+    }
+
     virtual ~PointView()
     {}
 
@@ -106,7 +113,9 @@ public:
     /// Return a new point view with the same point table as this
     /// point buffer.
     PointViewPtr makeNew() const
-        { return PointViewPtr(new PointView(m_pointTable)); }
+    {
+        return PointViewPtr( new PointView(m_pointTable, m_spatialReference));
+    }
 
     template<class T>
     T getFieldAs(Dimension::Id::Enum dim, PointId pointIndex) const;
@@ -204,8 +213,12 @@ public:
      { return m_pointTable.layout()->dimType(id);}
     DimTypeList dimTypes() const
         { return m_pointTable.layout()->dimTypes(); }
-
-    PointLayoutPtr layout() const { return m_pointTable.layout(); }
+    PointLayoutPtr layout() const
+        { return m_pointTable.layout(); }
+    void setSpatialReference(const SpatialReference& spatialRef)
+        { m_spatialReference = spatialRef; }
+    SpatialReference spatialReference() const
+        { return m_spatialReference; }
 
     /// Fill a buffer with point data specified by the dimension list.
     /// \param[in] dims  List of dimensions/types to retrieve.
@@ -257,6 +270,7 @@ protected:
     point_count_t m_size;
     int m_id;
     std::queue<PointId> m_temps;
+    SpatialReference m_spatialReference;
 
 private:
     template<typename T_IN, typename T_OUT>
@@ -271,9 +285,6 @@ private:
     inline PointId getTemp(PointId id);
     void freeTemp(PointId id)
         { m_temps.push(id); }
-
-    // Awfulness to avoid exceptions in numeric cast.
-    static bool m_ok;
 };
 
 struct PointViewLess
@@ -381,6 +392,7 @@ template <class T>
 inline T PointView::getFieldAs(Dimension::Id::Enum dim,
     PointId pointIndex) const
 {
+    assert(pointIndex < m_size);
     T retval;
     const Dimension::Detail *dd = m_pointTable.layout()->dimDetail(dim);
     double val;
diff --git a/include/pdal/SpatialReference.hpp b/include/pdal/SpatialReference.hpp
index a301a15..d890fbb 100644
--- a/include/pdal/SpatialReference.hpp
+++ b/include/pdal/SpatialReference.hpp
@@ -40,6 +40,19 @@ namespace pdal
 {
 
 class PDAL_DLL BOX3D;
+
+/// A SpatialReference defines a model of the earth that is used to describe
+/// the location of points.
+/// A SpatialReference is part of input data and is automatically loaded
+/// into PDAL by readers, or it's provided explicitly by a user through an
+/// option.  All points in a point view share a common spatial reference.  When
+/// a stage finishes processing point view, the point view takes on the
+/// spatial reference of that stage, if it had one.
+/// A point table tracks the spatial references of the views currently being
+/// processed by a stage.  If a point table being processed by a stage has
+/// more than one spatial reference, PointTable::spatialReference() will
+/// return an empty spatial reference and PointTable::spatialReferenceUnique()
+/// will return false.
 class PDAL_DLL SpatialReference
 {
 public:
@@ -59,11 +72,17 @@ public:
     bool equals(const SpatialReference& other) const;
     bool operator==(const SpatialReference& other) const;
     bool operator!=(const SpatialReference& other) const;
+    bool operator<(const SpatialReference& other) const
+        { return m_wkt < other.m_wkt; }
 
     // Returns true iff the object doesn't contain a valid srs.
     // (this is a cleaner way of saying "getWKT() == "")
     bool empty() const;
 
+
+    // Returns true of OSR can validate the SRS
+    bool valid() const;
+
     /// Returns the OGC WKT describing Spatial Reference System.
     /// If GDAL is linked, it uses GDAL's operations and methods to determine
     /// the WKT.  If GDAL is not linked, no WKT is returned.
diff --git a/include/pdal/Stage.hpp b/include/pdal/Stage.hpp
index 689486e..7d8282c 100644
--- a/include/pdal/Stage.hpp
+++ b/include/pdal/Stage.hpp
@@ -53,9 +53,6 @@ namespace pdal
 {
 
 class Iterator;
-class StageSequentialIterator;
-class StageRandomIterator;
-class StageBlockIterator;
 class StageRunner;
 class StageWrapper;
 
@@ -95,6 +92,11 @@ public:
         for (const auto& o : opts.getOptions())
             m_options.add(o);
     }
+    void removeOptions(const Options& opts)
+    {
+        for (const auto& o : opts.getOptions())
+            m_options.remove(o);
+    }
     virtual boost::property_tree::ptree serializePipeline() const = 0;
     virtual LogPtr log() const
         { return m_log; }
@@ -116,15 +118,9 @@ public:
         { return Options(); }
     static Dimension::IdList getDefaultDimensions()
         { return Dimension::IdList(); }
-    static std::string s_getInfoLink()
-        { return std::string(); }
     static std::string s_getPluginVersion()
         { return std::string(); }
-    virtual boost::property_tree::ptree toPTree(PointTableRef table) const
-        { return boost::property_tree::ptree(); }
 
-    virtual StageSequentialIterator* createSequentialIterator() const
-        { return NULL; }
     inline MetadataNode getMetadata() const
         { return m_metadata; }
 
@@ -158,9 +154,10 @@ private:
     virtual void writerProcessOptions(const Options& /*options*/)
         {}
     void l_initialize(PointTableRef table);
-    void l_done(PointTableRef table);
     virtual QuickInfo inspect()
         { return QuickInfo(); }
+    virtual void initialize(PointTableRef /*table*/)
+        { initialize(); }
     virtual void initialize()
         {}
     virtual void addDimensions(PointLayoutPtr /*layout*/)
@@ -181,4 +178,3 @@ private:
 PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Stage&);
 
 } // namespace pdal
-
diff --git a/include/pdal/StageWrapper.hpp b/include/pdal/StageWrapper.hpp
index 9af1b9f..62ec7ac 100644
--- a/include/pdal/StageWrapper.hpp
+++ b/include/pdal/StageWrapper.hpp
@@ -23,10 +23,7 @@ public:
     static void ready(Stage& s, PointTableRef table)
         { s.ready(table); }
     static void done(Stage& s, PointTableRef table)
-    {
-        s.l_done(table);
-        s.done(table);
-    }
+        { s.done(table); }
     static PointViewSet run(Stage& s, PointViewPtr view)
         { return s.run(view); }
 };
diff --git a/include/pdal/util/Algorithm.hpp b/include/pdal/util/Algorithm.hpp
index 9a8d336..0e92ff0 100644
--- a/include/pdal/util/Algorithm.hpp
+++ b/include/pdal/util/Algorithm.hpp
@@ -39,11 +39,36 @@
 namespace pdal
 {
 
+namespace Utils
+{
+
 template<typename CONTAINER, typename VALUE>
 bool contains(const CONTAINER& cont, const VALUE& val)
 {
     return std::find(cont.begin(), cont.end(), val) != cont.end();
 }
 
+
+template<typename KEY, typename VALUE>
+bool contains(const std::map<KEY, VALUE>& c, const KEY& v)
+{
+    return c.find(v) != c.end();
+}
+
+
+template<typename TYPE, typename VALUE>
+void remove(std::vector<TYPE>& v, const VALUE& val)
+{
+    v.erase(std::remove(v.begin(), v.end(), val), v.end());
+}
+
+
+template<typename TYPE, typename PREDICATE>
+void remove_if(std::vector<TYPE>& v, PREDICATE p)
+{
+    v.erase(std::remove_if(v.begin(), v.end(), p), v.end());
+}
+
+} // namespace Utils
 } // namespace pdal
 
diff --git a/include/pdal/util/Utils.hpp b/include/pdal/util/Utils.hpp
index 4fc220d..c8b7639 100644
--- a/include/pdal/util/Utils.hpp
+++ b/include/pdal/util/Utils.hpp
@@ -43,6 +43,7 @@
 #include <stdexcept>
 #include <cmath>
 #include <fstream>
+#include <iomanip>
 #include <istream>
 #include <limits>
 #include <cstring>
@@ -58,27 +59,6 @@ namespace pdal
 
 namespace Utils
 {
-    template<typename T>
-    char *as_buffer(T& data)
-        { return static_cast<char*>(static_cast<void*>(&data)); }
-
-    template<typename T>
-    char *as_buffer(T* data)
-        { return static_cast<char*>(static_cast<void*>(data)); }
-
-    template <typename C, typename T>
-    bool check_stream_state(std::basic_ios<C, T>& srtm)
-    {
-        // Test stream state bits
-        if (srtm.eof())
-            throw std::out_of_range("end of file encountered");
-        else if (srtm.fail())
-            throw std::runtime_error("non-fatal I/O error occured");
-        else if (srtm.bad())
-            throw std::runtime_error("fatal I/O error occured");
-        return true;
-    }
-
     PDAL_DLL void random_seed(unsigned int seed);
     PDAL_DLL double random(double minimum, double maximum);
     PDAL_DLL double uniform(const double& minimum=0.0f,
@@ -232,6 +212,16 @@ namespace Utils
     PDAL_DLL std::string escapeNonprinting(const std::string& s);
     PDAL_DLL std::string hexDump(const char *buf, size_t count);
 
+    template<typename PREDICATE>
+    PDAL_DLL std::string::size_type
+    extract(const std::string& s, std::string::size_type p, PREDICATE pred)
+    {
+        std::string::size_type count = 0;
+        while (pred(s[p++]))
+            count++;
+        return count;
+    }
+
     /// Split a string into substrings.  Characters matching the predicate are
     ///   discarded.
     /// \param[in] s  String to split.
@@ -302,20 +292,31 @@ namespace Utils
     std::string typeidName()
         { return Utils::demangle(typeid(T).name()); }
 
-    template<typename KEY, typename VALUE>
-    bool contains(const std::map<KEY, VALUE>& c, const KEY& v)
-        { return c.find(v) != c.end(); }
-
-    template<typename COLLECTION, typename VALUE>
-    bool contains(const COLLECTION& c, const VALUE& v)
-        { return (std::find(c.begin(), c.end(), v) != c.end()); }
-
     struct RedirectStream
     {
+        RedirectStream() : m_out(NULL), m_out2(NULL), m_buf(NULL)
+        {}
+
         std::ofstream *m_out;
+        std::ostream *m_out2;
         std::streambuf *m_buf;
     };
 
+    /// Redirect a stream to some other stream.
+    /// \param[in] out   Stream to redirect.
+    /// \param[in] dst   Destination stream.
+    /// \return  Context for stream restoration (see restore()).
+    inline RedirectStream redirect(std::ostream& out, std::ostream& dst)
+    {
+        RedirectStream redir;
+
+        redir.m_out2 = &dst;
+        redir.m_buf = out.rdbuf();
+        out.rdbuf(redir.m_out2->rdbuf());
+        return redir;
+    }
+
+
     /// Redirect a stream to some file, by default /dev/null.
     /// \param[in] out   Stream to redirect.
     /// \param[in] file  Name of file where stream should be redirected.
@@ -338,7 +339,11 @@ namespace Utils
     inline void restore(std::ostream& out, RedirectStream redir)
     {
         out.rdbuf(redir.m_buf);
-        redir.m_out->close();
+        if (redir.m_out)
+            redir.m_out->close();
+        redir.m_out = NULL;
+        redir.m_out2 = NULL;
+        redir.m_buf = NULL;
     }
 
     //ABELL - This is certainly not as efficient as boost::numeric_cast, but
@@ -397,9 +402,19 @@ namespace Utils
         return oss.str();
     }
 
-    // There is an overload of std::to_string() for float and double, but
-    // its behavior is different from streaming and doesn't match what
-    // we have been doing historically.
+    inline std::string toString(double from)
+    {
+        std::ostringstream oss;
+        oss << std::setprecision(10) << from;
+        return oss.str();
+    }
+
+    inline std::string toString(float from)
+    {
+        std::ostringstream oss;
+        oss << std::setprecision(8) << from;
+        return oss.str();
+    }
 
     inline std::string toString(long long from)
         { return std::to_string(from); }
diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt
index cbf5787..e198fd8 100644
--- a/io/CMakeLists.txt
+++ b/io/CMakeLists.txt
@@ -1,7 +1,9 @@
 add_subdirectory(bpf)
 add_subdirectory(derivative)
 add_subdirectory(faux)
+add_subdirectory(ilvis2)
 add_subdirectory(las)
+add_subdirectory(gdal)
 add_subdirectory(null)
 add_subdirectory(optech)
 add_subdirectory(ply)
@@ -9,5 +11,6 @@ add_subdirectory(qfit)
 add_subdirectory(sbet)
 add_subdirectory(text)
 add_subdirectory(terrasolid)
+add_subdirectory(tindex)
 
 set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} PARENT_SCOPE)
diff --git a/io/bpf/BpfWriter.cpp b/io/bpf/BpfWriter.cpp
index 3873f80..b153939 100644
--- a/io/bpf/BpfWriter.cpp
+++ b/io/bpf/BpfWriter.cpp
@@ -131,16 +131,28 @@ void BpfWriter::processOptions(const Options& options)
         }
         m_bundledFiles.push_back(ulemFile);
     }
+
+    // BPF coordinates are always in UTM meters, which can be quite large.
+    // Allowing the writer to proceed with the default offset of 0 can lead to
+    // unexpected quantization of the coordinates. Instead, we force use of
+    // auto offset to subtract the minimum value in XYZ, unless of course, the
+    // user chooses to override with their own offset.
+    if (!options.hasOption("offset_x"))
+        m_xXform.m_autoOffset = true;
+    if (!options.hasOption("offset_y"))
+        m_yXform.m_autoOffset = true;
+    if (!options.hasOption("offset_z"))
+        m_zXform.m_autoOffset = true;
 }
 
 
-void BpfWriter::readyTable(PointTableRef table)
+void BpfWriter::prepared(PointTableRef table)
 {
     loadBpfDimensions(table.layout());
 }
 
 
-void BpfWriter::readyFile(const std::string& filename)
+void BpfWriter::readyFile(const std::string& filename, const SpatialReference&)
 {
     m_stream.open(filename);
     m_header.m_version = 3;
@@ -166,9 +178,28 @@ void BpfWriter::readyFile(const std::string& filename)
 
 void BpfWriter::loadBpfDimensions(PointLayoutPtr layout)
 {
+    Dimension::IdList dims;
+
+    if (m_outputDims.size())
+    {
+       for (std::string& s : m_outputDims)
+       {
+           Dimension::Id::Enum id = layout->findDim(s);
+           if (id == Dimension::Id::Unknown)
+           {
+               std::ostringstream oss;
+               oss << "Invalid dimension '" << s << "' specified for "
+                   "'output_dims' option.";
+               throw pdal_error(oss.str());
+            }
+            dims.push_back(id);
+       }
+    }
+    else
+        dims = layout->dims();
+
     // Verify that we have X, Y and Z and that they're the first three
     // dimensions.
-    Dimension::IdList dims = layout->dims();
     std::sort(dims.begin(), dims.end());
     if (dims.size() < 3 || dims[0] != Dimension::Id::X ||
         dims[1] != Dimension::Id::Y || dims[2] != Dimension::Id::Z)
@@ -335,4 +366,3 @@ void BpfWriter::doneFile()
 }
 
 } //namespace pdal
-
diff --git a/io/bpf/BpfWriter.hpp b/io/bpf/BpfWriter.hpp
index 09d0995..70099de 100644
--- a/io/bpf/BpfWriter.hpp
+++ b/io/bpf/BpfWriter.hpp
@@ -68,8 +68,9 @@ private:
     std::vector<BpfUlemFile> m_bundledFiles;
 
     virtual void processOptions(const Options& options);
-    virtual void readyTable(PointTableRef table);
-    virtual void readyFile(const std::string& filename);
+    virtual void prepared(PointTableRef table);
+    virtual void readyFile(const std::string& filename,
+        const SpatialReference& srs);
     virtual void writeView(const PointViewPtr data);
     virtual void doneFile();
 
diff --git a/io/derivative/DerivativeWriter.cpp b/io/derivative/DerivativeWriter.cpp
index 03b7979..a70ae39 100644
--- a/io/derivative/DerivativeWriter.cpp
+++ b/io/derivative/DerivativeWriter.cpp
@@ -64,25 +64,21 @@ std::string DerivativeWriter::getName() const
 const double c_pi = 3.14159265358979323846; /*!< PI value */
 const float c_background = FLT_MIN;
 
-DerivativeWriter::DerivativeWriter()
-    : Writer()
-    , m_primitive_type(0)
-//    , m_outputTypes(0)
+DerivativeWriter::DerivativeWriter() : m_primitive_type(0)
 {
     GDALAllRegister();
 }
 
 
-void DerivativeWriter::ready(PointTableRef table)
+void DerivativeWriter::processOptions(const Options& ops)
 {
-    m_inSRS = table.spatialRef();
+    m_GRID_DIST_X = ops.getValueOrDefault<double>("grid_dist_x", 15.0);
+    m_GRID_DIST_Y = ops.getValueOrDefault<double>("grid_dist_y", 15.0);
 }
 
+
 void DerivativeWriter::initialize()
 {
-    m_GRID_DIST_X = getOptions().getValueOrDefault<double>("grid_dist_x", 15.0);
-    m_GRID_DIST_Y = getOptions().getValueOrDefault<double>("grid_dist_y", 15.0);
-    m_filename = getOptions().getValueOrThrow<std::string>("filename");
 
     // maybe we eventually introduce an option to do more than slope
     //std::vector<Option> types = options.getOptions("output_type");
@@ -661,7 +657,6 @@ int DerivativeWriter::determineCatchmentAreaD8(Eigen::MatrixXd* data,
         //}
         //(*area)(row, col) = determineCatchmentAreaD8(data, area, tNextY, tNextX, postSpacing);
     }
-    //ABELL - Returning something.
     return 0;
 }
 
@@ -999,7 +994,6 @@ GDALDataset* DerivativeWriter::createFloat32GTIFF(std::string filename,
                 return dataset;
         }
     }
-    //ABELL
     return NULL;
 }
 
@@ -1471,6 +1465,7 @@ void DerivativeWriter::writeCurvature(Eigen::MatrixXd* tDemData,
 
 void DerivativeWriter::write(const PointViewPtr data)
 {
+    m_inSRS = data->spatialReference();
     data->calculateBounds(m_bounds);
 
     // calculate grid based off bounds and post spacing
@@ -1577,7 +1572,6 @@ void DerivativeWriter::write(const PointViewPtr data)
             if (tInterpValue != c_background)
                 return tInterpValue;
 
-            //ABELL - Returning something.
             return 0.0f;
         };
 
diff --git a/io/derivative/DerivativeWriter.hpp b/io/derivative/DerivativeWriter.hpp
index 198f7ed..e97acf3 100644
--- a/io/derivative/DerivativeWriter.hpp
+++ b/io/derivative/DerivativeWriter.hpp
@@ -108,8 +108,8 @@ public:
     Options getDefaultOptions();
 
 private:
+    virtual void processOptions(const Options& ops);
     virtual void initialize();
-    virtual void ready(PointTableRef table);
     virtual void write(const PointViewPtr view);
 
     void setBounds(const BOX2D& v)
@@ -163,7 +163,6 @@ private:
     double m_GRID_DIST_Y;
     unsigned int m_primitive_type;
     BOX2D m_bounds;
-    std::string m_filename;
     SpatialReference m_inSRS;
 
     DerivativeWriter& operator=(const DerivativeWriter&); // not implemented
diff --git a/io/faux/FauxReader.cpp b/io/faux/FauxReader.cpp
index fc5b85e..be4dc9c 100644
--- a/io/faux/FauxReader.cpp
+++ b/io/faux/FauxReader.cpp
@@ -55,12 +55,20 @@ std::string FauxReader::getName() const { return s_info.name; }
 
 static Mode string2mode(const std::string& str)
 {
-    if (boost::iequals(str, "constant")) return Constant;
-    if (boost::iequals(str, "random")) return Random;
-    if (boost::iequals(str, "ramp")) return Ramp;
-    if (boost::iequals(str, "uniform")) return Uniform;
-    if (boost::iequals(str, "normal")) return Normal;
-    throw pdal_error("invalid Mode option: " + str);
+    std::string lstr = Utils::tolower(str);
+    if (lstr == "constant")
+        return Constant;
+    if (lstr == "random")
+        return Random;
+    if (lstr == "ramp")
+        return Ramp;
+    if (lstr == "uniform")
+        return Uniform;
+    if (lstr == "normal")
+        return Normal;
+    std::ostringstream oss;
+    oss << s_info.name << ": Invalid 'mode' option: '" << str << "'.";
+    throw pdal_error(oss.str());
 }
 
 
@@ -83,8 +91,8 @@ void FauxReader::processOptions(const Options& options)
         std::string s = options.getValueOrDefault<std::string>("bounds");
 
         std::ostringstream oss;
-        oss << "Invalid 'bounds' specification for " << getName() <<
-            ": '" << s << ".  Format: '([xmin,xmax],[ymin,ymax],[zmin,zmax])'.";
+        oss << getName() << ": Invalid 'bounds' specification: '" << s <<
+            "'.  Format: '([xmin,xmax],[ymin,ymax],[zmin,zmax])'.";
         throw pdal_error(oss.str());
     }
     m_minX = bounds.minx;
@@ -97,6 +105,12 @@ void FauxReader::processOptions(const Options& options)
     // For backward compatibility.
     if (m_count == 0)
         m_count = options.getValueOrThrow<point_count_t>("num_points");
+    if (m_count == 0)
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Option 'count' must be non-zero.";
+        throw pdal_error(oss.str());
+    }
 
     m_mean_x = options.getValueOrDefault<double>("mean_x",0.0);
     m_mean_y = options.getValueOrDefault<double>("mean_y",0.0);
@@ -107,7 +121,12 @@ void FauxReader::processOptions(const Options& options)
     m_mode = string2mode(options.getValueOrThrow<std::string>("mode"));
     m_numReturns = options.getValueOrDefault("number_of_returns", 0);
     if (m_numReturns > 10)
-        throw pdal_error("faux: number_of_returns option must be 10 or less.");
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Option 'number_of_returns' must be in the range "
+            "[0,10].";
+        throw pdal_error(oss.str());
+    }
 }
 
 Options FauxReader::getDefaultOptions()
@@ -145,9 +164,13 @@ Dimension::IdList FauxReader::getDefaultDimensions()
 point_count_t FauxReader::read(PointViewPtr view, point_count_t count)
 {
     const double numDeltas = (double)count - 1.0;
-    const double delX = (m_maxX - m_minX) / numDeltas;
-    const double delY = (m_maxY - m_minY) / numDeltas;
-    const double delZ = (m_maxZ - m_minZ) / numDeltas;
+    double delX(0), delY(0), delZ(0);
+    if (numDeltas)
+    {
+        delX = (m_maxX - m_minX) / numDeltas;
+        delY = (m_maxY - m_minY) / numDeltas;
+        delZ = (m_maxZ - m_minZ) / numDeltas;
+    }
 
     log()->get(LogLevel::Debug5) << "Reading a point view of " <<
         count << " points." << std::endl;
diff --git a/io/gdal/CMakeLists.txt b/io/gdal/CMakeLists.txt
new file mode 100644
index 0000000..546f0c0
--- /dev/null
+++ b/io/gdal/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(src
+    GDALReader.cpp
+)
+
+set(inc
+    GDALReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader gdal "${src}" "${inc}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/gdal/GDALReader.cpp b/io/gdal/GDALReader.cpp
new file mode 100644
index 0000000..2f3ff40
--- /dev/null
+++ b/io/gdal/GDALReader.cpp
@@ -0,0 +1,205 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler <howard at hobu.co>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GDALReader.hpp"
+
+#include <sstream>
+#include <algorithm>
+
+
+#include <pdal/PointView.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+        "readers.gdal",
+        "Read GDAL rasters as point clouds.",
+        "http://pdal.io/stages/reader.gdal.html");
+
+
+CREATE_STATIC_PLUGIN(1, 0, GDALReader, Reader, s_info);
+
+
+std::string GDALReader::getName() const
+{
+    return s_info.name;
+}
+
+
+GDALReader::GDALReader()
+    : m_index(0)
+{}
+
+
+void GDALReader::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log());
+    if (!m_raster)
+        m_raster = std::unique_ptr<gdal::Raster>(new gdal::Raster(m_filename));
+
+    m_raster->open();
+    setSpatialReference(m_raster->getSpatialRef());
+    m_count = m_raster->m_raster_x_size * m_raster->m_raster_y_size;
+
+}
+
+void GDALReader::processOptions(const Options& options)
+{
+
+}
+
+QuickInfo GDALReader::inspect()
+{
+    QuickInfo qi;
+    std::unique_ptr<PointLayout> layout(new PointLayout());
+
+    addDimensions(layout.get());
+    initialize();
+
+    m_raster = std::unique_ptr<gdal::Raster>(new gdal::Raster(m_filename));
+    m_raster->open();
+
+    qi.m_pointCount = m_raster->m_raster_x_size * m_raster->m_raster_y_size;
+//     qi.m_bounds = m_lasHeader.getBounds();
+    qi.m_srs = m_raster->getSpatialRef();
+    qi.m_valid = true;
+
+
+    return qi;
+}
+
+
+void GDALReader::addDimensions(PointLayoutPtr layout)
+{
+    int nBands = m_raster->m_band_count;
+
+    layout->registerDim(pdal::Dimension::Id::X);
+    layout->registerDim(pdal::Dimension::Id::Y);
+    for (int i=0; i < nBands; ++i)
+    {
+        std::ostringstream oss;
+        oss << "band-" << i+1;
+        layout->registerOrAssignDim(oss.str(), Dimension::Type::Double);
+    }
+}
+
+
+void GDALReader::ready(PointTableRef table)
+{
+    m_index = 0;
+
+
+}
+
+template<typename T>
+double convert(uint8_t*p)
+{
+    double output;
+
+    T t;
+    std::copy(p, p + sizeof(t), (uint8_t*)&t);
+    output = static_cast<double>(t);
+    return output;
+}
+
+point_count_t GDALReader::read(PointViewPtr view, point_count_t num)
+{
+    point_count_t count = std::min(num, m_count - m_index);
+    PointId nextId = view->size();
+
+    std::array<double, 2> coords;
+    for (int row = 0; row < m_raster->m_raster_y_size; ++row)
+    {
+        for(int col = 0; col < m_raster->m_raster_x_size; ++col)
+        {
+            m_raster->pixelToCoord(row, col, coords);
+            view->setField(Dimension::Id::X, nextId, coords[0]);
+            view->setField(Dimension::Id::Y, nextId, coords[1]);
+            nextId++;
+        }
+    }
+
+    std::vector<uint8_t> band;
+    std::vector<pdal::Dimension::Type::Enum> band_types = m_raster->getPDALDimensionTypes();
+    for (int b = 0; b < m_raster->m_band_count; ++b)
+    {
+        // Bands count from 1
+        // read up the band's bytes into an array,
+        // convert them from GDAL native types into
+        // doubles, and stuff them into the view
+        m_raster->readBand(band, b+1);
+        std::stringstream oss;
+        oss << "band-" << b+1;
+        log()->get(LogLevel::Info) << "Read band '" << oss.str() <<"'" << std::endl;
+        pdal::Dimension::Id::Enum d = view->layout()->findProprietaryDim(oss.str());
+        size_t dimSize = pdal::Dimension::size(band_types[b]); // count from 0
+
+        uint8_t* p = band.data();
+        for (point_count_t i = 0; i < count; ++i)
+        {
+
+            if (band_types[b] == pdal::Dimension::Type::Float ||
+                band_types[b] == pdal::Dimension::Type::Double )
+            {
+                if (dimSize == 4)
+                    view->setField(d, i, convert<float>(p));
+                else
+                    view->setField(d, i, convert<double>(p));
+            }
+            else
+            {
+                if (dimSize == 1)
+                {
+                    view->setField(d, i, convert<uint8_t>(p));
+                }
+                else if (dimSize == 2)
+                {
+                    view->setField(d, i, convert<uint16_t>(p));
+                }
+                else if (dimSize == 4)
+                {
+                    view->setField(d, i, convert<uint32_t>(p));
+                }
+            }
+            p = p + dimSize;
+        }
+    }
+
+    return view->size();
+}
+
+
+}
diff --git a/filters/ferry/FerryFilter.hpp b/io/gdal/GDALReader.hpp
similarity index 74%
copy from filters/ferry/FerryFilter.hpp
copy to io/gdal/GDALReader.hpp
index 6305728..5221f85 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/io/gdal/GDALReader.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+* Copyright (c) 2015, Howard Butler <howard at hobu.co>
 *
 * All rights reserved.
 *
@@ -34,40 +34,49 @@
 
 #pragma once
 
-#include <pdal/Filter.hpp>
-
-#include <map>
 #include <string>
 
-extern "C" int32_t FerryFilter_ExitFunc();
-extern "C" PF_ExitFunc FerryFilter_InitPlugin();
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <pdal/GDALUtils.hpp>
+
+extern "C" int32_t GDALReader_ExitFunc();
+extern "C" PF_ExitFunc GDALReader_InitPlugin();
+
 
 namespace pdal
 {
 
-class PDAL_DLL FerryFilter : public Filter
+
+typedef std::map<std::string, Dimension::Id::Enum> DimensionMap;
+
+
+
+class PDAL_DLL GDALReader : public Reader
 {
 public:
-    FerryFilter()
-    {}
-
-    static void * create();
+    static void *create();
     static int32_t destroy(void *);
     std::string getName() const;
 
-    Options getDefaultOptions();
+    GDALReader();
+
+    static Dimension::IdList getDefaultDimensions();
 
 private:
-    virtual void processOptions(const Options&);
+    virtual void initialize();
     virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options&);
     virtual void ready(PointTableRef table);
-    virtual void filter(PointView& view);
+    virtual point_count_t read(PointViewPtr view, point_count_t num);
+    virtual QuickInfo inspect();
 
-    FerryFilter& operator=(const FerryFilter&); // not implemented
-    FerryFilter(const FerryFilter&); // not implemented
+    std::unique_ptr<gdal::Raster> m_raster;
+    point_count_t m_index;
 
-    std::map<std::string, std::string> m_name_map;
-    std::map< Dimension::Id::Enum ,  Dimension::Id::Enum > m_dimensions_map;
 };
+}
 
-} // namespace pdal
diff --git a/io/ilvis2/CMakeLists.txt b/io/ilvis2/CMakeLists.txt
new file mode 100644
index 0000000..0fe903c
--- /dev/null
+++ b/io/ilvis2/CMakeLists.txt
@@ -0,0 +1,21 @@
+#
+# ILVIS2 driver CMake configuration
+#
+
+set(objs "")
+
+#
+# ILVIS2 Reader
+#
+set(srcs
+    Ilvis2Reader.cpp
+)
+
+set(incs
+    Ilvis2Reader.hpp
+)
+
+PDAL_ADD_DRIVER(reader ilvis2 "${srcs}" "${incs}" reader_objs)
+set(objs ${objs} ${reader_objs})
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/ilvis2/Ilvis2Reader.cpp b/io/ilvis2/Ilvis2Reader.cpp
new file mode 100644
index 0000000..c4f1b3f
--- /dev/null
+++ b/io/ilvis2/Ilvis2Reader.cpp
@@ -0,0 +1,225 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "Ilvis2Reader.hpp"
+#include <algorithm>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.ilvis2",
+    "ILVIS2 Reader",
+    "http://pdal.io/stages/readers.ilvis2.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, Ilvis2Reader, Reader, s_info)
+
+std::string Ilvis2Reader::getName() const { return s_info.name; }
+
+Options Ilvis2Reader::getDefaultOptions()
+{
+    Options options;
+    Option mapping("mapping", "LOW");
+    options.add(mapping);
+    return options;
+}
+
+void Ilvis2Reader::processOptions(const Options& options)
+{
+    m_convert = options.getValueOrDefault<std::string>("mapping", "CENTROID");
+}
+
+void Ilvis2Reader::addDimensions(PointLayoutPtr layout)
+{
+    using namespace pdal::Dimension::Type;
+    layout->registerOrAssignDim("LVIS_LFID", Unsigned64);
+    layout->registerOrAssignDim("SHOTNUMBER", Unsigned64);
+    layout->registerDim(pdal::Dimension::Id::GpsTime);
+    layout->registerOrAssignDim("LONGITUDE_CENTROID", Double);
+    layout->registerOrAssignDim("LATITUDE_CENTROID", Double);
+    layout->registerOrAssignDim("ELEVATION_CENTROID", Double);
+    layout->registerOrAssignDim("LONGITUDE_LOW", Double);
+    layout->registerOrAssignDim("LATITUDE_LOW", Double);
+    layout->registerOrAssignDim("ELEVATION_LOW", Double);
+    layout->registerOrAssignDim("LONGITUDE_HIGH", Double);
+    layout->registerOrAssignDim("LATITUDE_HIGH", Double);
+    layout->registerOrAssignDim("ELEVATION_HIGH", Double);
+    layout->registerDim(pdal::Dimension::Id::X);
+    layout->registerDim(pdal::Dimension::Id::Y);
+    layout->registerDim(pdal::Dimension::Id::Z);
+}
+
+pdal::Dimension::IdList Ilvis2Reader::getDefaultDimensions()
+{
+    using namespace pdal::Dimension;
+    Dimension::IdList ids;
+
+    ids.push_back(Id::GpsTime);
+    ids.push_back(Id::Y);
+    ids.push_back(Id::X);
+    ids.push_back(Id::Z);
+    return ids;
+}
+
+void Ilvis2Reader::ready(PointTableRef)
+{
+    m_stream.reset(new ILeStream(m_filename));
+
+    SpatialReference ref("EPSG:4385");
+    setSpatialReference(ref);
+}
+
+template <typename T>
+T convert(const StringList& s, const std::string& name, size_t fieldno)
+{
+    T output;
+    bool bConverted = Utils::fromString(s[fieldno], output);
+    if (!bConverted)
+    {
+        std::stringstream oss;
+        oss << "Unable to convert " << name << ", " << s[fieldno] << ", to double";
+        throw pdal_error(oss.str());
+    }
+
+    return output;
+}
+
+point_count_t Ilvis2Reader::read(PointViewPtr view, point_count_t count)
+{
+    PointLayoutPtr layout = view->layout();
+    PointId nextId = view->size();
+    PointId idx = m_index;
+    point_count_t numRead = 0;
+
+    // do any skipping to get to our m_index position;
+    m_stream.reset(new ILeStream(m_filename));
+
+    size_t HEADERSIZE(2);
+    size_t skip_lines(std::max(HEADERSIZE, (size_t)m_index));
+    size_t line_no(1);
+    for (std::string line; std::getline(*m_stream->stream(), line); line_no++)
+    {
+        if (line_no <= skip_lines)
+        {
+            continue;
+        }
+
+        StringList s = Utils::split2(line, ' ');
+//        # LVIS_LFID SHOTNUMBER TIME LONGITUDE_CENTROID LATITUDE_CENTROID ELEVATION_CENTROID LONGITUDE_LOW LATITUDE_LOW ELEVATION_LOW LONGITUDE_HIGH LATITUDE_HIGH ELEVATION_HIGH
+        unsigned long u64(0);
+        if (s.size() != 12)
+        {
+            std::stringstream oss;
+            oss << "Unable to split proper number of fields. Expected 12, got " << s.size();
+            throw pdal_error(oss.str());
+        }
+
+        std::string name("LVIS_LFID");
+        view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 0));
+
+        name = "SHOTNUMBER";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 1));
+
+        view->setField(pdal::Dimension::Id::GpsTime, nextId, convert<double>(s, name, 2));
+
+        name = "LONGITUDE_CENTROID";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 3) - 180.0);
+
+        name = "LATITUDE_CENTROID";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 4));
+
+        name = "ELEVATION_CENTROID";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 5));
+
+        name = "LONGITUDE_LOW";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 6) - 180.0);
+
+        name = "LATITUDE_LOW";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 7));
+
+        name = "ELEVATION_LOW";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 8));
+
+        name = "LONGITUDE_HIGH";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 9) - 180.0);
+
+        name = "LATITUDE_HIGH";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 10));
+
+        name = "ELEVATION_HIGH";
+        view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 11));
+
+        double x, y, z;
+        pdal::Dimension::Id::Enum xd, yd, zd;
+        if (Utils::iequals(m_convert, "HIGH"))
+        {
+            xd = layout->findProprietaryDim("LONGITUDE_HIGH");
+            yd = layout->findProprietaryDim("LATITUDE_HIGH");
+            zd = layout->findProprietaryDim("ELEVATION_HIGH");
+
+        } else if (Utils::iequals(m_convert, "LOW"))
+        {
+            xd = layout->findProprietaryDim("LONGITUDE_LOW");
+            yd = layout->findProprietaryDim("LATITUDE_LOW");
+            zd = layout->findProprietaryDim("ELEVATION_LOW");
+
+        } else
+        {
+            xd = layout->findProprietaryDim("LONGITUDE_CENTROID");
+            yd = layout->findProprietaryDim("LATITUDE_CENTROID");
+            zd = layout->findProprietaryDim("ELEVATION_CENTROID");
+
+        }
+
+        x = view->getFieldAs<double>(xd, nextId);
+        y = view->getFieldAs<double>(yd, nextId);
+        z = view->getFieldAs<double>(zd, nextId);
+
+        view->setField(pdal::Dimension::Id::X, nextId, x);
+        view->setField(pdal::Dimension::Id::Y, nextId, y);
+        view->setField(pdal::Dimension::Id::Z, nextId, z);
+        nextId++;
+        if (m_cb)
+            m_cb(*view, nextId);
+    }
+    m_index = nextId;
+    numRead = nextId;
+    return numRead;
+}
+
+
+
+
+
+} // namespace pdal
diff --git a/filters/ferry/FerryFilter.hpp b/io/ilvis2/Ilvis2Reader.hpp
similarity index 76%
copy from filters/ferry/FerryFilter.hpp
copy to io/ilvis2/Ilvis2Reader.hpp
index 6305728..fb1c274 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/io/ilvis2/Ilvis2Reader.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
 *
 * All rights reserved.
 *
@@ -34,40 +34,41 @@
 
 #pragma once
 
-#include <pdal/Filter.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
 
-#include <map>
-#include <string>
 
-extern "C" int32_t FerryFilter_ExitFunc();
-extern "C" PF_ExitFunc FerryFilter_InitPlugin();
+extern "C" int32_t Ilvis2Reader_ExitFunc();
+extern "C" PF_ExitFunc Ilvis2Reader_InitPlugin();
 
 namespace pdal
 {
-
-class PDAL_DLL FerryFilter : public Filter
+class PDAL_DLL Ilvis2Reader : public pdal::Reader
 {
 public:
-    FerryFilter()
-    {}
+    Ilvis2Reader() : Reader(), m_index(0), m_convert("CENTROID")
+        {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
     Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions();
+
 
 private:
-    virtual void processOptions(const Options&);
+    std::unique_ptr<ILeStream> m_stream;
+    point_count_t m_index;
+    std::string m_convert;
+
     virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
     virtual void ready(PointTableRef table);
-    virtual void filter(PointView& view);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
 
-    FerryFilter& operator=(const FerryFilter&); // not implemented
-    FerryFilter(const FerryFilter&); // not implemented
-
-    std::map<std::string, std::string> m_name_map;
-    std::map< Dimension::Id::Enum ,  Dimension::Id::Enum > m_dimensions_map;
 };
 
+
 } // namespace pdal
diff --git a/io/las/LasError.hpp b/io/las/LasError.hpp
index b7a6dbb..f45ba8c 100644
--- a/io/las/LasError.hpp
+++ b/io/las/LasError.hpp
@@ -35,7 +35,7 @@
 
 #include <vector>
 
-#include <pdal/util/Utils.hpp>
+#include <pdal/util/Algorithm.hpp>
 #include <pdal/Log.hpp>
 
 namespace pdal
@@ -59,8 +59,9 @@ public:
         if (!Utils::contains(warned, returnNum))
         {
             warned.push_back(returnNum);
-            m_log->get(LogLevel::Warning) << m_filename << ": Found invalid value of '" <<
-                returnNum << "' for point's return number.\n";
+            m_log->get(LogLevel::Warning) << m_filename <<
+                ": Found invalid value of '" << returnNum <<
+                "' for point's return number.\n";
         }
     }
 
diff --git a/io/las/LasHeader.cpp b/io/las/LasHeader.cpp
index 243c4e5..b136abe 100644
--- a/io/las/LasHeader.cpp
+++ b/io/las/LasHeader.cpp
@@ -90,7 +90,7 @@ void LasHeader::setSummary(const SummaryData& summary)
 {
     m_pointCount = summary.getTotalNumPoints();
     for (size_t num = 0; num < RETURN_COUNT; ++num)
-        m_pointCountByReturn[num] = summary.getReturnCount(num);
+        m_pointCountByReturn[num] = (int)summary.getReturnCount(num);
     m_bounds = summary.getBounds();
 }
 
@@ -197,6 +197,33 @@ void LasHeader::put(OLeStream& out, boost::uuids::uuid uuid)
 }
 
 
+Dimension::IdList LasHeader::usedDims() const
+{
+    using namespace Dimension;
+
+    Dimension::Id::Enum dims[] = { Id::ReturnNumber, Id::NumberOfReturns,
+        Id::X, Id::Y, Id::Z, Id::Intensity, Id::ScanChannel,
+        Id::ScanDirectionFlag, Id::EdgeOfFlightLine, Id::Classification,
+        Id::UserData, Id::ScanAngleRank, Id::PointSourceId };
+
+    // This mess is because MSVC doesn't support initializer lists.
+    Dimension::IdList ids;
+    std::copy(std::begin(dims), std::end(dims), std::back_inserter(ids));
+
+    if (hasTime())
+        ids.push_back(Id::GpsTime);
+    if (hasColor())
+    {
+        ids.push_back(Id::Red);
+        ids.push_back(Id::Green);
+        ids.push_back(Id::Blue);
+    }
+    if (hasInfrared())
+        ids.push_back(Id::Infrared);
+
+    return ids;
+}
+
 ILeStream& operator>>(ILeStream& in, LasHeader& h)
 {
     uint8_t versionMajor;
diff --git a/io/las/LasHeader.hpp b/io/las/LasHeader.hpp
index c8513fb..88f1def 100644
--- a/io/las/LasHeader.hpp
+++ b/io/las/LasHeader.hpp
@@ -41,6 +41,7 @@
 #include <boost/uuid/uuid.hpp>
 #include <boost/property_tree/ptree.hpp>
 
+#include <pdal/Dimension.hpp>
 #include <pdal/util/Bounds.hpp>
 #include <pdal/pdal_config.hpp>
 #include <pdal/gitsha.h>
@@ -337,6 +338,12 @@ public:
         return f > 5;
     }
 
+    bool useWkt() const
+        { return (bool)((m_globalEncoding >> 4) & 1); }
+
+    bool incompatibleSrs() const
+        { return !useWkt() && has14Format(); }
+
     /// Returns true iff the file is compressed (laszip),
     /// as determined by the high bit in the point type
     bool compressed() const
@@ -366,6 +373,7 @@ public:
 
     void setSummary(const SummaryData& summary);
     bool valid() const;
+    Dimension::IdList usedDims() const;
 
     friend ILeStream& operator>>(ILeStream&, LasHeader& h);
     friend OLeStream& operator<<(OLeStream&, const LasHeader& h);
diff --git a/io/las/LasReader.cpp b/io/las/LasReader.cpp
index 4967073..47ceaac 100644
--- a/io/las/LasReader.cpp
+++ b/io/las/LasReader.cpp
@@ -70,6 +70,26 @@ void LasReader::processOptions(const Options& options)
     StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
     m_extraDims = LasUtils::parse(extraDims);
 
+    m_compression = options.getValueOrDefault<std::string>("compression",
+        "LASZIP");
+    std::string compression = Utils::toupper(m_compression);
+#ifndef PDAL_HAVE_LAZPERF
+    if (compression == "LAZPERF")
+        throw pdal_error("Can't decompress with LAZperf.  PDAL not built "
+            "with LAZperf.");
+#endif
+    if (compression != "LAZPERF" && compression != "LASZIP")
+    {
+        std::ostringstream oss;
+
+        oss << "Invalid value for option for compression: '" <<
+            m_compression << "'.  Value values are 'lazperf' and 'laszip'.";
+        throw pdal_error(oss.str());
+    }
+
+    // Set case-corrected value.
+    m_compression = compression;
+
     m_error.setFilename(m_filename);
 }
 
@@ -89,8 +109,9 @@ QuickInfo LasReader::inspect()
     QuickInfo qi;
     std::unique_ptr<PointLayout> layout(new PointLayout());
 
+    PointTable table;
+    initialize(table);
     addDimensions(layout.get());
-    initialize();
 
     Dimension::IdList dims = layout->dims();
     for (auto di = dims.begin(); di != dims.end(); ++di)
@@ -98,17 +119,16 @@ QuickInfo LasReader::inspect()
     if (!Utils::numericCast(m_lasHeader.pointCount(), qi.m_pointCount))
         qi.m_pointCount = std::numeric_limits<point_count_t>::max();
     qi.m_bounds = m_lasHeader.getBounds();
-    qi.m_srs = getSrsFromVlrs();
+    qi.m_srs = getSpatialReference();
     qi.m_valid = true;
 
-    PointTable table;
     done(table);
 
     return qi;
 }
 
 
-void LasReader::initialize()
+void LasReader::initializeLocal(PointTableRef table, MetadataNode& m)
 {
     if (m_initialized)
         return;
@@ -148,45 +168,61 @@ void LasReader::initialize()
         readExtraBytesVlr();
     }
     fixupVlrs();
+    setSrsFromVlrs(m);
+    MetadataNode forward = table.privateMetadata("lasforward");
+    extractHeaderMetadata(forward, m);
+    extractVlrMetadata(forward, m);
+
     m_initialized = true;
 }
 
 
-void LasReader::ready(PointTableRef table, MetadataNode& m)
+void LasReader::ready(PointTableRef table)
 {
     m_index = 0;
-
-    setSrsFromVlrs(m);
-    MetadataNode forward = table.privateMetadata("lasforward");
-    extractHeaderMetadata(forward, m);
-    extractVlrMetadata(forward, m);
-
     if (m_lasHeader.compressed())
     {
 #ifdef PDAL_HAVE_LASZIP
-        VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID, LASZIP_RECORD_ID);
-        m_zipPoint.reset(new ZipPoint(vlr));
-
-        if (!m_unzipper)
+        if (m_compression == "LASZIP")
         {
-            m_unzipper.reset(new LASunzipper());
+            VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID,
+                LASZIP_RECORD_ID);
+            m_zipPoint.reset(new ZipPoint(vlr));
 
-            m_istream->seekg(m_lasHeader.pointOffset(), std::ios::beg);
-
-            // Once we open the zipper, don't touch the stream until the
-            // zipper is closed or bad things happen.
-            if (!m_unzipper->open(*m_istream, m_zipPoint->GetZipper()))
+            if (!m_unzipper)
             {
-                std::ostringstream oss;
-                const char* err = m_unzipper->get_error();
-                if (err == NULL)
-                    err = "(unknown error)";
-                oss << "Failed to open LASzip stream: " << std::string(err);
-                throw pdal_error(oss.str());
+                m_unzipper.reset(new LASunzipper());
+
+                m_istream->seekg(m_lasHeader.pointOffset(), std::ios::beg);
+
+                // Once we open the zipper, don't touch the stream until the
+                // zipper is closed or bad things happen.
+                if (!m_unzipper->open(*m_istream, m_zipPoint->GetZipper()))
+                {
+                    std::ostringstream oss;
+                    const char* err = m_unzipper->get_error();
+                    if (err == NULL)
+                        err = "(unknown error)";
+                    oss << "Failed to open LASzip stream: " << std::string(err);
+                    throw pdal_error(oss.str());
+                }
             }
         }
-#else
-        throw pdal_error("LASzip is not enabled.  Can't read LAZ data.");
+#endif
+
+#ifdef PDAL_HAVE_LAZPERF
+        if (m_compression == "LAZPERF")
+        {
+            VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID,
+                LASZIP_RECORD_ID);
+            m_decompressor.reset(new LazPerfVlrDecompressor(*m_istream,
+                vlr->data(), m_lasHeader.pointOffset()));
+        }
+#endif
+
+#if !defined(PDAL_HAVE_LAZPERF) && !defined(PDAL_HAVE_LASZIP)
+        throw pdal_error("Can't read compressed file without LASzip or "
+            "LAZperf decompression library.");
 #endif
     }
     m_error.setLog(log());
@@ -399,16 +435,31 @@ void LasReader::setSrsFromVlrs(MetadataNode& m)
     SpatialReference srs = getSpatialReference();
 
     if (srs.getWKT(pdal::SpatialReference::eCompoundOK).empty())
-        setSpatialReference(m, getSrsFromVlrs());
+        srs = getSrsFromVlrs();
+    setSpatialReference(m, srs);
 }
 
 
 SpatialReference LasReader::getSrsFromVlrs()
 {
-    SpatialReference srs = getSrsFromWktVlr();
-    if (srs.empty())
-        srs = getSrsFromGeotiffVlr();
-    return srs;
+    bool useWkt = false;
+
+    if (m_lasHeader.incompatibleSrs())
+    {
+        log()->get(LogLevel::Error) << getName() <<
+            ": Invalid SRS specification.  GeoTiff not "
+            "allowed with point formats 6 - 10." << std::endl;
+    }
+    else if (findVlr(TRANSFORM_USER_ID, WKT_RECORD_ID) &&
+        findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID))
+    {
+        log()->get(LogLevel::Error) << getName() << ": File contains both "
+            "WKT and GeoTiff VLRs which is disallowed." << std::endl;
+    }
+    else
+        useWkt = (m_lasHeader.versionMinor() >= 4);
+
+    return useWkt ? getSrsFromWktVlr() : getSrsFromGeotiffVlr();
 }
 
 
@@ -444,6 +495,7 @@ SpatialReference LasReader::getSrsFromWktVlr()
     if (*c == 0)
         len--;
     std::string wkt(vlr->data(), len);
+
     srs.setWKT(wkt);
     return srs;
 }
@@ -480,6 +532,12 @@ SpatialReference LasReader::getSrsFromGeotiffVlr()
     if (wkt.size())
         srs.setFromUserInput(geotiff.getWkt(false, false));
 
+    log()->get(LogLevel::Debug5) << "GeoTIFF keys: " << geotiff.getText() << std::endl;
+#else
+    if (findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID))
+        log()->get(LogLevel::Error) << getName() <<
+            ": Can't decode LAS GeoTiff VLR to SRS - PDAL not built "
+            "with GeoTiff." << std::endl;
 #endif
     return srs;
 }
@@ -565,26 +623,44 @@ point_count_t LasReader::read(PointViewPtr view, point_count_t count)
     count = std::min(count, getNumPoints() - m_index);
 
     PointId i = 0;
-    if (m_zipPoint)
+    if (m_lasHeader.compressed())
     {
 #ifdef PDAL_HAVE_LASZIP
-        for (i = 0; i < count; i++)
+        if (m_compression == "LASZIP")
         {
-            if (!m_unzipper->read(m_zipPoint->m_lz_point))
+            for (i = 0; i < count; i++)
             {
-                std::string error = "Error reading compressed point data: ";
-                const char* err = m_unzipper->get_error();
-                if (!err)
-                    err = "(unknown error)";
-                error += err;
-                throw pdal_error(error);
+                if (!m_unzipper->read(m_zipPoint->m_lz_point))
+                {
+                    std::string error = "Error reading compressed point data: ";
+                    const char* err = m_unzipper->get_error();
+                    if (!err)
+                        err = "(unknown error)";
+                    error += err;
+                    throw pdal_error(error);
+                }
+                loadPoint(*view.get(),
+                    (char *)m_zipPoint->m_lz_point_data.data(), pointByteCount);
             }
-            loadPoint(*view.get(), (char *)m_zipPoint->m_lz_point_data.data(),
-                pointByteCount);
         }
-#else
-        throw pdal_error("LASzip is not enabled for this "
-            "LasReader::processBuffer");
+#endif
+
+#ifdef PDAL_HAVE_LAZPERF
+        if (m_compression == "LAZPERF")
+        {
+            assert(pointByteCount == m_decompressor->pointSize());
+
+            std::vector<char> ptBuf(m_decompressor->pointSize());
+            for (i = 0; i < count; i++)
+            {
+                m_decompressor->decompress(ptBuf.data());
+                loadPoint(*view.get(), ptBuf.data(), pointByteCount);
+            }
+        }
+#endif
+#if !defined(PDAL_HAVE_LAZPERF) && !defined(PDAL_HAVE_LASZIP)
+        throw pdal_error("Can't read compressed file without LASzip or "
+            "LAZperf decompression library.");
 #endif
     }
     else
diff --git a/io/las/LasReader.hpp b/io/las/LasReader.hpp
index 2fd511b..857ba7d 100644
--- a/io/las/LasReader.hpp
+++ b/io/las/LasReader.hpp
@@ -35,6 +35,7 @@
 #pragma once
 
 #include <pdal/pdal_export.hpp>
+#include <pdal/Compression.hpp>
 #include <pdal/Reader.hpp>
 
 #include "LasError.hpp"
@@ -102,13 +103,17 @@ private:
     LasHeader m_lasHeader;
     std::unique_ptr<ZipPoint> m_zipPoint;
     std::unique_ptr<LASunzipper> m_unzipper;
+    std::unique_ptr<LazPerfVlrDecompressor> m_decompressor;
     point_count_t m_index;
     std::istream* m_istream;
     VlrList m_vlrs;
     std::vector<ExtraDim> m_extraDims;
+    std::string m_compression;
 
     virtual void processOptions(const Options& options);
-    virtual void initialize();
+    virtual void initialize(PointTableRef table)
+        { initializeLocal(table, m_metadata); }
+    virtual void initializeLocal(PointTableRef table, MetadataNode& m);
     virtual void addDimensions(PointLayoutPtr layout);
     void fixupVlrs();
     VariableLengthRecord *findVlr(const std::string& userId, uint16_t recordId);
@@ -120,9 +125,7 @@ private:
     void extractHeaderMetadata(MetadataNode& forward, MetadataNode& m);
     void extractVlrMetadata(MetadataNode& forward, MetadataNode& m);
     virtual QuickInfo inspect();
-    virtual void ready(PointTableRef table)
-        { ready(table, m_metadata); }
-    virtual void ready(PointTableRef table, MetadataNode& m);
+    virtual void ready(PointTableRef table);
     virtual point_count_t read(PointViewPtr view, point_count_t count);
     virtual void done(PointTableRef table);
     virtual bool eof()
@@ -138,6 +141,7 @@ private:
     LasReader& operator=(const LasReader&); // not implemented
     LasReader(const LasReader&); // not implemented
     bool m_initialized;
+    bool m_skipWktVLR;
 };
 
 } // namespace pdal
diff --git a/io/las/LasUtils.cpp b/io/las/LasUtils.cpp
index a84a1fc..5e5288c 100644
--- a/io/las/LasUtils.cpp
+++ b/io/las/LasUtils.cpp
@@ -185,9 +185,16 @@ namespace LasUtils
 std::vector<ExtraDim> parse(const StringList& dimString)
 {
     std::vector<ExtraDim> extraDims;
+    bool all = false;
 
     for (auto& dim : dimString)
     {
+        if (dim == "all")
+        {
+            all = true;
+            continue;
+        }
+
         StringList s = Utils::split2(dim, '=');
         if (s.size() != 2)
         {
@@ -211,6 +218,15 @@ std::vector<ExtraDim> parse(const StringList& dimString)
         ExtraDim ed(s[0], type);
         extraDims.push_back(ed);
     }
+
+    if (all)
+    {
+        if (extraDims.size())
+            throw (pdal_error("Can't specify specific extra dimensions with "
+                "special 'all' keyword."));
+        extraDims.push_back(ExtraDim("all", Dimension::Type::None));
+    }
+
     return extraDims;
 }
 
diff --git a/io/las/LasUtils.hpp b/io/las/LasUtils.hpp
index d0712b3..b1f601a 100644
--- a/io/las/LasUtils.hpp
+++ b/io/las/LasUtils.hpp
@@ -40,6 +40,18 @@
 namespace pdal
 {
 
+namespace LasCompression
+{
+
+enum Enum
+{
+    LasZip,
+    LazPerf,
+    None
+};
+
+}
+
 struct ExtraDim
 {
     ExtraDim(const std::string name, Dimension::Type::Enum type,
diff --git a/io/las/LasWriter.cpp b/io/las/LasWriter.cpp
index 2ff252c..c1bb645 100644
--- a/io/las/LasWriter.cpp
+++ b/io/las/LasWriter.cpp
@@ -38,8 +38,10 @@
 #include <boost/uuid/uuid_generators.hpp>
 #include <iostream>
 
+#include <pdal/Compression.hpp>
 #include <pdal/PDALUtils.hpp>
 #include <pdal/PointView.hpp>
+#include <pdal/util/Algorithm.hpp>
 #include <pdal/util/Inserter.hpp>
 #include <pdal/util/OStream.hpp>
 #include <pdal/util/Utils.hpp>
@@ -61,7 +63,7 @@ CREATE_STATIC_PLUGIN(1, 0, LasWriter, Writer, s_info)
 
 std::string LasWriter::getName() const { return s_info.name; }
 
-LasWriter::LasWriter() : m_ostream(NULL)
+LasWriter::LasWriter() : m_ostream(NULL), m_compression(LasCompression::None)
 {
     m_majorVersion.setDefault(1);
     m_minorVersion.setDefault(2);
@@ -93,8 +95,9 @@ Options LasWriter::getDefaultOptions()
     Options options;
     LasHeader header;
 
-    options.add("filename", "", "Name of the file for LAS/LAZ output.");
-    options.add("compression", false, "Do we LASzip-compress the data?");
+    options.add("filename", "", "Output file specification.");
+    options.add("compression", "none", "Compression engine to use ('laszip' "
+        "or 'lazperf'.");
     options.add("major_version", 1, "LAS Major version");
     options.add("minor_version", 2, "LAS Minor version");
     options.add("dataformat_id", 3, "Point format to write");
@@ -123,26 +126,54 @@ Options LasWriter::getDefaultOptions()
 void LasWriter::processOptions(const Options& options)
 {
     if (options.hasOption("a_srs"))
-        setSpatialReference(options.getValueOrDefault("a_srs", std::string()));
-    m_lasHeader.setCompressed(options.getValueOrDefault("compression", false));
+        setSpatialReference(options.getValueOrDefault<std::string>("a_srs"));
+
+    std::string compression =
+        options.getValueOrDefault<std::string>("compression");
+    compression = Utils::toupper(compression);
+    if (compression == "LASZIP" || compression == "TRUE")
+        m_compression = LasCompression::LasZip;
+    else if (compression == "LAZPERF")
+        m_compression = LasCompression::LazPerf;
+    else
+        m_compression = LasCompression::None;
+    if (m_compression != LasCompression::None)
+        m_lasHeader.setCompressed(true);
+#if !defined(PDAL_HAVE_LASZIP) && !defined(PDAL_HAVE_LAZPERF)
+    if (m_compression != LasCompression::None)
+        throw pdal_error("Can't write LAZ output.  "
+            "PDAL not built with LASzip or LAZperf.");
+#endif
+
     m_discardHighReturnNumbers = options.getValueOrDefault(
         "discard_high_return_numbers", false);
     StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
     m_extraDims = LasUtils::parse(extraDims);
 
-#ifndef PDAL_HAVE_LASZIP
-    if (m_lasHeader.compressed())
-        throw pdal_error("Can't write LAZ output.  "
-            "PDAL not built with LASzip.");
-#endif // PDAL_HAVE_LASZIP
     fillForwardList(options);
     getHeaderOptions(options);
-    getVlrOptions(options);
 }
 
 
 void LasWriter::prepared(PointTableRef table)
 {
+    PointLayoutPtr layout = table.layout();
+
+    // If we've asked for all dimensions, add to extraDims all dimensions
+    // in the layout that aren't already destined for LAS output.
+    if (m_extraDims.size() == 1 && m_extraDims[0].m_name == "all")
+    {
+        m_extraDims.clear();
+        Dimension::IdList ids = m_lasHeader.usedDims();
+        DimTypeList dimTypes = layout->dimTypes();
+        for (auto& dt : dimTypes)
+        {
+            if (!Utils::contains(ids, dt.m_id))
+                m_extraDims.push_back(
+                    ExtraDim(layout->dimName(dt.m_id), dt.m_type));
+        }
+    }
+
     m_extraByteLen = 0;
     for (auto& dim : m_extraDims)
     {
@@ -255,55 +286,17 @@ void LasWriter::getHeaderOptions(const Options &options)
     setHeaderOption("offset_z", m_offsetZ, options);
 }
 
-/// Get VLR-specific options and store for processing with metadata.
-/// \param opts  Options to check for VLR info.
-void LasWriter::getVlrOptions(const Options& opts)
-{
-    std::vector<pdal::Option> options = opts.getOptions("vlr");
-    for (auto o = options.begin(); o != options.end(); ++o)
-    {
-        if (!boost::algorithm::istarts_with(o->getName(), "vlr"))
-            continue;
-
-        boost::optional<pdal::Options const&> vo = o->getOptions();
-        if (!vo)
-            continue;
-
-        VlrOptionInfo info;
-        info.m_name = o->getName().substr(strlen("vlr"));
-        info.m_value = o->getValue<std::string>();
-        try
-        {
-            info.m_recordId = vo->getOption("record_id").getValue<int16_t>();
-            info.m_userId = vo->getOption("user_id").getValue<std::string>();
-        }
-        catch (Option::not_found)
-        {
-            continue;
-        }
-        info.m_description = vo->getValueOrDefault<std::string>
-            ("description", "");
-        m_optionInfos.push_back(info);
-    }
-}
-
 
 void LasWriter::readyTable(PointTableRef table)
 {
-    m_srs = getSpatialReference().empty() ?
-        table.spatialRef() : getSpatialReference();
-
-    setVlrsFromSpatialRef();
+    m_forwardMetadata = table.privateMetadata("lasforward");
     setExtraBytesVlr();
-    MetadataNode forward = table.privateMetadata("lasforward");
-    fillHeader(forward);
-    setVlrsFromMetadata(forward);
 }
 
 
-void LasWriter::readyFile(const std::string& filename)
+void LasWriter::readyFile(const std::string& filename,
+    const SpatialReference& srs)
 {
-    m_error.setFilename(filename);
     std::ostream *out = FileUtils::createFile(filename, true);
     if (!out)
     {
@@ -314,18 +307,35 @@ void LasWriter::readyFile(const std::string& filename)
         throw pdal_error(out.str());
     }
     m_curFilename = filename;
+    m_error.setFilename(filename);
     Utils::writeProgress(m_progressFd, "READYFILE", filename);
-    prepOutput(out);
+    prepOutput(out, srs);
 }
 
 
-void LasWriter::prepOutput(std::ostream *outStream)
+void LasWriter::prepOutput(std::ostream *outStream, const SpatialReference& srs)
 {
+    // Use stage SRS if provided.
+    m_srs = getSpatialReference().empty() ? srs : getSpatialReference();
+
+    // Filling the header here gives the VLR functions below easy access to
+    // the version information and so on.
+    fillHeader();
+
+    // Spatial reference can potentially change for multiple output files.
+    setVlrsFromSpatialRef();
+    handleHeaderForwards(m_forwardMetadata);
+    setVlrsFromMetadata(m_forwardMetadata);
+
     m_summaryData.reset(new SummaryData());
     m_ostream = outStream;
     if (m_lasHeader.compressed())
         readyCompression();
 
+    // Compression should cause the last of the VLRs to get filled.  We now
+    // have a valid count, so fill the header again.
+    fillHeader();
+
     // Write the header.
     OLeStream out(m_ostream);
     out << m_lasHeader;
@@ -342,7 +352,7 @@ void LasWriter::prepOutput(std::ostream *outStream)
     if (m_lasHeader.versionEquals(1, 0))
         out << (uint16_t)0xCCDD;
     m_lasHeader.setPointOffset((uint32_t)m_ostream->tellp());
-    if (m_lasHeader.compressed())
+    if (m_compression == LasCompression::LasZip)
         openCompression();
 
     m_error.setLog(log());
@@ -380,8 +390,7 @@ MetadataNode LasWriter::findVlrMetadata(MetadataNode node,
 }
 
 
-/// Set VLRs from metadata for forwarded info, or from option-provided data
-/// otherwise.
+/// Set VLRs from metadata for forwarded info.
 void LasWriter::setVlrsFromMetadata(MetadataNode& forward)
 {
     std::vector<uint8_t> data;
@@ -411,8 +420,22 @@ void LasWriter::setVlrsFromMetadata(MetadataNode& forward)
 /// \param  srs - Active spatial reference.
 void LasWriter::setVlrsFromSpatialRef()
 {
-    VlrList vlrs;
+    // Delete any existing spatial ref VLRs.  This can be an issue if we're
+    // using the reader to write multiple output files via a filename template.
+    deleteVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID);
+    deleteVlr(TRANSFORM_USER_ID, GEOTIFF_DOUBLES_RECORD_ID);
+    deleteVlr(TRANSFORM_USER_ID, GEOTIFF_ASCII_RECORD_ID);
+    deleteVlr(TRANSFORM_USER_ID, WKT_RECORD_ID);
+    deleteVlr(LIBLAS_USER_ID, WKT_RECORD_ID);
+
+    if (m_lasHeader.versionAtLeast(1, 4))
+        addWktVlr();
+    else
+        addGeotiffVlrs();
+}
 
+void LasWriter::addGeotiffVlrs()
+{
 #ifdef PDAL_HAVE_LIBGEOTIFF
     GeotiffSupport geotiff;
     geotiff.resetTags();
@@ -426,7 +449,9 @@ void LasWriter::setVlrsFromSpatialRef()
         "GeoTiff GeoDoubleParamsTag");
     addGeotiffVlr(geotiff, GEOTIFF_ASCII_RECORD_ID,
         "GeoTiff GeoAsciiParamsTag");
-    addWktVlr();
+#else
+    log()->get(LogLevel::Error) << getName() << ": PDAL not built with "
+        "libGeoTiff.  Can't write valid LAS file." << std::endl;
 #endif // PDAL_HAVE_LIBGEOTIFF
 }
 
@@ -436,7 +461,7 @@ void LasWriter::setVlrsFromSpatialRef()
 /// \param  recordId - Record ID associated with the VLR/Geotiff ref.
 /// \param  description - Description to use with the VLR
 /// \return  Whether the VLR was added.
-bool LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+void LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
     const std::string& description)
 {
 #ifdef PDAL_HAVE_LIBGEOTIFF
@@ -445,14 +470,15 @@ bool LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
 
     size_t size = geotiff.getKey(recordId, &count, &data);
     if (size == 0)
-        return false;
+    {
+        log()->get(LogLevel::Warning) << getName() << ": Invalid spatial "
+            "reference for writing GeoTiff VLR." << std::endl;
+        return;
+    }
 
     std::vector<uint8_t> buf(size);
     memcpy(buf.data(), data, size);
     addVlr(TRANSFORM_USER_ID, recordId, description, buf);
-    return true;
-#else
-    return false;
 #endif // PDAL_HAVE_LIBGEOTIFF
 }
 
@@ -517,8 +543,22 @@ void LasWriter::addVlr(const std::string& userId, uint16_t recordId,
     }
 }
 
+/// Delete a VLR from the vlr list.
+///
+void LasWriter::deleteVlr(const std::string& userId, uint16_t recordId)
+{
+    auto matches = [&userId, recordId](const VariableLengthRecord& vlr)
+    {
+        return vlr.matches(userId, recordId);
+    };
+
+    Utils::remove_if(m_vlrs, matches);
+    Utils::remove_if(m_eVlrs, matches);
+}
+
+
 template <typename T>
-void LasWriter::handleForward(const std::string& s, T& headerVal,
+void LasWriter::handleHeaderForward(const std::string& s, T& headerVal,
     const MetadataNode& base)
 {
     if (Utils::contains(m_forwards, s) && !headerVal.valSet())
@@ -530,25 +570,26 @@ void LasWriter::handleForward(const std::string& s, T& headerVal,
     }
 }
 
-void LasWriter::handleForwards(MetadataNode& forward)
-{
-    handleForward("major_version", m_majorVersion, forward);
-    handleForward("minor_version", m_minorVersion, forward);
-    handleForward("dataformat_id", m_dataformatId, forward);
-    handleForward("filesource_id", m_filesourceId, forward);
-    handleForward("global_encoding", m_globalEncoding, forward);
-    handleForward("project_id", m_projectId, forward);
-    handleForward("system_id", m_systemId, forward);
-    handleForward("software_id", m_softwareId, forward);
-    handleForward("creation_doy", m_creationDoy, forward);
-    handleForward("creation_year", m_creationYear, forward);
 
-    handleForward("scale_x", m_scaleX, forward);
-    handleForward("scale_y", m_scaleY, forward);
-    handleForward("scale_z", m_scaleZ, forward);
-    handleForward("offset_x", m_offsetX, forward);
-    handleForward("offset_y", m_offsetY, forward);
-    handleForward("offset_z", m_offsetZ, forward);
+void LasWriter::handleHeaderForwards(MetadataNode& forward)
+{
+    handleHeaderForward("major_version", m_majorVersion, forward);
+    handleHeaderForward("minor_version", m_minorVersion, forward);
+    handleHeaderForward("dataformat_id", m_dataformatId, forward);
+    handleHeaderForward("filesource_id", m_filesourceId, forward);
+    handleHeaderForward("global_encoding", m_globalEncoding, forward);
+    handleHeaderForward("project_id", m_projectId, forward);
+    handleHeaderForward("system_id", m_systemId, forward);
+    handleHeaderForward("software_id", m_softwareId, forward);
+    handleHeaderForward("creation_doy", m_creationDoy, forward);
+    handleHeaderForward("creation_year", m_creationYear, forward);
+
+    handleHeaderForward("scale_x", m_scaleX, forward);
+    handleHeaderForward("scale_y", m_scaleY, forward);
+    handleHeaderForward("scale_z", m_scaleZ, forward);
+    handleHeaderForward("offset_x", m_offsetX, forward);
+    handleHeaderForward("offset_y", m_offsetY, forward);
+    handleHeaderForward("offset_z", m_offsetZ, forward);
 
     m_xXform.setScale(m_scaleX.val());
     m_yXform.setScale(m_scaleY.val());
@@ -560,10 +601,8 @@ void LasWriter::handleForwards(MetadataNode& forward)
 
 /// Fill the LAS header with values as provided in options or forwarded
 /// metadata.
-void LasWriter::fillHeader(MetadataNode& forward)
+void LasWriter::fillHeader()
 {
-    handleForwards(forward);
-
     const uint16_t WKT_MASK = (1 << 4);
 
     m_lasHeader.setScale(m_xXform.m_scale, m_yXform.m_scale, m_zXform.m_scale);
@@ -581,8 +620,8 @@ void LasWriter::fillHeader(MetadataNode& forward)
     m_lasHeader.setSystemId(m_systemId.val());
     m_lasHeader.setProjectId(m_projectId.val());
     m_lasHeader.setFileSourceId(m_filesourceId.val());
-    // We always write a WKT VLR, but we need to be sure to set the WKT
-    // bit when the version is at least 1.4.
+
+    // We always write a WKT VLR for version 1.4 and later.
     uint16_t globalEncoding = m_globalEncoding.val();
     if (m_lasHeader.versionAtLeast(1, 4))
         globalEncoding |= WKT_MASK;
@@ -600,6 +639,15 @@ void LasWriter::fillHeader(MetadataNode& forward)
 
 void LasWriter::readyCompression()
 {
+    if (m_compression == LasCompression::LasZip)
+        readyLasZipCompression();
+    else if (m_compression == LasCompression::LazPerf)
+        readyLazPerfCompression();
+}
+
+
+void LasWriter::readyLasZipCompression()
+{
 #ifdef PDAL_HAVE_LASZIP
     m_zipPoint.reset(new ZipPoint(m_lasHeader.pointFormat(),
         m_lasHeader.pointLen()));
@@ -612,6 +660,29 @@ void LasWriter::readyCompression()
 }
 
 
+void LasWriter::readyLazPerfCompression()
+{
+#ifdef PDAL_HAVE_LAZPERF
+    if (m_lasHeader.versionAtLeast(1, 4))
+        throw pdal_error("Can't write version 1.4 output with LAZperf.");
+
+    laszip::factory::record_schema schema;
+    schema.push(laszip::factory::record_item::POINT10);
+    if (m_lasHeader.hasTime())
+        schema.push(laszip::factory::record_item::GPSTIME);
+    if (m_lasHeader.hasColor())
+        schema.push(laszip::factory::record_item::RGB12);
+    laszip::io::laz_vlr zipvlr = laszip::io::laz_vlr::from_schema(schema);
+    std::vector<uint8_t> data(zipvlr.size());
+    zipvlr.extract((char *)data.data());
+    addVlr(LASZIP_USER_ID, LASZIP_RECORD_ID, "http://laszip.org", data);
+
+    m_compressor.reset(new LazPerfVlrCompressor(*m_ostream, schema,
+        zipvlr.chunk_size));
+#endif
+}
+
+
 /// Prepare the compressor to write points.
 /// \param  pointFormat - Formt of points we're writing.
 void LasWriter::openCompression()
@@ -643,7 +714,6 @@ void LasWriter::writeView(const PointViewPtr view)
 
     const PointView& viewRef(*view.get());
 
-    //ABELL - Removed callback handling for now.
     point_count_t remaining = view->size();
     PointId idx = 0;
     while (remaining)
@@ -652,36 +722,52 @@ void LasWriter::writeView(const PointViewPtr view)
         idx += filled;
         remaining -= filled;
 
-#ifdef PDAL_HAVE_LASZIP
-        if (m_lasHeader.compressed())
-        {
-            char *pos = buf.data();
-            for (point_count_t i = 0; i < filled; i++)
-            {
-                memcpy(m_zipPoint->m_lz_point_data.data(), pos, pointLen);
-                if (!m_zipper->write(m_zipPoint->m_lz_point))
-                {
-                    std::ostringstream oss;
-                    const char* err = m_zipper->get_error();
-                    if (err == NULL)
-                        err = "(unknown error)";
-                    oss << "Error writing point: " << std::string(err);
-                    throw pdal_error(oss.str());
-                }
-                pos += pointLen;
-            }
-        }
+        if (m_compression == LasCompression::LasZip)
+            writeLasZipBuf(buf.data(), pointLen, filled);
+        else if (m_compression == LasCompression::LazPerf)
+            writeLazPerfBuf(buf.data(), pointLen, filled);
         else
             m_ostream->write(buf.data(), filled * pointLen);
-#else
-        m_ostream->write(buf.data(), filled * pointLen);
-#endif
     }
     Utils::writeProgress(m_progressFd, "DONEVIEW",
         std::to_string(view->size()));
 }
 
 
+void LasWriter::writeLasZipBuf(char *pos, size_t pointLen, point_count_t numPts)
+{
+#ifdef PDAL_HAVE_LASZIP
+    for (point_count_t i = 0; i < numPts; i++)
+    {
+        memcpy(m_zipPoint->m_lz_point_data.data(), pos, pointLen);
+        if (!m_zipper->write(m_zipPoint->m_lz_point))
+        {
+            std::ostringstream oss;
+            const char* err = m_zipper->get_error();
+            if (err == NULL)
+                err = "(unknown error)";
+            oss << "Error writing point: " << std::string(err);
+            throw pdal_error(oss.str());
+        }
+        pos += pointLen;
+    }
+#endif
+}
+
+
+void LasWriter::writeLazPerfBuf(char *pos, size_t pointLen,
+    point_count_t numPts)
+{
+#ifdef PDAL_HAVE_LAZPERF
+    for (point_count_t i = 0; i < numPts; i++)
+    {
+        m_compressor->compress(pos);
+        pos += pointLen;
+    }
+#endif
+}
+
+
 point_count_t LasWriter::fillWriteBuf(const PointView& view,
     PointId startId, std::vector<char>& buf)
 {
@@ -705,8 +791,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
         uint8_t numberOfReturns(1);
         if (view.hasDim(Id::ReturnNumber))
         {
-            returnNumber = view.getFieldAs<uint8_t>(Id::ReturnNumber,
-                idx);
+            returnNumber = view.getFieldAs<uint8_t>(Id::ReturnNumber, idx);
             if (returnNumber < 1 || returnNumber > maxReturnCount)
                 m_error.returnNumWarning(returnNumber);
         }
@@ -791,10 +876,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
 
         uint8_t classification = 0;
         if (view.hasDim(Id::Classification))
-        {
-            classification = view.getFieldAs<uint8_t>(Id::Classification,
-                idx);
-        }
+            classification = view.getFieldAs<uint8_t>(Id::Classification, idx);
         ostream << classification;
 
         uint8_t userData = 0;
@@ -819,8 +901,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
 
         uint16_t pointSourceId = 0;
         if (view.hasDim(Id::PointSourceId))
-            pointSourceId = view.getFieldAs<uint16_t>(Id::PointSourceId,
-                idx);
+            pointSourceId = view.getFieldAs<uint16_t>(Id::PointSourceId, idx);
         ostream << pointSourceId;
 
         if (hasTime)
@@ -882,13 +963,10 @@ void LasWriter::doneFile()
 
 void LasWriter::finishOutput()
 {
-    //ABELL - The zipper has to be closed right after all the points
-    // are written or bad things happen since this call expects the
-    // stream to be positioned at a particular position.
-#ifdef PDAL_HAVE_LASZIP
-    if (m_lasHeader.compressed())
-        m_zipper->close();
-#endif
+    if (m_compression == LasCompression::LasZip)
+        finishLasZipOutput();
+    else if (m_compression == LasCompression::LazPerf)
+        finishLazPerfOutput();
 
     log()->get(LogLevel::Debug) << "Wrote " <<
         m_summaryData->getTotalNumPoints() <<
@@ -910,21 +988,28 @@ void LasWriter::finishOutput()
 
     // The summary is calculated as points are written.
     m_lasHeader.setSummary(*m_summaryData);
-    // VLR count may change as LAS records are written.
-    m_lasHeader.setVlrCount(m_vlrs.size());
 
     out.seek(0);
     out << m_lasHeader;
     out.seek(m_lasHeader.pointOffset());
 
+    m_ostream->flush();
+}
+
+
+void LasWriter::finishLasZipOutput()
+{
 #ifdef PDAL_HAVE_LASZIP
-    if (m_lasHeader.compressed())
-    {
-        m_zipper.reset();
-        m_zipPoint.reset();
-    }
+    m_zipper->close();
+#endif
+}
+
+
+void LasWriter::finishLazPerfOutput()
+{
+#ifdef PDAL_HAVE_LAZPERF
+    m_compressor->done();
 #endif
-    m_ostream->flush();
 }
 
 } // namespace pdal
diff --git a/io/las/LasWriter.hpp b/io/las/LasWriter.hpp
index a6b56c6..83981d5 100644
--- a/io/las/LasWriter.hpp
+++ b/io/las/LasWriter.hpp
@@ -34,6 +34,7 @@
 
 #pragma once
 
+#include <pdal/Compression.hpp>
 #include <pdal/FlexWriter.hpp>
 
 #include "HeaderVal.hpp"
@@ -75,7 +76,7 @@ public:
     Options getDefaultOptions();
 
 protected:
-    void prepOutput(std::ostream *out);
+    void prepOutput(std::ostream *out, const SpatialReference& srs);
     void finishOutput();
 
 private:
@@ -84,6 +85,7 @@ private:
     std::unique_ptr<SummaryData> m_summaryData;
     std::unique_ptr<LASzipper> m_zipper;
     std::unique_ptr<ZipPoint> m_zipPoint;
+    std::unique_ptr<LazPerfVlrCompressor> m_compressor;
     bool m_discardHighReturnNumbers;
     std::map<std::string, std::string> m_headerVals;
     std::vector<VlrOptionInfo> m_optionInfos;
@@ -96,6 +98,7 @@ private:
     std::string m_curFilename;
     std::set<std::string> m_forwards;
     bool m_forwardVlrs;
+    LasCompression::Enum m_compression;
 
     NumHeaderVal<uint8_t, 1, 1> m_majorVersion;
     NumHeaderVal<uint8_t, 1, 4> m_minorVersion;
@@ -117,36 +120,45 @@ private:
     StringHeaderVal<20> m_offsetX;
     StringHeaderVal<20> m_offsetY;
     StringHeaderVal<20> m_offsetZ;
+    MetadataNode m_forwardMetadata;
 
     virtual void processOptions(const Options& options);
     virtual void prepared(PointTableRef table);
     virtual void readyTable(PointTableRef table);
-    virtual void readyFile(const std::string& filename);
+    virtual void readyFile(const std::string& filename,
+        const SpatialReference& srs);
     virtual void writeView(const PointViewPtr view);
     virtual void doneFile();
 
     void fillForwardList(const Options& options);
     void getHeaderOptions(const Options& options);
-    void getVlrOptions(const Options& opts);
     template <typename T>
-    void handleForward(const std::string& s, T& headerVal,
+    void handleHeaderForward(const std::string& s, T& headerVal,
         const MetadataNode& base);
-    void handleForwards(MetadataNode& forward);
-    void fillHeader(MetadataNode& forward);
+    void handleHeaderForwards(MetadataNode& forward);
+    void fillHeader();
     point_count_t fillWriteBuf(const PointView& view, PointId startId,
         std::vector<char>& buf);
+    void writeLasZipBuf(char *data, size_t pointLen, point_count_t numPts);
+    void writeLazPerfBuf(char *data, size_t pointLen, point_count_t numPts);
     void setVlrsFromMetadata(MetadataNode& forward);
     MetadataNode findVlrMetadata(MetadataNode node, uint16_t recordId,
         const std::string& userId);
     void setExtraBytesVlr();
     void setVlrsFromSpatialRef();
     void readyCompression();
+    void readyLasZipCompression();
+    void readyLazPerfCompression();
     void openCompression();
     void addVlr(const std::string& userId, uint16_t recordId,
         const std::string& description, std::vector<uint8_t>& data);
-    bool addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+    void deleteVlr(const std::string& userId, uint16_t recordId);
+    void addGeotiffVlrs();
+    void addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
         const std::string& description);
     bool addWktVlr();
+    void finishLasZipOutput();
+    void finishLazPerfOutput();
 
     LasWriter& operator=(const LasWriter&); // not implemented
     LasWriter(const LasWriter&); // not implemented
diff --git a/io/ply/CMakeLists.txt b/io/ply/CMakeLists.txt
index 10b7705..2c24995 100644
--- a/io/ply/CMakeLists.txt
+++ b/io/ply/CMakeLists.txt
@@ -1,13 +1,13 @@
 set(src
     PlyReader.cpp
     PlyWriter.cpp
-    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.c
+    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.4/rply.c
 )
 
 set(inc
     PlyReader.hpp
     PlyWriter.hpp
-    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.h
+    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.4/rply.h
 )
 
 PDAL_ADD_DRIVER(reader ply "${src}" "${inc}" objs)
diff --git a/io/ply/PlyReader.cpp b/io/ply/PlyReader.cpp
index 36c18b6..4022c02 100644
--- a/io/ply/PlyReader.cpp
+++ b/io/ply/PlyReader.cpp
@@ -36,8 +36,6 @@
 
 #include <sstream>
 
-#include <boost/algorithm/string.hpp>
-
 #include <pdal/PointView.hpp>
 
 namespace pdal
diff --git a/io/text/TextWriter.cpp b/io/text/TextWriter.cpp
index 18664a3..4e7fec6 100644
--- a/io/text/TextWriter.cpp
+++ b/io/text/TextWriter.cpp
@@ -42,8 +42,6 @@
 #include <iostream>
 #include <map>
 
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/erase.hpp>
 #include <boost/tokenizer.hpp>
 
 namespace pdal
@@ -100,7 +98,7 @@ void TextWriter::processOptions(const Options& ops)
         throw pdal_error(out.str());
     }
     m_outputType = ops.getValueOrDefault<std::string>("format", "csv");
-    boost::to_upper(m_outputType);
+    m_outputType = Utils::toupper(m_outputType);
     m_callback = ops.getValueOrDefault<std::string>("jscallback", "");
     m_writeAllDims = ops.getValueOrDefault<bool>("keep_unspecified", true);
     m_dimOrder = ops.getValueOrDefault<std::string>("order", "");
@@ -143,7 +141,7 @@ void TextWriter::ready(PointTableRef table)
     {
         Dimension::IdList all = table.layout()->dims();
         for (auto di = all.begin(); di != all.end(); ++di)
-            if (!contains(m_dims, *di))
+            if (!Utils::contains(m_dims, *di))
                 m_dims.push_back(*di);
     }
 
diff --git a/io/tindex/CMakeLists.txt b/io/tindex/CMakeLists.txt
new file mode 100644
index 0000000..8957acf
--- /dev/null
+++ b/io/tindex/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(src
+    TIndexReader.cpp
+)
+
+set(inc
+    TIndexReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader tindex "${src}" "${inc}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/tindex/TIndexReader.cpp b/io/tindex/TIndexReader.cpp
new file mode 100644
index 0000000..b67d0a6
--- /dev/null
+++ b/io/tindex/TIndexReader.cpp
@@ -0,0 +1,343 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TIndexReader.hpp"
+#include <pdal/GDALUtils.hpp>
+
+
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.tindex",
+    "TileIndex Reader",
+    "http://pdal.io/stages/readers.tindex.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TIndexReader, Reader, s_info)
+
+std::string TIndexReader::getName() const { return s_info.name; }
+
+Options TIndexReader::getDefaultOptions()
+{
+    Options options;
+    Option sql("sql", "", "OGR-compatible SQL statement for querying tile index layer");
+    options.add(sql);
+    Option polygon("polygon", "", "WKT Polygon or MultiPolygon describing spatial extent to query");
+    options.add(polygon);
+    Option bounds("bounds", "", "PDAL-style bounds to limit query window (exclusive of --polygon)");
+    options.add(bounds);
+    Option lyr_name("lyr_name", "", "OGR layer name from which to read tile index layer");
+    options.add(lyr_name);
+    Option tindex_name("tindex_name", "", "OGR column name from which to read tile index location");
+    options.add(tindex_name);
+    Option a_srs("a_srs", "", "Override SRS of geometry in the tile index");
+    options.add(a_srs);
+    Option t_srs("t_srs", "", "Transform SRS of tile index geometry");
+    options.add(t_srs);
+    Option srs_column("srs_column", "", "Column to use for SRS");
+    options.add(srs_column);
+    return options;
+}
+
+TIndexReader::FieldIndexes TIndexReader::getFields()
+{
+    FieldIndexes indexes;
+
+    void *fDefn = OGR_L_GetLayerDefn(m_layer);
+
+    indexes.m_filename = OGR_FD_GetFieldIndex(fDefn,
+        m_tileIndexColumnName.c_str());
+    if (indexes.m_filename < 0)
+    {
+        std::ostringstream out;
+
+        out << "Unable to find field '" << m_tileIndexColumnName <<
+            "' in file '" << m_filename << "'.";
+        throw pdal_error(out.str());
+    }
+    indexes.m_srs = OGR_FD_GetFieldIndex(fDefn, m_srsColumnName.c_str());
+    if (indexes.m_srs < 0)
+    {
+        std::ostringstream out;
+
+        out << "Unable to find field '" << m_srsColumnName << "' in file '" <<
+            m_filename << "'.";
+        throw pdal_error(out.str());
+    }
+
+    indexes.m_ctime = OGR_FD_GetFieldIndex(fDefn, "created");
+    indexes.m_mtime = OGR_FD_GetFieldIndex(fDefn, "modified");
+
+    return indexes;
+}
+
+
+
+std::vector<TIndexReader::FileInfo> TIndexReader::getFiles()
+{
+    std::vector<TIndexReader::FileInfo> output;
+
+    OGR_L_ResetReading(m_layer);
+    FieldIndexes indexes = getFields();
+
+    while (true)
+    {
+        OGRFeatureH feature = OGR_L_GetNextFeature(m_layer);
+        if (!feature)
+            break;
+
+        FileInfo fileInfo;
+        fileInfo.m_filename =
+            OGR_F_GetFieldAsString(feature, indexes.m_filename);
+        fileInfo.m_srs =
+            OGR_F_GetFieldAsString(feature, indexes.m_srs);
+        output.push_back(fileInfo);
+
+        OGR_F_Destroy(feature);
+    }
+
+    return output;
+}
+void TIndexReader::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+}
+
+void TIndexReader::processOptions(const Options& options)
+{
+    m_layerName = options.getValueOrDefault<std::string>("lyr_name", "pdal");
+    m_srsColumnName = options.getValueOrDefault<std::string>("srs_column", "srs");
+    m_tileIndexColumnName = options.getValueOrDefault<std::string>("tindex_name", "location");
+    m_sql = options.getValueOrDefault<std::string>("sql", "");
+
+    m_wkt = options.getValueOrDefault<std::string>("wkt", "");
+    BOX2D boundary = options.getValueOrDefault<BOX2D>("boundary", BOX2D());
+    if (!boundary.empty())
+    {
+        m_wkt = boundary.toWKT();
+    }
+    m_tgtSrsString = options.getValueOrDefault<std::string>("t_srs", "EPSG:4326");
+    m_filterSRS = options.getValueOrDefault<std::string>("filter_srs", "");
+    m_attributeFilter = options.getValueOrDefault<std::string>("where", "");
+    m_dialect = options.getValueOrDefault<std::string>("dialect", "OGRSQL");
+
+    m_out_ref.reset(new gdal::SpatialRef());
+}
+
+void TIndexReader::addDimensions(PointLayoutPtr layout)
+{
+    using namespace pdal::Dimension::Type;
+    layout->registerDim(pdal::Dimension::Id::X);
+    layout->registerDim(pdal::Dimension::Id::Y);
+    layout->registerDim(pdal::Dimension::Id::Z);
+}
+
+pdal::Dimension::IdList TIndexReader::getDefaultDimensions()
+{
+    using namespace pdal::Dimension;
+    Dimension::IdList ids;
+
+    return ids;
+}
+
+void TIndexReader::ready(PointTableRef table)
+{
+    log()->get(LogLevel::Debug) << "Opening file "
+                                << m_filename <<std::endl;
+
+    m_dataset = OGROpen(m_filename.c_str(), FALSE, NULL);
+    if (!m_dataset)
+    {
+        std::stringstream oss;
+        oss << "unable to datasource '" << m_filename << "'";
+        throw pdal::pdal_error(oss.str());
+    }
+
+    OGRGeometryH geometry(0);
+    if (m_sql.size())
+    {
+        m_layer = OGR_DS_ExecuteSQL(m_dataset,
+                                    m_sql.c_str(),
+                                    geometry,
+                                    m_dialect.c_str());
+    } else
+    {
+        m_layer = OGR_DS_GetLayerByName(m_dataset,
+                                        m_layerName.c_str());
+    }
+    if (!m_layer)
+    {
+        std::stringstream oss;
+        oss << "unable to open layer '"
+            << m_layerName << "' from OGR datasource '"
+            << m_filename << "'";
+        throw pdal::pdal_error(oss.str());
+    }
+
+    m_out_ref->setFromLayer(m_layer);
+
+    // Override the SRS if the user set one, otherwise, take it
+    // from the layer
+    if (m_tgtSrsString.size())
+        m_out_ref.reset(new gdal::SpatialRef(m_tgtSrsString));
+    else
+        m_out_ref.reset(new gdal::SpatialRef(m_out_ref->wkt()));
+
+    SpatialReference pdal_ref(m_out_ref->wkt());
+    setSpatialReference(pdal_ref);
+
+    std::unique_ptr<gdal::Geometry> wkt_g;
+
+    // If the user set either explicit 'polygon' or 'boundary' options
+    // we will filter by that geometry. The user can set a 'filter_srs'
+    // option to override the SRS of the input geometry and we will
+    // reproject to the output projection as needed.
+    if (m_wkt.size())
+    {
+        // Reproject the given wkt to the output SRS so
+        // filtering/cropping works
+        gdal::SpatialRef assign(m_filterSRS);
+        gdal::Geometry before(m_wkt, assign);
+        before.transform(*m_out_ref);
+
+        wkt_g.reset (new gdal::Geometry(before.wkt(), *m_out_ref));
+
+        geometry = wkt_g->get();
+        m_wkt = wkt_g->wkt();
+        OGR_L_SetSpatialFilter(m_layer, geometry);
+    }
+
+    if (m_attributeFilter.size())
+    {
+        OGRErr err = OGR_L_SetAttributeFilter(m_layer, m_attributeFilter.c_str());
+        if (err != OGRERR_NONE)
+        {
+            std::stringstream oss;
+            oss << "unable to set attribute filter '"
+                << m_attributeFilter << "' for OGR datasource '"
+                << m_filename << "'";
+            throw pdal::pdal_error(oss.str());
+        }
+    }
+
+    m_files = getFiles();
+
+    Options cropOptions;
+    if (m_wkt.size())
+        cropOptions.add("polygon", m_wkt);
+
+    for (auto f : m_files)
+    {
+        log()->get(LogLevel::Debug) << "Adding file "
+                                    << f.m_filename
+                                    << " to merge filter" <<std::endl;
+        Stage *premerge = NULL;
+        std::string driver = m_factory.inferReaderDriver(f.m_filename);
+        Stage *reader = m_factory.createStage(driver, true);
+        if (!reader)
+        {
+            std::stringstream out;
+            out << "Unable to create reader for file '"
+                << f.m_filename << "'.";
+            throw pdal_error(out.str());
+        }
+        Options readerOptions;
+        readerOptions.add("filename", f.m_filename);
+        reader->setOptions(readerOptions);
+        premerge = reader;
+
+        if (m_tgtSrsString != f.m_srs &&
+            (m_tgtSrsString.size() && f.m_srs.size()))
+        {
+            Stage *repro = m_factory.createStage("filters.reprojection", true);
+            repro->setInput(*reader);
+            Options reproOptions;
+            reproOptions.add("out_srs", m_tgtSrsString);
+            reproOptions.add("in_srs", f.m_srs);
+            log()->get(LogLevel::Debug2) << "Repro = "
+                                         << m_tgtSrsString << "/"
+                                         << f.m_srs << "!\n";
+            repro->setOptions(reproOptions);
+            premerge = repro;
+        }
+
+        // WKT is set, even if we're using a bounding box for filtering, so
+        // can be used as a test here.
+        if (!m_wkt.empty())
+        {
+            Stage *crop = m_factory.createStage("filters.crop", true);
+            crop->setOptions(cropOptions);
+            crop->setInput(*premerge);
+            log()->get(LogLevel::Debug3) << "Cropping data with wkt '"
+                                         << m_wkt << "'" << std::endl;
+            premerge = crop;
+        }
+
+        m_merge.setInput(*premerge);
+    }
+
+    m_table = table;
+
+}
+
+PointViewSet TIndexReader::run(PointViewPtr view)
+{
+    m_merge.prepare(m_table);
+    PointViewSet output = m_merge.execute(m_table);
+    return output;
+}
+
+TIndexReader::~TIndexReader()
+{
+    if (!m_dataset) return;
+    if (m_sql.size())
+    {
+        // We were created with OGR_DS_ExecuteSQL which needs to have
+        // its layer explicitly released
+        OGR_DS_ReleaseResultSet(m_dataset, m_layer);
+    }
+    else
+    {
+        OGR_DS_Destroy(m_dataset);
+    }
+
+    m_layer = 0;
+    m_dataset = 0;
+
+}
+
+
+
+} // namespace pdal
diff --git a/kernels/tindex/TIndexKernel.hpp b/io/tindex/TIndexReader.hpp
similarity index 65%
copy from kernels/tindex/TIndexKernel.hpp
copy to io/tindex/TIndexReader.hpp
index 705e67f..435fc20 100644
--- a/kernels/tindex/TIndexKernel.hpp
+++ b/io/tindex/TIndexReader.hpp
@@ -34,22 +34,19 @@
 
 #pragma once
 
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+#include <merge/MergeFilter.hpp>
+#include <pdal/StageFactory.hpp>
 #include <pdal/GDALUtils.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/Stage.hpp>
-#include <pdal/util/FileUtils.hpp>
-#include <pdal/plugin.hpp>
 
-
-extern "C" int32_t TIndexKernel_ExitFunc();
-extern "C" PF_ExitFunc TIndexKernel_InitPlugin();
+extern "C" int32_t TIndexReader_ExitFunc();
+extern "C" PF_ExitFunc TIndexReader_InitPlugin();
 
 namespace pdal
 {
-
-class KernelFactory;
-
-class PDAL_DLL TIndexKernel : public Kernel
+class PDAL_DLL TIndexReader : public pdal::Reader
 {
     struct FileInfo
     {
@@ -69,51 +66,57 @@ class PDAL_DLL TIndexKernel : public Kernel
     };
 
 public:
+    TIndexReader()
+        : Reader()
+        , m_dataset(0)
+        , m_layer(0)
+        , m_tablePtr(new PointTable())
+        , m_table(*m_tablePtr)
+        {}
+
+    ~TIndexReader();
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
-    int execute(); // overrride
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions();
 
 private:
-    TIndexKernel();
-    void addSwitches(); // overrride
-    void validateSwitches(); // overrride
-
-    StringList glob(std::string& path);
-    void createFile();
-    void mergeFile();
-    bool openDataset(const std::string& filename);
-    bool createDataset(const std::string& filename);
-    bool openLayer(const std::string& layerName);
-    bool createLayer(const std::string& layerName);
-    FieldIndexes getFields();
-    FileInfo getFileInfo(KernelFactory& factory, const std::string& filename);
-    bool createFeature(const FieldIndexes& indexes, FileInfo& info);
-    gdal::Geometry prepareGeometry(const FileInfo& fileInfo);
-    gdal::Geometry prepareGeometry(const std::string& wkt,
-        const gdal::SpatialRef& inSrs, const gdal::SpatialRef& outSrs);
-    void createFields();
-
-    bool isFileIndexed( const FieldIndexes& indexes, const FileInfo& fileInfo);
-
-    std::string m_idxFilename;
-    std::string m_filespec;
-    StringList m_files;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual PointViewSet run(PointViewPtr /*view*/);
+
+    virtual void initialize();
+
+    std::vector<FileInfo> m_files;
     std::string m_layerName;
     std::string m_driverName;
     std::string m_tileIndexColumnName;
     std::string m_srsColumnName;
     std::string m_wkt;
-    BOX2D m_bounds;
-    bool m_merge;
-    bool m_absPath;
+    std::string m_tgtSrsString;
+    std::string m_filterSRS;
+    std::string m_attributeFilter;
+    std::string m_dialect;
+    BOX2D m_boundary;
+    std::string m_sql;
 
+    std::unique_ptr<gdal::SpatialRef> m_out_ref;
     void *m_dataset;
     void *m_layer;
-    std::string m_tgtSrsString;
-    std::string m_assignSrsString;
-    bool m_fastBoundary;
+
+    std::unique_ptr<PointTable> m_tablePtr;
+    PointTableRef m_table;
+    StageFactory m_factory;
+    MergeFilter m_merge;
+
+    std::vector<FileInfo> getFiles();
+    FieldIndexes getFields();
+
 };
 
-} // namespace pdal
 
+} // namespace pdal
diff --git a/kernels/info/InfoKernel.cpp b/kernels/info/InfoKernel.cpp
index 78d6568..7a952a5 100644
--- a/kernels/info/InfoKernel.cpp
+++ b/kernels/info/InfoKernel.cpp
@@ -142,7 +142,7 @@ void InfoKernel::addSwitches()
     processing_options->add_options()
         ("all",
          po::value<bool>(&m_showAll)->zero_tokens()->implicit_value(true),
-         "dump the schema")
+         "dump statistics, schema and metadata")
         ("point,p", po::value<std::string >(&m_pointIndexes), "point to dump")
         ("query", po::value< std::string>(&m_queryPoint),
          "Return points in order of distance from the specified "
@@ -299,8 +299,7 @@ void InfoKernel::setup(const std::string& filename)
     if (!m_needPoints)
         readerOptions.add("count", 0);
 
-    m_manager = std::unique_ptr<PipelineManager>(
-        KernelSupport::makePipeline(filename));
+    m_manager = KernelSupport::makePipeline(filename);
     m_reader = m_manager->getStage();
     Stage *stage = m_reader;
 
diff --git a/kernels/info/InfoKernel.hpp b/kernels/info/InfoKernel.hpp
index b992520..38acf8d 100644
--- a/kernels/info/InfoKernel.hpp
+++ b/kernels/info/InfoKernel.hpp
@@ -104,7 +104,7 @@ private:
     Stage *m_reader;
 
     MetadataNode m_tree;
-    std::unique_ptr<PipelineManager> m_manager;
+    PipelineManagerPtr m_manager;
 };
 
 } // namespace pdal
diff --git a/kernels/tindex/TIndexKernel.cpp b/kernels/tindex/TIndexKernel.cpp
index 716a740..ac71f0a 100644
--- a/kernels/tindex/TIndexKernel.cpp
+++ b/kernels/tindex/TIndexKernel.cpp
@@ -86,6 +86,7 @@ TIndexKernel::TIndexKernel()
     , m_dataset(NULL)
     , m_layer(NULL)
     , m_fastBoundary(false)
+    , m_smoothBoundary(false)
 
 {
     m_log.setLeader("pdal tindex");
@@ -104,9 +105,12 @@ void TIndexKernel::addSwitches()
             "OGR-readable/writeable tile index output")
         ("filespec", po::value<std::string>(&m_filespec),
             "Build: Pattern of files to index. Merge: Output filename")
+        ("smooth_boundary", po::value<bool>(&m_smoothBoundary)->
+            zero_tokens()->implicit_value(false),
+            "use smoothed version of full boundary")
         ("fast_boundary", po::value<bool>(&m_fastBoundary)->
             zero_tokens()->implicit_value(true),
-            "use extend instead of exact boundary")
+            "use extent instead of exact boundary")
         ("lyr_name", po::value<std::string>(&m_layerName),
             "OGR layer name to write into datasource")
         ("tindex_name", po::value<std::string>(&m_tileIndexColumnName)->
@@ -180,6 +184,9 @@ void TIndexKernel::validateSwitches()
             throw pdal_error("--bounds option not supported when building "
                 "index.");
     }
+    if (m_smoothBoundary && m_fastBoundary)
+        throw pdal_error("Can't request both smooth_boundary and "
+            "fast_boundary.");
 }
 
 
@@ -415,7 +422,6 @@ void TIndexKernel::mergeFile()
             Options reproOptions;
             reproOptions.add("out_srs", m_tgtSrsString);
             reproOptions.add("in_srs", f.m_srs);
-    std::cerr << "Repro = " << m_tgtSrsString << "/" << f.m_srs << "!\n";
             repro->setOptions(reproOptions);
             premerge = repro;
         }
@@ -478,7 +484,8 @@ bool TIndexKernel::createFeature(const FieldIndexes& indexes,
         fileInfo.m_filename.c_str());
 
     // Set the SRS into the feature.
-    if (fileInfo.m_srs.empty())
+    // We override if m_assignSrsString is set
+    if (fileInfo.m_srs.empty() || m_assignSrsString.size())
         fileInfo.m_srs = m_assignSrsString;
 
     SpatialRef srcSrs(fileInfo.m_srs);
@@ -551,8 +558,9 @@ TIndexKernel::FileInfo TIndexKernel::getFileInfo(KernelFactory& factory,
     Stage *s = f.createStage(driverName, true);
     Options ops;
     ops.add("filename", filename);
+    setCommonOptions(ops);
     s->setOptions(ops);
-
+    applyExtraStageOptionsRecursive(s);
     if (m_fastBoundary)
     {
         QuickInfo qi = s->preview();
@@ -587,12 +595,17 @@ TIndexKernel::FileInfo TIndexKernel::getFileInfo(KernelFactory& factory,
         hexer->setInput(*s);
 
         hexer->prepare(table);
-        hexer->execute(table);
+        PointViewSet set = hexer->execute(table);
+
+        MetadataNode m = table.metadata();
+        m = m_smoothBoundary ?
+            m.findChild("filters.hexbin:smooth_boundary") :
+            m.findChild("filters.hexbin:boundary");
+        fileInfo.m_boundary = m.value();
 
-        fileInfo.m_boundary =
-            table.metadata().findChild("filters.hexbin:boundary").value();
-        if (!table.spatialRef().empty())
-            fileInfo.m_srs = table.spatialRef().getWKT();
+        PointViewPtr v = *set.begin();
+        if (!v->spatialReference().empty())
+            fileInfo.m_srs = v->spatialReference().getWKT();
     }
 
     FileUtils::fileTimes(filename, &fileInfo.m_ctime, &fileInfo.m_mtime);
@@ -739,15 +752,14 @@ gdal::Geometry TIndexKernel::prepareGeometry(const FileInfo& fileInfo)
         throw pdal_error("Unable to import target SRS.");
 
     Geometry g;
-
     try
     {
        g = prepareGeometry(fileInfo.m_boundary, srcSrs, tgtSrs);
     }
-    catch (pdal_error)
+    catch (pdal_error& e)
     {
         oss << "Unable to transform geometry from source to target SRS for " <<
-            fileInfo.m_filename << "'.";
+            fileInfo.m_filename << "'. Message is '" << e.what() << "'";
         throw pdal_error(oss.str());
     }
     if (!g)
diff --git a/kernels/tindex/TIndexKernel.hpp b/kernels/tindex/TIndexKernel.hpp
index 705e67f..52a0ab2 100644
--- a/kernels/tindex/TIndexKernel.hpp
+++ b/kernels/tindex/TIndexKernel.hpp
@@ -113,6 +113,7 @@ private:
     std::string m_tgtSrsString;
     std::string m_assignSrsString;
     bool m_fastBoundary;
+    bool m_smoothBoundary;
 };
 
 } // namespace pdal
diff --git a/kernels/translate/TranslateKernel.cpp b/kernels/translate/TranslateKernel.cpp
index 7627f91..7436441 100644
--- a/kernels/translate/TranslateKernel.cpp
+++ b/kernels/translate/TranslateKernel.cpp
@@ -164,7 +164,13 @@ int TranslateKernel::execute()
         Stage* filter = &(m_manager->addFilter(filter_name));
 
         if (filter == NULL)
+        {
+            std::ostringstream oss;
+            oss << "Unable to add filter " << filter_name << ".  Filter "
+              "is invalid or plugin could not be loaded.  Check "
+              "'pdal --drivers'.";
             throw pdal_error("Error getting filter\n");
+        }
 
         filter->setOptions(filterOptions);
         filter->setInput(*stage);
diff --git a/pdal_defines.h.in b/pdal_defines.h.in
index 961efe1..71e0675 100644
--- a/pdal_defines.h.in
+++ b/pdal_defines.h.in
@@ -74,4 +74,6 @@
  */
 #cmakedefine PDAL_APP_BUNDLE
 
+#define PDAL_PYTHON_LIBRARY "${PYTHON_LIBRARY}"
+
 #endif
diff --git a/plugins/attribute/CMakeLists.txt b/plugins/attribute/CMakeLists.txt
index 7bce37b..90b499f 100644
--- a/plugins/attribute/CMakeLists.txt
+++ b/plugins/attribute/CMakeLists.txt
@@ -16,6 +16,11 @@ if (GEOS_FOUND AND GDAL_FOUND)
     PDAL_ADD_PLUGIN(libname filter attribute
         FILES "${srcs}" "${incs}"
         LINK_WITH ${GEOS_LIBRARY} ${GDAL_LIBRARY})
+
+    if (WITH_TESTS)
+        PDAL_ADD_TEST(pdal_filters_attribute_test
+            FILES test/AttributeFilterTest.cpp)
+    endif()
 else()
     message(STATUS "BUILD_PLUGIN_ATTRIBUTE disabled because GEOS and/or GDAL was not found")
 endif()
diff --git a/plugins/attribute/filters/AttributeFilter.cpp b/plugins/attribute/filters/AttributeFilter.cpp
index f98c06d..9970077 100644
--- a/plugins/attribute/filters/AttributeFilter.cpp
+++ b/plugins/attribute/filters/AttributeFilter.cpp
@@ -35,6 +35,7 @@
 #include "AttributeFilter.hpp"
 
 #include <memory>
+#include <vector>
 
 #include <pdal/GlobalEnvironment.hpp>
 #include <pdal/GDALUtils.hpp>
@@ -66,16 +67,33 @@ struct OGRDataSourceDeleter
     }
 };
 
-struct OGRGeometryDeleter
+namespace
 {
-    template <typename T>
-    void operator()(T* ptr)
-    {
-        if (ptr)
-            ::OGR_G_DestroyGeometry(ptr);
-    }
-};
 
+static void _GEOSErrorHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    va_start(args, fmt);
+    char buf[1024];
+
+    vsnprintf(buf, sizeof(buf), fmt, args);
+
+    va_end(args);
+}
+
+static void _GEOSWarningHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    char buf[1024];
+    vsnprintf(buf, sizeof(buf), fmt, args);
+    std::cout << "GEOS warning: " << buf << std::endl;
+
+    va_end(args);
+}
+
+} // unnamed namespace
 
 struct OGRFeatureDeleter
 {
@@ -97,21 +115,8 @@ Options AttributeFilter::getDefaultOptions()
 {
     Options options;
 
-    pdal::Option red("dimension", "Classification", "");
-    pdal::Option b0("value","0", "");
-    pdal::Option geometry("geometry","POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))", "");
-    pdal::Option query("query","", "");
-    pdal::Option layer("layer","", "");
-    pdal::Option datasource("datasource","", "");
-    pdal::Options redO;
-    redO.add(b0);
-    redO.add(geometry);
-    redO.add(query);
-    redO.add(layer);
-    redO.add(datasource);
-    red.setOptions(redO);
-
-    options.add(red);
+    options.add("dimension", "Classification");
+    options.add("datasource", "source");
 
     return options;
 }
@@ -119,64 +124,77 @@ Options AttributeFilter::getDefaultOptions()
 
 void AttributeFilter::processOptions(const Options& options)
 {
-    std::vector<Option> dimensions = options.getOptions("dimension");
-    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    if (!options.hasOption("dimension"))
+    {
+        std::ostringstream oss;
+        oss << getName() << ": option 'dimension' must be specified.";
+        throw pdal_error(oss.str());
+    }
+    if (options.hasOption("value") && options.hasOption("datasource"))
+    {
+        std::ostringstream oss;
+        oss << getName() << ": options 'value' and 'datasource' mutually "
+            "exclusive.";
+        throw pdal_error(oss.str());
+    }
+    if (!options.hasOption("value") && !options.hasOption("datasource"))
     {
-        std::string name = i->getValue<std::string>();
-        boost::optional<Options const&> dimensionOptions = i->getOptions();
-        if (!dimensionOptions)
+        std::ostringstream oss;
+        oss << getName() << ": Either option 'value' or 'datasource' must "
+            "be specified.";
+        throw pdal_error(oss.str());
+    }
+
+    std::string ops[] = { "column", "query", "layer" };
+    for (auto& op : ops)
+    {
+        if (options.hasOption("value") && options.hasOption(op))
         {
             std::ostringstream oss;
-            oss << "No options dimension given for dimension '" <<
-                name << "'";
+            oss << getName() << ": option 'op' invalid with option 'value'.";
             throw pdal_error(oss.str());
         }
+    }
 
-        AttributeInfo info;
-        info.datasource = dimensionOptions->getValueOrDefault<std::string>("datasource", "");
-
-
-        // If we have no datasource, then we're simply setting a value.
-        // If we have no value, throw an exception.
-        if (!info.datasource.size())
-        {
-            info.value = dimensionOptions->getValueOrThrow<std::string>("value");
-            info.isogr = false;
-        } else
-        {
-            info.column = dimensionOptions->getValueOrDefault<std::string>("column",""); // take first column
-            info.query = dimensionOptions->getValueOrDefault<std::string>("query","");
-            info.layer = dimensionOptions->getValueOrDefault<std::string>("layer",""); // take first layer
+    m_dimName = options.getValueOrDefault<std::string>("dimension");
+    m_value = options.getValueOrDefault<double>("value",
+        std::numeric_limits<double>::quiet_NaN());
+    m_datasource = options.getValueOrDefault<std::string>("datasource");
+    m_column = options.getValueOrDefault<std::string>("column");
+    m_query = options.getValueOrDefault<std::string>("query");
+    m_layer = options.getValueOrDefault<std::string>("layer");
+}
 
-        }
 
-        m_dimensions.insert(std::make_pair(name, info));
+void AttributeFilter::prepared(PointTableRef table)
+{
+    m_dim = table.layout()->findDim(m_dimName);
+    if (m_dim == Dimension::Id::Unknown)
+    {
+        std::ostringstream oss;
+        oss << getName() << ": Dimension '" << m_dimName << "' not found.";
+        throw pdal_error(oss.str());
     }
 }
 
+
 void AttributeFilter::ready(PointTableRef table)
 {
-    for (auto& dim_par : m_dimensions)
+    if (m_value != m_value)
     {
-        Dimension::Id::Enum t = table.layout()->findDim(dim_par.first);
-        dim_par.second.dim = t;
-
-        if (dim_par.second.isogr)
+        m_ds = OGRDSPtr(OGROpen(m_datasource.c_str(), 0, 0),
+            OGRDataSourceDeleter());
+        if (!m_ds)
         {
-
-            OGRDSPtr ds = OGRDSPtr(OGROpen(dim_par.second.datasource.c_str(), 0, 0), OGRDataSourceDeleter());
-            if (!ds)
-            {
-                std::ostringstream oss;
-                oss << "Unable to open data source '" << dim_par.second.datasource <<"'";
-                throw pdal_error(oss.str());
-            }
-            dim_par.second.ds = ds;
+            std::ostringstream oss;
+            oss << getName() << ": Unable to open data source '" <<
+                    m_datasource << "'";
+            throw pdal_error(oss.str());
         }
-
     }
 }
 
+
 BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry)
 {
     uint32_t numInputDims;
@@ -208,13 +226,13 @@ BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry)
 }
 
 
-GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx, double x, double y, double z)
+GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx,
+    double x, double y, double z)
 {
     int ret(0);
 
     // precise filtering based on the geometry
-    GEOSCoordSequence* coords =
-        GEOSCoordSeq_create_r(ctx, 1, 3);
+    GEOSCoordSequence* coords = GEOSCoordSeq_create_r(ctx, 1, 3);
     if (!coords)
         throw pdal_error("unable to allocate coordinate sequence");
     ret = GEOSCoordSeq_setX_r(ctx, coords, 0, x);
@@ -233,47 +251,46 @@ GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx, double x, double y, doubl
     return p;
 }
 
-void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
+
+void AttributeFilter::UpdateGEOSBuffer(PointView& view)
 {
     QuadIndex idx(view);
 
-    if (!info.lyr) // wake up the layer
+    if (m_layer.size())
+        m_lyr = OGR_DS_GetLayerByName(m_ds.get(), m_layer.c_str());
+    else if (m_query.size())
+        m_lyr = OGR_DS_ExecuteSQL(m_ds.get(), m_query.c_str(), 0, 0);
+    else
+        m_lyr = OGR_DS_GetLayer(m_ds.get(), 0);
+
+    if (!m_lyr)
     {
-        if (info.layer.size())
-            info.lyr = OGR_DS_GetLayerByName(info.ds.get(), info.layer.c_str());
-        else if (info.query.size())
-        {
-            info.lyr = OGR_DS_ExecuteSQL(info.ds.get(), info.query.c_str(), 0, 0);
-        }
-        else
-            info.lyr = OGR_DS_GetLayer(info.ds.get(), 0);
-        if (!info.lyr)
-        {
-            std::ostringstream oss;
-            oss << "Unable to select layer '" << info.layer << "'";
-            throw pdal_error(oss.str());
-        }
+        std::ostringstream oss;
+        oss << getName() << ": Unable to select layer '" << m_layer << "'";
+        throw pdal_error(oss.str());
     }
 
-    OGRFeaturePtr feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+    OGRFeaturePtr feature = OGRFeaturePtr(OGR_L_GetNextFeature(m_lyr),
+        OGRFeatureDeleter());
 
     int field_index(1); // default to first column if nothing was set
-    if (info.column.size())
+    if (m_column.size())
     {
-
-        field_index = OGR_F_GetFieldIndex(feature.get(), info.column.c_str());
+        field_index = OGR_F_GetFieldIndex(feature.get(), m_column.c_str());
         if (field_index == -1)
         {
             std::ostringstream oss;
-            oss << "No column name '" << info.column << "' was found.";
+            oss << getName() << ": No column name '" << m_column <<
+                "' was found.";
             throw pdal_error(oss.str());
         }
     }
 
-    while(feature)
+    while (feature)
     {
         OGRGeometryH geom = OGR_F_GetGeometryRef(feature.get());
         OGRwkbGeometryType t = OGR_G_GetGeometryType(geom);
+        int32_t fieldVal = OGR_F_GetFieldAsInteger(feature.get(), field_index);
 
         if (!(t == wkbPolygon ||
             t == wkbMultiPolygon ||
@@ -281,28 +298,36 @@ void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
             t == wkbMultiPolygon25D))
         {
             std::ostringstream oss;
-            oss << "Geometry is not Polygon or MultiPolygon!";
+            oss << getName() << ": Geometry is not Polygon or MultiPolygon!";
             throw pdal::pdal_error(oss.str());
         }
 
-        OGRGeometry* ogr_g = (OGRGeometry*) geom;
-        GEOSGeometry* geos_g (0);
+        OGRGeometry *ogr_g = (OGRGeometry*)geom;
         if (!m_geosEnvironment)
+            m_geosEnvironment = initGEOS_r(_GEOSWarningHandler,
+                _GEOSErrorHandler);
+
+        // Convert the the GDAL geom to WKB in order to avoid the version
+        // context issues with exporting directoly to GEOS.
+        OGRwkbByteOrder bo =
+            GEOS_getWKBByteOrder() == GEOS_WKB_XDR ? wkbXDR : wkbNDR;
+        int wkbSize = ogr_g->WkbSize();
+        std::vector<unsigned char> wkb(wkbSize);
+
+        ogr_g->exportToWkb(bo, wkb.data());
+        GEOSGeometry *geos_g = GEOSGeomFromWKB_buf_r(m_geosEnvironment,
+            wkb.data(), wkbSize);
+
+        GEOSPreparedGeometry const* geos_pg = GEOSPrepare_r(m_geosEnvironment,
+            geos_g);
+        if (!geos_pg)
         {
-
-#if (GDAL_VERSION_MINOR < 11) && (GDAL_VERSION_MAJOR == 1)
-        geos_g = ogr_g->exportToGEOS();
-#else
-        m_geosEnvironment = ogr_g->createGEOSContext();
-        geos_g = ogr_g->exportToGEOS(m_geosEnvironment);
-
-#endif
+            std::ostringstream oss;
+            oss << getName() << ": unable to prepare geometry for "
+                "index-accelerated intersection";
+            throw pdal_error(oss.str());
         }
 
-        GEOSPreparedGeometry const* geos_pg = GEOSPrepare_r(m_geosEnvironment, geos_g);
-        if (!geos_pg)
-            throw pdal_error("unable to prepare geometry for index-accelerated intersection");
-
         // Compute a total bounds for the geometry. Query the QuadTree to
         // find out the points that are inside the bbox. Then test each
         // point in the bbox against the prepared geometry.
@@ -310,47 +335,40 @@ void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
         std::vector<PointId> ids = idx.getPoints(box);
         for (const auto& i : ids)
         {
-
             double x = view.getFieldAs<double>(Dimension::Id::X, i);
             double y = view.getFieldAs<double>(Dimension::Id::Y, i);
             double z = view.getFieldAs<double>(Dimension::Id::Z, i);
 
             GEOSGeometry* p = createGEOSPoint(m_geosEnvironment, x, y ,z);
 
-            if (static_cast<bool>(GEOSPreparedContains_r(m_geosEnvironment, geos_pg, p)))
+            if ((bool)(GEOSPreparedCovers_r(m_geosEnvironment, geos_pg, p)))
             {
                 // We're in the poly, write the attribute value
-                int32_t v = OGR_F_GetFieldAsInteger(feature.get(), field_index);
-                view.setField(info.dim, i, v);
-//                 log()->get(LogLevel::Debug) << "Setting value: " << v << std::endl;
+                view.setField(m_dim, i, fieldVal);
             }
-
             GEOSGeom_destroy_r(m_geosEnvironment, p);
-
         }
-
-        feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+        feature = OGRFeaturePtr(OGR_L_GetNextFeature(m_lyr),
+            OGRFeatureDeleter());
     }
 }
 
+
 void AttributeFilter::filter(PointView& view)
 {
+    if (m_value == m_value)
+        for (PointId i = 0; i < view.size(); ++i)
+            view.setField(m_dim, i, m_value);
+    else
+        UpdateGEOSBuffer(view);
+}
 
-    for (auto& dim_par : m_dimensions)
-    {
-        if (dim_par.second.isogr)
-        {
-            UpdateGEOSBuffer(view, dim_par.second);
-        }  else
-        {
-            for (PointId i = 0; i < view.size(); ++i)
-            {
-                double v = boost::lexical_cast<double>(dim_par.second.value);
-                view.setField(dim_par.second.dim, i, v);
-            }
 
-        }
-    }
+void AttributeFilter::done(PointTableRef /*table*/)
+{
+    if (m_geosEnvironment)
+        finishGEOS_r(m_geosEnvironment);
+    m_geosEnvironment = 0;
 }
 
 } // namespace pdal
diff --git a/plugins/attribute/filters/AttributeFilter.hpp b/plugins/attribute/filters/AttributeFilter.hpp
index d9be09b..8feb0e8 100644
--- a/plugins/attribute/filters/AttributeFilter.hpp
+++ b/plugins/attribute/filters/AttributeFilter.hpp
@@ -53,65 +53,15 @@ namespace gdal
     class ErrorHandler;
 }
 
-
 typedef std::shared_ptr<void> OGRDSPtr;
 typedef std::shared_ptr<void> OGRFeaturePtr;
 typedef std::shared_ptr<void> OGRGeometryPtr;
 
-class AttributeInfo
-{
-public:
-    AttributeInfo() : ds(0), lyr(0), isogr(true) {};
-
-    std::string connection;
-    std::string column;
-    std::string datasource;
-    OGRDSPtr ds;
-    OGRLayerH lyr;
-    std::string query;
-    std::string layer;
-    std::string value;
-    bool isogr;
-    Dimension::Id::Enum dim;
-    AttributeInfo(const AttributeInfo& other)
-        : connection(other.connection)
-        , column(other.column)
-        , datasource(other.datasource)
-        , ds(other.ds)
-        , lyr(other.lyr)
-        , query(other.query)
-        , layer(other.layer)
-        , value(other.value)
-        , isogr(other.isogr)
-        , dim(other.dim) {};
-    AttributeInfo& operator=(const AttributeInfo& other)
-    {
-        if (&other != this)
-        {
-            connection = other.connection;
-            column = other.column;
-            datasource = other.datasource;
-            ds = other.ds;
-            lyr = other.lyr;
-            query = other.query;
-            value = other.value;
-            layer = other.layer;
-            isogr = other.isogr;
-            dim = other.dim;
-        }
-        return *this;
-    }
-
-};
-
-
-typedef std::map< std::string, AttributeInfo> AttributeInfoMap;
-
-
 class PDAL_DLL AttributeFilter : public Filter
 {
 public:
-    AttributeFilter() : Filter(), m_geosEnvironment(0) {};
+    AttributeFilter() : Filter(), m_ds(0), m_lyr(0), m_geosEnvironment(0)
+    {}
 
     static void * create();
     static int32_t destroy(void *);
@@ -122,18 +72,29 @@ public:
 private:
     virtual void initialize();
     virtual void processOptions(const Options&);
+    virtual void prepared(PointTableRef table);
     virtual void ready(PointTableRef table);
     virtual void filter(PointView& view);
+    virtual void done(PointTableRef table);
 
     AttributeFilter& operator=(const AttributeFilter&); // not implemented
     AttributeFilter(const AttributeFilter&); // not implemented
 
     typedef std::shared_ptr<void> OGRDSPtr;
 
-    AttributeInfoMap m_dimensions;
+    OGRDSPtr m_ds;
+    OGRLayerH m_lyr;
+    std::string m_dimName;
+    double m_value;
+    std::string m_datasource;
+    std::string m_column;
+    std::string m_query;
+    std::string m_layer;
+    Dimension::Id::Enum m_dim;
+
     GEOSContextHandle_t m_geosEnvironment;
     std::unique_ptr<pdal::gdal::ErrorHandler> m_gdal_debug;
-    void UpdateGEOSBuffer(PointView& view, AttributeInfo& info);
+    void UpdateGEOSBuffer(PointView& view);
 
 };
 
diff --git a/plugins/attribute/test/AttributeFilterTest.cpp b/plugins/attribute/test/AttributeFilterTest.cpp
new file mode 100644
index 0000000..8d74b1b
--- /dev/null
+++ b/plugins/attribute/test/AttributeFilterTest.cpp
@@ -0,0 +1,186 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/StageFactory.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(AttributeFilterTest, value)
+{
+    Options ro;
+    ro.add("filename", Support::datapath("autzen/autzen-dd.las"));
+
+    StageFactory factory;
+    Stage& r = *(factory.createStage("readers.las", true));
+    r.setOptions(ro);
+
+    Options fo;
+    fo.add("dimension", "X");
+    fo.add("value", 27.5);
+
+    Stage& f = *(factory.createStage("filters.attribute", true));
+    f.setInput(r);
+    f.setOptions(fo);
+
+    std::string tempfile(Support::temppath("out.las"));
+
+    Options wo;
+    wo.add("filename", tempfile);
+    Stage& w = *(factory.createStage("writers.las", true));
+    w.setInput(f);
+    w.setOptions(wo);
+
+    FileUtils::deleteFile(tempfile);
+    PointTable t1;
+    w.prepare(t1); 
+    w.execute(t1);
+
+    Options testOptions;
+    testOptions.add("filename", tempfile);
+
+    Stage& test = *(factory.createStage("readers.las", true)); 
+    test.setOptions(testOptions);
+
+    PointTable t2;
+    test.prepare(t2);
+    PointViewSet s = test.execute(t2);
+    PointViewPtr v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_DOUBLE_EQ(v->getFieldAs<double>(Dimension::Id::X, i), 27.5);
+}
+
+TEST(AttributeFilterTest, datasource)
+{
+    Options ro;
+    ro.add("filename", Support::datapath("autzen/autzen-dd.las"));
+
+    StageFactory factory;
+    Stage& r = *(factory.createStage("readers.las", true));
+    r.setOptions(ro);
+
+    Options fo;
+    fo.add("dimension", "Classification");
+    fo.add("column", "cls");
+    fo.add("datasource", Support::datapath("autzen/attributes.shp"));
+
+    Stage& f = *(factory.createStage("filters.attribute", true));
+    f.setInput(r);
+    f.setOptions(fo);
+
+    std::string tempfile(Support::temppath("out.las"));
+
+    Options wo;
+    wo.add("filename", tempfile);
+    wo.add("forward", "all");
+    Stage& w = *(factory.createStage("writers.las", true));
+    w.setInput(f);
+    w.setOptions(wo);
+
+    FileUtils::deleteFile(tempfile);
+    PointTable t;
+    w.prepare(t); 
+    w.execute(t);
+
+// 
+//
+    Options testOptions;
+    testOptions.add("filename", tempfile);
+
+    Stage& test = *(factory.createStage("readers.las", true)); 
+    test.setOptions(testOptions);
+
+    Stage& c = *(factory.createStage("filters.crop", true));
+    c.setInput(test);
+
+    Options o1;
+    o1.add("polygon", "POLYGON ((-123.067019000727967 44.059524946819884,-123.066697831944637 44.059771500882199,-123.065494970755537 44.059838504937517,-123.064074882074451 44.059742872480356,-123.063707784110264 44.059184772926969,-123.06401206144227 44.05752667418929,-123.065925935478475 44.057786669839672,-123.065745673821624 44.058221493390228,-123.06633379431868 44.058264073197797,-123.066237450902648 44.058593303895073,-123.06633104847343 44.058966114097124,-123.06667192031054 44. [...]
+
+    c.setOptions(o1);
+
+    PointTable t1;
+    c.prepare(t1);
+    PointViewSet s = c.execute(t1);
+    PointViewPtr v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 2);
+
+    Options o2;
+    o2.add("polygon", "POLYGON ((-123.064404672110015 44.062248205780641,-123.063001791092177 44.062295757390288,-123.062938948566199 44.061866413306625,-123.063711529699802 44.061825083575727,-123.062903757506561 44.060798284876931,-123.0634590922878 44.06084959530147,-123.063939134831102 44.061205726019097,-123.064707560079256 44.061834553141757,-123.064404672110015 44.062248205780641))");
+    c.setOptions(o2);
+
+    PointTable t2;
+    c.prepare(t2);
+    s = c.execute(t2);
+    v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 5);
+
+    Options o3;
+    o3.add("polygon", "POLYGON ((-123.071105494548775 44.059121603563895,-123.070160265697027 44.059007342229378,-123.070431650409773 44.058379004056327,-123.071225617617372 44.058576450660659,-123.071105494548775 44.059121603563895))");
+    c.setOptions(o3);
+
+    PointTable t3;
+    c.prepare(t3);
+    s = c.execute(t3);
+    v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+
+    Options o4;
+    o4.add("polygon", "POLYGON ((-123.06887558672102 44.059227793751305,-123.068425255931515 44.059301773132752,-123.067936238335534 44.059248990941661,-123.06749590912527 44.059043544671049,-123.06710185170931 44.058629650191868,-123.067099413306224 44.058063335596437,-123.067333190514816 44.057587417330502,-123.067852567837207 44.057320435256116,-123.068290450314009 44.057214830538491,-123.068899280712444 44.057225021409202,-123.069338909397359 44.057414523826182,-123.069655618140771 4 [...]
+    c.setOptions(o4);
+
+    PointTable t4;
+    c.prepare(t4);
+    s = c.execute(t4);
+    v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+
+    Options o5;
+    o5.add("polygon", "POLYGON ((-123.071871740947586 44.058426242457685,-123.070376025800414 44.058117017731242,-123.07060216253906 44.057465769662898,-123.072144836409578 44.057837746292243,-123.071871740947586 44.058426242457685))");
+    c.setOptions(o5);
+
+    PointTable t5;
+    c.prepare(t5);
+    s = c.execute(t5);
+    v = *s.begin();
+    for (PointId i = 0; i < v->size(); ++i)
+        EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+}
diff --git a/plugins/geowave/CMakeLists.txt b/plugins/geowave/CMakeLists.txt
index 9dae78e..d76576d 100644
--- a/plugins/geowave/CMakeLists.txt
+++ b/plugins/geowave/CMakeLists.txt
@@ -8,9 +8,7 @@ include(${PDAL_CMAKE_DIR}/geowave.cmake)
 
 set(GEOWAVE_LIBRARIES "")
 set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${Boost_LIBRARIES})
-set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JNI_LIBRARIES})
 set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JACE_LIBRARY})
-set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_AWT_LIBRARY})
 set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_JVM_LIBRARY})
 
 set(objs "")
diff --git a/plugins/geowave/io/GeoWaveReader.cpp b/plugins/geowave/io/GeoWaveReader.cpp
index b835895..c7c869b 100644
--- a/plugins/geowave/io/GeoWaveReader.cpp
+++ b/plugins/geowave/io/GeoWaveReader.cpp
@@ -57,11 +57,9 @@ using jace::StaticVmLoader;
 #ifdef _WIN32
 #include "jace/Win32VmLoader.h"
 using jace::Win32VmLoader;
-const std::string os_pathsep(";");
 #else
 #include "jace/UnixVmLoader.h"
 using ::jace::UnixVmLoader;
-const std::string os_pathsep(":");
 #endif
 
 #include "jace/JArray.h"
@@ -107,27 +105,27 @@ using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
 #include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
 using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
 
-#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
-using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::Index;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
-#include "jace/proxy/mil/nga/giat/geowave/store/query/Query.h"
-using jace::proxy::mil::nga::giat::geowave::store::query::Query;
-#include "jace/proxy/mil/nga/giat/geowave/store/query/SpatialQuery.h"
-using jace::proxy::mil::nga::giat::geowave::store::query::SpatialQuery;
-
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/metadata/AccumuloAdapterStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::metadata::AccumuloAdapterStore;
+#include "jace/proxy/mil/nga/giat/geowave/core/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::core::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/query/Query.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::query::Query;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/store/query/SpatialQuery.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::store::query::SpatialQuery;
+
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/metadata/AccumuloAdapterStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::metadata::AccumuloAdapterStore;
 
 static PluginInfo const s_info = PluginInfo(
     "readers.geowave",
@@ -149,14 +147,14 @@ namespace pdal
     {
         Options options;
 
-        Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance");
-        Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance");
+        Option zookeeperUrl("zookeeper_url", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance");
+        Option instanceName("instance_name", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance");
         Option username("username", "", "The username for the account to establish an Accumulo connector");
         Option password("password", "", "The password for the account to establish an Accumulo connector");
-        Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave");
-        Option featureTypeName("featureTypeName", "", "The feature type name to be used when interacting with GeoWave");
-        Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
-        Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+        Option tableNamespace("table_namespace", "", "The table name to be used when interacting with GeoWave");
+        Option featureTypeName("feature_type_name", "", "The feature type name to be used when interacting with GeoWave");
+        Option dataAdapter("data_adapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
+        Option pointsPerEntry("points_per_entry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
         Option bounds("bounds", "", "The extent of the bounding rectangle to use to query points, expressed as a string, eg: ([xmin, xmax], [ymin, ymax], [zmin, zmax])");
 
         options.add(zookeeperUrl);
@@ -186,14 +184,14 @@ namespace pdal
 
     void GeoWaveReader::processOptions(const Options& ops)
     {
-        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
-        m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeper_url");
+        m_instanceName = ops.getValueOrThrow<std::string>("instance_name");
         m_username = ops.getValueOrThrow<std::string>("username");
         m_password = ops.getValueOrThrow<std::string>("password");
-        m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
-        m_featureTypeName =  ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
-        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
-        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+        m_tableNamespace = ops.getValueOrThrow<std::string>("table_namespace");
+        m_featureTypeName =  ops.getValueOrDefault<std::string>("feature_type_name", "PDAL_Point");
+        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("data_adapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("points_per_Entry", 5000u);
         m_bounds = ops.getValueOrDefault<BOX3D>("bounds", BOX3D());
     }
 
@@ -365,7 +363,6 @@ namespace pdal
         {
             StaticVmLoader loader(JNI_VERSION_1_2);
 
-            std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
             std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
 
             OptionList options;
@@ -374,7 +371,7 @@ namespace pdal
             //options.push_back(CustomOption("-Xcheck:jni"));
             //options.push_back(Verbose (Verbose::JNI));
             //options.push_back(Verbose (Verbose::CLASS));
-            options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+            options.push_back(ClassPath(geowaveClasspath));
 
             jace::createVm(loader, options);
         }
diff --git a/plugins/geowave/io/GeoWaveReader.hpp b/plugins/geowave/io/GeoWaveReader.hpp
index e3fd571..6810300 100644
--- a/plugins/geowave/io/GeoWaveReader.hpp
+++ b/plugins/geowave/io/GeoWaveReader.hpp
@@ -42,8 +42,8 @@
 #include <geos_c.h>
 #endif
 
-#include "jace/proxy/mil/nga/giat/geowave/store/CloseableIterator.h"
-using jace::proxy::mil::nga::giat::geowave::store::CloseableIterator;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/CloseableIterator.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::CloseableIterator;
 
 extern "C" int32_t GeoWaveReader_ExitFunc();
 extern "C" PF_ExitFunc GeoWaveReader_InitPlugin();
diff --git a/plugins/geowave/io/GeoWaveWriter.cpp b/plugins/geowave/io/GeoWaveWriter.cpp
index d865a1e..494b77d 100644
--- a/plugins/geowave/io/GeoWaveWriter.cpp
+++ b/plugins/geowave/io/GeoWaveWriter.cpp
@@ -59,11 +59,9 @@ using jace::StaticVmLoader;
 #ifdef _WIN32
 #include "jace/Win32VmLoader.h"
 using jace::Win32VmLoader;
-const std::string os_pathsep(";");
 #else
 #include "jace/UnixVmLoader.h"
 using ::jace::UnixVmLoader;
-const std::string os_pathsep(":");
 #endif
 
 #include "jace/proxy/types/JDouble.h"
@@ -117,24 +115,24 @@ using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
 #include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
 using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
 
-#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
-using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/adapter/WritableDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::store::adapter::WritableDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::Index;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloIndexWriter.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloIndexWriter;
+#include "jace/proxy/mil/nga/giat/geowave/core/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::core::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/adapter/WritableDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::adapter::WritableDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloIndexWriter.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloIndexWriter;
 
 static PluginInfo const s_info = PluginInfo(
     "writers.geowave",
@@ -156,14 +154,14 @@ namespace pdal
     {
         Options options;
 
-        Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance.");
-        Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance.");
+        Option zookeeperUrl("zookeeper_url", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance.");
+        Option instanceName("instance_name", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance.");
         Option username("username", "", "The username for the account to establish an Accumulo connector.");
         Option password("password", "", "The password for the account to establish an Accumulo connector.");
-        Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave.");
-        Option featureTypeName("featureTypeName", "PDAL_Point", "The feature type name to be used when interacting with GeoWave.");
-        Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
-        Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+        Option tableNamespace("table_namespace", "", "The table name to be used when interacting with GeoWave.");
+        Option featureTypeName("feature_type_name", "PDAL_Point", "The feature type name to be used when interacting with GeoWave.");
+        Option dataAdapter("data_adapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
+        Option pointsPerEntry("points_per_entry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
 
         options.add(zookeeperUrl);
         options.add(instanceName);
@@ -179,14 +177,14 @@ namespace pdal
 
     void GeoWaveWriter::processOptions(const Options& ops)
     {
-        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
-        m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeper_url");
+        m_instanceName = ops.getValueOrThrow<std::string>("instance_name");
         m_username = ops.getValueOrThrow<std::string>("username");
         m_password = ops.getValueOrThrow<std::string>("password");
-        m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
-        m_featureTypeName = ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
-        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
-        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+        m_tableNamespace = ops.getValueOrThrow<std::string>("table_namespace");
+        m_featureTypeName = ops.getValueOrDefault<std::string>("feature_type_name", "PDAL_Point");
+        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("data_adapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("points_per_entry", 5000u);
     }
 
     void GeoWaveWriter::initialize()
@@ -315,7 +313,6 @@ namespace pdal
         {
             StaticVmLoader loader(JNI_VERSION_1_2);
 
-            std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
             std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
 
             OptionList options;
@@ -324,7 +321,7 @@ namespace pdal
             //options.push_back(CustomOption("-Xcheck:jni"));
             //options.push_back(Verbose (Verbose::JNI));
             //options.push_back(Verbose (Verbose::CLASS));
-            options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+            options.push_back(ClassPath(geowaveClasspath));
 
             jace::createVm(loader, options);
         }
diff --git a/plugins/greyhound/io/GreyhoundReader.cpp b/plugins/greyhound/io/GreyhoundReader.cpp
index ff8c102..24ebde8 100644
--- a/plugins/greyhound/io/GreyhoundReader.cpp
+++ b/plugins/greyhound/io/GreyhoundReader.cpp
@@ -76,7 +76,7 @@ void GreyhoundReader::initialize()
 void GreyhoundReader::processOptions(const Options& options)
 {
     m_url = options.getValueOrThrow<std::string>("url");
-    m_pipelineId = options.getValueOrThrow<std::string>("pipelineId");
+    m_pipelineId = options.getValueOrThrow<std::string>("pipeline_id");
 
     m_wsClient.initialize(m_url);
 }
diff --git a/plugins/hexbin/filters/HexBin.cpp b/plugins/hexbin/filters/HexBin.cpp
index 95266bb..239d4a7 100644
--- a/plugins/hexbin/filters/HexBin.cpp
+++ b/plugins/hexbin/filters/HexBin.cpp
@@ -35,6 +35,7 @@
 #include "HexBin.hpp"
 
 #include <hexer/HexIter.hpp>
+#include <pdal/Geometry.hpp>
 #include <pdal/StageFactory.hpp>
 
 using namespace hexer;
@@ -82,6 +83,7 @@ void HexBin::filter(PointView& view)
         double x = view.getFieldAs<double>(pdal::Dimension::Id::X, idx);
         double y = view.getFieldAs<double>(pdal::Dimension::Id::Y, idx);
         m_grid->addPoint(x, y);
+        m_count++;
     }
 }
 
@@ -141,6 +143,36 @@ void HexBin::done(PointTableRef table)
     m_grid->toWKT(polygon);
     m_metadata.add("boundary", polygon.str(),
         "Boundary MULTIPOLYGON of domain");
+
+    /***
+      We want to make these bumps on edges go away, which means that
+      we want to elimnate both B and C.  If we take a line from A -> C,
+      we need the tolerance to eliminate B.  After that we're left with
+      the triangle ACD and we want to eliminate C.  The perpendicular
+      distance from AD to C is the hexagon height / 2, so we set the
+      tolerance a little larger than that.  This is larger than the
+      perpendicular distance needed to eliminate B in ABC, so should
+      serve for both cases.
+      
+         B ______  C
+          /      \
+       A /        \ D
+    
+    ***/
+    double tolerance = 1.1 * m_grid->height() / 2;
+    m_metadata.add("smoothed_boundary",
+        Geometry::smoothPolygon(polygon.str(), tolerance),
+        "Smoothed boundary MULTIPOLYGON of domain");
+    double area = Geometry::computeArea(polygon.str());
+
+    double density = (double) m_count / area ;
+    m_metadata.add("density",
+            density,
+        "Number of points per square unit");
+    m_metadata.add("area",
+            area,
+        "Area in square units of tessellated polygon");
+
 }
 
 } // namespace pdal
diff --git a/plugins/hexbin/filters/HexBin.hpp b/plugins/hexbin/filters/HexBin.hpp
index 2a73bcc..50bf09d 100644
--- a/plugins/hexbin/filters/HexBin.hpp
+++ b/plugins/hexbin/filters/HexBin.hpp
@@ -62,6 +62,7 @@ private:
     int32_t m_density;
     double m_edgeLength;
     bool m_outputTesselation;
+    point_count_t m_count;
 
     virtual void processOptions(const Options& options);
     virtual void ready(PointTableRef table);
diff --git a/plugins/nitf/io/NitfReader.cpp b/plugins/nitf/io/NitfReader.cpp
index f3c6941..b3a93c8 100644
--- a/plugins/nitf/io/NitfReader.cpp
+++ b/plugins/nitf/io/NitfReader.cpp
@@ -97,7 +97,7 @@ std::string NitfReader::getName() const { return s_info.name; }
 //
 
 
-void NitfReader::initialize()
+void NitfReader::initialize(PointTableRef table)
 {
     NitfFile nitf(m_filename);
     nitf.open();
@@ -107,15 +107,11 @@ void NitfReader::initialize()
     m_metadata.add("DESDATA_LENGTH", m_length);
 
     nitf.close();
-    LasReader::initialize();
-}
-
 
-void NitfReader::ready(PointTableRef table)
-{
     // Initialize the LAS stuff with its own metadata node.
     MetadataNode lasNode = m_metadata.add(LasReader::getName());
-    LasReader::ready(table, lasNode);
+    initializeLocal(table, lasNode);
 }
 
 } // namespace pdal
+
diff --git a/plugins/nitf/io/NitfReader.hpp b/plugins/nitf/io/NitfReader.hpp
index 6a4cdfb..1231186 100644
--- a/plugins/nitf/io/NitfReader.hpp
+++ b/plugins/nitf/io/NitfReader.hpp
@@ -84,8 +84,7 @@ private:
     std::unique_ptr<RDevice> m_rdevice;
     std::unique_ptr<RStream> m_rstream;
 
-    virtual void initialize();
-    virtual void ready(PointTableRef table);
+    virtual void initialize(PointTableRef table);
     NitfReader& operator=(const NitfReader&); // not implemented
     NitfReader(const NitfReader&); // not implemented
 };
diff --git a/plugins/nitf/io/NitfWriter.cpp b/plugins/nitf/io/NitfWriter.cpp
index 80e546f..6dc5961 100644
--- a/plugins/nitf/io/NitfWriter.cpp
+++ b/plugins/nitf/io/NitfWriter.cpp
@@ -143,50 +143,41 @@ NitfWriter::NitfWriter()
 void NitfWriter::processOptions(const Options& options)
 {
     LasWriter::processOptions(options);
-    m_cLevel = options.getValueOrDefault<std::string>("CLEVEL","03");
-    m_sType = options.getValueOrDefault<std::string>("STYPE","BF01");
-    m_oStationId = options.getValueOrDefault<std::string>("OSTAID","PDAL");
-    m_fileTitle = options.getValueOrDefault<std::string>("FTITLE", "");
-    m_fileClass = options.getValueOrDefault<std::string>("FSCLAS","U");
-    m_origName = options.getValueOrDefault<std::string>("ONAME","");
-    m_origPhone = options.getValueOrDefault<std::string>("OPHONE","");
-    m_securityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
+    m_cLevel = options.getValueOrDefault<std::string>("clevel","03");
+    m_sType = options.getValueOrDefault<std::string>("stype","BF01");
+    m_oStationId = options.getValueOrDefault<std::string>("ostaid", "PDAL");
+    m_fileTitle = options.getValueOrDefault<std::string>("ftitle");
+    m_fileClass = options.getValueOrDefault<std::string>("fsclas","U");
+    m_origName = options.getValueOrDefault<std::string>("oname");
+    m_origPhone = options.getValueOrDefault<std::string>("ophone");
+    m_securityClass = options.getValueOrDefault<std::string>("fsclas","U");
     m_securityControlAndHandling =
-        options.getValueOrDefault<std::string>("FSCTLH","");
+        options.getValueOrDefault<std::string>("fsctlh");
     m_securityClassificationSystem =
-        options.getValueOrDefault<std::string>("FSCLSY","");
-    m_imgSecurityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
-    m_imgDate = getOptions().getValueOrDefault<std::string>("IDATIM", "");
-    m_imgIdentifier2 = getOptions().getValueOrDefault<std::string>("IID2", "");
-    m_sic = getOptions().getValueOrDefault<std::string>("FSCLTX", "");
-    try
-    {
-        m_aimidb = getOptions().getOption("AIMIDB");
-    }
-    catch (Option::not_found)
-    {}
-    try
-    {
-        m_acftb = getOptions().getOption("ACFTB");
-    }
-    catch (Option::not_found)
-    {}
+        options.getValueOrDefault<std::string>("fsclsy");
+    m_imgSecurityClass = options.getValueOrDefault<std::string>("fsclas","U");
+    m_imgDate = options.getValueOrDefault<std::string>("idatim");
+    m_imgIdentifier2 = options.getValueOrDefault<std::string>("iid2");
+    m_sic = options.getValueOrDefault<std::string>("fscltx");
+    m_aimidb = options.getValueOrDefault<StringList>("aimidb");
+    m_acftb = options.getValueOrDefault<StringList>("acftb");
 }
 
 
 void NitfWriter::writeView(const PointViewPtr view)
 {
     view->calculateBounds(m_bounds);
-
     LasWriter::writeView(view);
 }
 
 
-void NitfWriter::readyFile(const std::string& filename)
+void NitfWriter::readyFile(const std::string& filename,
+    const SpatialReference& srs)
 {
     m_error.setFilename(filename);
     m_nitfFilename = filename;
-    prepOutput(&m_oss);
+    Utils::writeProgress(m_progressFd, "READYFILE", filename);
+    prepOutput(&m_oss, srs);
 }
 
 
@@ -319,35 +310,39 @@ void NitfWriter::doneFile()
         iSource.addBand(*band);
 
         //AIMIDB
-        if (!m_aimidb.empty())
+        ::nitf::TRE aimidbTre("AIMIDB");
+        for (auto& s : m_aimidb)
         {
-            boost::optional<const Options&> options = m_aimidb.getOptions();
-            if (options)
+            StringList v = Utils::split2(s, ':');
+            if (v.size() != 2)
             {
-                ::nitf::TRE tre("AIMIDB");
-                std::vector<Option> opts = options->getOptions();
-                for (auto i = opts.begin(); i != opts.end(); ++i)
-                {
-                    tre.setField(i->getName(), i->getValue<std::string>());
-                }
-                subheader.getExtendedSection().appendTRE(tre);
+                std::ostringstream oss;
+                oss << "Invalid name/value for AIMDB '" << s <<
+                    "'.  Format: <name>:<value>.";
+                throw oss.str();
             }
+            Utils::trim(v[0]);
+            Utils::trim(v[1]);
+            aimidbTre.setField(v[0], v[1]);
+            subheader.getExtendedSection().appendTRE(aimidbTre);
         }
 
         //ACFTB
-        if (!m_acftb.empty())
+        ::nitf::TRE acftbTre("ACFTB");
+        for (auto& s : m_acftb)
         {
-            boost::optional<const Options&> options = m_acftb.getOptions();
-            if (options)
+            StringList v = Utils::split2(s, ':');
+            if (v.size() != 2)
             {
-                ::nitf::TRE tre("ACFTB");
-                std::vector<Option> opts = options->getOptions();
-                for (auto i = opts.begin(); i != opts.end(); ++i)
-                {
-                    tre.setField(i->getName(), i->getValue<std::string>());
-                }
-                subheader.getExtendedSection().appendTRE(tre);
+                std::ostringstream oss;
+                oss << "Invalid name/value for ACFTB '" << s <<
+                    "'.  Format: <name>:<value>.";
+                throw oss.str();
             }
+            Utils::trim(v[0]);
+            Utils::trim(v[1]);
+            acftbTre.setField(v[0], v[1]);
+            subheader.getExtendedSection().appendTRE(acftbTre);
         }
 
         ::nitf::Writer writer;
diff --git a/plugins/nitf/io/NitfWriter.hpp b/plugins/nitf/io/NitfWriter.hpp
index e446f7f..f5330ea 100644
--- a/plugins/nitf/io/NitfWriter.hpp
+++ b/plugins/nitf/io/NitfWriter.hpp
@@ -52,7 +52,8 @@ public:
 
 private:
     virtual void processOptions(const Options& options);
-    virtual void readyFile(const std::string& filename);
+    virtual void readyFile(const std::string& filename,
+        const SpatialReference& srs);
     virtual void doneFile();
     virtual void writeView(const PointViewPtr view);
 
@@ -70,8 +71,8 @@ private:
     std::string m_securityClassificationSystem;
     std::string m_imgSecurityClass;
     std::string m_imgDate;
-    pdal::Option m_aimidb;
-    pdal::Option m_acftb;
+    StringList m_aimidb;
+    StringList m_acftb;
     std::string m_imgIdentifier2;
     std::string m_sic;
     std::stringstream m_oss;
diff --git a/plugins/nitf/test/NitfReaderTest.cpp b/plugins/nitf/test/NitfReaderTest.cpp
index 11e809c..388bd1b 100644
--- a/plugins/nitf/test/NitfReaderTest.cpp
+++ b/plugins/nitf/test/NitfReaderTest.cpp
@@ -171,5 +171,5 @@ TEST(NitfReaderTest, optionSrs)
 
     EXPECT_EQ(sr, nitfReader->getSpatialReference().getWKT());
     EXPECT_EQ("", writer.getSpatialReference().getWKT());
-    EXPECT_EQ(sr, table.spatialRef().getWKT());
+    EXPECT_EQ(sr, table.spatialReference().getWKT());
 }
diff --git a/plugins/nitf/test/NitfWriterTest.cpp b/plugins/nitf/test/NitfWriterTest.cpp
index 0d0f881..b09ea13 100644
--- a/plugins/nitf/test/NitfWriterTest.cpp
+++ b/plugins/nitf/test/NitfWriterTest.cpp
@@ -121,19 +121,19 @@ TEST(NitfWriterTest, test1)
         Option debug("debug", true);
         Option verbose("verbose", 8);
 
-        Option datetime("IDATIM", "20110516183337");
+        Option datetime("idatim", "20110516183337");
         writer_opts.add(datetime);
 
-        Option cls("FSCLAS", "S");
+        Option cls("fsclas", "S");
         writer_opts.add(cls);
 
-        Option phone("OPHONE", "5159664628");
+        Option phone("ophone", "5159664628");
         writer_opts.add(phone);
 
-        Option name("ONAME", "Howard Butler");
+        Option name("oname", "Howard Butler");
         writer_opts.add(name);
 
-        Option ftitle("FTITLE", "LiDAR from somewhere");
+        Option ftitle("ftitle", "LiDAR from somewhere");
         writer_opts.add(ftitle);
 
         // writer_opts.add(debug);
diff --git a/plugins/oci/io/OciReader.cpp b/plugins/oci/io/OciReader.cpp
index 3a8125b..903cf6d 100644
--- a/plugins/oci/io/OciReader.cpp
+++ b/plugins/oci/io/OciReader.cpp
@@ -53,14 +53,13 @@ std::string OciReader::getName() const { return s_info.name; }
 
 void OciReader::processOptions(const Options& options)
 {
-    m_schemaFile = options.getValueOrDefault<std::string>(
-        "xml_schema_dump", std::string());
+    m_schemaFile = options.getValueOrDefault<std::string>("xml_schema_dump");
     if (options.hasOption("spatialreference"))
         m_spatialRef = boost::optional<SpatialReference>(
             options.getValueOrThrow<pdal::SpatialReference>(
                 "spatialreference"));
     m_query = options.getValueOrThrow<std::string>("query");
-    m_connSpec = options.getValueOrDefault<std::string>("connection", "");
+    m_connSpec = options.getValueOrDefault<std::string>("connection");
 
     m_updatePointSourceId =  options.getValueOrDefault<bool>(
         "populate_pointsourceid", false);
diff --git a/plugins/oci/io/OciWriter.cpp b/plugins/oci/io/OciWriter.cpp
index 379ad34..33555df 100644
--- a/plugins/oci/io/OciWriter.cpp
+++ b/plugins/oci/io/OciWriter.cpp
@@ -87,8 +87,8 @@ Options OciWriter::getDefaultOptions()
     Options options;
 
     Option is3d("is3d",  false,
-        "Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, "
-        "and indexing");
+        "Should we use 3D objects (include the z dimension) for SDO_PC "
+        "PC_EXTENT, BLK_EXTENT, and indexing");
     Option solid("solid", false,
         "Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) "
         "instead of the normal (1,1003,3), and use gtype 3008/2008 vs "
@@ -433,7 +433,7 @@ std::string OciWriter::loadSQLData(std::string const& filename)
 void OciWriter::runFileSQL(std::string const& filename)
 {
     std::ostringstream oss;
-    std::string sql = getOptions().getValueOrDefault<std::string>(filename, "");
+    std::string sql = getOptions().getValueOrDefault<std::string>(filename);
 
     if (!sql.size())
         return;
@@ -670,6 +670,7 @@ bool OciWriter::isValidWKT(std::string const& input)
 
 void OciWriter::processOptions(const Options& options)
 {
+    m_3d = getDefaultedOption<bool>(options, "is3d");
     m_precision = getDefaultedOption<uint32_t>(options,
         "stream_output_precision");
     m_createIndex = options.getValueOrDefault<bool>("create_index", true);
@@ -680,7 +681,6 @@ void OciWriter::processOptions(const Options& options)
         options.getValueOrDefault<bool>("disable_cloud_trigger", false);
     m_trace = options.getValueOrDefault<bool>("do_trace", false);
     m_solid = getDefaultedOption<bool>(options, "solid");
-    m_3d = getDefaultedOption<bool>(options, "is3d");
     m_srid = options.getValueOrThrow<uint32_t>("srid");
     m_baseTableBounds =
         getDefaultedOption<BOX3D>(options, "base_table_bounds");
diff --git a/plugins/p2g/io/P2gWriter.cpp b/plugins/p2g/io/P2gWriter.cpp
index b6b5d8d..770fdfe 100644
--- a/plugins/p2g/io/P2gWriter.cpp
+++ b/plugins/p2g/io/P2gWriter.cpp
@@ -107,16 +107,24 @@ void P2gWriter::processOptions(const Options& options)
 }
 
 
-/*
 void P2gWriter::ready(PointTableRef table)
 {
+/*
     double min_x = (std::numeric_limits<double>::max)();
     double max_x = (std::numeric_limits<double>::min)();
     double min_y = (std::numeric_limits<double>::max)();
     double max_y = (std::numeric_limits<double>::min)();
     setBounds(pdal::Bounds<double>(min_x, min_y, max_x, max_y));
-}
 */
+    if (!table.spatialReferenceUnique())
+    {
+        std::ostringstream oss;
+
+        oss << getName() << ": Can't write output with multiple spatial "
+            "references.";
+        throw pdal_error(oss.str());
+    }
+}
 
 
 Options P2gWriter::getDefaultOptions()
@@ -142,8 +150,7 @@ Options P2gWriter::getDefaultOptions()
 
 void P2gWriter::write(const PointViewPtr view)
 {
-    std::string z_name = getOptions().getValueOrDefault<std::string>("Z", "Z");
-
+    std::string z_name = getOptions().getValueOrDefault<std::string>("z", "Z");
 
     for (point_count_t idx = 0; idx < view->size(); idx++)
     {
@@ -215,17 +222,17 @@ void P2gWriter::done(PointTableRef table)
     adfGeoTransform[4] = 0.0;
     adfGeoTransform[5] = -1 * m_GRID_DIST_Y;
 
-    SpatialReference const& srs = table.spatialRef();
+    SpatialReference const& srs = table.spatialReference();
 
-    log()->get(LogLevel::Debug) << "Output SRS  :'" << srs.getWKT() << "'" << std::endl;
-    if ((rc = m_interpolator->finish(const_cast<char*>(m_filename.c_str()), m_outputFormat, m_outputTypes, adfGeoTransform, srs.getWKT().c_str())) < 0)
+    log()->get(LogLevel::Debug) << "Output SRS  :'" << srs.getWKT() << "'" <<
+        std::endl;
+    if ((rc = m_interpolator->finish(const_cast<char*>(m_filename.c_str()),
+        m_outputFormat, m_outputTypes, adfGeoTransform,
+        srs.getWKT().c_str())) < 0)
     {
         throw p2g_error("interp->finish() error");
     }
-
-    return;
 }
 
-
-
 } // namespaces
+
diff --git a/plugins/p2g/io/P2gWriter.hpp b/plugins/p2g/io/P2gWriter.hpp
index 2ef645b..63d8953 100644
--- a/plugins/p2g/io/P2gWriter.hpp
+++ b/plugins/p2g/io/P2gWriter.hpp
@@ -78,6 +78,7 @@ private:
     P2gWriter& operator=(const P2gWriter&); // not implemented
 
     virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
     virtual void write(const PointViewPtr view);
     virtual void done(PointTableRef table);
 
diff --git a/plugins/pcl/CMakeLists.txt b/plugins/pcl/CMakeLists.txt
index 54d8e61..86d0cc0 100644
--- a/plugins/pcl/CMakeLists.txt
+++ b/plugins/pcl/CMakeLists.txt
@@ -31,6 +31,7 @@ include_directories(${PCL_INCLUDE_DIRS})
 include_directories(${CMAKE_CURRENT_LIST_DIR})
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/filters)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/pipeline)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/dartsample)
 link_directories(${PCL_LIBRARY_DIRS})
 add_definitions(${PCL_DEFINITIONS})
 if (NOT WIN32)
@@ -131,6 +132,44 @@ PDAL_ADD_PLUGIN(ground_filter_libname filter ground
     FILES filters/GroundFilter.hpp filters/GroundFilter.cpp
     LINK_WITH ${PCL_LIBRARIES})
 
+PDAL_ADD_PLUGIN(statistical_outlier_filter_libname filter statisticaloutlier
+    FILES filters/StatisticalOutlierFilter.hpp filters/StatisticalOutlierFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(radius_outlier_filter_libname filter radiusoutlier
+    FILES filters/RadiusOutlierFilter.hpp filters/RadiusOutlierFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(voxelgrid_filter_libname filter voxelgrid
+    FILES filters/VoxelGridFilter.hpp filters/VoxelGridFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(movingleastsquares_filter_libname filter movingleastsquares
+    FILES filters/MovingLeastSquaresFilter.hpp filters/MovingLeastSquaresFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(gridprojection_filter_libname filter gridprojection
+    FILES filters/GridProjectionFilter.hpp filters/GridProjectionFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(poisson_filter_libname filter poisson
+    FILES filters/PoissonFilter.hpp filters/PoissonFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(greedyprojection_filter_libname filter greedyprojection
+    FILES filters/GreedyProjectionFilter.hpp filters/GreedyProjectionFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(height_filter_libname filter height
+    FILES filters/HeightFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(dartsample_filter_libname filter dartsample
+    FILES
+        filters/DartSampleFilter.cpp
+        dartsample/dart_sample.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
 #
 # PCL Kernel
 #
diff --git a/plugins/python/plang/Plang.hpp b/plugins/pcl/dartsample/dart_sample.cpp
similarity index 68%
rename from plugins/python/plang/Plang.hpp
rename to plugins/pcl/dartsample/dart_sample.cpp
index f132790..c8bde0f 100644
--- a/plugins/python/plang/Plang.hpp
+++ b/plugins/pcl/dartsample/dart_sample.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -13,9 +13,10 @@
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided
 *       with the distribution.
-*     * Neither the name of Hobu, Inc. nor the names of its contributors
-*       may be used to endorse or promote products derived from this
-*       software without specific prior written permission.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -31,25 +32,18 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#pragma once
+#include "dart_sample.hpp"
 
-#include <pdal/Metadata.hpp>
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
 
-// forward declare PyObject so we don't need the python headers everywhere
-// see: http://mail.python.org/pipermail/python-dev/2003-August/037601.html
-#ifndef PyObject_HEAD
-struct _object;
-typedef _object PyObject;
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+PCL_INSTANTIATE(DartSample,
+                (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointXYZRGB))
+#else
+PCL_INSTANTIATE(DartSample, PCL_XYZ_POINT_TYPES)
 #endif
 
-namespace pdal
-{
-namespace plang
-{
-
-PyObject *fromMetadata(MetadataNode m);
-void addMetadata(PyObject *list, MetadataNode m);
-
-} // namespace plang
-} // namespace pdal
-
+#endif    // PCL_NO_PRECOMPILE
diff --git a/plugins/pcl/dartsample/dart_sample.h b/plugins/pcl/dartsample/dart_sample.h
new file mode 100644
index 0000000..709f4b1
--- /dev/null
+++ b/plugins/pcl/dartsample/dart_sample.h
@@ -0,0 +1,112 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pcl/filters/filter_indices.h>
+
+namespace pcl
+{
+  /** \brief @b DartSample performs dart throwing for a given radius.
+    * \author Bradley J Chambers
+    * \ingroup filters
+    */
+  template<typename PointT>
+  class DartSample : public FilterIndices<PointT>
+  {
+    using FilterIndices<PointT>::filter_name_;
+    using FilterIndices<PointT>::getClassName;
+    using FilterIndices<PointT>::indices_;
+    using FilterIndices<PointT>::input_;
+    using FilterIndices<PointT>::negative_;
+    using FilterIndices<PointT>::user_filter_value_;
+    using FilterIndices<PointT>::extract_removed_indices_;
+    using FilterIndices<PointT>::removed_indices_;
+
+    typedef typename FilterIndices<PointT>::PointCloud PointCloud;
+    typedef typename PointCloud::Ptr PointCloudPtr;
+    typedef typename PointCloud::ConstPtr PointCloudConstPtr;
+
+    public:
+
+      typedef boost::shared_ptr< DartSample<PointT> > Ptr;
+      typedef boost::shared_ptr< const DartSample<PointT> > ConstPtr;
+
+      /** \brief Empty constructor. */
+      DartSample (bool extract_removed_indices = false) :
+        FilterIndices<PointT> (extract_removed_indices),
+        radius_ (1.0)
+      {
+        filter_name_ = "DartSample";
+      }
+
+      /** \brief Set minimum distance radius for adding points..
+        * \param radius
+        */
+      inline void
+      setRadius (double radius)
+      {
+        radius_ = radius;
+      }
+
+      /** \brief Get the value of the internal \a radius parameter.
+        */
+      inline double
+      getRadius ()
+      {
+        return (radius_);
+      }
+
+    protected:
+
+      /** \brief Minimum distance radius for adding points. */
+      double radius_;
+
+      /** \brief Sample of point indices into a separate PointCloud
+        * \param output the resultant point cloud
+        */
+      void
+      applyFilter (PointCloud &output);
+
+      /** \brief Sample of point indices
+        * \param indices the resultant point cloud indices
+        */
+      void
+      applyFilter (std::vector<int> &indices);
+  };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include "dart_sample.hpp"
+#endif
diff --git a/plugins/pcl/dartsample/dart_sample.hpp b/plugins/pcl/dartsample/dart_sample.hpp
new file mode 100644
index 0000000..a022b3e
--- /dev/null
+++ b/plugins/pcl/dartsample/dart_sample.hpp
@@ -0,0 +1,116 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "dart_sample.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstdlib>
+#include <ctime>
+#include <vector>
+
+#include <pcl/common/io.h>
+#include <pcl/console/print.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/octree/octree.h>
+#include <pcl/point_traits.h>
+#include <pcl/point_types.h>
+
+///////////////////////////////////////////////////////////////////////////////
+template<typename PointT> void
+pcl::DartSample<PointT>::applyFilter (PointCloud &output)
+{
+  std::vector<int> indices;
+  output.is_dense = true;
+  applyFilter (indices);
+  copyPointCloud (*input_, indices, output);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+template<typename PointT>
+void
+pcl::DartSample<PointT>::applyFilter (std::vector<int> &indices)
+{
+  unsigned N = static_cast<unsigned> (input_->size ());
+
+  std::srand ( std::time (NULL));
+  std::vector<int> shuffled_indices = (*indices_);
+  std::random_shuffle (shuffled_indices.begin (), shuffled_indices.end ());
+
+  // Reserve N indices/removed_indices_
+  indices.resize (static_cast<size_t> (N));
+  if (extract_removed_indices_)
+    removed_indices_->resize (static_cast<size_t> (N));
+
+  unsigned i = 0;
+  unsigned ri = 0;
+
+  // Create octree, seeded with the first index
+  pcl::octree::OctreePointCloudSearch<PointT> tree (radius_ / std::sqrt (3));
+  typename pcl::PointCloud<PointT>::Ptr cloud_t (new pcl::PointCloud<PointT>);
+  tree.setInputCloud (cloud_t);
+  tree.addPointToCloud (input_->points[shuffled_indices[0]], cloud_t);
+
+  // Keep the first index
+  indices[i++] = shuffled_indices[0];
+
+  // Iterate over remaining points, keeping only those meeting the minimum
+  // distance criteria.
+  for (auto const& j : shuffled_indices)
+  {
+    std::vector<int> neighbors;
+    std::vector<float> sqr_distances;
+    PointT temp_pt = input_->points[j];
+
+    int num = tree.radiusSearch (temp_pt, radius_, neighbors, sqr_distances, 1);
+
+    if (num == 0)
+    {
+      indices[i++] = j;
+      tree.addPointToCloud (temp_pt, cloud_t);
+    }
+    else if (extract_removed_indices_)
+    {
+      (*removed_indices_)[ri++] = j;
+    }
+  }
+
+  indices.resize (static_cast<size_t> (i));
+  removed_indices_->resize (static_cast<size_t> (ri));
+}
+
+#define PCL_INSTANTIATE_DartSample(T) \
+    template class PCL_EXPORTS pcl::DartSample<T>;
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/DartSampleFilter.cpp
similarity index 52%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/DartSampleFilter.cpp
index a5b5cb6..5f8edad 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/DartSampleFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,8 +32,9 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "DartSampleFilter.hpp"
 
+#include "dart_sample.h"
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
 
@@ -44,50 +45,46 @@
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.dartsample", "Dart sample filter",
+               "http://pdal.io/stages/filters.dartsample.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, DartSampleFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string DartSampleFilter::getName() const
+{
+    return s_info.name;
+}
 
-/** \brief This method processes the PointView through the given pipeline. */
+Options DartSampleFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("radius", 1.0, "Minimum distance criterion");
+    return options;
+}
 
-void PCLBlock::processOptions(const Options& options)
+void DartSampleFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    m_radius = options.getValueOrDefault<double>("radius", 1.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet DartSampleFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
     viewSet.insert(output);
 
-    bool logOutput = log()->getLevel() > LogLevel::Debug1;
-    if (logOutput)
-        log()->floatPrecision(8);
-
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->floatPrecision(2);
+    log()->get(LogLevel::Info) << "DartSampleFilter (radius="
+                               << m_radius << ")\n";
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
 
-    // convert PointView to PointNormal
     typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,39 +108,29 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
-
-    // create PointCloud for results
-    Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
-
-    if (cloud_f->points.empty())
+    pcl::DartSample<pcl::PointXYZ> ds;
+    ds.setInputCloud(cloud);
+    ds.setRadius(m_radius);
+
+    std::vector<int> samples;
+    ds.filter(samples);
+
+    if (samples.empty())
     {
-        log()->get(LogLevel::Debug2) << "Filtered cloud has no points!" << std::endl;
+        log()->get(LogLevel::Warning) << "Filtered cloud has no points!\n";
         return viewSet;
     }
 
-    pclsupport::PCDtoPDAL(*cloud_f, output, buffer_bounds);
+    for (const auto& i : samples)
+        output->appendPoint(*input, i);
+
+    double frac = (double)samples.size() / (double)cloud->size();
+    log()->get(LogLevel::Info) << "Retaining " << samples.size() << " of "
+                               << cloud->size() << " points ("
+                               <<  100*frac
+                               << "%)\n";
 
-    log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
-                                 cloud_f->points.size() << " after" << std::endl;
-    log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/DartSampleFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/DartSampleFilter.hpp
index 448c9f3..63e6725 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/DartSampleFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,31 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL DartSampleFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    DartSampleFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    double m_radius;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    DartSampleFilter& operator=(const DartSampleFilter&); // not implemented
+    DartSampleFilter(const DartSampleFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/GreedyProjectionFilter.cpp
similarity index 58%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/GreedyProjectionFilter.cpp
index a5b5cb6..1bd2800 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/GreedyProjectionFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,36 +32,50 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "GreedyProjectionFilter.hpp"
 
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
 
 #include <pcl/console/print.h>
 #include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
 #include <pcl/io/pcd_io.h>
+#include <pcl/surface/gp3.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.greedyprojection", "Grid Projection filter",
+               "http://pdal.io/stages/filters.greedyprojection.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, GreedyProjectionFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string GreedyProjectionFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options GreedyProjectionFilter::getDefaultOptions()
+{
+    Options options;
+    // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+    // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+    // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+    return options;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
-void PCLBlock::processOptions(const Options& options)
+void GreedyProjectionFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+    // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+    // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet GreedyProjectionFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     if (logOutput)
         log()->floatPrecision(8);
 
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->get(LogLevel::Debug2) << "Process GreedyProjectionFilter..." << std::endl;
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,22 +118,48 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+    // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+    pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+    // Create search tree
+    tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+    tree->setInputCloud(cloud);
+
+    // Normal estimation
+    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+    n.setInputCloud(cloud);
+    n.setSearchMethod(tree);
+    n.setKSearch(20);
+    n.compute(*normals);
+
+    // Concatenate XYZ and normal information
+    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+    // Create search tree
+    tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+    tree2->setInputCloud(cloud_with_normals);
+
+    // initial setup
+    pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
+    gp3.setInputCloud(cloud_with_normals);
+    gp3.setSearchMethod(tree2);
+    gp3.setSearchRadius(0.025);
+    gp3.setMu(2.5);
+    gp3.setMaximumNearestNeighbors(100);
+    gp3.setMaximumSurfaceAngle(M_PI/4); // 45 degrees
+    gp3.setMinimumAngle(M_PI/18); // 10 degrees
+    gp3.setMaximumAngle(2*M_PI/3); // 120 degrees
+    gp3.setNormalConsistency(false);
 
     // create PointCloud for results
+    pcl::PolygonMesh grid;
+    gp3.reconstruct(grid);
+
     Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
+    pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
 
     if (cloud_f->points.empty())
     {
@@ -139,11 +172,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
                                  cloud_f->points.size() << " after" << std::endl;
     log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GreedyProjectionFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/GreedyProjectionFilter.hpp
index 448c9f3..3e6646f 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GreedyProjectionFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,31 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL GreedyProjectionFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    GreedyProjectionFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    // double m_leaf_x, m_leaf_y, m_leaf_z;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    GreedyProjectionFilter& operator=(const GreedyProjectionFilter&); // not implemented
+    GreedyProjectionFilter(const GreedyProjectionFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/GridProjectionFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/GridProjectionFilter.cpp
index a5b5cb6..d71a61a 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/GridProjectionFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,36 +32,50 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "GridProjectionFilter.hpp"
 
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
 
 #include <pcl/console/print.h>
 #include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
 #include <pcl/io/pcd_io.h>
+#include <pcl/surface/grid_projection.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.gridprojection", "Grid Projection filter",
+               "http://pdal.io/stages/filters.gridprojection.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, GridProjectionFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string GridProjectionFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options GridProjectionFilter::getDefaultOptions()
+{
+    Options options;
+    // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+    // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+    // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+    return options;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
-void PCLBlock::processOptions(const Options& options)
+void GridProjectionFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+    // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+    // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet GridProjectionFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     if (logOutput)
         log()->floatPrecision(8);
 
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->get(LogLevel::Debug2) << "Process GridProjectionFilter..." << std::endl;
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,22 +118,43 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+    // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+    pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+    // Create search tree
+    tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+    tree->setInputCloud(cloud);
+
+    // Normal estimation
+    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+    n.setInputCloud(cloud);
+    n.setSearchMethod(tree);
+    n.setKSearch(20);
+    n.compute(*normals);
+
+    // Concatenate XYZ and normal information
+    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+    // Create search tree
+    tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+    tree2->setInputCloud(cloud_with_normals);
+
+    // initial setup
+    pcl::GridProjection<pcl::PointNormal> gp;
+    gp.setInputCloud(cloud_with_normals);
+    gp.setSearchMethod(tree2);
+    gp.setResolution(0.5);
+    gp.setPaddingSize(3);
 
     // create PointCloud for results
+    pcl::PolygonMesh grid;
+    gp.reconstruct(grid);
+
     Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
+    pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
 
     if (cloud_f->points.empty())
     {
@@ -139,11 +167,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
                                  cloud_f->points.size() << " after" << std::endl;
     log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GridProjectionFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/GridProjectionFilter.hpp
index 448c9f3..bb0037e 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GridProjectionFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,31 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL GridProjectionFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    GridProjectionFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    // double m_leaf_x, m_leaf_y, m_leaf_z;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    GridProjectionFilter& operator=(const GridProjectionFilter&); // not implemented
+    GridProjectionFilter(const GridProjectionFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/GroundFilter.cpp
index 7072d4f..2fb8d68 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/GroundFilter.cpp
@@ -51,22 +51,38 @@
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.ground",
-    "Progressive morphological filter",
-    "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.ground", "Progressive morphological filter",
+               "http://pdal.io/stages/filters.ground.html");
 
 CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
 
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string GroundFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options GroundFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("max_window_size", 33, "Maximum window size");
+    options.add("slope", 1, "Slope");
+    options.add("max_distance", 2.5, "Maximum distance");
+    options.add("initial_distance", 0.15, "Initial distance");
+    options.add("cell_size", 1, "Cell Size");
+    options.add("classify", true, "Apply classification labels?");
+    options.add("extract", false, "Extract ground returns?");
+    options.add("approximate", false, "Use approximate algorithm?");
+    return options;
+}
 
 void GroundFilter::processOptions(const Options& options)
 {
-    m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
+    m_maxWindowSize = options.getValueOrDefault<double>("max_window_size", 33);
     m_slope = options.getValueOrDefault<double>("slope", 1);
-    m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
-    m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
-    m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+    m_maxDistance = options.getValueOrDefault<double>("max_distance", 2.5);
+    m_initialDistance = options.getValueOrDefault<double>("initial_distance", 0.15);
+    m_cellSize = options.getValueOrDefault<double>("cell_size", 1);
     m_classify = options.getValueOrDefault<bool>("classify", true);
     m_extract = options.getValueOrDefault<bool>("extract", false);
     m_approximate = options.getValueOrDefault<bool>("approximate", false);
@@ -130,7 +146,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
 
         // run the PMF filter, grabbing indices of ground returns
         pmf.extract(idx->indices);
-    } else
+    }
+    else
     {
         pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
         pmf.setInputCloud(cloud);
@@ -156,7 +173,9 @@ PointViewSet GroundFilter::run(PointViewPtr input)
             // set the classification label of ground returns as 2
             // (corresponding to ASPRS LAS specification)
             for (const auto& i : idx->indices)
-            { input->setField(Dimension::Id::Classification, i, 2); }
+            {
+                input->setField(Dimension::Id::Classification, i, 2);
+            }
 
             viewSet.insert(input);
         }
@@ -192,4 +211,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GroundFilter.hpp
index 448c9f3..49b7753 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GroundFilter.hpp
@@ -57,6 +57,8 @@ public:
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
     double m_maxWindowSize;
     double m_slope;
@@ -76,4 +78,3 @@ private:
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/HeightFilter.cpp b/plugins/pcl/filters/HeightFilter.cpp
new file mode 100644
index 0000000..6503418
--- /dev/null
+++ b/plugins/pcl/filters/HeightFilter.cpp
@@ -0,0 +1,180 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "HeightFilter.hpp"
+
+// c++
+#include <memory>
+#include <string>
+#include <vector>
+
+// project
+#include "PCLConversions.hpp"
+#include <pdal/Dimension.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+// other
+#include <pcl/console/print.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/filters/project_inliers.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/ModelCoefficients.h>
+#include <pcl/point_types.h>
+#include <pcl/search/kdtree.h>
+
+#define DBG log()->get(LogLevel::Debug)
+
+namespace pdal
+{
+
+typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+
+static PluginInfo const s_info =
+    PluginInfo("filters.height", "Height Filter", "");
+
+CREATE_SHARED_PLUGIN(1, 0, HeightFilter, Filter, s_info)
+
+std::string HeightFilter::getName() const
+{
+    return s_info.name;
+}
+
+void HeightFilter::addDimensions(PointLayoutPtr layout)
+{
+    m_heightDim = layout->registerOrAssignDim("Height", Dimension::Type::Double);
+}
+
+void HeightFilter::prepared(PointTableRef table)
+{
+    const PointLayoutPtr layout(table.layout());
+    if (!layout->hasDim(Dimension::Id::Classification))
+        throw pdal_error("HeightFilter: missing Classification dimension in input PointView");
+}
+
+void HeightFilter::filter(PointView& view)
+{
+    bool logOutput = log()->getLevel() > LogLevel::Debug1;
+    if (logOutput)
+        log()->floatPrecision(8);
+
+    DBG << "Computing normalized heights...\n";
+
+    BOX3D bounds;
+    view.calculateBounds(bounds);
+
+    Cloud::Ptr cloud_in(new Cloud);
+    pclsupport::PDALtoPCD(std::make_shared<PointView>(view), *cloud_in, bounds);
+
+    pcl::PointIndices::Ptr ground(new pcl::PointIndices());
+    ground->indices.reserve(view.size());
+
+    std::vector<PointId> nonground;
+    nonground.reserve(view.size());
+
+    for (PointId id = 0; id < view.size(); ++id)
+    {
+        double c = view.getFieldAs<double>(Dimension::Id::Classification, id);
+
+        if (c == 2)
+            ground->indices.push_back(id);
+        else
+            nonground.push_back(id);
+    }
+
+    if (ground->indices.size()==0)
+        throw pdal_error("HeightFilter: the input PointView does not appear to have any points classified as ground");
+
+    pcl::ExtractIndices<pcl::PointXYZ> extract;
+    extract.setInputCloud(cloud_in);
+    extract.setIndices(ground);
+
+    Cloud::Ptr cloud_ground(new Cloud);
+    extract.setNegative(false);
+    extract.filter(*cloud_ground);
+
+    Cloud::Ptr cloud_nonground(new Cloud);
+    extract.setNegative(true);
+    extract.filter(*cloud_nonground);
+
+    // project both ground and non-ground into XY plane
+
+    // Create a set of planar coefficients with X=Y=0,Z=1
+    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
+    coefficients->values.resize(4);
+    coefficients->values[0] = coefficients->values[1] = 0;
+    coefficients->values[2] = 1.0;
+    coefficients->values[3] = 0;
+
+    // Create the filtering object
+    pcl::ProjectInliers<pcl::PointXYZ> proj;
+    proj.setModelType(pcl::SACMODEL_PLANE);
+
+    Cloud::Ptr cloud_ground_projected(new Cloud);
+    proj.setInputCloud(cloud_ground);
+    proj.setModelCoefficients(coefficients);
+    proj.filter(*cloud_ground_projected);
+
+    Cloud::Ptr cloud_nonground_projected(new Cloud);
+    proj.setInputCloud(cloud_nonground);
+    proj.setModelCoefficients(coefficients);
+    proj.filter(*cloud_nonground_projected);
+
+    pcl::search::KdTree<pcl::PointXYZ>::Ptr ground_tree;
+    ground_tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+    ground_tree->setInputCloud(cloud_ground_projected);
+
+    for (size_t i = 0; i < cloud_nonground_projected->size(); ++i)
+    {
+        pcl::PointXYZ nonground_query = cloud_nonground_projected->points[i];
+        std::vector<int> neighbors(1);
+        std::vector<float> sqr_distances(1);
+        ground_tree->nearestKSearch(nonground_query, 1, neighbors, sqr_distances);
+
+        double nonground_Z = view.getFieldAs<double>(Dimension::Id::Z, nonground[i]);
+        double ground_Z = view.getFieldAs<double>(Dimension::Id::Z, ground->indices[neighbors[0]]);
+        double height = nonground_Z - ground_Z;
+
+        view.setField(m_heightDim, nonground[i], height);
+    }
+
+    for (auto const& ground_idx : ground->indices)
+        view.setField(m_heightDim, ground_idx, 0.0);
+}
+
+
+} // namespace pdal
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/HeightFilter.hpp
similarity index 80%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/HeightFilter.hpp
index 448c9f3..69a2704 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/HeightFilter.hpp
@@ -34,23 +34,26 @@
 
 #pragma once
 
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/Dimension.hpp>
 #include <pdal/Filter.hpp>
 #include <pdal/Stage.hpp>
 
-#include <memory>
-
 namespace pdal
 {
 
 class Options;
 class PointLayout;
-class PointTable;
 class PointView;
 
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL HeightFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    HeightFilter() : Filter()
     {}
 
     static void * create();
@@ -58,22 +61,14 @@ public:
     std::string getName() const;
 
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    Dimension::Id::Enum m_heightDim;
 
     virtual void addDimensions(PointLayoutPtr layout);
-    virtual void processOptions(const Options& options);
-    virtual PointViewSet run(PointViewPtr view);
+    virtual void prepared(PointTableRef table);
+    virtual void filter(PointView& view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    HeightFilter& operator=(const HeightFilter&); // not implemented
+    HeightFilter(const HeightFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/MovingLeastSquaresFilter.cpp
similarity index 65%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/MovingLeastSquaresFilter.cpp
index a5b5cb6..06af7fb 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/MovingLeastSquaresFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,7 +32,7 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "MovingLeastSquaresFilter.hpp"
 
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
@@ -40,28 +40,41 @@
 #include <pcl/console/print.h>
 #include <pcl/point_types.h>
 #include <pcl/io/pcd_io.h>
+#include <pcl/surface/mls.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.movingleastsquares", "Moving Least Squares filter",
+               "http://pdal.io/stages/filters.movingleastsquares.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, MovingLeastSquaresFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string MovingLeastSquaresFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options MovingLeastSquaresFilter::getDefaultOptions()
+{
+    Options options;
+    // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+    // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+    // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+    return options;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
-void PCLBlock::processOptions(const Options& options)
+void MovingLeastSquaresFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+    // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+    // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet MovingLeastSquaresFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
@@ -71,11 +84,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     if (logOutput)
         log()->floatPrecision(8);
 
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->get(LogLevel::Debug2) << "Process MovingLeastSquaresFilter..." << std::endl;
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
@@ -85,9 +94,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,22 +117,17 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+    // initial setup
+    pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ> mls;
+    mls.setInputCloud(cloud);
+    mls.setSearchRadius(1);
+    mls.setPolynomialFit(true);
+    mls.setPolynomialOrder(2);
+    mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ>::NONE);
 
     // create PointCloud for results
     Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
+    mls.process(*cloud_f);
 
     if (cloud_f->points.empty())
     {
@@ -139,11 +140,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
                                  cloud_f->points.size() << " after" << std::endl;
     log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/MovingLeastSquaresFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/MovingLeastSquaresFilter.hpp
index 448c9f3..b5c58c2 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/MovingLeastSquaresFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,31 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL MovingLeastSquaresFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    MovingLeastSquaresFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    // double m_leaf_x, m_leaf_y, m_leaf_z;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    MovingLeastSquaresFilter& operator=(const MovingLeastSquaresFilter&); // not implemented
+    MovingLeastSquaresFilter(const MovingLeastSquaresFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/PCLBlock.cpp
index a5b5cb6..f89d908 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/PCLBlock.cpp
@@ -44,14 +44,16 @@
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.pclblock", "PCL Block implementation",
+               "http://pdal.io/stages/filters.pclblock.html");
 
 CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string PCLBlock::getName() const
+{
+    return s_info.name;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
@@ -72,9 +74,9 @@ PointViewSet PCLBlock::run(PointViewPtr input)
         log()->floatPrecision(8);
 
     log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+                                 input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
+                                 input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
+                                 input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
     log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
 
     BOX3D buffer_bounds;
@@ -86,7 +88,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
     log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
+                                 cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
 
     int level = log()->getLevel();
     switch (level)
@@ -146,4 +148,3 @@ PointViewSet PCLBlock::run(PointViewPtr input)
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/PoissonFilter.cpp
similarity index 61%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/PoissonFilter.cpp
index a5b5cb6..8bf97eb 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/PoissonFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,36 +32,50 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "PoissonFilter.hpp"
 
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
 
 #include <pcl/console/print.h>
 #include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
 #include <pcl/io/pcd_io.h>
+#include <pcl/surface/poisson.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.poisson", "Poisson filter",
+               "http://pdal.io/stages/filters.poisson.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, PoissonFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string PoissonFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options PoissonFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("depth", 8, "Maximum depth of the tree used for reconstruction");
+    options.add("point_weight", 4.0,
+                "Importance of interpolation of point samples in the screened "\
+                "Poisson equation");
+    return options;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
-void PCLBlock::processOptions(const Options& options)
+void PoissonFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    m_depth = options.getValueOrDefault<int>("depth", 8);
+    m_point_weight = options.getValueOrDefault<float>("point_weight", 4.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet PoissonFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     if (logOutput)
         log()->floatPrecision(8);
 
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->get(LogLevel::Debug2) << "Process PoissonFilter..." << std::endl;
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,22 +118,43 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+    // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+    pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+    // Create search tree
+    tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+    tree->setInputCloud(cloud);
+
+    // Normal estimation
+    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+    n.setInputCloud(cloud);
+    n.setSearchMethod(tree);
+    n.setKSearch(20);
+    n.compute(*normals);
+
+    // Concatenate XYZ and normal information
+    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+    // Create search tree
+    tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+    tree2->setInputCloud(cloud_with_normals);
+
+    // initial setup
+    pcl::Poisson<pcl::PointNormal> p;
+    p.setInputCloud(cloud_with_normals);
+    p.setSearchMethod(tree2);
+    p.setDepth(m_depth);
+    p.setPointWeight(m_point_weight);
 
     // create PointCloud for results
+    pcl::PolygonMesh grid;
+    p.reconstruct(grid);
+
     Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
+    pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
 
     if (cloud_f->points.empty())
     {
@@ -139,11 +167,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
                                  cloud_f->points.size() << " after" << std::endl;
     log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/PoissonFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/PoissonFilter.hpp
index 448c9f3..7b502bc 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/PoissonFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,32 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL PoissonFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    PoissonFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    int m_depth;
+    float m_point_weight;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    PoissonFilter& operator=(const PoissonFilter&); // not implemented
+    PoissonFilter(const PoissonFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/RadiusOutlierFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/GroundFilter.cpp
copy to plugins/pcl/filters/RadiusOutlierFilter.cpp
index 7072d4f..7526a12 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/RadiusOutlierFilter.cpp
@@ -32,7 +32,7 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "GroundFilter.hpp"
+#include "RadiusOutlierFilter.hpp"
 
 #include "PCLConversions.hpp"
 
@@ -45,44 +45,51 @@
 #include <pcl/console/print.h>
 #include <pcl/filters/extract_indices.h>
 #include <pcl/io/pcd_io.h>
-#include <pcl/segmentation/progressive_morphological_filter.h>
-#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/filters/radius_outlier_removal.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.ground",
-    "Progressive morphological filter",
-    "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.radiusoutlier", "Radius outlier removal",
+               "http://pdal.io/stages/filters.radiusoutlier.html");
 
-CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, RadiusOutlierFilter, Filter, s_info)
 
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string RadiusOutlierFilter::getName() const
+{
+    return s_info.name;
+}
 
-void GroundFilter::processOptions(const Options& options)
+Options RadiusOutlierFilter::getDefaultOptions()
 {
-    m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
-    m_slope = options.getValueOrDefault<double>("slope", 1);
-    m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
-    m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
-    m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+    Options options;
+    options.add("min_neighbors", 2, "Minimum number of neighbors in radius");
+    options.add("radius", 1, "Radius");
+    options.add("classify", true, "Apply classification labels?");
+    options.add("extract", false, "Extract ground returns?");
+    return options;
+}
+
+void RadiusOutlierFilter::processOptions(const Options& options)
+{
+    m_min_neighbors = options.getValueOrDefault<int>("min_neighbors", 2);
+    m_radius = options.getValueOrDefault<double>("radius", 1);
     m_classify = options.getValueOrDefault<bool>("classify", true);
     m_extract = options.getValueOrDefault<bool>("extract", false);
-    m_approximate = options.getValueOrDefault<bool>("approximate", false);
 }
 
-void GroundFilter::addDimensions(PointLayoutPtr layout)
+void RadiusOutlierFilter::addDimensions(PointLayoutPtr layout)
 {
     layout->registerDim(Dimension::Id::Classification);
 }
 
-PointViewSet GroundFilter::run(PointViewPtr input)
+PointViewSet RadiusOutlierFilter::run(PointViewPtr input)
 {
     bool logOutput = log()->getLevel() > LogLevel::Debug1;
     if (logOutput)
         log()->floatPrecision(8);
-    log()->get(LogLevel::Debug2) << "Process GroundFilter...\n";
+    log()->get(LogLevel::Debug2) << "Process RadiusOutlierFilter...\n";
 
     // convert PointView to PointXYZ
     typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
@@ -115,59 +122,57 @@ PointViewSet GroundFilter::run(PointViewPtr input)
             break;
     }
 
-    // setup the PMF filter
-    pcl::PointIndicesPtr idx(new pcl::PointIndices);
-    if (!m_approximate)
-    {
+    // setup the outlier filter
+    pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror(true);
+    ror.setInputCloud(cloud);
+    ror.setMinNeighborsInRadius(m_min_neighbors);
+    ror.setRadiusSearch(m_radius);
 
-        pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
-        pmf.setInputCloud(cloud);
-        pmf.setMaxWindowSize(m_maxWindowSize);
-        pmf.setSlope(m_slope);
-        pmf.setMaxDistance(m_maxDistance);
-        pmf.setInitialDistance(m_initialDistance);
-        pmf.setCellSize(m_cellSize);
-
-        // run the PMF filter, grabbing indices of ground returns
-        pmf.extract(idx->indices);
-    } else
-    {
-        pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
-        pmf.setInputCloud(cloud);
-        pmf.setMaxWindowSize(m_maxWindowSize);
-        pmf.setSlope(m_slope);
-        pmf.setMaxDistance(m_maxDistance);
-        pmf.setInitialDistance(m_initialDistance);
-        pmf.setCellSize(m_cellSize);
+    pcl::PointCloud<pcl::PointXYZ> output;
+    ror.setNegative(true);
+    ror.filter(output);
 
-        // run the PMF filter, grabbing indices of ground returns
-        pmf.extract(idx->indices);
+    // filtered to return inliers
+    pcl::PointIndicesPtr inliers(new pcl::PointIndices);
+    ror.getRemovedIndices(*inliers);
 
+    // inverse are the outliers
+    std::vector<int> outliers(input->size()-inliers->indices.size());
+    for (PointId i = 0, j = 0, k = 0; i < input->size(); ++i)
+    {
+        if (i == (PointId)inliers->indices[j])
+        {
+            j++;
+            continue;
+        }
+        outliers[k++] = i;
     }
 
     PointViewSet viewSet;
-    if (!idx->indices.empty() && (m_classify || m_extract))
+    if (!outliers.empty() && (m_classify || m_extract))
     {
 
         if (m_classify)
         {
-            log()->get(LogLevel::Debug2) << "Labeled " << idx->indices.size() << " ground returns!\n";
+            log()->get(LogLevel::Debug2) << "Labeled " << outliers.size() << " outliers as noise!\n";
 
-            // set the classification label of ground returns as 2
-            // (corresponding to ASPRS LAS specification)
-            for (const auto& i : idx->indices)
-            { input->setField(Dimension::Id::Classification, i, 2); }
+            // set the classification label of outlier returns as 18
+            // (corresponding to ASPRS LAS specification for high noise)
+            for (const auto& i : outliers)
+            {
+                input->setField(Dimension::Id::Classification, i, 18);
+            }
 
             viewSet.insert(input);
         }
 
         if (m_extract)
         {
-            log()->get(LogLevel::Debug2) << "Extracted " << idx->indices.size() << " ground returns!\n";
+            log()->get(LogLevel::Debug2) << "Extracted " << inliers->indices.size() << " inliers!\n";
 
-            // create new PointView containing only ground returns
+            // create new PointView containing only outliers
             PointViewPtr output = input->makeNew();
-            for (const auto& i : idx->indices)
+            for (const auto& i : inliers->indices)
             {
                 output->appendPoint(*input, i);
             }
@@ -178,8 +183,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
     }
     else
     {
-        if (idx->indices.empty())
-            log()->get(LogLevel::Debug2) << "Filtered cloud has no ground returns!\n";
+        if (outliers.empty())
+            log()->get(LogLevel::Debug2) << "Filtered cloud has no outliers!\n";
 
         if (!(m_classify || m_extract))
             log()->get(LogLevel::Debug2) << "Must choose --classify or --extract\n";
@@ -192,4 +197,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/RadiusOutlierFilter.hpp
similarity index 86%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/RadiusOutlierFilter.hpp
index 448c9f3..e7d1190 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/RadiusOutlierFilter.hpp
@@ -47,33 +47,30 @@ class PointLayout;
 class PointTable;
 class PointView;
 
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL RadiusOutlierFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    RadiusOutlierFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
+    int m_min_neighbors;
+    double m_radius;
     bool m_classify;
     bool m_extract;
-    bool m_approximate;
 
     virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    RadiusOutlierFilter& operator=(const RadiusOutlierFilter&); // not implemented
+    RadiusOutlierFilter(const RadiusOutlierFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/StatisticalOutlierFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/GroundFilter.cpp
copy to plugins/pcl/filters/StatisticalOutlierFilter.cpp
index 7072d4f..91a2f53 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/StatisticalOutlierFilter.cpp
@@ -32,7 +32,7 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "GroundFilter.hpp"
+#include "StatisticalOutlierFilter.hpp"
 
 #include "PCLConversions.hpp"
 
@@ -45,44 +45,51 @@
 #include <pcl/console/print.h>
 #include <pcl/filters/extract_indices.h>
 #include <pcl/io/pcd_io.h>
-#include <pcl/segmentation/progressive_morphological_filter.h>
-#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/filters/statistical_outlier_removal.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.ground",
-    "Progressive morphological filter",
-    "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.statisticaloutlier", "Statistical outlier removal",
+               "http://pdal.io/stages/filters.statisticaloutlier.html");
 
-CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, StatisticalOutlierFilter, Filter, s_info)
 
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string StatisticalOutlierFilter::getName() const
+{
+    return s_info.name;
+}
 
-void GroundFilter::processOptions(const Options& options)
+Options StatisticalOutlierFilter::getDefaultOptions()
 {
-    m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
-    m_slope = options.getValueOrDefault<double>("slope", 1);
-    m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
-    m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
-    m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+    Options options;
+    options.add("mean_k", 8, "Mean number of neighbors");
+    options.add("multiplier", 2, "Standard deviation threshold");
+    options.add("classify", true, "Apply classification labels?");
+    options.add("extract", false, "Extract ground returns?");
+    return options;
+}
+
+void StatisticalOutlierFilter::processOptions(const Options& options)
+{
+    m_meanK = options.getValueOrDefault<int>("mean_k", 8);
+    m_multiplier = options.getValueOrDefault<double>("multiplier", 2);
     m_classify = options.getValueOrDefault<bool>("classify", true);
     m_extract = options.getValueOrDefault<bool>("extract", false);
-    m_approximate = options.getValueOrDefault<bool>("approximate", false);
 }
 
-void GroundFilter::addDimensions(PointLayoutPtr layout)
+void StatisticalOutlierFilter::addDimensions(PointLayoutPtr layout)
 {
     layout->registerDim(Dimension::Id::Classification);
 }
 
-PointViewSet GroundFilter::run(PointViewPtr input)
+PointViewSet StatisticalOutlierFilter::run(PointViewPtr input)
 {
     bool logOutput = log()->getLevel() > LogLevel::Debug1;
     if (logOutput)
         log()->floatPrecision(8);
-    log()->get(LogLevel::Debug2) << "Process GroundFilter...\n";
+    log()->get(LogLevel::Debug2) << "Process StatisticalOutlierFilter...\n";
 
     // convert PointView to PointXYZ
     typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
@@ -115,59 +122,57 @@ PointViewSet GroundFilter::run(PointViewPtr input)
             break;
     }
 
-    // setup the PMF filter
-    pcl::PointIndicesPtr idx(new pcl::PointIndices);
-    if (!m_approximate)
-    {
+    // setup the outlier filter
+    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor(true);
+    sor.setInputCloud(cloud);
+    sor.setMeanK(m_meanK);
+    sor.setStddevMulThresh(m_multiplier);
 
-        pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
-        pmf.setInputCloud(cloud);
-        pmf.setMaxWindowSize(m_maxWindowSize);
-        pmf.setSlope(m_slope);
-        pmf.setMaxDistance(m_maxDistance);
-        pmf.setInitialDistance(m_initialDistance);
-        pmf.setCellSize(m_cellSize);
-
-        // run the PMF filter, grabbing indices of ground returns
-        pmf.extract(idx->indices);
-    } else
-    {
-        pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
-        pmf.setInputCloud(cloud);
-        pmf.setMaxWindowSize(m_maxWindowSize);
-        pmf.setSlope(m_slope);
-        pmf.setMaxDistance(m_maxDistance);
-        pmf.setInitialDistance(m_initialDistance);
-        pmf.setCellSize(m_cellSize);
+    pcl::PointCloud<pcl::PointXYZ> output;
+    sor.setNegative(true);
+    sor.filter(output);
 
-        // run the PMF filter, grabbing indices of ground returns
-        pmf.extract(idx->indices);
+    // filtered to return inliers
+    pcl::PointIndicesPtr inliers(new pcl::PointIndices);
+    sor.getRemovedIndices(*inliers);
 
+    // inverse are the outliers
+    std::vector<int> outliers(input->size()-inliers->indices.size());
+    for (PointId i = 0, j = 0, k = 0; i < input->size(); ++i)
+    {
+        if (i == (PointId)inliers->indices[j])
+        {
+            j++;
+            continue;
+        }
+        outliers[k++] = i;
     }
 
     PointViewSet viewSet;
-    if (!idx->indices.empty() && (m_classify || m_extract))
+    if (!outliers.empty() && (m_classify || m_extract))
     {
 
         if (m_classify)
         {
-            log()->get(LogLevel::Debug2) << "Labeled " << idx->indices.size() << " ground returns!\n";
+            log()->get(LogLevel::Debug2) << "Labeled " << outliers.size() << " outliers as noise!\n";
 
-            // set the classification label of ground returns as 2
-            // (corresponding to ASPRS LAS specification)
-            for (const auto& i : idx->indices)
-            { input->setField(Dimension::Id::Classification, i, 2); }
+            // set the classification label of outlier returns as 18
+            // (corresponding to ASPRS LAS specification for high noise)
+            for (const auto& i : outliers)
+            {
+                input->setField(Dimension::Id::Classification, i, 18);
+            }
 
             viewSet.insert(input);
         }
 
         if (m_extract)
         {
-            log()->get(LogLevel::Debug2) << "Extracted " << idx->indices.size() << " ground returns!\n";
+            log()->get(LogLevel::Debug2) << "Extracted " << inliers->indices.size() << " inliers!\n";
 
-            // create new PointView containing only ground returns
+            // create new PointView containing only outliers
             PointViewPtr output = input->makeNew();
-            for (const auto& i : idx->indices)
+            for (const auto& i : inliers->indices)
             {
                 output->appendPoint(*input, i);
             }
@@ -178,8 +183,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
     }
     else
     {
-        if (idx->indices.empty())
-            log()->get(LogLevel::Debug2) << "Filtered cloud has no ground returns!\n";
+        if (outliers.empty())
+            log()->get(LogLevel::Debug2) << "Filtered cloud has no outliers!\n";
 
         if (!(m_classify || m_extract))
             log()->get(LogLevel::Debug2) << "Must choose --classify or --extract\n";
@@ -192,4 +197,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/StatisticalOutlierFilter.hpp
similarity index 86%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/StatisticalOutlierFilter.hpp
index 448c9f3..d2b9146 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/StatisticalOutlierFilter.hpp
@@ -47,33 +47,30 @@ class PointLayout;
 class PointTable;
 class PointView;
 
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL StatisticalOutlierFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    StatisticalOutlierFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
+    int m_meanK;
+    double m_multiplier;
     bool m_classify;
     bool m_extract;
-    bool m_approximate;
 
     virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    StatisticalOutlierFilter& operator=(const StatisticalOutlierFilter&); // not implemented
+    StatisticalOutlierFilter(const StatisticalOutlierFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/VoxelGridFilter.cpp
similarity index 65%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/VoxelGridFilter.cpp
index a5b5cb6..6d17700 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/VoxelGridFilter.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -32,7 +32,7 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
-#include "PCLBlock.hpp"
+#include "VoxelGridFilter.hpp"
 
 #include "PCLConversions.hpp"
 #include "PCLPipeline.h"
@@ -40,28 +40,41 @@
 #include <pcl/console/print.h>
 #include <pcl/point_types.h>
 #include <pcl/io/pcd_io.h>
+#include <pcl/filters/voxel_grid.h>
 
 namespace pdal
 {
 
-static PluginInfo const s_info = PluginInfo(
-    "filters.pclblock",
-    "PCL Block implementation",
-    "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+    PluginInfo("filters.voxelgrid", "Voxel grid filter",
+               "http://pdal.io/stages/filters.voxelgrid.html");
 
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, VoxelGridFilter, Filter, s_info)
 
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string VoxelGridFilter::getName() const
+{
+    return s_info.name;
+}
+
+Options VoxelGridFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("leaf_x", 1.0, "Leaf size in X dimension");
+    options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+    options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+    return options;
+}
 
 /** \brief This method processes the PointView through the given pipeline. */
 
-void PCLBlock::processOptions(const Options& options)
+void VoxelGridFilter::processOptions(const Options& options)
 {
-    m_filename = options.getValueOrDefault<std::string>("filename", "");
-    m_json = options.getValueOrDefault<std::string>("json", "");
+    m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+    m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+    m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
 }
 
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet VoxelGridFilter::run(PointViewPtr input)
 {
     PointViewPtr output = input->makeNew();
     PointViewSet viewSet;
@@ -71,11 +84,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     if (logOutput)
         log()->floatPrecision(8);
 
-    log()->get(LogLevel::Debug2) <<
-        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
-    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+    log()->get(LogLevel::Debug2) << "Process VoxelGridFilter..." << std::endl;
 
     BOX3D buffer_bounds;
     input->calculateBounds(buffer_bounds);
@@ -85,9 +94,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     Cloud::Ptr cloud(new Cloud);
     pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
 
-    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
-        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
     int level = log()->getLevel();
     switch (level)
     {
@@ -111,22 +117,14 @@ PointViewSet PCLBlock::run(PointViewPtr input)
             break;
     }
 
-    pcl::Pipeline<pcl::PointXYZ> pipeline;
-    pipeline.setInputCloud(cloud);
-    if (!m_filename.empty())
-        pipeline.setFilename(m_filename);
-    else if (!m_json.empty())
-        pipeline.setJSON(m_json);
-    else
-        throw pdal_error("No PCL pipeline specified!");
-    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
-    // errors in conversion to float. These offsets need to be conveyed to the
-    // pipeline to offset any bounds entered as part of a PassThrough filter.
-    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+    // initial setup
+    pcl::VoxelGrid<pcl::PointXYZ> vg;
+    vg.setInputCloud(cloud);
+    vg.setLeafSize(m_leaf_x, m_leaf_y, m_leaf_z);
 
     // create PointCloud for results
     Cloud::Ptr cloud_f(new Cloud);
-    pipeline.filter(*cloud_f);
+    vg.filter(*cloud_f);
 
     if (cloud_f->points.empty())
     {
@@ -139,11 +137,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
     log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
                                  cloud_f->points.size() << " after" << std::endl;
     log()->get(LogLevel::Debug2) << output->size() << std::endl;
-    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
-                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
     return viewSet;
 }
 
 } // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/VoxelGridFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/VoxelGridFilter.hpp
index 448c9f3..915bc40 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/VoxelGridFilter.hpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
 *
 * All rights reserved.
 *
@@ -35,45 +35,31 @@
 #pragma once
 
 #include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
 
 namespace pdal
 {
 
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL VoxelGridFilter : public Filter
 {
 public:
-    GroundFilter() : Filter()
+    VoxelGridFilter() : Filter()
     {}
 
     static void * create();
     static int32_t destroy(void *);
     std::string getName() const;
 
+    Options getDefaultOptions();
+
 private:
-    double m_maxWindowSize;
-    double m_slope;
-    double m_maxDistance;
-    double m_initialDistance;
-    double m_cellSize;
-    bool m_classify;
-    bool m_extract;
-    bool m_approximate;
+    double m_leaf_x, m_leaf_y, m_leaf_z;
 
-    virtual void addDimensions(PointLayoutPtr layout);
     virtual void processOptions(const Options& options);
     virtual PointViewSet run(PointViewPtr view);
 
-    GroundFilter& operator=(const GroundFilter&); // not implemented
-    GroundFilter(const GroundFilter&); // not implemented
+    VoxelGridFilter& operator=(const VoxelGridFilter&); // not implemented
+    VoxelGridFilter(const VoxelGridFilter&); // not implemented
 };
 
 } // namespace pdal
-
diff --git a/plugins/pcl/kernel/GroundKernel.cpp b/plugins/pcl/kernel/GroundKernel.cpp
index f1b9c34..824573b 100644
--- a/plugins/pcl/kernel/GroundKernel.cpp
+++ b/plugins/pcl/kernel/GroundKernel.cpp
@@ -94,11 +94,11 @@ void GroundKernel::addSwitches()
     file_options->add_options()
     ("input,i", po::value<std::string>(&m_inputFile)->default_value(""), "input file name")
     ("output,o", po::value<std::string>(&m_outputFile)->default_value(""), "output file name")
-    ("maxWindowSize", po::value<double>(&m_maxWindowSize)->default_value(33), "max window size")
+    ("max_window_size", po::value<double>(&m_maxWindowSize)->default_value(33), "max window size")
     ("slope", po::value<double>(&m_slope)->default_value(1), "slope")
-    ("maxDistance", po::value<double>(&m_maxDistance)->default_value(2.5), "max distance")
-    ("initialDistance", po::value<double>(&m_initialDistance)->default_value(0.15, "0.15"), "initial distance")
-    ("cellSize", po::value<double>(&m_cellSize)->default_value(1), "cell size")
+    ("max_distance", po::value<double>(&m_maxDistance)->default_value(2.5), "max distance")
+    ("initial_distance", po::value<double>(&m_initialDistance)->default_value(0.15, "0.15"), "initial distance")
+    ("cell_size", po::value<double>(&m_cellSize)->default_value(1), "cell size")
     ("classify", po::bool_switch(&m_classify), "apply classification labels?")
     ("extract", po::bool_switch(&m_extract), "extract ground returns?")
     ("approximate,a", po::bool_switch(&m_approximate), "use approximate algorithm? (much faster)")
@@ -122,11 +122,11 @@ int GroundKernel::execute()
     readerStage.setOptions(readerOptions);
 
     Options groundOptions;
-    groundOptions.add<double>("maxWindowSize", m_maxWindowSize);
+    groundOptions.add<double>("max_window_size", m_maxWindowSize);
     groundOptions.add<double>("slope", m_slope);
-    groundOptions.add<double>("maxDistance", m_maxDistance);
-    groundOptions.add<double>("initialDistance", m_initialDistance);
-    groundOptions.add<double>("cellSize", m_cellSize);
+    groundOptions.add<double>("max_distance", m_maxDistance);
+    groundOptions.add<double>("initial_distance", m_initialDistance);
+    groundOptions.add<double>("cell_size", m_cellSize);
     groundOptions.add<bool>("classify", m_classify);
     groundOptions.add<bool>("extract", m_extract);
     groundOptions.add<bool>("approximate", m_approximate);
diff --git a/plugins/pcl/pipeline/PCLPipeline.hpp b/plugins/pcl/pipeline/PCLPipeline.hpp
index b6dd968..caf067a 100644
--- a/plugins/pcl/pipeline/PCLPipeline.hpp
+++ b/plugins/pcl/pipeline/PCLPipeline.hpp
@@ -564,14 +564,14 @@ pcl::Pipeline<PointT>::applyMovingLeastSquares(PointCloudConstPtr cloud, PointCl
         mls.setSearchRadius(1);
         mls.setPolynomialFit(true);
         mls.setPolynomialOrder(2);
-        mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointT, PointT>::SAMPLE_LOCAL_PLANE);
+        mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointT, PointT>::NONE);
         //mls.setDilationIterations(1);
         //mls.setDilationVoxelSize(0.5);
         //mls.setPointDensity(20);
-        mls.setUpsamplingRadius(2);
-        mls.setUpsamplingStepSize(1);
-        PCL_DEBUG("%f radius \n", mls.getUpsamplingRadius());
-        PCL_DEBUG("%f step\n", mls.getUpsamplingStepSize());
+        //mls.setUpsamplingRadius(2);
+        //mls.setUpsamplingStepSize(1);
+        //PCL_DEBUG("%f radius \n", mls.getUpsamplingRadius());
+        //PCL_DEBUG("%f step\n", mls.getUpsamplingStepSize());
         mls.process(output);
 
     PCL_DEBUG("%d filtered to %d in moving least squares\n", cloud->points.size(), output.points.size());
diff --git a/plugins/pgpointcloud/io/PgReader.cpp b/plugins/pgpointcloud/io/PgReader.cpp
index 2b55ae4..b50a245 100644
--- a/plugins/pgpointcloud/io/PgReader.cpp
+++ b/plugins/pgpointcloud/io/PgReader.cpp
@@ -174,6 +174,7 @@ uint32_t PgReader::fetchPcid() const
     }
     oss << " WHERE c.relname = " << pg_quote_literal(m_table_name);
     oss << " AND a.attname = " << pg_quote_literal(m_column_name);
+    oss << " AND a.attrelid = c.oid " ;
     if (!m_schema_name.empty())
     {
         oss << " AND c.relnamespace = n.oid AND n.nspname = " <<
diff --git a/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
index 333c1b8..0332aa6 100644
--- a/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
+++ b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
@@ -36,6 +36,7 @@
 
 #include <pdal/Writer.hpp>
 #include <pdal/StageFactory.hpp>
+#include <pdal/util/Algorithm.hpp>
 
 #include "Support.hpp"
 #include "Pgtest-Support.hpp"
@@ -92,7 +93,8 @@ Options getDbOptions()
 class PgpointcloudWriterTest : public testing::Test
 {
 public:
-    PgpointcloudWriterTest() : m_masterConnection(0), m_testConnection(0) {};
+    PgpointcloudWriterTest() : m_masterConnection(0), m_testConnection(0),
+                               m_bSkipTests(false) {};
 protected:
     virtual void SetUp()
     {
@@ -108,11 +110,27 @@ protected:
         std::stringstream createDbSql;
         createDbSql << "CREATE DATABASE " <<
             testDbTempname << " TEMPLATE template0";
-        executeOnMasterDb(createDbSql.str());
+        try
+        {
+            executeOnMasterDb(createDbSql.str());
+        }
+        catch( const pdal_error& error )
+        {
+            m_bSkipTests = true;
+            return;
+        }
 
         m_testConnection = pg_connect( getTestDBTempConn() );
 
-        executeOnTestDb("CREATE EXTENSION pointcloud");
+        try
+        {
+            executeOnTestDb("CREATE EXTENSION pointcloud");
+        }
+        catch( const pdal_error& error )
+        {
+            m_bSkipTests = true;
+            return;
+        }
     }
 
     void executeOnTestDb(const std::string& sql)
@@ -134,6 +152,8 @@ protected:
         }
     }
 
+    bool shouldSkipTests() const { return m_bSkipTests; }
+
 private:
 
     void executeOnMasterDb(const std::string& sql)
@@ -155,6 +175,7 @@ private:
 
     PGconn* m_masterConnection;
     PGconn* m_testConnection;
+    bool m_bSkipTests;
 };
 
 namespace
@@ -194,11 +215,21 @@ void optionsWrite(const Options& writerOps)
 
 TEST_F(PgpointcloudWriterTest, write)
 {
+    if (shouldSkipTests())
+    {
+        return;
+    }
+
     optionsWrite(getDbOptions());
 }
 
 TEST_F(PgpointcloudWriterTest, writeScaled)
 {
+    if (shouldSkipTests())
+    {
+        return;
+    }
+
     Options ops = getDbOptions();
     ops.add("scale_x", .01);
     ops.add("scale_y", .01);
@@ -209,6 +240,11 @@ TEST_F(PgpointcloudWriterTest, writeScaled)
 
 TEST_F(PgpointcloudWriterTest, writeXYZ)
 {
+    if (shouldSkipTests())
+    {
+        return;
+    }
+
     Options ops = getDbOptions();
     ops.add("output_dims", "X,Y,Z");
 
@@ -229,6 +265,11 @@ TEST_F(PgpointcloudWriterTest, writeXYZ)
 
 TEST_F(PgpointcloudWriterTest, writetNoPointcloudExtension)
 {
+    if (shouldSkipTests())
+    {
+        return;
+    }
+
     StageFactory f;
     std::unique_ptr<Stage> writer(f.createStage("writers.pgpointcloud"));
     EXPECT_TRUE(writer.get());
diff --git a/plugins/python/filters/ProgrammableFilter.cpp b/plugins/python/filters/ProgrammableFilter.cpp
index 236e9ad..c198c6c 100644
--- a/plugins/python/filters/ProgrammableFilter.cpp
+++ b/plugins/python/filters/ProgrammableFilter.cpp
@@ -35,7 +35,6 @@
 #include <pdal/pdal_internal.hpp>
 
 #include "ProgrammableFilter.hpp"
-#include "../plang/Plang.hpp"
 #include <pdal/PointView.hpp>
 #include <pdal/StageFactory.hpp>
 
diff --git a/plugins/python/plang/CMakeLists.txt b/plugins/python/plang/CMakeLists.txt
deleted file mode 100644
index ec53803..0000000
--- a/plugins/python/plang/CMakeLists.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-
-set(plang_srcs
-    BufferedInvocation.cpp
-    Invocation.cpp
-    Environment.cpp
-    Plang.cpp
-    Redirector.cpp
-    Script.cpp
-)
-
-set(plang_headers
-    BufferedInvocation.hpp
-    Invocation.hpp
-    Environment.hpp
-    Plang.hpp
-    Redirector.hpp
-    Script.hpp
-)
-
-set(PYTHON_LIBRARY ${PDAL_NO_AS_NEEDED_START}
-    ${PYTHON_LIBRARY}
-    ${PDAL_NO_AS_NEEDED_END})
-PDAL_ADD_LIBRARY(${PLANG_LIB_NAME} ${plang_srcs} ${plang_headers})
-target_link_libraries(${PLANG_LIB_NAME} ${PDAL_BASE_LIB_NAME} ${PYTHON_LIBRARY})
-install(TARGETS ${PLANG_LIB_NAME}
-    RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
-    LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
-    ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
-
-if (WITH_TESTS)
-    PDAL_ADD_TEST(plangtest FILES ../test/PLangTest.cpp
-        LINK_WITH ${PLANG_LIB_NAME})
-
-endif()
diff --git a/plugins/python/plang/Plang.cpp b/plugins/python/plang/Plang.cpp
deleted file mode 100644
index 11d0dc7..0000000
--- a/plugins/python/plang/Plang.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include <Python.h>
-
-#include <boost/uuid/string_generator.hpp>
-
-//#include <pdal/plang/Plang.hpp>
-#include <pdal/Metadata.hpp>
-
-namespace pdal
-{
-namespace plang
-{
-
-PyObject *fromMetadata(MetadataNode m)
-{
-    std::string name = m.name();
-    std::string value = m.value();
-    std::string type = m.type();
-    std::string description = m.description();
-
-    MetadataNodeList children = m.children();
-    PyObject *submeta = NULL;
-    if (children.size())
-    {
-        submeta = PyList_New(0);
-        for (MetadataNode& child : children)
-            PyList_Append(submeta, fromMetadata(child));
-    }
-    PyObject *data = PyTuple_New(5);
-    PyTuple_SetItem(data, 0, PyString_FromString(name.data()));
-    PyTuple_SetItem(data, 1, PyString_FromString(value.data()));
-    PyTuple_SetItem(data, 2, PyString_FromString(type.data()));
-    PyTuple_SetItem(data, 3, PyString_FromString(description.data()));
-    PyTuple_SetItem(data, 4, submeta);
-
-    return data;
-}
-
-void addMetadata(PyObject *list, MetadataNode m)
-{
-    if (!PyList_Check(list))
-        return;
-    for (Py_ssize_t i = 0; i < PyList_Size(list); ++i)
-    {
-        PyObject *tuple = PyList_GetItem(list, i);
-        if (!PyTuple_Check(tuple) || PyTuple_Size(tuple) != 5)
-            continue;
-        PyObject *o;
-        o = PyTuple_GetItem(tuple, 0);
-        if (!o || !PyString_Check(o))
-            continue;
-        std::string name = PyString_AsString(o);
-
-        o = PyTuple_GetItem(tuple, 1);
-        if (!o || !PyString_Check(o))
-            continue;
-        std::string value = PyString_AsString(o);
-
-        o = PyTuple_GetItem(tuple, 2);
-        if (!o || !PyString_Check(o))
-            continue;
-        std::string type = PyString_AsString(o);
-        if (type.empty())
-            type = Metadata::inferType(value);
-
-        o = PyTuple_GetItem(tuple, 3);
-        if (!o || !PyString_Check(o))
-            continue;
-        std::string description = PyString_AsString(o);
-
-        PyObject *submeta = PyTuple_GetItem(tuple, 4);
-        MetadataNode child =  m.add(name, value, type, description);
-        if (submeta)
-            addMetadata(submeta, child);
-    }
-}
-
-} // namespace plang
-} // namespace pdal
diff --git a/plugins/rxp/io/RxpReader.hpp b/plugins/rxp/io/RxpReader.hpp
index 041059e..a99a649 100644
--- a/plugins/rxp/io/RxpReader.hpp
+++ b/plugins/rxp/io/RxpReader.hpp
@@ -67,6 +67,7 @@ public:
         : pdal::Reader()
         , m_uri("")
         , m_syncToPps(DEFAULT_SYNC_TO_PPS)
+        , m_minimal(false)
         , m_pointcloud()
     {}
 
diff --git a/scripts/ci/before_install.sh b/scripts/ci/before_install.sh
index 86f0809..73e9af3 100755
--- a/scripts/ci/before_install.sh
+++ b/scripts/ci/before_install.sh
@@ -68,5 +68,20 @@ then
         points2grid
 fi
 
+#
+# LasZIP
+#
+
+mkdir laszip
+cd laszip
+wget https://github.com/LASzip/LASzip/releases/download/v2.2.0/laszip-src-2.2.0.tar.gz &&
+  tar xzf laszip-src-2.2.0.tar.gz &&
+  cd laszip-src-2.2.0 &&
+  ./configure &&
+  make &&
+  sudo make install &&
+  sudo ldconfig &&
+  (cd /usr/local/include && sudo mkdir laszip && cd laszip && sudo ln -s ../las*.hpp .)
+
 gcc --version
 clang --version
diff --git a/scripts/ci/script.sh b/scripts/ci/script.sh
index 75f0ffa..a07cad6 100755
--- a/scripts/ci/script.sh
+++ b/scripts/ci/script.sh
@@ -42,6 +42,8 @@ cmake \
     -DWITH_LAZPERF=$OPTIONAL_COMPONENT_SWITCH \
     -DWITH_GEOTIFF=$OPTIONAL_COMPONENT_SWITCH \
     -DWITH_LASZIP=$OPTIONAL_COMPONENT_SWITCH \
+    -DLASZIP_INCLUDE_DIR:PATH=/usr/local/include \
+    -DLASZIP_LIBRARY:FILEPATH=/usr/local/lib/liblaszip.so \
     -DWITH_TESTS=ON \
     -G "$PDAL_CMAKE_GENERATOR" \
     ..
diff --git a/scripts/linux-install-scripts/geowave b/scripts/linux-install-scripts/geowave
index 28f3de8..bf3e1e6 100755
--- a/scripts/linux-install-scripts/geowave
+++ b/scripts/linux-install-scripts/geowave
@@ -1,7 +1,7 @@
 #!/bin/sh
 SERVICE_NAME=geowave
-PATH_TO_JAR=/home/vagrant/geowave/geowave-deploy/target/geowave-deploy-0.8.5-jace.jar
-CLASS_TO_RUN=mil.nga.giat.geowave.demo.app.GeoWaveDemoApp
+PATH_TO_JAR=/home/vagrant/geowave/geowave-jace.jar
+CLASS_TO_RUN=mil.nga.giat.geowave.datastore.accumulo.app.GeoWaveDemoApp
 PID_PATH_NAME=/tmp/geowave-pid
 case $1 in
     start)
diff --git a/scripts/linux-install-scripts/geowave.sh b/scripts/linux-install-scripts/geowave.sh
index e2973d7..da50590 100755
--- a/scripts/linux-install-scripts/geowave.sh
+++ b/scripts/linux-install-scripts/geowave.sh
@@ -1,14 +1,29 @@
 #!/bin/bash -e
+NUMTHREADS=2
+if [[ -f /sys/devices/system/cpu/online ]]; then
+	# Calculates 1.5 times physical threads
+	NUMTHREADS=$(( ( $(cut -f 2 -d '-' /sys/devices/system/cpu/online) + 1 ) * 15 / 10  ))
+fi
+#NUMTHREADS=1 # disable MP
+export NUMTHREADS
+
 # Installs GeoWave library
-git clone https://github.com/ngageoint/geowave.git geowave
+mkdir geowave
 cd geowave
-git checkout tags/v0.8.5
-mvn clean package -pl geowave-deploy -am -P generate-jace-proxies,linux-amd64-gcc -DskipITs=true -DskipTests=true
+wget http://s3.amazonaws.com/geowave-rpms/release/TARBALL/geowave-0.8.8.1-24f1a85-jace-source.tar.gz
+tar -xzf geowave-*-jace-source.tar.gz
+mkdir build
+cd build
+cmake -G "Unix Makefiles" \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DBUILD_SHARED_LIBS=ON \
+      ..
+
+make -j $NUMTHREADS
 
 # Configure library paths
-chmod 777 /home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so
-sudo ln -s /home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so /usr/lib/libjace.so
-echo "/usr/lib/jvm/java-7-oracle/jre/lib/amd64" | sudo tee --append /etc/ld.so.conf.d/awt.conf
+chmod 777 /home/vagrant/geowave/build/libjace.so
+sudo ln -s /home/vagrant/geowave/build/libjace.so /usr/lib/libjace.so
 echo "/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server" | sudo tee --append /etc/ld.so.conf.d/jvm.conf
 sudo ldconfig
 
diff --git a/scripts/linux-install-scripts/packages.sh b/scripts/linux-install-scripts/packages.sh
index a9196b3..215e22b 100755
--- a/scripts/linux-install-scripts/packages.sh
+++ b/scripts/linux-install-scripts/packages.sh
@@ -39,8 +39,7 @@ sudo apt-get install -y -q  git \
                            g++-multilib \
                            libglew-dev \
                            oracle-java7-installer \
-                           maven \
-                           libc6-i386
+                           maven
 
 
 
diff --git a/scripts/linux-install-scripts/pdal.sh b/scripts/linux-install-scripts/pdal.sh
index c20aea2..6e3105e 100644
--- a/scripts/linux-install-scripts/pdal.sh
+++ b/scripts/linux-install-scripts/pdal.sh
@@ -5,6 +5,7 @@ if [[ -f /sys/devices/system/cpu/online ]]; then
 fi
 #NUMTHREADS=1 # disable MP
 export NUMTHREADS
+export JAVA_HOME=/usr/lib/jvm/java-7-oracle
 
 git clone https://github.com/PDAL/PDAL.git pdal
 cd pdal
@@ -31,15 +32,9 @@ cmake   -G "Unix Makefiles"  \
         -DLAZPERF_INCLUDE_DIR=/home/vagrant/laz-perf \
         -DJSONCPP_ROOT_DIR=/usr/include/jsoncpp \
         -DBUILD_PLUGIN_GEOWAVE=ON \
-        -DGEOWAVE_RUNTIME_JAR=/home/vagrant/geowave/geowave-deploy/target/geowave-deploy-0.8.5-jace.jar \
-        -DJACE_INCLUDE_DIR=/home/vagrant/geowave/geowave-deploy/target/dependency/jace/include \
-        -DJACE_LIBRARY=/home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so \
-        -DJACE_RUNTIME_JAR=/home/vagrant/geowave/geowave-deploy/target/dependency/jace-core-runtime-1.2.22.jar \
-        -DJAVA_AWT_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/include \
-        -DJAVA_AWT_LIBRARY=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/libjawt.so \
-        -DJAVA_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/include \
-        -DJAVA_INCLUDE_PATH2=/usr/lib/jvm/java-7-oracle/include/linux \
-        -DJAVA_JVM_LIBRARY=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/libjvm.so \
+        -DGEOWAVE_RUNTIME_JAR=/home/vagrant/geowave/geowave-jace.jar \
+        -DJACE_INCLUDE_DIR=/home/vagrant/geowave/include \
+        -DJACE_LIBRARY=/home/vagrant/geowave/build/libjace.so \
         ..
 
 make -j $NUMTHREADS
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4dc48e7..0b849a2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -43,6 +43,7 @@ set(PDAL_BASE_HPP
   "${PDAL_HEADERS_DIR}/Filter.hpp"
   "${PDAL_HEADERS_DIR}/FlexWriter.hpp"
   "${PDAL_HEADERS_DIR}/GDALUtils.hpp"
+  "${PDAL_HEADERS_DIR}/Geometry.hpp"
   "${PDAL_HEADERS_DIR}/GlobalEnvironment.hpp"
   "${PDAL_HEADERS_DIR}/gitsha.h"
   "${PDAL_HEADERS_DIR}/KDIndex.hpp"
@@ -177,7 +178,6 @@ else()
     set(UTIL_LIB ${PDAL_UTIL_LIB_NAME})
 endif()
 
-
 target_link_libraries(${PDAL_BASE_LIB_NAME}
     ${CMAKE_THREAD_LIBS_INIT}
     ${GDAL_LIBRARY}
diff --git a/src/GDALUtils.cpp b/src/GDALUtils.cpp
index 523f524..59c6637 100644
--- a/src/GDALUtils.cpp
+++ b/src/GDALUtils.cpp
@@ -100,6 +100,282 @@ ErrorHandler::~ErrorHandler()
     CPLPopErrorHandler();
 }
 
+Raster::Raster(const std::string& filename)
+    : m_filename(filename)
+    , m_raster_x_size(0)
+    , m_raster_y_size(0)
+    , m_block_x(0)
+    , m_block_y(0)
+    , m_size(0)
+    , m_band_count(0)
+    , m_ds(0)
+
+{
+    m_forward_transform.fill(0.0);
+    m_inverse_transform.fill(0.0);
+}
+
+bool Raster::open()
+{
+    if (m_ds)
+        return true; // already open
+
+    m_ds = GDALOpen(m_filename.c_str(), GA_ReadOnly);
+    if (m_ds == NULL)
+        throw pdal_error("Unable to open GDAL datasource!");
+
+    if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None)
+        throw pdal_error("unable to fetch forward geotransform for raster!");
+
+    if (!GDALInvGeoTransform(&(m_forward_transform.front()),
+        &(m_inverse_transform.front())))
+        throw pdal_error("unable to fetch inverse geotransform for raster!");
+
+    m_raster_x_size = GDALGetRasterXSize(m_ds);
+    m_raster_y_size = GDALGetRasterYSize(m_ds);
+    m_band_count = GDALGetRasterCount(m_ds);
+
+    m_types = computePDALDimensionTypes();
+    m_size = 0;
+    for(auto t: m_types)
+    {
+        m_size += pdal::Dimension::size(t);
+    }
+    return true;
+}
+
+void Raster::pixelToCoord(int col, int row, std::array<double, 2>& output) const
+{
+    // from http://gis.stackexchange.com/questions/53617/how-to-find-lat-lon-values-for-every-pixel-in-a-geotiff-file
+    double c = m_forward_transform[0];
+    double a = m_forward_transform[1];
+    double b = m_forward_transform[2];
+    double f = m_forward_transform[3];
+    double d = m_forward_transform[4];
+    double e = m_forward_transform[5];
+
+    output[0] = a*col + b*row + a*0.5 + b*0.5 + c;
+    output[1] = d*col + e*row + d*0.5 + e*0.5 + f;
+}
+
+// Determines the pixel/line position given an x/y.
+// No reprojection is done at this time.
+bool Raster::getPixelAndLinePosition(double x, double y,
+                                     std::array<double, 6> const& inverse,
+                                    int32_t& pixel, int32_t& line)
+{
+    pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) +
+        (inverse[2] * y));
+    line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) +
+        (inverse[5] * y));
+
+    int xs = m_raster_x_size;
+    int ys = m_raster_y_size;
+
+    if (!xs || !ys)
+        throw pdal_error("Unable to get X or Y size from raster!");
+
+    if (pixel < 0 || line < 0 || pixel >= xs || line  >= ys)
+    {
+        // The x, y is not coincident with this raster
+        return false;
+    }
+
+    return true;
+}
+
+pdal::Dimension::Type::Enum convertGDALtoPDAL(GDALDataType t)
+{
+
+    using namespace pdal::Dimension::Type;
+    switch (t)
+    {
+        case GDT_Byte:
+            return Unsigned8;
+        case GDT_UInt16:
+            return Unsigned16;
+        case GDT_Int16:
+            return Signed16;
+        case GDT_UInt32:
+            return Unsigned32;
+        case GDT_Int32:
+            return Signed32;
+        case GDT_CFloat32:
+            return Float;
+        case GDT_CFloat64:
+            return Double;
+        default:
+            return None;
+    }
+
+    return None;
+}
+
+bool Raster::readBand(std::vector<uint8_t>& data, int nBand)
+{
+    data.resize(m_raster_x_size * m_raster_y_size);
+
+    GDALRasterBandH band = GDALGetRasterBand(m_ds, nBand);
+    if (!band)
+    {
+        std::ostringstream oss;
+        oss << "Unable to get band " << nBand <<
+            " from data source!";
+        throw pdal_error(oss.str());
+    }
+
+    int nXBlockSize(0);
+    int nYBlockSize(0);
+
+    GDALGetBlockSize(band, &nXBlockSize, &nYBlockSize);
+
+    int nXBlocks = (GDALGetRasterBandXSize(band) + nXBlockSize - 1) / nXBlockSize;
+    int nYBlocks = (GDALGetRasterBandYSize(band) + nYBlockSize - 1) / nYBlockSize;
+
+    for (int iYBlock = 0; iYBlock < nYBlocks; iYBlock++)
+    {
+        int nXValid(0); int nYValid(0);
+        for (int iXBlock = 0; iXBlock < nXBlocks; iXBlock++)
+        {
+
+             if ((iXBlock+1) * nXBlockSize > GDALGetRasterBandXSize(band))
+                 nXValid = GDALGetRasterBandXSize(band) - iXBlock * nXBlockSize;
+             else
+                 nXValid = nXBlockSize;
+             if ((iYBlock+1) * nYBlockSize > GDALGetRasterBandYSize(band))
+                 nYValid = GDALGetRasterBandYSize(band) - iYBlock * nYBlockSize;
+             else
+                 nYValid = nYBlockSize;
+
+            int offset = iXBlock * (nXValid * nYValid) + iYBlock * (nXValid * nYValid);
+
+            CPLErr err = GDALReadBlock(band, iXBlock, iYBlock, data.data() + offset);
+            if (err != CPLE_None)
+            {
+                std::ostringstream oss;
+                oss << "unable to read block for ("<<iXBlock <<","<< iYBlock <<")";
+                throw pdal::pdal_error(oss.str());
+            }
+
+        }
+
+    }
+    return true;
+}
+
+std::vector<std::array<int, 2>> Raster::fetchGDALBlockSizes() const
+{
+    std::vector<std::array<int, 2>> output;
+    for (int i=1; i < m_band_count; ++i)
+    {
+        GDALRasterBandH band = GDALGetRasterBand(m_ds, i);
+        if (!band)
+        {
+            std::ostringstream oss;
+            oss << "Unable to get band " << i <<
+                " from data source!";
+            throw pdal_error(oss.str());
+        }
+        int x(0), y(0);
+        GDALGetBlockSize(band, &x, &y);
+        std::array<int, 2> a;
+        a[0] = x;
+        a[1] = y;
+        output.push_back(a);
+    }
+
+
+    return output;
+}
+
+std::vector<pdal::Dimension::Type::Enum> Raster::computePDALDimensionTypes() const
+{
+
+    if (!m_ds) throw pdal::pdal_error("raster is not open!");
+
+    std::vector<pdal::Dimension::Type::Enum> output;
+    for (int i=0; i < m_band_count; ++i)
+    {
+        GDALRasterBandH band = GDALGetRasterBand(m_ds, i+1);
+        if (!band)
+        {
+            std::ostringstream oss;
+            oss << "Unable to get band " << i+1 <<
+                " from data source!";
+            throw pdal_error(oss.str());
+        }
+
+        GDALDataType t = GDALGetRasterDataType(band);
+        int x(0), y(0);
+        GDALGetBlockSize(band, &x, &y);
+        pdal::Dimension::Type::Enum ptype = convertGDALtoPDAL(t);
+
+        output.push_back(ptype);
+    }
+    return output;
+}
+
+
+bool Raster::read(double x, double y, std::vector<double>& data)
+{
+
+    if (!m_ds)
+        throw pdal::pdal_error("Unable to read() because raster data source is not open");
+
+    int32_t pixel(0);
+    int32_t line(0);
+    data.resize(m_band_count);
+
+    std::array<double, 2> pix = { {0.0, 0.0} };
+
+    // No data at this x,y if we can't compute a pixel/line location
+    // for it.
+    if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel, line))
+        return false;
+
+    for (int i=0; i < m_band_count; ++i)
+    {
+        GDALRasterBandH b = GDALGetRasterBand(m_ds, i+1);
+        if (GDALRasterIO(b, GF_Read, pixel, line, 1, 1,
+            &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None)
+        {
+            // we read a pixel put its values in our vector
+            data[i] = pix[0];
+        }
+
+    }
+
+    return true;
+}
+
+SpatialReference Raster::getSpatialRef() const
+{
+    if (!m_ds)
+        throw pdal::pdal_error("Unable to getSpatialRef() because raster data source is not open");
+
+    const char* wkt = GDALGetProjectionRef(m_ds);
+
+    SpatialReference r(wkt);
+    return r;
+
+}
+
+Raster::~Raster()
+{
+    close();
+}
+
+void Raster::close()
+{
+    if (m_ds != 0)
+    {
+        GDALClose(m_ds);
+        m_ds = 0;
+    }
+    m_size = 0;
+    m_types.clear();
+}
+
 } // namespace gdal
 
 std::string transformWkt(std::string wkt, const SpatialReference& from,
diff --git a/src/Kernel.cpp b/src/Kernel.cpp
index 7c516a2..724d755 100644
--- a/src/Kernel.cpp
+++ b/src/Kernel.cpp
@@ -35,11 +35,14 @@
 #include <pdal/GlobalEnvironment.hpp>
 #include <pdal/Kernel.hpp>
 #include <pdal/PDALUtils.hpp>
+
+#include <cctype>
 #include <iostream>
 
 #include <boost/algorithm/string.hpp>
 
 #include <pdal/pdal_config.hpp>
+#include <pdal/Options.hpp>
 #include <pdal/StageFactory.hpp>
 
 #include <pdal/pdal_config.hpp>
@@ -71,6 +74,18 @@ Kernel::Kernel()
 {}
 
 
+Kernel::~Kernel()
+{
+    for (auto & iter : m_public_options)
+    {
+        delete iter;
+    }
+    for (auto & iter : m_hidden_options)
+    {
+        delete iter;
+    }
+}
+
 std::ostream& operator<<(std::ostream& ostr, const Kernel& kernel)
 {
     ostr << "  Name: " << kernel.getName() << std::endl;
@@ -219,61 +234,72 @@ int Kernel::run(int argc, const char* argv[], const std::string& appName)
 }
 
 
+namespace
+{
+
+bool parseOption(std::string o, std::string& stage, std::string& option,
+    std::string& value)
+{
+    if (o.size() < 2)
+        return false;
+    if (o[0] != '-' || o[1] != '-')
+        return false;
+
+    o = o.substr(2);
+
+    // Options are stage_type.stage_name.option_name
+    // stage_type and stage_name are always lowercase.  Option name starts
+    // with lowercase and then contains lowercase, numbers or underscore.
+
+    // This awfulness is to work around the multiply-defined islower.  Seems
+    // a bit better than the cast solution.
+    auto islc = [](char c)
+        { return std::islower(c); };
+
+    std::string::size_type pos = 0;
+    std::string::size_type count = 0;
+    // Get stage_type.
+    count = Utils::extract(o, pos, islc);
+    pos += count;
+    if (o[pos++] != '.')
+        return false;
+
+    // Get stage_name.
+    count = Utils::extract(o, pos, islc);
+    pos += count;
+    stage = o.substr(0, pos);
+    if (o[pos++] != '.')
+        return false;
+
+    // Get option name.
+    std::string::size_type optionStart = pos;
+    count = Option::parse(o, pos);
+    pos += count;
+    option = o.substr(optionStart, count);
+
+    if (o[pos++] != '=')
+        return false;
+
+    // The command-line parser takes care of quotes around an argument
+    // value and such.  May want to do something to handle escaped characters?
+    value = o.substr(pos);
+    return true;
+}
+
+} // unnamed namespace
+
+
 void Kernel::collectExtraOptions()
 {
     for (const auto& o : m_extra_options)
     {
-        typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
-
-        // if we don't have --, we're not an option we
-        // even care about
-        if (!boost::algorithm::find_first(o, "--"))
-            continue;
-
-        // Find the dimensions listed and put them on the id list.
-        boost::char_separator<char> equal("=");
-        boost::char_separator<char> dot(".");
-        tokenizer option_tokens(o, equal);
-        std::vector<std::string> option_split;
-        for (auto const& ti : option_tokens)
-            option_split.push_back(boost::lexical_cast<std::string>(ti));
-        if (!(option_split.size() == 2))
-        {
-//             std::ostringstream oss;
-//             oss << "option '" << o << "' did not split correctly. Is it "
-//                 "in the form --readers.las.option=foo?";
-//             throw app_usage_error(oss.str());
-            continue;
-        }
-
-        std::string option_value(option_split[1]);
-        std::string stage_value(option_split[0]);
-        boost::algorithm::erase_all(stage_value, "--");
-
-        tokenizer name_tokens(stage_value, dot);
-        std::vector<std::string> stage_values;
-        for (auto const& ti : name_tokens)
-            stage_values.push_back(ti);
+        std::string stageName, opName, value;
 
-        std::string option_name = *stage_values.rbegin();
-        std::ostringstream stage_name_ostr;
-        bool bFirst(true);
-        for (auto s = stage_values.begin(); s != stage_values.end() - 1; ++s)
+        if (parseOption(o, stageName, opName, value))
         {
-            auto s2 = boost::algorithm::erase_all_copy(*s, " ");
-
-            if (bFirst)
-            {
-                bFirst = false;
-            }
-            else
-                stage_name_ostr <<".";
-            stage_name_ostr << s2;
+            Option op(opName, value);
+            m_extraStageOptions[stageName].add(op);
         }
-        std::string stageName(stage_name_ostr.str());
-
-        Option op(option_name, option_value);
-        m_extraStageOptions[stageName].add(op);
     }
 }
 
diff --git a/src/KernelSupport.cpp b/src/KernelSupport.cpp
index cef6e09..a834012 100644
--- a/src/KernelSupport.cpp
+++ b/src/KernelSupport.cpp
@@ -44,12 +44,12 @@
 namespace pdal
 {
 
-PipelineManager* KernelSupport::makePipeline(const std::string& inputFile)
+PipelineManagerPtr KernelSupport::makePipeline(const std::string& inputFile)
 {
     if (!pdal::FileUtils::fileExists(inputFile))
         throw app_runtime_error("file not found: " + inputFile);
 
-    PipelineManager* output = new PipelineManager;
+    PipelineManagerPtr output(new PipelineManager);
 
     if (inputFile == "STDIN")
     {
diff --git a/src/Options.cpp b/src/Options.cpp
index 43c2834..87ff3a7 100644
--- a/src/Options.cpp
+++ b/src/Options.cpp
@@ -1,4 +1,5 @@
 /******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
 *
 * All rights reserved.
 *
@@ -34,17 +35,10 @@
 #include <pdal/Options.hpp>
 #include <pdal/PDALUtils.hpp>
 
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/json_parser.hpp>
-#include <boost/optional.hpp>
-#include <boost/foreach.hpp>
-#include <boost/algorithm/string.hpp>
-
 #include <iostream>
 #include <sstream>
 #include <iostream>
 
-
 namespace pdal
 {
 
@@ -56,25 +50,6 @@ Option::Option(const boost::property_tree::ptree& tree)
     m_value = tree.get<std::string>("Value");
     m_description =
     tree.count("Description") ? tree.get<std::string>("Description") : "";
-
-    boost::property_tree::ptree opts;
-    ptree const& options = tree.get_child("Options", opts);
-    if (options.size())
-        m_options = options::OptionsPtr(new Options(options));
-}
-
-
-boost::optional<Options const&> Option::getOptions() const
-{
-    if (m_options.get())
-        return boost::optional<Options const&>(*m_options.get());
-    else
-        return boost::optional<Options const&>();
-}
-
-void Option::setOptions(Options const& options)
-{
-    m_options = options::OptionsPtr(new Options(options));
 }
 
 #if !defined(PDAL_COMPILER_MSVC)
@@ -95,23 +70,12 @@ template<> void Option::setValue(const std::string& value)
 }
 #endif
 
-bool Option::empty() const
-{
-    if (m_options)
-        return m_options->empty();
-    else
-        return false;
-}
 
 void Option::toMetadata(MetadataNode& parent) const
 {
     MetadataNode child = parent.add(getName());
     child.add("value", getValue<std::string>());
     child.add("description", getDescription());
-
-    auto opts = getOptions();
-    if (opts)
-        opts->toMetadata(child);
 }
 
 //---------------------------------------------------------------------------
@@ -128,6 +92,20 @@ Options::Options(const Option& opt)
 }
 
 
+bool Option::nameValid(const std::string& name, bool reportError)
+{
+    bool valid = (parse(name, 0) == name.size());
+    if (!valid && reportError)
+    {
+        std::ostringstream oss;
+        oss << "Invalid option name '" << name << "'.  Options must "
+            "consist of only lowercase letters, numbers and '_'.";
+        Utils::printError(oss.str());
+    }
+    return valid;
+}
+
+
 Options::Options(const boost::property_tree::ptree& tree)
 {
     for (auto iter = tree.begin(); iter != tree.end(); ++iter)
@@ -141,10 +119,17 @@ Options::Options(const boost::property_tree::ptree& tree)
 
 void Options::add(const Option& option)
 {
+    assert(Option::nameValid(option.getName(), true));
     m_options.insert(std::pair<std::string, Option>(option.getName(), option));
 }
 
 
+void Options::remove(const Option& option)
+{
+    m_options.erase(option.getName());
+}
+
+
 Option& Options::getOptionByRef(const std::string& name)
 {
     auto iter = m_options.find(name);
@@ -161,6 +146,7 @@ Option& Options::getOptionByRef(const std::string& name)
 
 const Option& Options::getOption(const std::string& name) const
 {
+    assert(Option::nameValid(name, true));
     auto iter = m_options.find(name);
     if (iter == m_options.end())
     {
@@ -177,7 +163,7 @@ std::vector<Option> Options::getOptions(std::string const& name) const
     std::vector<Option> output;
 
     // If we have an empty name, return them all
-    if (boost::iequals(name, ""))
+    if (name.empty())
     {
         for (auto it = m_options.begin(); it != m_options.end(); ++it)
         {
@@ -195,13 +181,6 @@ std::vector<Option> Options::getOptions(std::string const& name) const
     return output;
 }
 
-// the empty options set
-static const Options s_none;
-const Options& Options::none()
-{
-    return s_none;
-}
-
 
 bool Options::hasOption(std::string const& name) const
 {
diff --git a/src/PDALUtils.cpp b/src/PDALUtils.cpp
index a5c9ae6..cebc870 100644
--- a/src/PDALUtils.cpp
+++ b/src/PDALUtils.cpp
@@ -152,9 +152,6 @@ void toJSON(const Option& opt, std::ostream& o, int level)
     o << indent2 << "\"value\" : " << value << "," << endl;
     o << indent2 << "\"description\" : " << description << endl;
 
-    boost::optional<Options const&> opts = opt.getOptions();
-    if (opts)
-        toJSON(*opts, o, level + 1);
     o << indent << "}";
 }
 
diff --git a/src/PipelineReader.cpp b/src/PipelineReader.cpp
index 93f7bdd..1a6c301 100644
--- a/src/PipelineReader.cpp
+++ b/src/PipelineReader.cpp
@@ -164,26 +164,6 @@ Option PipelineReader::parseElement_Option(const ptree& tree)
     boost::algorithm::trim(value);
     Option option(name, value);
 
-    boost::optional<ptree const&> moreOptions =
-        tree.get_child_optional("Options");
-
-    if (moreOptions)
-    {
-        ptree::const_iterator iter = moreOptions->begin();
-
-        Options options;
-        while (iter != moreOptions->end())
-        {
-            if (iter->first == "Option")
-            {
-                Option o2 = parseElement_Option(iter->second);
-                options.add(o2);
-            }
-            ++iter;
-        }
-        option.setOptions(options);
-    }
-
     // filenames in the XML are fixed up as follows:
     //   - if absolute path, leave it alone
     //   - if relative path, make it absolute using the XML file's directory
diff --git a/src/PluginManager.cpp b/src/PluginManager.cpp
index c4e6fca..7eea778 100644
--- a/src/PluginManager.cpp
+++ b/src/PluginManager.cpp
@@ -303,6 +303,13 @@ bool PluginManager::guessLoadByPath(const std::string& driverName)
         pluginDir = oss.str();
     }
 
+    std::string plugin_debug("PDAL_DEBUG");
+    std::string plugin_debug_path = Utils::getenv(plugin_debug);
+    if (plugin_debug_path.size())
+    {
+        std::cerr << "PDAL: plugin search path '" << pluginDir <<"'"<<std::endl;
+    }
+
     std::vector<std::string> pluginPathVec = Utils::split2(pluginDir, ':');
     for (const auto& pluginPath : pluginPathVec)
     {
@@ -372,18 +379,40 @@ bool PluginManager::loadByPath(const std::string& pluginPath,
 
     // If we are a valid type, and we're not yet already
     // loaded in the LibraryMap, load it.
+
+    std::string plugin_debug("PDAL_DEBUG");
+    std::string plugin_debug_path = Utils::getenv(plugin_debug);
+
     if (pluginTypeValid(pathname, type) &&
         m_dynamicLibraryMap.find(path.string()) == m_dynamicLibraryMap.end())
     {
         std::string errorString;
         auto completePath(boost::filesystem::complete(path).string());
+        if (plugin_debug_path.size())
+        {
+            std::cerr << "PDAL: attempting to load plugin '" << completePath <<"'"<<std::endl;
+        }
 
         if (DynamicLibrary *d = loadLibrary(completePath, errorString))
         {
+            if (plugin_debug_path.size())
+            {
+                std::cerr << "PDAL: loaded plugin '" << completePath <<"'"<<std::endl;
+            }
             if (PF_InitFunc initFunc =
                     (PF_InitFunc)(d->getSymbol("PF_initPlugin")))
             {
                 loaded = initializePlugin(initFunc);
+                if (plugin_debug_path.size())
+                {
+                    std::cerr << "PDAL: initialized plugin '" << completePath <<"'"<<std::endl;
+                }
+            } else
+            {
+                if (plugin_debug_path.size())
+                {
+                    std::cerr << "PDAL: failed to initialize plugin '" << completePath <<"'"<<std::endl;
+                }
             }
         }
     }
diff --git a/src/PointLayout.cpp b/src/PointLayout.cpp
index 5803ac6..883ddcf 100644
--- a/src/PointLayout.cpp
+++ b/src/PointLayout.cpp
@@ -33,7 +33,7 @@
 ****************************************************************************/
 
 #include <pdal/PointLayout.hpp>
-#include <pdal/util/Utils.hpp>
+#include <pdal/util/Algorithm.hpp>
 
 namespace pdal
 {
diff --git a/src/PointTable.cpp b/src/PointTable.cpp
index 6f5cc64..8f10b3f 100644
--- a/src/PointTable.cpp
+++ b/src/PointTable.cpp
@@ -37,22 +37,6 @@
 namespace pdal
 {
 
-SpatialReference BasePointTable::spatialRef() const
-{
-    MetadataNode m = m_metadata->m_private.findChild("spatialreference");
-    SpatialReference sref;
-    sref.setWKT(m.value());
-    return sref;
-}
-
-
-void BasePointTable::setSpatialRef(const SpatialReference& sref)
-{
-    MetadataNode mp = m_metadata->m_private;
-    mp.addOrUpdate("spatialreference", sref.getRawWKT());
-}
-
-
 MetadataNode BasePointTable::privateMetadata(const std::string& name)
 {
     MetadataNode mp = m_metadata->m_private;
diff --git a/src/PointView.cpp b/src/PointView.cpp
index 241e988..4b2cc5e 100644
--- a/src/PointView.cpp
+++ b/src/PointView.cpp
@@ -42,8 +42,6 @@
 namespace pdal
 {
 
-bool PointView::m_ok;
-
 PointViewIter PointView::begin()
 {
     return PointViewIter(this, 0);
diff --git a/src/SpatialReference.cpp b/src/SpatialReference.cpp
index 05c3f67..8b14af1 100644
--- a/src/SpatialReference.cpp
+++ b/src/SpatialReference.cpp
@@ -69,6 +69,18 @@ bool SpatialReference::empty() const
     return getWKT().empty();
 }
 
+bool SpatialReference::valid() const
+{
+    std::string wkt = getWKT();
+    OGRSpatialReferenceH current =
+        OSRNewSpatialReference(wkt.c_str());
+
+    OGRErr err = OSRValidate(current);
+
+    OSRDestroySpatialReference(current);
+    return err == OGRERR_NONE;
+}
+
 
 std::string SpatialReference::getWKT(WKTModeFlag mode_flag) const
 {
@@ -267,7 +279,7 @@ int SpatialReference::calculateZone(double lon, double lat)
     if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 )
         zone = 32;
     // Special Svalbard processing.
-    else if (lat >= 72.0 && lat < 84.0) 
+    else if (lat >= 72.0 && lat < 84.0)
     {
         if (lon >= 0.0  && lon < 9.0)
             zone = 31;
@@ -356,9 +368,7 @@ int SpatialReference::computeUTMZone(const BOX3D& box) const
     int min_zone(0);
     int max_zone(0);
     min_zone = calculateZone(minx, miny);
-    std::cerr << "Min X/Y/zone = " << minx << "/" << miny << "/" << min_zone << "!\n";
     max_zone = calculateZone(maxx, maxy);
-    std::cerr << "Max X/Y/zone = " << maxx << "/" << maxy << "/" << max_zone << "!\n";
 
     if (min_zone != max_zone)
     {
diff --git a/src/Stage.cpp b/src/Stage.cpp
index fc190bc..6ca50ab 100644
--- a/src/Stage.cpp
+++ b/src/Stage.cpp
@@ -81,7 +81,7 @@ void Stage::prepare(PointTableRef table)
     l_processOptions(m_options);
     processOptions(m_options);
     l_initialize(table);
-    initialize();
+    initialize(table);
     addDimensions(table.layout());
     prepared(table);
 }
@@ -92,6 +92,8 @@ PointViewSet Stage::execute(PointTableRef table)
     table.layout()->finalize();
 
     PointViewSet views;
+
+    // If the inputs are empty, we're a reader.
     if (m_inputs.empty())
     {
         views.insert(PointViewPtr(new PointView(table)));
@@ -109,6 +111,19 @@ PointViewSet Stage::execute(PointTableRef table)
     PointViewSet outViews;
     std::vector<StageRunnerPtr> runners;
 
+    // Put the spatial references from the views onto the table.
+    // The table's spatial references are only valid as long as the stage
+    // is running.
+    // ABELL - Should we clear the references once the stage run has
+    //   completed?  Wondering if that would break something where a
+    //   writer wants to check a table's SRS.
+    SpatialReference srs;
+    table.clearSpatialReferences();
+    for (auto const& it : views)
+        table.addSpatialReference(it->spatialReference());
+
+    // Do the ready operation and then start running all the views
+    // through the stage.
     ready(table);
     for (auto const& it : views)
     {
@@ -116,13 +131,22 @@ PointViewSet Stage::execute(PointTableRef table)
         runners.push_back(runner);
         runner->run();
     }
+
+    // As the stages complete (synchronously at this time), propagate the
+    // spatial reference and merge the output views.
+    srs = getSpatialReference();
     for (auto const& it : runners)
     {
         StageRunnerPtr runner(it);
         PointViewSet temp = runner->wait();
+        
+        // If our stage has a spatial reference, the view takes it on once
+        // the stage has been run.
+        if (!srs.empty())
+            for (PointViewPtr v : temp)
+                v->setSpatialReference(srs);
         outViews.insert(temp.begin(), temp.end());
     }
-    l_done(table);
     done(table);
     return outViews;
 }
@@ -184,12 +208,6 @@ void Stage::l_processOptions(const Options& options)
 }
 
 
-void Stage::l_done(PointTableRef table)
-{
-    if (!m_spatialReference.empty())
-        table.setSpatialRef(m_spatialReference);
-}
-
 const SpatialReference& Stage::getSpatialReference() const
 {
     return m_spatialReference;
diff --git a/src/StageFactory.cpp b/src/StageFactory.cpp
index 59ac097..c6cd431 100644
--- a/src/StageFactory.cpp
+++ b/src/StageFactory.cpp
@@ -53,6 +53,8 @@
 // readers
 #include <bpf/BpfReader.hpp>
 #include <faux/FauxReader.hpp>
+#include <gdal/GDALReader.hpp>
+#include <ilvis2/Ilvis2Reader.hpp>
 #include <las/LasReader.hpp>
 #include <optech/OptechReader.hpp>
 #include <pdal/BufferReader.hpp>
@@ -60,6 +62,7 @@
 #include <qfit/QfitReader.hpp>
 #include <sbet/SbetReader.hpp>
 #include <terrasolid/TerrasolidReader.hpp>
+#include <tindex/TIndexReader.hpp>
 
 // writers
 #include <bpf/BpfWriter.hpp>
@@ -105,6 +108,7 @@ std::string StageFactory::inferReaderDriver(const std::string& filename)
     drivers["sbet"] = "readers.sbet";
     drivers["sqlite"] = "readers.sqlite";
     drivers["sid"] = "readers.mrsid";
+    drivers["tindex"] = "readers.tindex";
 
     if (ext == "") return "";
     ext = ext.substr(1, ext.length()-1);
@@ -200,12 +204,15 @@ StageFactory::StageFactory(bool no_plugins)
     // readers
     PluginManager::initializePlugin(BpfReader_InitPlugin);
     PluginManager::initializePlugin(FauxReader_InitPlugin);
+    PluginManager::initializePlugin(GDALReader_InitPlugin);
+    PluginManager::initializePlugin(Ilvis2Reader_InitPlugin);
     PluginManager::initializePlugin(LasReader_InitPlugin);
     PluginManager::initializePlugin(OptechReader_InitPlugin);
     PluginManager::initializePlugin(PlyReader_InitPlugin);
     PluginManager::initializePlugin(QfitReader_InitPlugin);
     PluginManager::initializePlugin(SbetReader_InitPlugin);
     PluginManager::initializePlugin(TerrasolidReader_InitPlugin);
+    PluginManager::initializePlugin(TIndexReader_InitPlugin);
 
     // writers
     PluginManager::initializePlugin(BpfWriter_InitPlugin);
diff --git a/src/gitsha.cpp b/src/gitsha.cpp
index bd149e6..477c591 100644
--- a/src/gitsha.cpp
+++ b/src/gitsha.cpp
@@ -1,3 +1,3 @@
 #include <pdal/gitsha.h>
-#define GIT_SHA1 "a9d6693901c7f8c7bb8e57f640a2954c9115343f"
+#define GIT_SHA1 "5ba8ee566c5c4faf5285768ed4567668888b223a"
 const char g_GIT_SHA1[] = GIT_SHA1;
diff --git a/src/plang/Environment.cpp b/src/plang/Environment.cpp
index f6702a3..497f798 100644
--- a/src/plang/Environment.cpp
+++ b/src/plang/Environment.cpp
@@ -32,6 +32,10 @@
 * OF SUCH DAMAGE.
 ****************************************************************************/
 
+#ifndef _WIN32
+#include <dlfcn.h>
+#endif
+
 #include <pdal/plang/Environment.hpp>
 #include <pdal/plang/Redirector.hpp>
 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
@@ -51,6 +55,20 @@
 #undef tolower
 #undef isspace
 
+// See ticket #1010.  This function runs when libplang is loaded.  It makes
+// sure python symbols can be found by extention module .so's since on some
+// platforms (notably Ubuntu), they aren't linked with libpython even though
+// they depend on it.  If a platform doesn't support
+// __attribute__ ((constructor)) this does nothing.  We'll have to deal with
+// those as they come up.
+#ifndef _WIN32
+__attribute__ ((constructor))
+static void loadPython()
+{
+    std::cerr << "Force load python.\n";
+    ::dlopen(PDAL_PYTHON_LIBRARY, RTLD_LAZY | RTLD_GLOBAL);
+}
+#endif
 
 // http://www.linuxjournal.com/article/3641
 // http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I
diff --git a/test/data/autzen/attributes.json b/test/data/autzen/attributes.json
new file mode 100644
index 0000000..6a1ccd5
--- /dev/null
+++ b/test/data/autzen/attributes.json
@@ -0,0 +1,11 @@
+{
+"type": "FeatureCollection",
+                                                                                
+"features": [
+{ "type": "Feature", "properties": { "id": 6, "cls": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.067019000727967, 44.059524946819884 ], [ -123.066697831944637, 44.059771500882199 ], [ -123.065494970755537, 44.059838504937517 ], [ -123.064074882074451, 44.059742872480356 ], [ -123.063707784110264, 44.059184772926969 ], [ -123.06401206144227, 44.05752667418929 ], [ -123.065925935478475, 44.057786669839672 ], [ -123.065745673821624, 44.058221493390228 ], [ -123.066333794 [...]
+{ "type": "Feature", "properties": { "id": 4, "cls": 5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.064404672110015, 44.062248205780641 ], [ -123.063001791092177, 44.062295757390288 ], [ -123.062938948566199, 44.061866413306625 ], [ -123.063711529699802, 44.061825083575727 ], [ -123.062903757506561, 44.060798284876931 ], [ -123.0634590922878, 44.06084959530147 ], [ -123.063939134831102, 44.061205726019097 ], [ -123.064707560079256, 44.061834553141757 ], [ -123.0644046721 [...]
+{ "type": "Feature", "properties": { "id": 3, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.071105494548775, 44.059121603563895 ], [ -123.070160265697027, 44.059007342229378 ], [ -123.070431650409773, 44.058379004056327 ], [ -123.071225617617372, 44.058576450660659 ], [ -123.071105494548775, 44.059121603563895 ] ] ] } },
+{ "type": "Feature", "properties": { "id": 2, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.06887558672102, 44.059227793751305 ], [ -123.068425255931515, 44.059301773132752 ], [ -123.067936238335534, 44.059248990941661 ], [ -123.06749590912527, 44.059043544671049 ], [ -123.06710185170931, 44.058629650191868 ], [ -123.067099413306224, 44.058063335596437 ], [ -123.067333190514816, 44.057587417330502 ], [ -123.067852567837207, 44.057320435256116 ], [ -123.0682904503 [...]
+{ "type": "Feature", "properties": { "id": 1, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.071871740947586, 44.058426242457685 ], [ -123.070376025800414, 44.058117017731242 ], [ -123.07060216253906, 44.057465769662898 ], [ -123.072144836409578, 44.057837746292243 ], [ -123.071871740947586, 44.058426242457685 ] ] ] } }
+]
+}
diff --git a/test/data/autzen/attributes.vrt b/test/data/autzen/attributes.vrt
new file mode 100644
index 0000000..e0175a7
--- /dev/null
+++ b/test/data/autzen/attributes.vrt
@@ -0,0 +1,9 @@
+<OGRVRTDataSource>
+    <OGRVRTWarpedLayer>
+        <OGRVRTLayer name="OGRGeoJSON">
+            <SrcDataSource>attributes.json</SrcDataSource>
+            <LayerSRS>EPSG:4326</LayerSRS>
+        </OGRVRTLayer>
+        <TargetSRS>+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs</TargetSRS>
+    </OGRVRTWarpedLayer>
+</OGRVRTDataSource>
diff --git a/test/data/autzen/autzen-APMF.json b/test/data/autzen/autzen-APMF.json
new file mode 100644
index 0000000..0d90a73
--- /dev/null
+++ b/test/data/autzen/autzen-APMF.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ApproximateProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/autzen/autzen-interpolate.xml b/test/data/autzen/autzen-interpolate.xml
new file mode 100644
index 0000000..c8391c1
--- /dev/null
+++ b/test/data/autzen/autzen-interpolate.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.p2g">
+        <Option name="filename">
+            autzen-surface.tif
+        </Option>
+        <Option name="output_type">
+            min
+        </Option>
+        <Option name="output_format">
+            tif
+        </Option>
+        <Option name="grid_dist_x">
+          1.0
+        </Option>
+        <Option name="grid_dist_y">
+          1.0
+        </Option>
+        <Filter type="filters.pclblock">
+            <Option name="filename">
+                ./autzen-APMF.json
+            </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                /Users/hobu/dev/git/pdal/test/data/local/autzen/autzen-full.las
+            </Option>
+        </Reader>
+    </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/autzen/hag.py b/test/data/autzen/hag.py
new file mode 100644
index 0000000..3c123ff
--- /dev/null
+++ b/test/data/autzen/hag.py
@@ -0,0 +1,53 @@
+
+from osgeo import gdal
+gdal.UseExceptions()
+
+import struct
+
+objs = {}
+
+def wakeup(filename):
+
+    objs['ds'] = gdal.Open(filename)
+    objs['gt'] = objs['ds'].GetGeoTransform()
+    objs['band'] = objs['ds'].GetRasterBand(1)
+    return objs
+
+
+def read(x, y, objs):
+
+    # stolen from http://stackoverflow.com/questions/24537450/python-struct-error-unpack-requires-a-string-argument-of-length-2
+    gt = objs['gt']
+    ds = objs['ds']
+    band = objs['band']
+
+    px = int((x - gt[0]) / gt[1])
+    py = int((y - gt[3]) / gt[5])
+
+    val = band.ReadRaster(px,py,1,1,buf_type=gdal.GDT_Float32)
+    z = struct.unpack('f' , val)
+    return z[0]
+
+def filter(ins,outs):
+    HAG = ins['HAG']
+    X = ins['X']
+    Y = ins['Y']
+    Z = ins['Z']
+
+    objs = wakeup('autzen-surface.tif.min.tif')
+    print (objs)
+    for i in range(len(X)):
+        x = X[i]
+        y = Y[i]
+        z = Z[i]
+        surface_z = read(x, y, objs)
+#        print (x, y, z, surface_z)
+        hag = z - surface_z
+        if (surface_z  != -9999):
+            HAG[i] = hag
+    outs['Z'] = HAG
+    return True
+
+if __name__=='__main__':
+    objs = wakeup('autzen-surface.tif.min.tif')
+    print (read(636436,850412, objs))
diff --git a/test/data/autzen/hag.xml.in b/test/data/autzen/hag.xml.in
new file mode 100644
index 0000000..8e57514
--- /dev/null
+++ b/test/data/autzen/hag.xml.in
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            autzen-hag.las
+        </Option>
+        <Filter type="filters.programmable">
+            <Option name="script">
+                hag.py
+            </Option>
+            <Option name="function">
+                filter
+            </Option>
+            <Option name="module">
+                anything
+            </Option>
+            <Filter type="filters.ferry">
+                <Option name="dimension">
+                    Z
+                    <Options>
+                        <Option name="to">
+                            HAG
+                        </Option>
+                    </Options>
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/autzen/autzen.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/bpf/simple-extra.bpf b/test/data/bpf/simple-extra.bpf
new file mode 100644
index 0000000..3508c11
Binary files /dev/null and b/test/data/bpf/simple-extra.bpf differ
diff --git a/test/data/filters/colorize.xml.in b/test/data/filters/colorize.xml.in
index 5fc7c0b..bbcf6cb 100644
--- a/test/data/filters/colorize.xml.in
+++ b/test/data/filters/colorize.xml.in
@@ -5,38 +5,8 @@
             @CMAKE_SOURCE_DIR@/test/temp/colorized.las
         </Option>
         <Filter type="filters.colorization">
-            <Option name="dimension">
-                Red
-                <Options>
-                    <Option name="band">
-                        1
-                    </Option>
-                    <Option name="scale">
-                        1.0
-                    </Option>
-                </Options>
-            </Option>
-            <Option name="dimension">
-                Green
-                <Options>
-                    <Option name="band">
-                        2
-                    </Option>
-                    <Option name="scale">
-                        1.0
-                    </Option>
-                </Options>
-            </Option>
-            <Option name="dimension">
-                Blue
-                <Options>
-                    <Option name="band">
-                        3
-                    </Option>
-                    <Option name="scale">
-                        256
-                    </Option>
-                </Options>
+            <Option name="dimensions">
+                Red, Green, Blue::256
             </Option>
             <Option name="raster">
                 @CMAKE_SOURCE_DIR@/test/data/autzen/autzen.jpg
diff --git a/test/data/filters/ferry.xml.in b/test/data/filters/ferry.xml.in
index 849e7a8..b73e0d1 100644
--- a/test/data/filters/ferry.xml.in
+++ b/test/data/filters/ferry.xml.in
@@ -15,21 +15,8 @@
                 0.0000001
             </Option>
             <Filter type="filters.ferry">
-                <Option name="dimension">
-                    X
-                    <Options>
-                        <Option name="to">
-                            StatePlaneX
-                        </Option>
-                    </Options>
-                </Option>
-                <Option name="dimension">
-                    Y
-                    <Options>
-                        <Option name="to">
-                            StatePlaneY
-                        </Option>
-                    </Options>
+                <Option name="dimensions">
+                    X=StatePlaneX, Y=StatePlaneY
                 </Option>
                 <Reader type="readers.las">
                     <Option name="filename">
diff --git a/test/data/filters/merge2.xml.in b/test/data/filters/merge2.xml.in
new file mode 100644
index 0000000..d8ad037
--- /dev/null
+++ b/test/data/filters/merge2.xml.in
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.reprojection">
+        <Option name="out_srs">EPSG:2028</Option>
+        <Filter type="filters.merge">
+            <Reader type="readers.las">
+                <Option name="spatialreference">EPSG:2027</Option>
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+            <Reader type="readers.las">
+                <Option name="spatialreference">EPSG:2027</Option>
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Filter>
+</Pipeline>
diff --git a/test/data/filters/merge3.xml.in b/test/data/filters/merge3.xml.in
new file mode 100644
index 0000000..b407e29
--- /dev/null
+++ b/test/data/filters/merge3.xml.in
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+        <Filter type="filters.merge">
+            <Option name="verbose">5</Option>
+            <Reader type="readers.las">
+                <Option name="spatialreference">EPSG:2028</Option>
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+            <Reader type="readers.las">
+                <Option name="spatialreference">EPSG:2027</Option>
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/filters/range_classification.xml.in b/test/data/filters/range_classification.xml.in
index 489c17f..6e6d22b 100644
--- a/test/data/filters/range_classification.xml.in
+++ b/test/data/filters/range_classification.xml.in
@@ -5,11 +5,8 @@
             @CMAKE_SOURCE_DIR@/test/temp/only_class_equals_2.las
         </Option>
         <Filter type="filters.range">
-            <Option name="dimension">
-                Classification
-                <Options>
-                    <Option name="equals">2</Option>
-                </Options>
+            <Option name="limits">
+                Classification[2:2]
             </Option>
             <Reader type="readers.las">
                 <Option name="filename">
diff --git a/test/data/filters/range_z.xml.in b/test/data/filters/range_z.xml.in
index 1fa29ba..b59a6fc 100644
--- a/test/data/filters/range_z.xml.in
+++ b/test/data/filters/range_z.xml.in
@@ -5,12 +5,8 @@
             @CMAKE_SOURCE_DIR@/test/temp/only_z_400-500.las
         </Option>
         <Filter type="filters.range">
-            <Option name="dimension">
-                Z
-                <Options>
-                    <Option name="min">400</Option>
-                    <Option name="max">500</Option>
-                </Options>
+            <Option name="limits">
+                Z[400:500]
             </Option>
             <Reader type="readers.las">
                 <Option name="filename">
diff --git a/test/data/filters/range_z_classification.xml.in b/test/data/filters/range_z_classification.xml.in
index 9785a73..2c98b6e 100644
--- a/test/data/filters/range_z_classification.xml.in
+++ b/test/data/filters/range_z_classification.xml.in
@@ -5,18 +5,8 @@
             @CMAKE_SOURCE_DIR@/test/temp/only_z_400-500_class_equals_2.las
         </Option>
         <Filter type="filters.range">
-            <Option name="dimension">
-                Z
-                <Options>
-                    <Option name="min">400</Option>
-                    <Option name="max">500</Option>
-                </Options>
-            </Option>
-            <Option name="dimension">
-                Classification
-                <Options>
-                    <Option name="equals">2</Option>
-                </Options>
+            <Option name="limits">
+                Z[400:500], Classification[2:2]
             </Option>
             <Reader type="readers.las">
                 <Option name="filename">
diff --git a/test/data/hole/crop.xml.in b/test/data/hole/crop.xml.in
index edd4d86..574920d 100644
--- a/test/data/hole/crop.xml.in
+++ b/test/data/hole/crop.xml.in
@@ -2,11 +2,11 @@
 <Pipeline version="1.0">
     <Writer type="writers.las">
         <Option name="filename">
-            @CMAKE_SOURCE_DIR/test/temp/hole.las
+            @CMAKE_SOURCE_DIR@/test/temp/hole.las
         </Option>
         <Option name="compression">
             false
-        </Option>    
+        </Option>
         <Filter type="filters.crop">
             <Option name="polygon">
                 POLYGON ((-123.070497025496451 44.058766662574463,-123.065624990686828 44.058248360998967,-123.068009177934087 44.057108097532883,-123.066350612892521 44.056486135642295,-123.066661593837807 44.054101948395022,-123.070289704866255 44.054412929340323,-123.070497025496451 44.058766662574463))
diff --git a/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT
new file mode 100644
index 0000000..75398d1
--- /dev/null
+++ b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT
@@ -0,0 +1,1000 @@
+# Several elevations are derived from the LVIS Level 1B waveform product. Please visit lvis.gsfc.nasa.gov for discussion on the elevation product that may be most appropriate for your use.
+# LVIS_LFID SHOTNUMBER TIME LONGITUDE_CENTROID LATITUDE_CENTROID ELEVATION_CENTROID LONGITUDE_LOW LATITUDE_LOW ELEVATION_LOW LONGITUDE_HIGH LATITUDE_HIGH ELEVATION_HIGH
+1654935003  1103940  42504.48313  301.214787  78.307673   1956.583 301.214787  78.307672   1956.777 301.214787  78.307672   1956.777
+1654935003  1103941  42504.48512  301.215096  78.307592   1956.292 301.215097  78.307592   1956.588 301.215097  78.307592   1956.588
+1654935003  1103942  42504.48712  301.215410  78.307512   1956.353 301.215410  78.307512   1956.667 301.215410  78.307512   1956.667
+1654935003  1103943  42504.48912  301.215723  78.307432   1956.372 301.215723  78.307431   1956.576 301.215723  78.307431   1956.576
+1654935003  1103944  42504.49112  301.216035  78.307352   1956.359 301.216036  78.307352   1956.679 301.216036  78.307352   1956.679
+1654935003  1103945  42504.49312  301.216346  78.307272   1956.408 301.216346  78.307272   1956.689 301.216346  78.307272   1956.689
+1654935003  1103946  42504.49512  301.216655  78.307192   1956.404 301.216655  78.307191   1956.642 301.216655  78.307191   1956.642
+1654935003  1103947  42504.49712  301.216963  78.307111   1956.501 301.216963  78.307110   1956.743 301.216963  78.307110   1956.743
+1654935003  1103948  42504.49912  301.217270  78.307030   1956.528 301.217271  78.307029   1956.812 301.217271  78.307029   1956.812
+1654935003  1103949  42504.50112  301.217577  78.306949   1956.516 301.217577  78.306949   1956.791 301.217577  78.306949   1956.791
+1654935003  1103950  42504.50312  301.217884  78.306869   1956.645 301.217885  78.306868   1956.854 301.217885  78.306868   1956.854
+1654935003  1103951  42504.50512  301.218192  78.306788   1956.665 301.218192  78.306788   1956.919 301.218192  78.306788   1956.919
+1654935003  1103953  42504.50912  301.218807  78.306627   1956.772 301.218807  78.306627   1957.083 301.218807  78.306627   1957.083
+1654935003  1103954  42504.51112  301.219115  78.306546   1956.727 301.219115  78.306546   1957.006 301.219115  78.306546   1957.006
+1654935003  1103955  42504.51312  301.219424  78.306466   1956.856 301.219424  78.306466   1957.061 301.219424  78.306466   1957.061
+1654935003  1103956  42504.51512  301.219735  78.306386   1956.881 301.219735  78.306386   1957.026 301.219735  78.306386   1957.026
+1654935003  1103957  42504.51712  301.220047  78.306306   1956.878 301.220048  78.306306   1957.113 301.220048  78.306306   1957.113
+1654935003  1103958  42504.51911  301.220359  78.306227   1956.789 301.220359  78.306226   1957.073 301.220359  78.306226   1957.073
+1654935003  1103959  42504.52111  301.220669  78.306147   1956.928 301.220669  78.306147   1957.211 301.220669  78.306147   1957.211
+1654935003  1103960  42504.52311  301.220977  78.306067   1956.980 301.220978  78.306067   1957.280 301.220978  78.306067   1957.280
+1654935003  1103961  42504.52511  301.221283  78.305987   1957.051 301.221284  78.305987   1957.316 301.221284  78.305987   1957.316
+1654935003  1103962  42504.52711  301.221587  78.305906   1957.037 301.221588  78.305906   1957.332 301.221588  78.305906   1957.332
+1654935003  1103963  42504.52911  301.221892  78.305826   1957.098 301.221892  78.305825   1957.469 301.221892  78.305825   1957.469
+1654935003  1103964  42504.53111  301.222198  78.305745   1957.152 301.222198  78.305745   1957.455 301.222198  78.305745   1957.455
+1654935003  1103965  42504.53311  301.222504  78.305665   1957.079 301.222504  78.305665   1957.418 301.222504  78.305665   1957.418
+1654935003  1103966  42504.53511  301.222811  78.305586   1957.131 301.222811  78.305586   1957.370 301.222811  78.305586   1957.370
+1654935003  1103967  42504.53711  301.223117  78.305506   1957.133 301.223117  78.305506   1957.443 301.223117  78.305506   1957.443
+1654935003  1103968  42504.53911  301.223424  78.305427   1957.157 301.223424  78.305426   1957.473 301.223424  78.305426   1957.473
+1654935003  1103969  42504.54111  301.223729  78.305347   1957.229 301.223729  78.305347   1957.464 301.223729  78.305347   1957.464
+1654935003  1103970  42504.54311  301.224036  78.305267   1957.418 301.224036  78.305267   1957.654 301.224036  78.305267   1957.654
+1654935003  1103972  42504.54711  301.224651  78.305108   1957.367 301.224651  78.305108   1957.681 301.224651  78.305108   1957.681
+1654935003  1103973  42504.54911  301.224958  78.305029   1957.452 301.224958  78.305029   1957.647 301.224958  78.305029   1957.647
+1654935003  1103974  42504.55111  301.225266  78.304949   1957.571 301.225266  78.304949   1957.810 301.225266  78.304949   1957.810
+1654935003  1103975  42504.55311  301.225573  78.304869   1957.473 301.225573  78.304869   1957.800 301.225573  78.304869   1957.800
+1654935003  1103976  42504.55510  301.225879  78.304789   1957.555 301.225879  78.304789   1957.780 301.225879  78.304789   1957.780
+1654935003  1103977  42504.55710  301.226184  78.304708   1957.579 301.226184  78.304708   1957.862 301.226184  78.304708   1957.862
+1654935003  1103978  42504.55910  301.226490  78.304628   1957.625 301.226490  78.304628   1957.850 301.226490  78.304628   1957.850
+1654935003  1103979  42504.56110  301.226797  78.304549   1957.746 301.226797  78.304548   1958.025 301.226797  78.304548   1958.025
+1654935003  1103980  42504.56310  301.227105  78.304469   1957.674 301.227105  78.304469   1957.987 301.227105  78.304469   1957.987
+1654935003  1103981  42504.56510  301.227412  78.304390   1957.796 301.227412  78.304390   1958.013 301.227412  78.304390   1958.013
+1654935003  1103982  42504.56710  301.227719  78.304310   1957.835 301.227719  78.304310   1958.047 301.227719  78.304310   1958.047
+1654935003  1103983  42504.56910  301.228026  78.304231   1957.864 301.228026  78.304231   1958.017 301.228026  78.304231   1958.017
+1654935003  1103984  42504.57110  301.228331  78.304150   1957.930 301.228331  78.304150   1958.132 301.228331  78.304150   1958.132
+1654935003  1103985  42504.57310  301.228634  78.304071   1958.025 301.228634  78.304071   1958.168 301.228634  78.304071   1958.168
+1654935003  1103987  42504.57710  301.229249  78.303911   1957.980 301.229248  78.303911   1958.235 301.229248  78.303911   1958.235
+1654935003  1103989  42504.58110  301.229862  78.303752   1958.068 301.229862  78.303752   1958.322 301.229862  78.303752   1958.322
+1654935003  1103990  42504.58310  301.230168  78.303673   1958.078 301.230167  78.303673   1958.312 301.230167  78.303673   1958.312
+1654935003  1103992  42504.58710  301.230779  78.303514   1958.196 301.230779  78.303514   1958.471 301.230779  78.303514   1958.471
+1654935003  1103993  42504.58909  301.231086  78.303434   1958.196 301.231086  78.303434   1958.472 301.231086  78.303434   1958.472
+1654935003  1103994  42504.59109  301.231394  78.303354   1958.252 301.231394  78.303354   1958.519 301.231394  78.303354   1958.519
+1654935003  1103995  42504.59309  301.231702  78.303275   1958.328 301.231702  78.303275   1958.564 301.231702  78.303275   1958.564
+1654935003  1103996  42504.59509  301.232009  78.303195   1958.342 301.232008  78.303195   1958.609 301.232008  78.303195   1958.609
+1654935003  1103997  42504.59709  301.232315  78.303115   1958.320 301.232315  78.303115   1958.531 301.232315  78.303115   1958.531
+1654935003  1103998  42504.59909  301.232620  78.303035   1958.486 301.232620  78.303035   1958.635 301.232620  78.303035   1958.635
+1654935003  1103999  42504.60109  301.232923  78.302955   1958.610 301.232922  78.302955   1958.838 301.232922  78.302955   1958.838
+1654935003  1104000  42504.60309  301.233225  78.302875   1958.592 301.233225  78.302875   1958.748 301.233225  78.302875   1958.748
+1654935003  1104001  42504.60509  301.233531  78.302795   1958.599 301.233530  78.302795   1958.802 301.233530  78.302795   1958.802
+1654935003  1104002  42504.60709  301.233839  78.302717   1958.629 301.233838  78.302717   1958.835 301.233838  78.302717   1958.835
+1654935003  1104003  42504.60909  301.234147  78.302638   1958.651 301.234146  78.302638   1958.869 301.234146  78.302638   1958.869
+1654935003  1104004  42504.61109  301.234456  78.302558   1958.698 301.234456  78.302558   1958.877 301.234456  78.302558   1958.877
+1654935003  1104005  42504.61309  301.234766  78.302479   1958.646 301.234765  78.302479   1958.836 301.234765  78.302479   1958.836
+1654935003  1104006  42504.61509  301.235073  78.302399   1958.796 301.235073  78.302399   1958.973 301.235073  78.302399   1958.973
+1654935003  1104008  42504.61909  301.235683  78.302238   1958.926 301.235683  78.302238   1959.063 301.235683  78.302238   1959.063
+1654935003  1104010  42504.62308  301.236292  78.302078   1959.002 301.236292  78.302078   1959.140 301.236292  78.302078   1959.140
+1654935003  1104011  42504.62508  301.236597  78.301998   1959.097 301.236597  78.301998   1959.253 301.236597  78.301998   1959.253
+1654935003  1104012  42504.62708  301.236902  78.301919   1959.175 301.236901  78.301919   1959.402 301.236901  78.301919   1959.402
+1654935003  1104039  42504.68107  301.242260  78.300445   1959.800 301.242259  78.300445   1960.111 301.242259  78.300445   1960.111
+1654935003  1104040  42504.68307  301.241974  78.300529   1959.478 301.241973  78.300529   1959.740 301.241973  78.300529   1959.740
+1654935003  1104041  42504.68507  301.241689  78.300613   1959.396 301.241688  78.300613   1959.729 301.241688  78.300613   1959.729
+1654935003  1104042  42504.68707  301.241405  78.300697   1959.404 301.241404  78.300697   1959.701 301.241404  78.300697   1959.701
+1654935003  1104043  42504.68907  301.241121  78.300781   1959.337 301.241120  78.300781   1959.642 301.241120  78.300781   1959.642
+1654935003  1104044  42504.69106  301.240837  78.300864   1959.259 301.240836  78.300864   1959.562 301.240836  78.300864   1959.562
+1654935003  1104045  42504.69306  301.240553  78.300947   1959.262 301.240552  78.300947   1959.548 301.240552  78.300947   1959.548
+1654935003  1104046  42504.69506  301.240269  78.301030   1959.291 301.240268  78.301030   1959.554 301.240268  78.301030   1959.554
+1654935003  1104047  42504.69706  301.239983  78.301113   1959.256 301.239983  78.301113   1959.520 301.239983  78.301113   1959.520
+1654935003  1104048  42504.69906  301.239697  78.301196   1959.231 301.239696  78.301197   1959.515 301.239696  78.301197   1959.515
+1654935003  1104049  42504.70106  301.239407  78.301279   1959.231 301.239406  78.301280   1959.491 301.239406  78.301280   1959.491
+1654935003  1104050  42504.70306  301.239117  78.301363   1959.129 301.239116  78.301363   1959.394 301.239116  78.301363   1959.394
+1654935003  1104051  42504.70506  301.238829  78.301446   1958.998 301.238828  78.301446   1959.282 301.238828  78.301446   1959.282
+1654935003  1104052  42504.70706  301.238543  78.301529   1958.968 301.238542  78.301529   1959.277 301.238542  78.301529   1959.277
+1654935003  1104053  42504.70906  301.238259  78.301612   1958.875 301.238258  78.301612   1959.173 301.238258  78.301612   1959.173
+1654935003  1104054  42504.71106  301.237977  78.301696   1958.831 301.237977  78.301696   1959.138 301.237977  78.301696   1959.138
+1654935003  1104055  42504.71306  301.237696  78.301780   1958.785 301.237696  78.301780   1959.094 301.237696  78.301780   1959.094
+1654935003  1104056  42504.71506  301.237414  78.301863   1958.795 301.237413  78.301863   1959.081 301.237413  78.301863   1959.081
+1654935003  1104057  42504.71706  301.237129  78.301946   1958.749 301.237129  78.301946   1959.048 301.237129  78.301946   1959.048
+1654935003  1104058  42504.71906  301.236845  78.302029   1958.740 301.236844  78.302029   1958.997 301.236844  78.302029   1958.997
+1654935003  1104059  42504.72106  301.236558  78.302111   1958.722 301.236558  78.302111   1959.033 301.236558  78.302111   1959.033
+1654935003  1104060  42504.72306  301.236272  78.302194   1958.643 301.236271  78.302194   1958.951 301.236271  78.302194   1958.951
+1654935003  1104061  42504.72506  301.235985  78.302277   1958.593 301.235985  78.302277   1958.905 301.235985  78.302277   1958.905
+1654935003  1104062  42504.72705  301.235699  78.302361   1958.531 301.235699  78.302361   1958.872 301.235699  78.302361   1958.872
+1654935003  1104063  42504.72905  301.235413  78.302444   1958.454 301.235413  78.302444   1958.748 301.235413  78.302444   1958.748
+1654935003  1104064  42504.73105  301.235127  78.302527   1958.407 301.235127  78.302527   1958.727 301.235127  78.302527   1958.727
+1654935003  1104065  42504.73305  301.234844  78.302609   1958.393 301.234843  78.302609   1958.740 301.234843  78.302609   1958.740
+1654935003  1104066  42504.73505  301.234561  78.302691   1958.386 301.234560  78.302691   1958.726 301.234560  78.302691   1958.726
+1654935003  1104067  42504.73705  301.234279  78.302774   1958.296 301.234279  78.302774   1958.600 301.234279  78.302774   1958.600
+1654935003  1104068  42504.73905  301.233997  78.302857   1958.245 301.233997  78.302857   1958.604 301.233997  78.302857   1958.604
+1654935003  1104069  42504.74105  301.233715  78.302940   1958.250 301.233714  78.302940   1958.587 301.233714  78.302940   1958.587
+1654935003  1104070  42504.74305  301.233430  78.303024   1958.162 301.233430  78.303024   1958.506 301.233430  78.303024   1958.506
+1654935003  1104071  42504.74505  301.233145  78.303108   1958.130 301.233145  78.303108   1958.456 301.233145  78.303108   1958.456
+1654935003  1104072  42504.74705  301.232859  78.303190   1958.118 301.232859  78.303190   1958.441 301.232859  78.303190   1958.441
+1654935003  1104073  42504.74905  301.232574  78.303273   1958.040 301.232574  78.303273   1958.348 301.232574  78.303273   1958.348
+1654935003  1104075  42504.75305  301.232010  78.303437   1958.043 301.232009  78.303437   1958.371 301.232009  78.303437   1958.371
+1654935003  1104076  42504.75505  301.231727  78.303520   1957.970 301.231726  78.303520   1958.299 301.231726  78.303520   1958.299
+1654935003  1104077  42504.75705  301.231442  78.303603   1957.974 301.231442  78.303603   1958.285 301.231442  78.303603   1958.285
+1654935003  1104078  42504.75905  301.231157  78.303686   1957.880 301.231157  78.303686   1958.173 301.231157  78.303686   1958.173
+1654935003  1104079  42504.76104  301.230870  78.303768   1957.839 301.230870  78.303768   1958.181 301.230870  78.303768   1958.181
+1654935003  1104080  42504.76304  301.230584  78.303851   1957.831 301.230584  78.303851   1958.141 301.230584  78.303851   1958.141
+1654935003  1104081  42504.76504  301.230300  78.303934   1957.835 301.230299  78.303934   1958.143 301.230299  78.303934   1958.143
+1654935003  1104082  42504.76704  301.230018  78.304018   1957.855 301.230018  78.304018   1958.168 301.230018  78.304018   1958.168
+1654935003  1104083  42504.76904  301.229736  78.304101   1957.773 301.229736  78.304101   1958.099 301.229736  78.304101   1958.099
+1654935003  1104084  42504.77104  301.229454  78.304184   1957.696 301.229454  78.304184   1958.004 301.229454  78.304184   1958.004
+1654935003  1104085  42504.77304  301.229173  78.304267   1957.582 301.229173  78.304267   1957.917 301.229173  78.304267   1957.917
+1654935003  1104086  42504.77504  301.228889  78.304349   1957.556 301.228889  78.304349   1957.891 301.228889  78.304349   1957.891
+1654935003  1104087  42504.77704  301.228602  78.304431   1957.515 301.228602  78.304431   1957.842 301.228602  78.304431   1957.842
+1654935003  1104088  42504.77904  301.228316  78.304513   1957.486 301.228316  78.304513   1957.799 301.228316  78.304513   1957.799
+1654935003  1104089  42504.78104  301.228031  78.304595   1957.462 301.228031  78.304595   1957.790 301.228031  78.304595   1957.790
+1654935003  1104090  42504.78304  301.227746  78.304679   1957.428 301.227746  78.304679   1957.758 301.227746  78.304679   1957.758
+1654935003  1104091  42504.78504  301.227462  78.304762   1957.457 301.227462  78.304762   1957.811 301.227462  78.304762   1957.811
+1654935003  1104092  42504.78704  301.227180  78.304846   1957.446 301.227180  78.304846   1957.753 301.227180  78.304846   1957.753
+1654935003  1104093  42504.78904  301.226898  78.304929   1957.364 301.226898  78.304929   1957.676 301.226898  78.304929   1957.676
+1654935003  1104094  42504.79104  301.226616  78.305012   1957.214 301.226616  78.305012   1957.565 301.226616  78.305012   1957.565
+1654935003  1104095  42504.79304  301.226335  78.305094   1957.216 301.226335  78.305094   1957.500 301.226335  78.305094   1957.500
+1654935003  1104096  42504.79503  301.226052  78.305177   1957.167 301.226052  78.305177   1957.473 301.226052  78.305177   1957.473
+1654935003  1104097  42504.79703  301.225768  78.305259   1957.170 301.225768  78.305259   1957.505 301.225768  78.305259   1957.505
+1654935003  1104098  42504.79903  301.225482  78.305342   1957.168 301.225482  78.305342   1957.483 301.225482  78.305342   1957.483
+1654935003  1104099  42504.80103  301.225193  78.305425   1957.113 301.225193  78.305425   1957.416 301.225193  78.305425   1957.416
+1654935003  1104100  42504.80303  301.224903  78.305508   1957.044 301.224903  78.305507   1957.331 301.224903  78.305507   1957.331
+1654935003  1104101  42504.80503  301.224614  78.305590   1956.953 301.224615  78.305590   1957.286 301.224615  78.305590   1957.286
+1654935003  1104102  42504.80703  301.224327  78.305673   1956.901 301.224327  78.305673   1957.218 301.224327  78.305673   1957.218
+1654935003  1104103  42504.80903  301.224043  78.305756   1956.919 301.224043  78.305755   1957.234 301.224043  78.305755   1957.234
+1654935003  1104104  42504.81103  301.223765  78.305839   1956.902 301.223765  78.305839   1957.245 301.223765  78.305839   1957.245
+1654935003  1104105  42504.81303  301.223488  78.305923   1956.844 301.223488  78.305923   1957.139 301.223488  78.305923   1957.139
+1654935003  1104106  42504.81503  301.223208  78.306007   1956.808 301.223209  78.306006   1957.138 301.223209  78.306006   1957.138
+1654935003  1104107  42504.81703  301.222926  78.306090   1956.763 301.222926  78.306090   1957.077 301.222926  78.306090   1957.077
+1654935003  1104108  42504.81903  301.222641  78.306174   1956.796 301.222641  78.306173   1957.113 301.222641  78.306173   1957.113
+1654935003  1104109  42504.82103  301.222353  78.306256   1956.787 301.222353  78.306256   1957.089 301.222353  78.306256   1957.089
+1654935003  1104110  42504.82303  301.222064  78.306339   1956.655 301.222065  78.306338   1956.967 301.222065  78.306338   1956.967
+1654935003  1104111  42504.82503  301.221776  78.306421   1956.661 301.221776  78.306421   1956.987 301.221776  78.306421   1956.987
+1654935003  1104112  42504.82703  301.221487  78.306504   1956.659 301.221488  78.306504   1956.947 301.221488  78.306504   1956.947
+1654935003  1104113  42504.82902  301.221199  78.306587   1956.609 301.221199  78.306587   1956.881 301.221199  78.306587   1956.881
+1654935003  1104114  42504.83102  301.220911  78.306670   1956.562 301.220911  78.306670   1956.856 301.220911  78.306670   1956.856
+1654935003  1104115  42504.83302  301.220623  78.306753   1956.550 301.220623  78.306753   1956.878 301.220623  78.306753   1956.878
+1654935003  1104116  42504.83502  301.220337  78.306836   1956.513 301.220337  78.306836   1956.806 301.220337  78.306836   1956.806
+1654935003  1104117  42504.83702  301.220054  78.306920   1956.521 301.220055  78.306920   1956.779 301.220055  78.306920   1956.779
+1654935003  1104118  42504.83902  301.219772  78.307004   1956.463 301.219772  78.307003   1956.749 301.219772  78.307003   1956.749
+1654935003  1104119  42504.84102  301.219491  78.307088   1956.350 301.219492  78.307088   1956.638 301.219492  78.307088   1956.638
+1654935003  1104120  42504.84302  301.219210  78.307173   1956.348 301.219210  78.307173   1956.608 301.219210  78.307173   1956.608
+1654935003  1104121  42504.84502  301.218925  78.307257   1956.353 301.218925  78.307257   1956.626 301.218925  78.307257   1956.626
+1654935003  1104122  42504.84702  301.218636  78.307340   1956.336 301.218637  78.307340   1956.613 301.218637  78.307340   1956.613
+1654935003  1104123  42504.84902  301.218347  78.307423   1956.339 301.218348  78.307422   1956.621 301.218348  78.307422   1956.621
+1654935003  1104124  42504.85102  301.218056  78.307505   1956.215 301.218057  78.307504   1956.480 301.218057  78.307504   1956.480
+1654935003  1104125  42504.85302  301.217768  78.307587   1956.147 301.217768  78.307586   1956.378 301.217768  78.307586   1956.378
+1654935003  1104126  42504.85502  301.217480  78.307669   1956.097 301.217481  78.307669   1956.325 301.217481  78.307669   1956.325
+1654935003  1104129  42504.86102  301.216619  78.307922   1956.153 301.216620  78.307922   1956.429 301.216620  78.307922   1956.429
+1654935003  1104144  42504.89101  301.217698  78.307574   1956.125 301.217698  78.307573   1956.354 301.217698  78.307573   1956.354
+1654935003  1104146  42504.89501  301.218321  78.307411   1956.270 301.218321  78.307411   1956.513 301.218321  78.307411   1956.513
+1654935003  1104148  42504.89900  301.218937  78.307249   1956.279 301.218938  78.307249   1956.489 301.218938  78.307249   1956.489
+1654935003  1104149  42504.90100  301.219244  78.307169   1956.286 301.219244  78.307168   1956.509 301.219244  78.307168   1956.509
+1654935003  1104151  42504.90500  301.219855  78.307008   1956.409 301.219855  78.307008   1956.640 301.219855  78.307008   1956.640
+1654935003  1104152  42504.90700  301.220160  78.306927   1956.402 301.220161  78.306927   1956.683 301.220161  78.306927   1956.683
+1654935003  1104153  42504.90900  301.220468  78.306846   1956.436 301.220468  78.306846   1956.723 301.220468  78.306846   1956.723
+1654935003  1104154  42504.91100  301.220779  78.306765   1956.488 301.220779  78.306765   1956.767 301.220779  78.306765   1956.767
+1654935003  1104155  42504.91300  301.221092  78.306685   1956.495 301.221093  78.306685   1956.774 301.221093  78.306685   1956.774
+1654935003  1104156  42504.91500  301.221405  78.306605   1956.536 301.221405  78.306605   1956.793 301.221405  78.306605   1956.793
+1654935003  1104157  42504.91700  301.221717  78.306525   1956.606 301.221717  78.306525   1956.895 301.221717  78.306525   1956.895
+1654935003  1104158  42504.91900  301.222027  78.306446   1956.617 301.222027  78.306446   1956.920 301.222027  78.306446   1956.920
+1654935003  1104159  42504.92100  301.222334  78.306365   1956.679 301.222334  78.306365   1956.971 301.222334  78.306365   1956.971
+1654935003  1104161  42504.92500  301.222947  78.306204   1956.739 301.222947  78.306204   1956.989 301.222947  78.306204   1956.989
+1654935003  1104162  42504.92700  301.223253  78.306123   1956.696 301.223253  78.306123   1957.000 301.223253  78.306123   1957.000
+1654935003  1104163  42504.92900  301.223561  78.306042   1956.760 301.223561  78.306042   1957.069 301.223561  78.306042   1957.069
+1654935003  1104164  42504.93100  301.223869  78.305962   1956.771 301.223869  78.305962   1957.047 301.223869  78.305962   1957.047
+1654935003  1104165  42504.93299  301.224177  78.305882   1956.774 301.224177  78.305882   1957.074 301.224177  78.305882   1957.074
+1654935003  1104166  42504.93499  301.224485  78.305802   1956.820 301.224485  78.305802   1957.134 301.224485  78.305802   1957.134
+1654935003  1104167  42504.93699  301.224792  78.305722   1956.838 301.224792  78.305722   1957.173 301.224792  78.305722   1957.173
+1654935003  1104168  42504.93899  301.225098  78.305642   1956.967 301.225099  78.305642   1957.242 301.225099  78.305642   1957.242
+1654935003  1104169  42504.94099  301.225405  78.305563   1957.062 301.225406  78.305563   1957.330 301.225406  78.305563   1957.330
+1654935003  1104170  42504.94299  301.225712  78.305484   1957.076 301.225712  78.305483   1957.330 301.225712  78.305483   1957.330
+1654935003  1104171  42504.94499  301.226019  78.305404   1957.108 301.226019  78.305404   1957.378 301.226019  78.305404   1957.378
+1654935003  1104172  42504.94699  301.226326  78.305325   1957.106 301.226326  78.305325   1957.464 301.226326  78.305325   1957.464
+1654935003  1104173  42504.94899  301.226632  78.305245   1957.146 301.226632  78.305245   1957.484 301.226632  78.305245   1957.484
+1654935003  1104174  42504.95099  301.226937  78.305164   1957.193 301.226937  78.305164   1957.555 301.226937  78.305164   1957.555
+1654935003  1104175  42504.95299  301.227243  78.305083   1957.221 301.227243  78.305083   1957.536 301.227243  78.305083   1957.536
+1654935003  1104176  42504.95499  301.227549  78.305003   1957.312 301.227549  78.305003   1957.609 301.227549  78.305003   1957.609
+1654935003  1104177  42504.95699  301.227856  78.304923   1957.317 301.227856  78.304923   1957.596 301.227856  78.304923   1957.596
+1654935003  1104178  42504.95899  301.228163  78.304843   1957.298 301.228163  78.304843   1957.639 301.228163  78.304843   1957.639
+1654935003  1104179  42504.96099  301.228471  78.304764   1957.343 301.228471  78.304764   1957.646 301.228471  78.304764   1957.646
+1654935003  1104180  42504.96299  301.228777  78.304685   1957.340 301.228777  78.304684   1957.640 301.228777  78.304684   1957.640
+1654935003  1104181  42504.96499  301.229084  78.304605   1957.354 301.229084  78.304605   1957.650 301.229084  78.304605   1957.650
+1654935003  1104182  42504.96698  301.229390  78.304525   1957.440 301.229390  78.304525   1957.727 301.229390  78.304525   1957.727
+1654935003  1104183  42504.96898  301.229698  78.304445   1957.478 301.229698  78.304445   1957.798 301.229698  78.304445   1957.798
+1654935003  1104184  42504.97098  301.230006  78.304365   1957.626 301.230006  78.304365   1957.893 301.230006  78.304365   1957.893
+1654935003  1104185  42504.97298  301.230313  78.304286   1957.628 301.230313  78.304286   1957.916 301.230313  78.304286   1957.916
+1654935003  1104186  42504.97498  301.230622  78.304206   1957.596 301.230622  78.304206   1957.918 301.230622  78.304206   1957.918
+1654935003  1104187  42504.97698  301.230929  78.304126   1957.665 301.230929  78.304125   1958.001 301.230929  78.304125   1958.001
+1654935003  1104188  42504.97898  301.231235  78.304045   1957.745 301.231235  78.304045   1958.045 301.231235  78.304045   1958.045
+1654935003  1104189  42504.98098  301.231538  78.303965   1957.755 301.231538  78.303965   1958.063 301.231538  78.303965   1958.063
+1654935003  1104190  42504.98298  301.231840  78.303885   1957.839 301.231840  78.303885   1958.127 301.231840  78.303885   1958.127
+1654935003  1104191  42504.98498  301.232144  78.303805   1957.876 301.232144  78.303805   1958.181 301.232144  78.303805   1958.181
+1654935003  1104192  42504.98698  301.232449  78.303725   1957.831 301.232448  78.303725   1958.118 301.232448  78.303725   1958.118
+1654935003  1104193  42504.98898  301.232755  78.303646   1957.870 301.232754  78.303646   1958.135 301.232754  78.303646   1958.135
+1654935003  1104194  42504.99098  301.233064  78.303566   1957.913 301.233063  78.303566   1958.204 301.233063  78.303566   1958.204
+1654935003  1104195  42504.99298  301.233374  78.303486   1957.939 301.233374  78.303486   1958.312 301.233374  78.303486   1958.312
+1654935003  1104196  42504.99498  301.233683  78.303407   1957.951 301.233683  78.303407   1958.286 301.233683  78.303407   1958.286
+1654935003  1104197  42504.99698  301.233992  78.303327   1957.993 301.233991  78.303327   1958.300 301.233991  78.303327   1958.300
+1654935003  1104198  42504.99898  301.234299  78.303247   1958.115 301.234299  78.303247   1958.406 301.234299  78.303247   1958.406
+1654935003  1104199  42505.00097  301.234606  78.303167   1958.136 301.234605  78.303168   1958.416 301.234605  78.303168   1958.416
+1654935003  1104200  42505.00297  301.234911  78.303088   1958.191 301.234911  78.303088   1958.517 301.234911  78.303088   1958.517
+1654935003  1104201  42505.00497  301.235216  78.303008   1958.209 301.235216  78.303008   1958.478 301.235216  78.303008   1958.478
+1654935003  1104202  42505.00697  301.235521  78.302929   1958.318 301.235521  78.302929   1958.615 301.235521  78.302929   1958.615
+1654935003  1104203  42505.00897  301.235826  78.302849   1958.329 301.235826  78.302849   1958.626 301.235826  78.302849   1958.626
+1654935003  1104204  42505.01097  301.236131  78.302768   1958.473 301.236131  78.302768   1958.815 301.236131  78.302768   1958.815
+1654935003  1104205  42505.01297  301.236438  78.302688   1958.458 301.236437  78.302688   1958.712 301.236437  78.302688   1958.712
+1654935003  1104206  42505.01497  301.236745  78.302607   1958.526 301.236744  78.302607   1958.816 301.236744  78.302607   1958.816
+1654935003  1104207  42505.01697  301.237052  78.302527   1958.559 301.237052  78.302527   1958.826 301.237052  78.302527   1958.826
+1654935003  1104208  42505.01897  301.237360  78.302447   1958.609 301.237359  78.302447   1958.907 301.237359  78.302447   1958.907
+1654935003  1104209  42505.02097  301.237668  78.302368   1958.655 301.237667  78.302368   1958.954 301.237667  78.302368   1958.954
+1654935003  1104210  42505.02297  301.237976  78.302288   1958.593 301.237975  78.302288   1958.947 301.237975  78.302288   1958.947
+1654935003  1104211  42505.02497  301.238283  78.302209   1958.665 301.238282  78.302209   1958.982 301.238282  78.302209   1958.982
+1654935003  1104212  42505.02697  301.238590  78.302128   1958.685 301.238589  78.302128   1958.984 301.238589  78.302128   1958.984
+1654935003  1104213  42505.02897  301.238897  78.302048   1958.732 301.238896  78.302048   1959.013 301.238896  78.302048   1959.013
+1654935003  1104214  42505.03097  301.239206  78.301968   1958.756 301.239205  78.301968   1959.061 301.239205  78.301968   1959.061
+1654935003  1104215  42505.03297  301.239514  78.301887   1958.860 301.239513  78.301887   1959.167 301.239513  78.301887   1959.167
+1654935003  1104216  42505.03496  301.239822  78.301807   1958.877 301.239821  78.301807   1959.141 301.239821  78.301807   1959.141
+1654935003  1104217  42505.03696  301.240130  78.301727   1958.931 301.240129  78.301727   1959.186 301.240129  78.301727   1959.186
+1654935003  1104218  42505.03896  301.240438  78.301647   1958.922 301.240437  78.301647   1959.253 301.240437  78.301647   1959.253
+1654935003  1104219  42505.04096  301.240745  78.301566   1959.000 301.240744  78.301566   1959.270 301.240744  78.301566   1959.270
+1654935003  1104220  42505.04296  301.241052  78.301486   1958.940 301.241051  78.301486   1959.302 301.241051  78.301486   1959.302
+1654935003  1104221  42505.04496  301.241359  78.301405   1959.059 301.241358  78.301405   1959.351 301.241358  78.301405   1959.351
+1654935003  1104222  42505.04696  301.241667  78.301325   1959.120 301.241666  78.301325   1959.404 301.241666  78.301325   1959.404
+1654935003  1104223  42505.04896  301.241975  78.301244   1959.126 301.241974  78.301245   1959.397 301.241974  78.301245   1959.397
+1654935003  1104224  42505.05096  301.242284  78.301164   1959.184 301.242283  78.301164   1959.497 301.242283  78.301164   1959.497
+1654935003  1104228  42505.05896  301.243518  78.300841   1959.369 301.243518  78.300841   1959.617 301.243518  78.300841   1959.617
+1654935003  1104230  42505.06296  301.244135  78.300681   1959.467 301.244134  78.300682   1959.733 301.244134  78.300682   1959.733
+1654935003  1104238  42505.07895  301.244227  78.300567   1960.353 301.244227  78.300567   1960.489 301.244227  78.300567   1960.489
+1654935003  1104244  42505.09095  301.242521  78.301067   1959.238 301.242520  78.301067   1959.478 301.242520  78.301067   1959.478
+1654935003  1104245  42505.09295  301.242237  78.301150   1959.164 301.242237  78.301150   1959.463 301.242237  78.301150   1959.463
+1654935003  1104247  42505.09695  301.241667  78.301317   1959.151 301.241666  78.301317   1959.416 301.241666  78.301317   1959.416
+1654935003  1104248  42505.09895  301.241381  78.301400   1959.024 301.241380  78.301400   1959.319 301.241380  78.301400   1959.319
+1654935003  1104249  42505.10095  301.241092  78.301482   1958.948 301.241091  78.301483   1959.290 301.241091  78.301483   1959.290
+1654935003  1104250  42505.10295  301.240803  78.301565   1958.932 301.240802  78.301565   1959.284 301.240802  78.301565   1959.284
+1654935003  1104251  42505.10494  301.240516  78.301648   1958.924 301.240515  78.301648   1959.181 301.240515  78.301648   1959.181
+1654935003  1104252  42505.10694  301.240231  78.301730   1958.911 301.240230  78.301731   1959.208 301.240230  78.301731   1959.208
+1654935003  1104253  42505.10894  301.239947  78.301813   1958.860 301.239946  78.301813   1959.169 301.239946  78.301813   1959.169
+1654935003  1104254  42505.11094  301.239664  78.301896   1958.810 301.239663  78.301896   1959.078 301.239663  78.301896   1959.078
+1654935003  1104255  42505.11294  301.239382  78.301979   1958.714 301.239381  78.301979   1959.052 301.239381  78.301979   1959.052
+1654935003  1104256  42505.11494  301.239099  78.302062   1958.740 301.239098  78.302062   1959.032 301.239098  78.302062   1959.032
+1654935003  1104257  42505.11694  301.238815  78.302145   1958.676 301.238814  78.302145   1958.940 301.238814  78.302145   1958.940
+1654935003  1104259  42505.12094  301.238248  78.302311   1958.639 301.238247  78.302311   1958.927 301.238247  78.302311   1958.927
+1654935003  1104260  42505.12294  301.237963  78.302394   1958.595 301.237963  78.302394   1958.896 301.237963  78.302394   1958.896
+1654935003  1104261  42505.12494  301.237679  78.302477   1958.587 301.237678  78.302477   1958.872 301.237678  78.302477   1958.872
+1654935003  1104262  42505.12694  301.237394  78.302560   1958.538 301.237393  78.302560   1958.837 301.237393  78.302560   1958.837
+1654935003  1104263  42505.12894  301.237109  78.302643   1958.521 301.237109  78.302643   1958.786 301.237109  78.302643   1958.786
+1654935003  1104264  42505.13094  301.236823  78.302725   1958.410 301.236823  78.302725   1958.726 301.236823  78.302725   1958.726
+1654935003  1104265  42505.13294  301.236538  78.302807   1958.415 301.236537  78.302807   1958.735 301.236537  78.302807   1958.735
+1654935003  1104266  42505.13494  301.236253  78.302890   1958.331 301.236252  78.302890   1958.660 301.236252  78.302890   1958.660
+1654935003  1104267  42505.13694  301.235969  78.302972   1958.237 301.235969  78.302972   1958.555 301.235969  78.302972   1958.555
+1654935003  1104268  42505.13893  301.235686  78.303055   1958.215 301.235685  78.303055   1958.580 301.235685  78.303055   1958.580
+1654935003  1104269  42505.14093  301.235401  78.303137   1958.180 301.235400  78.303137   1958.503 301.235400  78.303137   1958.503
+1654935003  1104270  42505.14293  301.235116  78.303220   1958.136 301.235116  78.303220   1958.451 301.235116  78.303220   1958.451
+1654935003  1104271  42505.14493  301.234832  78.303302   1958.076 301.234832  78.303302   1958.409 301.234832  78.303302   1958.409
+1654935003  1104272  42505.14693  301.234549  78.303385   1958.078 301.234549  78.303385   1958.368 301.234549  78.303385   1958.368
+1654935003  1104273  42505.14893  301.234266  78.303468   1958.034 301.234266  78.303468   1958.322 301.234266  78.303468   1958.322
+1654935003  1104274  42505.15093  301.233986  78.303551   1958.006 301.233986  78.303551   1958.328 301.233986  78.303551   1958.328
+1654935003  1104275  42505.15293  301.233705  78.303634   1958.063 301.233705  78.303635   1958.397 301.233705  78.303635   1958.397
+1654935003  1104276  42505.15493  301.233423  78.303717   1957.983 301.233423  78.303717   1958.275 301.233423  78.303717   1958.275
+1654935003  1104277  42505.15693  301.233139  78.303800   1957.897 301.233139  78.303800   1958.145 301.233139  78.303800   1958.145
+1654935003  1104278  42505.15893  301.232854  78.303882   1957.891 301.232854  78.303882   1958.193 301.232854  78.303882   1958.193
+1654935003  1104279  42505.16093  301.232568  78.303964   1957.801 301.232567  78.303964   1958.115 301.232567  78.303964   1958.115
+1654935003  1104280  42505.16293  301.232281  78.304046   1957.790 301.232280  78.304046   1958.068 301.232280  78.304046   1958.068
+1654935003  1104281  42505.16493  301.231994  78.304128   1957.755 301.231994  78.304128   1958.072 301.231994  78.304128   1958.072
+1654935003  1104282  42505.16693  301.231708  78.304210   1957.687 301.231708  78.304210   1958.040 301.231708  78.304210   1958.040
+1654935003  1104283  42505.16893  301.231423  78.304293   1957.718 301.231423  78.304293   1958.026 301.231423  78.304293   1958.026
+1654935003  1104284  42505.17093  301.231138  78.304376   1957.643 301.231137  78.304376   1957.918 301.231137  78.304376   1957.918
+1654935003  1104286  42505.17492  301.230573  78.304541   1957.511 301.230572  78.304541   1957.815 301.230572  78.304541   1957.815
+1654935003  1104287  42505.17692  301.230293  78.304624   1957.498 301.230293  78.304624   1957.841 301.230293  78.304624   1957.841
+1654935003  1104288  42505.17892  301.230013  78.304707   1957.447 301.230013  78.304707   1957.745 301.230013  78.304707   1957.745
+1654935003  1104289  42505.18092  301.229734  78.304790   1957.391 301.229734  78.304790   1957.698 301.229734  78.304790   1957.698
+1654935003  1104290  42505.18292  301.229454  78.304873   1957.341 301.229454  78.304873   1957.680 301.229454  78.304873   1957.680
+1654935003  1104291  42505.18492  301.229170  78.304956   1957.290 301.229170  78.304956   1957.564 301.229170  78.304956   1957.564
+1654935003  1104292  42505.18692  301.228883  78.305038   1957.308 301.228883  78.305038   1957.627 301.228883  78.305038   1957.627
+1654935003  1104293  42505.18892  301.228595  78.305120   1957.224 301.228595  78.305120   1957.541 301.228595  78.305120   1957.541
+1654935003  1104294  42505.19092  301.228306  78.305201   1957.208 301.228306  78.305201   1957.521 301.228306  78.305201   1957.521
+1654935003  1104295  42505.19292  301.228019  78.305283   1957.201 301.228019  78.305283   1957.491 301.228019  78.305283   1957.491
+1654935003  1104296  42505.19492  301.227733  78.305366   1957.129 301.227733  78.305366   1957.434 301.227733  78.305366   1957.434
+1654935003  1104297  42505.19692  301.227450  78.305449   1957.145 301.227450  78.305449   1957.416 301.227450  78.305449   1957.416
+1654935003  1104298  42505.19892  301.227167  78.305532   1957.094 301.227167  78.305532   1957.423 301.227167  78.305532   1957.423
+1654935003  1104299  42505.20092  301.226883  78.305615   1957.146 301.226883  78.305615   1957.433 301.226883  78.305615   1957.433
+1654935003  1104300  42505.20292  301.226599  78.305698   1957.181 301.226599  78.305698   1957.445 301.226599  78.305698   1957.445
+1654935003  1104301  42505.20492  301.226316  78.305781   1957.119 301.226316  78.305781   1957.408 301.226316  78.305781   1957.408
+1654935003  1104302  42505.20691  301.226035  78.305864   1957.021 301.226035  78.305864   1957.258 301.226035  78.305864   1957.258
+1654935003  1104303  42505.20891  301.225753  78.305948   1956.952 301.225753  78.305947   1957.264 301.225753  78.305947   1957.264
+1654935003  1104304  42505.21091  301.225469  78.306031   1956.871 301.225469  78.306031   1957.165 301.225469  78.306031   1957.165
+1654935003  1104305  42505.21291  301.225184  78.306114   1956.809 301.225184  78.306114   1957.051 301.225184  78.306114   1957.051
+1654935003  1104306  42505.21491  301.224897  78.306196   1956.812 301.224897  78.306196   1957.071 301.224897  78.306196   1957.071
+1654935003  1104307  42505.21691  301.224607  78.306278   1956.754 301.224607  78.306278   1957.005 301.224607  78.306278   1957.005
+1654935003  1104308  42505.21891  301.224319  78.306360   1956.733 301.224319  78.306360   1956.984 301.224319  78.306360   1956.984
+1654935003  1104309  42505.22091  301.224031  78.306442   1956.672 301.224032  78.306442   1956.934 301.224032  78.306442   1956.934
+1654935003  1104310  42505.22291  301.223746  78.306525   1956.636 301.223746  78.306525   1956.892 301.223746  78.306525   1956.892
+1654935003  1104311  42505.22491  301.223461  78.306608   1956.640 301.223462  78.306608   1956.880 301.223462  78.306608   1956.880
+1654935003  1104312  42505.22691  301.223177  78.306692   1956.568 301.223177  78.306692   1956.840 301.223177  78.306692   1956.840
+1654935003  1104313  42505.22891  301.222891  78.306775   1956.640 301.222892  78.306775   1956.850 301.222892  78.306775   1956.850
+1654935003  1104314  42505.23091  301.222605  78.306859   1956.528 301.222606  78.306859   1956.850 301.222606  78.306859   1956.850
+1654935003  1104316  42505.23491  301.222034  78.307026   1956.411 301.222035  78.307026   1956.680 301.222035  78.307026   1956.680
+1654935003  1104317  42505.23691  301.221752  78.307110   1956.474 301.221753  78.307109   1956.775 301.221753  78.307109   1956.775
+1654935003  1104318  42505.23891  301.221469  78.307193   1956.396 301.221469  78.307193   1956.662 301.221469  78.307193   1956.662
+1654935003  1104319  42505.24091  301.221184  78.307276   1956.387 301.221184  78.307276   1956.663 301.221184  78.307276   1956.663
+1654935003  1104320  42505.24290  301.220897  78.307359   1956.386 301.220897  78.307359   1956.643 301.220897  78.307359   1956.643
+1654935003  1104321  42505.24490  301.220608  78.307442   1956.252 301.220608  78.307442   1956.484 301.220608  78.307442   1956.484
+1654935003  1104330  42505.26290  301.218024  78.308191   1956.424 301.218025  78.308191   1956.738 301.218025  78.308191   1956.738
+1654935003  1104339  42505.28089  301.217825  78.308157   1956.516 301.217826  78.308157   1956.883 301.217826  78.308157   1956.883
+1654935003  1104349  42505.30089  301.220942  78.307353   1956.391 301.220942  78.307352   1956.687 301.220942  78.307352   1956.687
+1654935003  1104350  42505.30289  301.221245  78.307271   1956.335 301.221246  78.307271   1956.582 301.221246  78.307271   1956.582
+1654935003  1104352  42505.30689  301.221852  78.307108   1956.471 301.221852  78.307108   1956.744 301.221852  78.307108   1956.744
+1654935003  1104353  42505.30889  301.222157  78.307027   1956.403 301.222157  78.307027   1956.657 301.222157  78.307027   1956.657
+1654935003  1104354  42505.31088  301.222465  78.306947   1956.488 301.222466  78.306947   1956.757 301.222466  78.306947   1956.757
+1654935003  1104355  42505.31288  301.222776  78.306867   1956.556 301.222776  78.306867   1956.804 301.222776  78.306867   1956.804
+1654935003  1104356  42505.31488  301.223087  78.306788   1956.556 301.223088  78.306788   1956.833 301.223088  78.306788   1956.833
+1654935003  1104357  42505.31688  301.223400  78.306708   1956.585 301.223401  78.306708   1956.851 301.223401  78.306708   1956.851
+1654935003  1104359  42505.32088  301.224025  78.306549   1956.631 301.224025  78.306548   1956.915 301.224025  78.306548   1956.915
+1654935003  1104361  42505.32488  301.224649  78.306387   1956.698 301.224649  78.306387   1956.969 301.224649  78.306387   1956.969
+1654935003  1104362  42505.32688  301.224959  78.306307   1956.716 301.224959  78.306307   1957.000 301.224959  78.306307   1957.000
+1654935003  1104363  42505.32888  301.225267  78.306226   1956.743 301.225267  78.306226   1957.016 301.225267  78.306226   1957.016
+1654935003  1104364  42505.33088  301.225570  78.306145   1956.809 301.225570  78.306145   1957.086 301.225570  78.306145   1957.086
+1654935003  1104365  42505.33288  301.225870  78.306064   1956.866 301.225870  78.306064   1957.169 301.225870  78.306064   1957.169
+1654935003  1104366  42505.33488  301.226172  78.305983   1956.978 301.226172  78.305983   1957.209 301.226172  78.305983   1957.209
+1654935003  1104367  42505.33688  301.226475  78.305902   1956.979 301.226475  78.305901   1957.252 301.226475  78.305901   1957.252
+1654935003  1104368  42505.33888  301.226781  78.305821   1957.046 301.226781  78.305821   1957.298 301.226781  78.305821   1957.298
+1654935003  1104369  42505.34088  301.227091  78.305741   1957.037 301.227091  78.305741   1957.280 301.227091  78.305741   1957.280
+1654935003  1104370  42505.34288  301.227402  78.305662   1957.060 301.227402  78.305662   1957.360 301.227402  78.305662   1957.360
+1654935003  1104371  42505.34487  301.227714  78.305583   1957.059 301.227714  78.305583   1957.367 301.227714  78.305583   1957.367
+1654935003  1104372  42505.34687  301.228026  78.305504   1957.102 301.228026  78.305504   1957.360 301.228026  78.305504   1957.360
+1654935003  1104373  42505.34887  301.228336  78.305425   1957.115 301.228336  78.305425   1957.428 301.228336  78.305425   1957.428
+1654935003  1104374  42505.35087  301.228646  78.305345   1957.239 301.228646  78.305345   1957.491 301.228646  78.305345   1957.491
+1654935003  1104375  42505.35287  301.228955  78.305265   1957.214 301.228955  78.305265   1957.498 301.228955  78.305265   1957.498
+1654935003  1104376  42505.35487  301.229262  78.305185   1957.237 301.229262  78.305185   1957.588 301.229262  78.305185   1957.588
+1654935003  1104377  42505.35687  301.229566  78.305105   1957.326 301.229566  78.305105   1957.645 301.229566  78.305105   1957.645
+1654935003  1104378  42505.35887  301.229870  78.305025   1957.370 301.229870  78.305025   1957.686 301.229870  78.305025   1957.686
+1654935003  1104379  42505.36087  301.230173  78.304944   1957.398 301.230173  78.304944   1957.755 301.230173  78.304944   1957.755
+1654935003  1104380  42505.36287  301.230475  78.304863   1957.517 301.230475  78.304863   1957.810 301.230475  78.304863   1957.810
+1654935003  1104381  42505.36487  301.230780  78.304782   1957.589 301.230780  78.304782   1957.888 301.230780  78.304782   1957.888
+1654935003  1104382  42505.36687  301.231086  78.304701   1957.527 301.231086  78.304701   1957.778 301.231086  78.304701   1957.778
+1654935003  1104383  42505.36887  301.231394  78.304621   1957.466 301.231394  78.304621   1957.758 301.231394  78.304621   1957.758
+1654935003  1104384  42505.37087  301.231704  78.304541   1957.543 301.231704  78.304541   1957.862 301.231704  78.304541   1957.862
+1654935003  1104385  42505.37287  301.232011  78.304463   1957.612 301.232011  78.304463   1957.916 301.232011  78.304463   1957.916
+1654935003  1104386  42505.37487  301.232320  78.304384   1957.611 301.232320  78.304384   1957.931 301.232320  78.304384   1957.931
+1654935003  1104387  42505.37687  301.232628  78.304305   1957.672 301.232628  78.304305   1957.961 301.232628  78.304305   1957.961
+1654935003  1104388  42505.37886  301.232937  78.304225   1957.758 301.232936  78.304225   1958.051 301.232936  78.304225   1958.051
+1654935003  1104389  42505.38086  301.233245  78.304145   1957.840 301.233245  78.304145   1958.111 301.233245  78.304145   1958.111
+1654935003  1104390  42505.38286  301.233554  78.304065   1957.885 301.233554  78.304065   1958.198 301.233554  78.304065   1958.198
+1654935003  1104391  42505.38486  301.233862  78.303984   1957.896 301.233862  78.303984   1958.226 301.233862  78.303984   1958.226
+1654935003  1104392  42505.38686  301.234169  78.303904   1957.930 301.234169  78.303904   1958.247 301.234169  78.303904   1958.247
+1654935003  1104393  42505.38886  301.234475  78.303824   1957.978 301.234474  78.303824   1958.282 301.234474  78.303824   1958.282
+1654935003  1104394  42505.39086  301.234778  78.303743   1957.963 301.234778  78.303743   1958.240 301.234778  78.303743   1958.240
+1654935003  1104395  42505.39286  301.235081  78.303662   1957.996 301.235081  78.303662   1958.303 301.235081  78.303662   1958.303
+1654935003  1104396  42505.39486  301.235386  78.303582   1958.053 301.235386  78.303582   1958.345 301.235386  78.303582   1958.345
+1654935003  1104397  42505.39686  301.235693  78.303502   1958.080 301.235693  78.303502   1958.442 301.235693  78.303502   1958.442
+1654935003  1104398  42505.39886  301.236001  78.303422   1958.111 301.236001  78.303422   1958.388 301.236001  78.303422   1958.388
+1654935003  1104399  42505.40086  301.236312  78.303342   1958.185 301.236311  78.303342   1958.503 301.236311  78.303342   1958.503
+1654935003  1104400  42505.40286  301.236623  78.303263   1958.269 301.236622  78.303263   1958.526 301.236622  78.303263   1958.526
+1654935003  1104401  42505.40486  301.236933  78.303183   1958.249 301.236933  78.303183   1958.548 301.236933  78.303183   1958.548
+1654935003  1104402  42505.40686  301.237243  78.303103   1958.298 301.237243  78.303103   1958.609 301.237243  78.303103   1958.609
+1654935003  1104403  42505.40886  301.237552  78.303023   1958.355 301.237552  78.303023   1958.712 301.237552  78.303023   1958.712
+1654935003  1104404  42505.41086  301.237859  78.302942   1958.360 301.237859  78.302942   1958.675 301.237859  78.302942   1958.675
+1654935003  1104405  42505.41285  301.238165  78.302862   1958.421 301.238164  78.302862   1958.718 301.238164  78.302862   1958.718
+1654935003  1104406  42505.41485  301.238470  78.302783   1958.476 301.238470  78.302783   1958.801 301.238470  78.302783   1958.801
+1654935003  1104407  42505.41685  301.238775  78.302703   1958.528 301.238775  78.302703   1958.830 301.238775  78.302703   1958.830
+1654935003  1104408  42505.41885  301.239080  78.302623   1958.569 301.239080  78.302623   1958.841 301.239080  78.302623   1958.841
+1654935003  1104409  42505.42085  301.239386  78.302543   1958.602 301.239386  78.302543   1958.916 301.239386  78.302543   1958.916
+1654935003  1104410  42505.42285  301.239694  78.302462   1958.623 301.239693  78.302462   1958.943 301.239693  78.302462   1958.943
+1654935003  1104411  42505.42485  301.240002  78.302381   1958.615 301.240001  78.302381   1958.925 301.240001  78.302381   1958.925
+1654935003  1104412  42505.42685  301.240311  78.302300   1958.681 301.240310  78.302300   1959.001 301.240310  78.302300   1959.001
+1654935003  1104413  42505.42885  301.240620  78.302220   1958.794 301.240619  78.302220   1959.081 301.240619  78.302220   1959.081
+1654935003  1104414  42505.43085  301.240928  78.302140   1958.917 301.240928  78.302140   1959.168 301.240928  78.302140   1959.168
+1654935003  1104415  42505.43285  301.241236  78.302060   1958.907 301.241235  78.302060   1959.222 301.241235  78.302060   1959.222
+1654935003  1104416  42505.43485  301.241543  78.301980   1958.912 301.241543  78.301981   1959.202 301.241543  78.301981   1959.202
+1654935003  1104417  42505.43685  301.241851  78.301901   1958.956 301.241850  78.301901   1959.225 301.241850  78.301901   1959.225
+1654935003  1104419  42505.44085  301.242469  78.301740   1959.018 301.242469  78.301740   1959.260 301.242469  78.301740   1959.260
+1654935003  1104423  42505.44884  301.243707  78.301418   1959.187 301.243706  78.301418   1959.474 301.243706  78.301418   1959.474
+1654935003  1104430  42505.46284  301.245868  78.300852   1959.517 301.245867  78.300852   1959.736 301.245867  78.300852   1959.736
+1654935003  1104431  42505.46484  301.246178  78.300772   1960.385 301.246177  78.300772   1960.504 301.246177  78.300772   1960.504
+1654935003  1104439  42505.48084  301.245681  78.300821   1959.751 301.245680  78.300821   1960.038 301.245680  78.300821   1960.038
+1654935003  1104441  42505.48483  301.245111  78.300986   1959.395 301.245110  78.300987   1959.673 301.245110  78.300987   1959.673
+1654935003  1104442  42505.48683  301.244826  78.301069   1959.423 301.244826  78.301070   1959.656 301.244826  78.301070   1959.656
+1654935003  1104443  42505.48883  301.244541  78.301152   1959.362 301.244541  78.301153   1959.645 301.244541  78.301153   1959.645
+1654935003  1104444  42505.49083  301.244258  78.301236   1959.316 301.244257  78.301236   1959.607 301.244257  78.301236   1959.607
+1654935003  1104445  42505.49283  301.243974  78.301320   1959.257 301.243973  78.301320   1959.513 301.243973  78.301320   1959.513
+1654935003  1104446  42505.49483  301.243690  78.301403   1959.213 301.243689  78.301403   1959.503 301.243689  78.301403   1959.503
+1654935003  1104447  42505.49683  301.243405  78.301486   1959.182 301.243405  78.301486   1959.411 301.243405  78.301486   1959.411
+1654935003  1104448  42505.49883  301.243121  78.301569   1959.100 301.243120  78.301569   1959.380 301.243120  78.301569   1959.380
+1654935003  1104449  42505.50083  301.242836  78.301652   1959.091 301.242835  78.301652   1959.358 301.242835  78.301652   1959.358
+1654935003  1104450  42505.50283  301.242550  78.301735   1959.007 301.242549  78.301735   1959.367 301.242549  78.301735   1959.367
+1654935003  1104451  42505.50483  301.242265  78.301817   1959.011 301.242264  78.301817   1959.327 301.242264  78.301817   1959.327
+1654935003  1104452  42505.50683  301.241980  78.301900   1958.990 301.241979  78.301900   1959.280 301.241979  78.301900   1959.280
+1654935003  1104453  42505.50883  301.241696  78.301982   1958.916 301.241695  78.301982   1959.208 301.241695  78.301982   1959.208
+1654935003  1104454  42505.51083  301.241411  78.302065   1958.883 301.241410  78.302065   1959.186 301.241410  78.302065   1959.186
+1654935003  1104455  42505.51283  301.241127  78.302147   1958.857 301.241127  78.302147   1959.107 301.241127  78.302147   1959.107
+1654935003  1104456  42505.51483  301.240844  78.302230   1958.851 301.240843  78.302230   1959.150 301.240843  78.302230   1959.150
+1654935003  1104457  42505.51682  301.240561  78.302313   1958.789 301.240561  78.302313   1959.105 301.240561  78.302313   1959.105
+1654935003  1104458  42505.51882  301.240278  78.302396   1958.680 301.240277  78.302396   1959.008 301.240277  78.302396   1959.008
+1654935003  1104459  42505.52082  301.239996  78.302480   1958.662 301.239996  78.302480   1958.961 301.239996  78.302480   1958.961
+1654935003  1104460  42505.52282  301.239715  78.302563   1958.584 301.239715  78.302563   1958.910 301.239715  78.302563   1958.910
+1654935003  1104461  42505.52482  301.239433  78.302646   1958.609 301.239432  78.302646   1958.904 301.239432  78.302646   1958.904
+1654935003  1104462  42505.52682  301.239149  78.302728   1958.581 301.239149  78.302728   1958.866 301.239149  78.302728   1958.866
+1654935003  1104463  42505.52882  301.238865  78.302810   1958.621 301.238864  78.302810   1958.896 301.238864  78.302810   1958.896
+1654935003  1104464  42505.53082  301.238579  78.302892   1958.508 301.238578  78.302892   1958.822 301.238578  78.302892   1958.822
+1654935003  1104465  42505.53282  301.238291  78.302975   1958.392 301.238291  78.302975   1958.748 301.238291  78.302975   1958.748
+1654935003  1104466  42505.53482  301.238004  78.303058   1958.376 301.238004  78.303058   1958.673 301.238004  78.303058   1958.673
+1654935003  1104467  42505.53682  301.237718  78.303141   1958.368 301.237718  78.303141   1958.659 301.237718  78.303141   1958.659
+1654935003  1104468  42505.53882  301.237433  78.303224   1958.309 301.237433  78.303224   1958.602 301.237433  78.303224   1958.602
+1654935003  1104469  42505.54082  301.237149  78.303306   1958.297 301.237149  78.303306   1958.609 301.237149  78.303306   1958.609
+1654935003  1104470  42505.54282  301.236866  78.303389   1958.218 301.236866  78.303389   1958.523 301.236866  78.303389   1958.523
+1654935003  1104471  42505.54482  301.236584  78.303472   1958.191 301.236584  78.303472   1958.547 301.236584  78.303472   1958.547
+1654935003  1104472  42505.54682  301.236305  78.303555   1958.155 301.236305  78.303555   1958.483 301.236305  78.303555   1958.483
+1654935003  1104473  42505.54882  301.236025  78.303638   1958.135 301.236024  78.303638   1958.425 301.236024  78.303638   1958.425
+1654935003  1104474  42505.55081  301.235744  78.303720   1958.099 301.235743  78.303720   1958.462 301.235743  78.303720   1958.462
+1654935003  1104475  42505.55281  301.235462  78.303803   1958.023 301.235461  78.303803   1958.306 301.235461  78.303803   1958.306
+1654935003  1104476  42505.55481  301.235178  78.303885   1958.007 301.235178  78.303885   1958.325 301.235178  78.303885   1958.325
+1654935003  1104477  42505.55681  301.234892  78.303967   1957.903 301.234892  78.303967   1958.193 301.234892  78.303967   1958.193
+1654935003  1104478  42505.55881  301.234607  78.304049   1957.849 301.234607  78.304049   1958.156 301.234607  78.304049   1958.156
+1654935003  1104479  42505.56081  301.234323  78.304131   1957.904 301.234323  78.304131   1958.259 301.234323  78.304131   1958.259
+1654935003  1104480  42505.56281  301.234040  78.304214   1957.852 301.234040  78.304214   1958.176 301.234040  78.304214   1958.176
+1654935003  1104481  42505.56481  301.233758  78.304296   1957.789 301.233757  78.304296   1958.094 301.233757  78.304296   1958.094
+1654935003  1104482  42505.56681  301.233475  78.304378   1957.821 301.233475  78.304378   1958.132 301.233475  78.304378   1958.132
+1654935003  1104483  42505.56881  301.233192  78.304461   1957.725 301.233192  78.304461   1958.029 301.233192  78.304461   1958.029
+1654935003  1104484  42505.57081  301.232909  78.304543   1957.658 301.232909  78.304543   1958.009 301.232909  78.304543   1958.009
+1654935003  1104485  42505.57281  301.232628  78.304625   1957.686 301.232628  78.304625   1958.028 301.232628  78.304625   1958.028
+1654935003  1104486  42505.57481  301.232345  78.304707   1957.632 301.232345  78.304707   1957.996 301.232345  78.304707   1957.996
+1654935003  1104487  42505.57681  301.232064  78.304790   1957.624 301.232064  78.304790   1957.944 301.232064  78.304790   1957.944
+1654935003  1104488  42505.57881  301.231782  78.304873   1957.500 301.231782  78.304873   1957.804 301.231782  78.304873   1957.804
+1654935003  1104489  42505.58081  301.231499  78.304956   1957.484 301.231499  78.304956   1957.777 301.231499  78.304956   1957.777
+1654935003  1104490  42505.58281  301.231217  78.305038   1957.438 301.231217  78.305038   1957.793 301.231217  78.305038   1957.793
+1654935003  1104491  42505.58480  301.230933  78.305121   1957.448 301.230933  78.305121   1957.740 301.230933  78.305121   1957.740
+1654935003  1104492  42505.58680  301.230649  78.305203   1957.356 301.230649  78.305203   1957.689 301.230649  78.305203   1957.689
+1654935003  1104493  42505.58880  301.230364  78.305285   1957.365 301.230365  78.305285   1957.688 301.230365  78.305285   1957.688
+1654935003  1104494  42505.59080  301.230081  78.305368   1957.368 301.230081  78.305368   1957.706 301.230081  78.305368   1957.706
+1654935003  1104495  42505.59280  301.229796  78.305451   1957.305 301.229797  78.305451   1957.671 301.229797  78.305451   1957.671
+1654935003  1104496  42505.59480  301.229512  78.305534   1957.278 301.229512  78.305534   1957.627 301.229512  78.305534   1957.627
+1654935003  1104497  42505.59680  301.229226  78.305617   1957.299 301.229227  78.305617   1957.630 301.229227  78.305617   1957.630
+1654935003  1104498  42505.59880  301.228941  78.305700   1957.172 301.228941  78.305700   1957.502 301.228941  78.305700   1957.502
+1654935003  1104499  42505.60080  301.228655  78.305782   1957.203 301.228655  78.305782   1957.553 301.228655  78.305782   1957.553
+1654935003  1104500  42505.60280  301.228369  78.305864   1957.094 301.228370  78.305864   1957.404 301.228370  78.305864   1957.404
+1654935003  1104501  42505.60480  301.228085  78.305947   1957.081 301.228086  78.305947   1957.399 301.228086  78.305947   1957.399
+1654935003  1104502  42505.60680  301.227804  78.306030   1957.077 301.227804  78.306030   1957.399 301.227804  78.306030   1957.399
+1654935003  1104503  42505.60880  301.227522  78.306113   1957.020 301.227522  78.306113   1957.389 301.227522  78.306113   1957.389
+1654935003  1104504  42505.61080  301.227239  78.306196   1956.993 301.227240  78.306196   1957.297 301.227240  78.306196   1957.297
+1654935003  1104505  42505.61280  301.226956  78.306278   1956.977 301.226957  78.306278   1957.335 301.226957  78.306278   1957.335
+1654935003  1104506  42505.61480  301.226673  78.306361   1956.956 301.226673  78.306361   1957.289 301.226673  78.306361   1957.289
+1654935003  1104507  42505.61680  301.226390  78.306444   1956.897 301.226390  78.306444   1957.216 301.226390  78.306444   1957.216
+1654935003  1104508  42505.61880  301.226106  78.306526   1956.883 301.226107  78.306526   1957.248 301.226107  78.306526   1957.248
+1654935003  1104509  42505.62079  301.225823  78.306609   1956.790 301.225823  78.306609   1957.111 301.225823  78.306609   1957.111
+1654935003  1104510  42505.62279  301.225539  78.306692   1956.779 301.225539  78.306692   1957.110 301.225539  78.306692   1957.110
+1654935003  1104511  42505.62479  301.225253  78.306775   1956.728 301.225254  78.306775   1957.041 301.225254  78.306775   1957.041
+1654935003  1104512  42505.62679  301.224965  78.306857   1956.729 301.224966  78.306857   1957.039 301.224966  78.306857   1957.039
+1654935003  1104513  42505.62879  301.224678  78.306940   1956.645 301.224678  78.306940   1956.975 301.224678  78.306940   1956.975
+1654935003  1104514  42505.63079  301.224390  78.307022   1956.665 301.224390  78.307022   1956.974 301.224390  78.307022   1956.974
+1654935003  1104515  42505.63279  301.224104  78.307105   1956.642 301.224104  78.307105   1956.915 301.224104  78.307105   1956.915
+1654935003  1104516  42505.63479  301.223819  78.307188   1956.562 301.223820  78.307188   1956.887 301.223820  78.307188   1956.887
+1654935003  1104517  42505.63679  301.223537  78.307272   1956.497 301.223538  78.307272   1956.752 301.223538  78.307272   1956.752
+1654935003  1104518  42505.63879  301.223254  78.307356   1956.488 301.223255  78.307356   1956.814 301.223255  78.307356   1956.814
+1654935003  1104519  42505.64079  301.222971  78.307439   1956.460 301.222971  78.307439   1956.764 301.222971  78.307439   1956.764
+1654935003  1104520  42505.64279  301.222686  78.307523   1956.483 301.222686  78.307522   1956.769 301.222686  78.307522   1956.769
+1654935003  1104521  42505.64479  301.222400  78.307606   1956.385 301.222401  78.307605   1956.677 301.222401  78.307605   1956.677
+1654935003  1104522  42505.64679  301.222115  78.307689   1956.351 301.222115  78.307688   1956.671 301.222115  78.307688   1956.671
+1654935003  1104523  42505.64879  301.221829  78.307772   1956.362 301.221830  78.307771   1956.682 301.221830  78.307771   1956.682
+1654935003  1104524  42505.65079  301.221543  78.307855   1956.324 301.221544  78.307855   1956.636 301.221544  78.307855   1956.636
+1654935003  1104525  42505.65279  301.221256  78.307938   1956.336 301.221256  78.307938   1956.614 301.221256  78.307938   1956.614
+1654935003  1104526  42505.65478  301.220968  78.308021   1956.282 301.220968  78.308021   1956.545 301.220968  78.308021   1956.545
+1654935003  1104527  42505.65678  301.220677  78.308104   1956.259 301.220677  78.308104   1956.568 301.220677  78.308104   1956.568
+1654935003  1104528  42505.65878  301.220387  78.308187   1956.227 301.220387  78.308187   1956.593 301.220387  78.308187   1956.593
+1654935003  1104529  42505.66078  301.220099  78.308270   1956.337 301.220099  78.308270   1956.667 301.220099  78.308270   1956.667
+1654935003  1104551  42505.70477  301.223375  78.307353   1956.518 301.223375  78.307353   1956.767 301.223375  78.307353   1956.767
+1654935003  1104560  42505.72276  301.226162  78.306629   1956.900 301.226163  78.306629   1957.054 301.226163  78.306629   1957.054
+1654935003  1104561  42505.72476  301.226470  78.306549   1956.972 301.226471  78.306549   1957.202 301.226471  78.306549   1957.202
+1654935003  1104562  42505.72676  301.226779  78.306469   1957.049 301.226779  78.306469   1957.338 301.226779  78.306469   1957.338
+1654935003  1104565  42505.73276  301.227706  78.306228   1957.203 301.227706  78.306228   1957.383 301.227706  78.306228   1957.383
+1654935003  1104568  42505.73876  301.228647  78.305988   1957.172 301.228647  78.305988   1957.514 301.228647  78.305988   1957.514
+1654935003  1104571  42505.74476  301.229578  78.305747   1957.299 301.229578  78.305747   1957.536 301.229578  78.305747   1957.536
+1654935003  1104575  42505.75276  301.230801  78.305424   1957.366 301.230801  78.305424   1957.663 301.230801  78.305424   1957.663
+1654935003  1104577  42505.75675  301.231418  78.305265   1957.574 301.231418  78.305265   1957.846 301.231418  78.305265   1957.846
+1654935003  1104578  42505.75875  301.231727  78.305185   1957.644 301.231727  78.305185   1957.860 301.231727  78.305185   1957.860
+1654935003  1104580  42505.76275  301.232344  78.305026   1957.707 301.232344  78.305026   1957.991 301.232344  78.305026   1957.991
+1654935003  1104581  42505.76475  301.232653  78.304947   1957.680 301.232653  78.304947   1957.935 301.232653  78.304947   1957.935
+1654935003  1104583  42505.76875  301.233273  78.304788   1957.842 301.233273  78.304787   1958.112 301.233273  78.304787   1958.112
+1654935003  1104584  42505.77075  301.233581  78.304707   1957.749 301.233581  78.304707   1958.019 301.233581  78.304707   1958.019
+1654935003  1104585  42505.77275  301.233886  78.304628   1957.795 301.233886  78.304628   1958.075 301.233886  78.304628   1958.075
+1654935003  1104586  42505.77475  301.234192  78.304547   1957.921 301.234192  78.304547   1958.193 301.234192  78.304547   1958.193
+1654935003  1104587  42505.77675  301.234497  78.304466   1957.864 301.234497  78.304466   1958.148 301.234497  78.304466   1958.148
+1654935003  1104588  42505.77875  301.234803  78.304385   1957.941 301.234802  78.304385   1958.144 301.234802  78.304385   1958.144
+1654935003  1104589  42505.78075  301.235111  78.304305   1958.061 301.235111  78.304305   1958.234 301.235111  78.304305   1958.234
+1654935003  1104590  42505.78275  301.235420  78.304225   1958.110 301.235420  78.304225   1958.417 301.235420  78.304225   1958.417
+1654935003  1104591  42505.78475  301.235729  78.304146   1958.155 301.235729  78.304146   1958.384 301.235729  78.304146   1958.384
+1654935003  1104593  42505.78875  301.236349  78.303987   1958.172 301.236348  78.303987   1958.423 301.236348  78.303987   1958.423
+1654935003  1104594  42505.79075  301.236657  78.303907   1958.210 301.236657  78.303907   1958.505 301.236657  78.303907   1958.505
+1654935003  1104595  42505.79274  301.236967  78.303827   1958.194 301.236966  78.303827   1958.499 301.236966  78.303827   1958.499
+1654935003  1104596  42505.79474  301.237276  78.303747   1958.361 301.237275  78.303747   1958.616 301.237275  78.303747   1958.616
+1654935003  1104597  42505.79674  301.237585  78.303667   1958.471 301.237585  78.303667   1958.721 301.237585  78.303667   1958.721
+1654935003  1104598  42505.79874  301.237894  78.303587   1958.392 301.237893  78.303587   1958.579 301.237893  78.303587   1958.579
+1654935003  1104599  42505.80074  301.238201  78.303507   1958.329 301.238200  78.303507   1958.613 301.238200  78.303507   1958.613
+1654935003  1104600  42505.80274  301.238506  78.303427   1958.455 301.238506  78.303427   1958.696 301.238506  78.303427   1958.696
+1654935003  1104601  42505.80474  301.238812  78.303346   1958.546 301.238812  78.303346   1958.812 301.238812  78.303346   1958.812
+1654935003  1104602  42505.80674  301.239118  78.303265   1958.566 301.239118  78.303265   1958.779 301.239118  78.303265   1958.779
+1654935003  1104603  42505.80874  301.239426  78.303184   1958.616 301.239426  78.303185   1958.895 301.239426  78.303185   1958.895
+1654935003  1104604  42505.81074  301.239737  78.303104   1958.697 301.239737  78.303104   1958.929 301.239737  78.303104   1958.929
+1654935003  1104605  42505.81274  301.240049  78.303024   1958.691 301.240049  78.303024   1958.955 301.240049  78.303024   1958.955
+1654935003  1104606  42505.81474  301.240361  78.302944   1958.586 301.240360  78.302944   1958.892 301.240360  78.302944   1958.892
+1654935003  1104607  42505.81674  301.240672  78.302864   1958.731 301.240671  78.302864   1959.045 301.240671  78.302864   1959.045
+1654935003  1104608  42505.81874  301.240983  78.302784   1958.750 301.240982  78.302784   1959.008 301.240982  78.302784   1959.008
+1654935003  1104609  42505.82074  301.241292  78.302704   1958.763 301.241292  78.302704   1959.105 301.241292  78.302704   1959.105
+1654935003  1104610  42505.82274  301.241601  78.302624   1958.891 301.241600  78.302624   1959.180 301.241600  78.302624   1959.180
+1654935003  1104611  42505.82474  301.241909  78.302544   1958.919 301.241909  78.302544   1959.219 301.241909  78.302544   1959.219
+1654935003  1104612  42505.82673  301.242218  78.302464   1959.012 301.242218  78.302464   1959.244 301.242218  78.302464   1959.244
+1654935003  1104613  42505.82873  301.242527  78.302384   1959.029 301.242526  78.302384   1959.298 301.242526  78.302384   1959.298
+1654935003  1104614  42505.83073  301.242834  78.302304   1959.085 301.242834  78.302304   1959.412 301.242834  78.302304   1959.412
+1654935003  1104615  42505.83273  301.243143  78.302223   1959.182 301.243142  78.302223   1959.319 301.243142  78.302223   1959.319
+1654935003  1104616  42505.83473  301.243450  78.302143   1959.219 301.243450  78.302143   1959.547 301.243450  78.302143   1959.547
+1654935003  1104617  42505.83673  301.243756  78.302061   1959.122 301.243756  78.302061   1959.369 301.243756  78.302061   1959.369
+1654935003  1104618  42505.83873  301.244063  78.301980   1959.213 301.244063  78.301980   1959.429 301.244063  78.301980   1959.429
+1654935003  1104619  42505.84073  301.244372  78.301900   1959.274 301.244372  78.301900   1959.579 301.244372  78.301900   1959.579
+1654935003  1104620  42505.84273  301.244682  78.301820   1959.274 301.244681  78.301820   1959.594 301.244681  78.301820   1959.594
+1654935003  1104621  42505.84473  301.244992  78.301740   1959.384 301.244991  78.301740   1959.710 301.244991  78.301740   1959.710
+1654935003  1104623  42505.84873  301.245616  78.301579   1959.347 301.245615  78.301580   1959.620 301.245615  78.301580   1959.620
+1654935003  1104624  42505.85073  301.245927  78.301499   1959.414 301.245927  78.301499   1959.658 301.245927  78.301499   1959.658
+1654935003  1104625  42505.85273  301.246240  78.301418   1959.419 301.246240  78.301418   1959.703 301.246240  78.301418   1959.703
+1654935003  1104626  42505.85473  301.246552  78.301337   1959.515 301.246551  78.301337   1959.764 301.246551  78.301337   1959.764
+1654935003  1104627  42505.85673  301.246863  78.301257   1959.521 301.246862  78.301257   1959.859 301.246862  78.301257   1959.859
+1654935003  1104628  42505.85873  301.247172  78.301176   1959.574 301.247171  78.301176   1959.886 301.247171  78.301176   1959.886
+1654935003  1104629  42505.86072  301.247479  78.301095   1959.665 301.247478  78.301096   1959.976 301.247478  78.301096   1959.976
+1654935003  1111542  42519.68271  301.310316  78.320202   1958.941 301.310316  78.320202   1959.130 301.310316  78.320202   1959.130
+1654935003  1111543  42519.68470  301.310622  78.320121   1959.066 301.310623  78.320121   1959.225 301.310623  78.320121   1959.225
+1654935003  1111545  42519.68870  301.311236  78.319958   1959.200 301.311237  78.319958   1959.357 301.311237  78.319958   1959.357
+1654935003  1111546  42519.69070  301.311546  78.319877   1959.143 301.311546  78.319877   1959.318 301.311546  78.319877   1959.318
+1654935003  1111548  42519.69470  301.312166  78.319717   1959.134 301.312166  78.319717   1959.449 301.312166  78.319717   1959.449
+1654935003  1111549  42519.69670  301.312473  78.319636   1959.216 301.312474  78.319636   1959.414 301.312474  78.319636   1959.414
+1654935003  1111550  42519.69870  301.312780  78.319555   1959.233 301.312781  78.319555   1959.451 301.312781  78.319555   1959.451
+1654935003  1111551  42519.70070  301.313087  78.319474   1959.409 301.313087  78.319474   1959.553 301.313087  78.319474   1959.553
+1654935003  1111553  42519.70470  301.313701  78.319311   1959.364 301.313701  78.319311   1959.519 301.313701  78.319311   1959.519
+1654935003  1111554  42519.70670  301.314010  78.319231   1959.336 301.314010  78.319230   1959.524 301.314010  78.319230   1959.524
+1654935003  1111557  42519.71270  301.314928  78.318988   1959.383 301.314928  78.318988   1959.540 301.314928  78.318988   1959.540
+1654935003  1111559  42519.71670  301.315537  78.318827   1959.451 301.315537  78.318827   1959.643 301.315537  78.318827   1959.643
+1654935003  1111560  42519.71869  301.315842  78.318746   1959.460 301.315842  78.318746   1959.601 301.315842  78.318746   1959.601
+1654935003  1111565  42519.72869  301.317374  78.318345   1959.670 301.317374  78.318345   1959.745 301.317374  78.318345   1959.745
+1654935003  1111566  42519.73069  301.317678  78.318265   1959.668 301.317678  78.318264   1959.924 301.317678  78.318264   1959.924
+1654935003  1111568  42519.73469  301.318290  78.318103   1959.728 301.318290  78.318103   1959.946 301.318290  78.318103   1959.946
+1654935003  1111569  42519.73669  301.318596  78.318023   1959.781 301.318596  78.318023   1960.029 301.318596  78.318023   1960.029
+1654935003  1111570  42519.73869  301.318902  78.317943   1959.825 301.318902  78.317943   1960.011 301.318902  78.317943   1960.011
+1654935003  1111571  42519.74069  301.319207  78.317862   1959.703 301.319207  78.317862   1959.847 301.319207  78.317862   1959.847
+1654935003  1111575  42519.74869  301.320424  78.317539   1959.982 301.320424  78.317539   1960.091 301.320424  78.317539   1960.091
+1654935003  1111583  42519.76468  301.322867  78.316898   1960.314 301.322867  78.316898   1960.459 301.322867  78.316898   1960.459
+1654935003  1111589  42519.77668  301.324686  78.316416   1960.348 301.324686  78.316416   1960.498 301.324686  78.316416   1960.498
+1654935003  1111653  42519.90464  301.333304  78.314286   1960.879 301.333303  78.314286   1961.160 301.333303  78.314286   1961.160
+1654935003  1111656  42519.91064  301.332460  78.314535   1960.855 301.332459  78.314535   1961.068 301.332459  78.314535   1961.068
+1654935003  1111658  42519.91464  301.331890  78.314701   1960.919 301.331890  78.314701   1961.068 301.331890  78.314701   1961.068
+1654935003  1111659  42519.91664  301.331606  78.314784   1960.899 301.331606  78.314784   1961.043 301.331606  78.314784   1961.043
+1654935003  1111660  42519.91864  301.331323  78.314866   1960.753 301.331323  78.314866   1960.918 301.331323  78.314866   1960.918
+1654935003  1111661  42519.92064  301.331039  78.314949   1960.800 301.331039  78.314949   1960.978 301.331039  78.314949   1960.978
+1654935003  1111663  42519.92463  301.330474  78.315115   1960.694 301.330473  78.315115   1960.965 301.330473  78.315115   1960.965
+1654935003  1111664  42519.92663  301.330193  78.315198   1960.656 301.330193  78.315198   1960.804 301.330193  78.315198   1960.804
+1654935003  1111665  42519.92863  301.329912  78.315281   1960.564 301.329912  78.315281   1960.739 301.329912  78.315281   1960.739
+1654935003  1111666  42519.93063  301.329632  78.315364   1960.601 301.329632  78.315364   1960.848 301.329632  78.315364   1960.848
+1654935003  1111667  42519.93263  301.329352  78.315448   1960.489 301.329352  78.315448   1960.770 301.329352  78.315448   1960.770
+1654935003  1111668  42519.93463  301.329072  78.315531   1960.577 301.329072  78.315531   1960.765 301.329072  78.315531   1960.765
+1654935003  1111669  42519.93663  301.328792  78.315614   1960.475 301.328792  78.315614   1960.849 301.328792  78.315614   1960.849
+1654935003  1111670  42519.93863  301.328512  78.315697   1960.572 301.328511  78.315697   1960.793 301.328511  78.315697   1960.793
+1654935003  1111671  42519.94063  301.328231  78.315780   1960.561 301.328231  78.315780   1960.803 301.328231  78.315780   1960.803
+1654935003  1111672  42519.94263  301.327950  78.315864   1960.542 301.327949  78.315864   1960.730 301.327949  78.315864   1960.730
+1654935003  1111673  42519.94463  301.327667  78.315946   1960.353 301.327667  78.315946   1960.649 301.327667  78.315946   1960.649
+1654935003  1111674  42519.94663  301.327384  78.316028   1960.334 301.327383  78.316028   1960.575 301.327383  78.316028   1960.575
+1654935003  1111675  42519.94863  301.327100  78.316111   1960.384 301.327100  78.316111   1960.592 301.327100  78.316111   1960.592
+1654935003  1111676  42519.95063  301.326816  78.316193   1960.286 301.326815  78.316193   1960.505 301.326815  78.316193   1960.505
+1654935003  1111677  42519.95263  301.326531  78.316275   1960.269 301.326531  78.316275   1960.563 301.326531  78.316275   1960.563
+1654935003  1111678  42519.95463  301.326248  78.316358   1960.179 301.326248  78.316358   1960.410 301.326248  78.316358   1960.410
+1654935003  1111679  42519.95663  301.325967  78.316441   1960.147 301.325967  78.316441   1960.325 301.325967  78.316441   1960.325
+1654935003  1111680  42519.95862  301.325686  78.316525   1960.102 301.325686  78.316525   1960.358 301.325686  78.316525   1960.358
+1654935003  1111681  42519.96062  301.325408  78.316609   1960.148 301.325407  78.316609   1960.458 301.325407  78.316609   1960.458
+1654935003  1111682  42519.96262  301.325131  78.316692   1960.128 301.325131  78.316692   1960.252 301.325131  78.316692   1960.252
+1654935003  1111683  42519.96462  301.324854  78.316775   1960.047 301.324853  78.316775   1960.325 301.324853  78.316775   1960.325
+1654935003  1111684  42519.96662  301.324575  78.316858   1960.102 301.324575  78.316858   1960.354 301.324575  78.316858   1960.354
+1654935003  1111685  42519.96862  301.324298  78.316940   1960.062 301.324298  78.316940   1960.395 301.324298  78.316940   1960.395
+1654935003  1111686  42519.97062  301.324018  78.317023   1960.081 301.324018  78.317023   1960.268 301.324018  78.317023   1960.268
+1654935003  1111687  42519.97262  301.323736  78.317105   1959.982 301.323736  78.317105   1960.285 301.323736  78.317105   1960.285
+1654935003  1111688  42519.97462  301.323453  78.317188   1959.983 301.323453  78.317188   1960.253 301.323453  78.317188   1960.253
+1654935003  1111689  42519.97662  301.323167  78.317270   1959.956 301.323167  78.317270   1960.242 301.323167  78.317270   1960.242
+1654935003  1111690  42519.97862  301.322882  78.317352   1959.953 301.322882  78.317352   1960.293 301.322882  78.317352   1960.293
+1654935003  1111691  42519.98062  301.322598  78.317435   1960.015 301.322597  78.317434   1960.295 301.322597  78.317434   1960.295
+1654935003  1111692  42519.98262  301.322316  78.317517   1959.896 301.322315  78.317517   1960.219 301.322315  78.317517   1960.219
+1654935003  1111693  42519.98462  301.322035  78.317600   1959.854 301.322035  78.317600   1960.108 301.322035  78.317600   1960.108
+1654935003  1111694  42519.98662  301.321759  78.317683   1959.807 301.321759  78.317683   1960.167 301.321759  78.317683   1960.167
+1654935003  1111695  42519.98862  301.321482  78.317767   1959.767 301.321482  78.317767   1959.996 301.321482  78.317767   1959.996
+1654935003  1111696  42519.99062  301.321205  78.317850   1959.734 301.321205  78.317850   1959.918 301.321205  78.317850   1959.918
+1654935003  1111697  42519.99261  301.320926  78.317933   1959.685 301.320926  78.317933   1959.966 301.320926  78.317933   1959.966
+1654935003  1111698  42519.99461  301.320645  78.318016   1959.772 301.320645  78.318016   1959.978 301.320645  78.318016   1959.978
+1654935003  1111699  42519.99661  301.320361  78.318100   1959.674 301.320361  78.318099   1959.978 301.320361  78.318099   1959.978
+1654935003  1111700  42519.99861  301.320077  78.318183   1959.658 301.320077  78.318183   1959.949 301.320077  78.318183   1959.949
+1654935003  1111701  42520.00061  301.319793  78.318266   1959.632 301.319793  78.318266   1959.987 301.319793  78.318266   1959.987
+1654935003  1111702  42520.00261  301.319509  78.318349   1959.563 301.319509  78.318349   1959.890 301.319509  78.318349   1959.890
+1654935003  1111703  42520.00461  301.319225  78.318432   1959.665 301.319225  78.318432   1959.894 301.319225  78.318432   1959.894
+1654935003  1111704  42520.00661  301.318942  78.318514   1959.592 301.318942  78.318514   1959.922 301.318942  78.318514   1959.922
+1654935003  1111705  42520.00861  301.318660  78.318596   1959.624 301.318660  78.318596   1959.848 301.318660  78.318596   1959.848
+1654935003  1111706  42520.01061  301.318377  78.318679   1959.496 301.318378  78.318679   1959.766 301.318378  78.318679   1959.766
+1654935003  1111707  42520.01261  301.318096  78.318762   1959.503 301.318096  78.318762   1959.752 301.318096  78.318762   1959.752
+1654935003  1111708  42520.01461  301.317815  78.318845   1959.346 301.317815  78.318845   1959.696 301.317815  78.318845   1959.696
+1654935003  1111709  42520.01661  301.317536  78.318929   1959.411 301.317536  78.318929   1959.661 301.317536  78.318929   1959.661
+1654935003  1111710  42520.01861  301.317256  78.319014   1959.391 301.317256  78.319013   1959.688 301.317256  78.319013   1959.688
+1654935003  1111711  42520.02061  301.316976  78.319097   1959.503 301.316976  78.319097   1959.791 301.316976  78.319097   1959.791
+1654935003  1111712  42520.02261  301.316694  78.319181   1959.427 301.316695  78.319181   1959.724 301.316695  78.319181   1959.724
+1654935003  1111713  42520.02461  301.316412  78.319264   1959.427 301.316412  78.319264   1959.616 301.316412  78.319264   1959.616
+1654935003  1111714  42520.02661  301.316129  78.319347   1959.307 301.316130  78.319346   1959.568 301.316130  78.319346   1959.568
+1654935003  1111715  42520.02860  301.315847  78.319429   1959.276 301.315847  78.319429   1959.622 301.315847  78.319429   1959.622
+1654935003  1111716  42520.03060  301.315563  78.319512   1959.272 301.315564  78.319512   1959.544 301.315564  78.319512   1959.544
+1654935003  1111717  42520.03260  301.315279  78.319595   1959.219 301.315279  78.319595   1959.471 301.315279  78.319595   1959.471
+1654935003  1111718  42520.03460  301.314994  78.319678   1959.174 301.314994  78.319678   1959.487 301.314994  78.319678   1959.487
+1654935003  1111719  42520.03660  301.314707  78.319761   1959.106 301.314707  78.319761   1959.411 301.314707  78.319761   1959.411
+1654935003  1111720  42520.03860  301.314420  78.319845   1959.051 301.314421  78.319845   1959.356 301.314421  78.319845   1959.356
+1654935003  1111721  42520.04060  301.314136  78.319928   1959.142 301.314137  78.319928   1959.448 301.314137  78.319928   1959.448
+1654935003  1111722  42520.04260  301.313855  78.320012   1959.116 301.313855  78.320012   1959.457 301.313855  78.320012   1959.457
+1654935003  1111723  42520.04460  301.313575  78.320096   1959.200 301.313575  78.320096   1959.433 301.313575  78.320096   1959.433
+1654935003  1111724  42520.04660  301.313298  78.320180   1959.184 301.313299  78.320180   1959.458 301.313299  78.320180   1959.458
+1654935003  1111725  42520.04860  301.313020  78.320264   1959.076 301.313020  78.320264   1959.291 301.313020  78.320264   1959.291
+1654935003  1111726  42520.05060  301.312739  78.320347   1959.058 301.312739  78.320347   1959.305 301.312739  78.320347   1959.305
+1654935003  1111727  42520.05260  301.312455  78.320430   1959.053 301.312455  78.320430   1959.341 301.312455  78.320430   1959.341
+1654935003  1111728  42520.05460  301.312169  78.320514   1959.018 301.312170  78.320513   1959.283 301.312170  78.320513   1959.283
+1654935003  1111729  42520.05660  301.311881  78.320597   1959.283 301.311882  78.320597   1959.444 301.311882  78.320597   1959.444
+1654935003  1111740  42520.07859  301.311953  78.320603   1959.114 301.311953  78.320603   1959.371 301.311953  78.320603   1959.371
+1654935003  1111741  42520.08059  301.312259  78.320523   1958.882 301.312260  78.320522   1959.231 301.312260  78.320522   1959.231
+1654935003  1111742  42520.08259  301.312564  78.320441   1958.952 301.312565  78.320441   1959.293 301.312565  78.320441   1959.293
+1654935003  1111743  42520.08459  301.312870  78.320360   1958.970 301.312870  78.320360   1959.289 301.312870  78.320360   1959.289
+1654935003  1111744  42520.08659  301.313178  78.320278   1959.066 301.313179  78.320278   1959.402 301.313179  78.320278   1959.402
+1654935003  1111745  42520.08859  301.313488  78.320196   1959.125 301.313489  78.320196   1959.441 301.313489  78.320196   1959.441
+1654935003  1111746  42520.09059  301.313797  78.320115   1959.033 301.313798  78.320114   1959.331 301.313798  78.320114   1959.331
+1654935003  1111747  42520.09259  301.314106  78.320033   1959.121 301.314106  78.320033   1959.454 301.314106  78.320033   1959.454
+1654935003  1111748  42520.09459  301.314413  78.319952   1959.073 301.314414  78.319952   1959.412 301.314414  78.319952   1959.412
+1654935003  1111749  42520.09658  301.314718  78.319871   1959.129 301.314718  78.319870   1959.422 301.314718  78.319870   1959.422
+1654935003  1111750  42520.09858  301.315022  78.319790   1959.096 301.315022  78.319789   1959.460 301.315022  78.319789   1959.460
+1654935003  1111751  42520.10058  301.315328  78.319709   1959.177 301.315329  78.319708   1959.490 301.315329  78.319708   1959.490
+1654935003  1111752  42520.10258  301.315637  78.319628   1959.155 301.315638  78.319628   1959.506 301.315638  78.319628   1959.506
+1654935003  1111753  42520.10458  301.315947  78.319547   1959.230 301.315947  78.319547   1959.539 301.315947  78.319547   1959.539
+1654935003  1111754  42520.10658  301.316257  78.319467   1959.246 301.316258  78.319466   1959.562 301.316258  78.319466   1959.562
+1654935003  1111755  42520.10858  301.316567  78.319386   1959.364 301.316567  78.319385   1959.661 301.316567  78.319385   1959.661
+1654935003  1111756  42520.11058  301.316874  78.319305   1959.355 301.316875  78.319304   1959.698 301.316875  78.319304   1959.698
+1654935003  1111757  42520.11258  301.317180  78.319223   1959.292 301.317180  78.319223   1959.567 301.317180  78.319223   1959.567
+1654935003  1111758  42520.11458  301.317485  78.319142   1959.305 301.317485  78.319142   1959.614 301.317485  78.319142   1959.614
+1654935003  1111759  42520.11658  301.317789  78.319062   1959.294 301.317790  78.319062   1959.602 301.317790  78.319062   1959.602
+1654935003  1111760  42520.11858  301.318093  78.318982   1959.304 301.318094  78.318982   1959.651 301.318094  78.318982   1959.651
+1654935003  1111761  42520.12058  301.318398  78.318901   1959.349 301.318398  78.318901   1959.668 301.318398  78.318901   1959.668
+1654935003  1111762  42520.12258  301.318703  78.318821   1959.463 301.318703  78.318821   1959.796 301.318703  78.318821   1959.796
+1654935003  1111763  42520.12458  301.319008  78.318740   1959.477 301.319008  78.318740   1959.802 301.319008  78.318740   1959.802
+1654935003  1111764  42520.12658  301.319312  78.318659   1959.558 301.319313  78.318659   1959.852 301.319313  78.318659   1959.852
+1654935003  1111765  42520.12858  301.319618  78.318577   1959.552 301.319618  78.318577   1959.870 301.319618  78.318577   1959.870
+1654935003  1111766  42520.13057  301.319925  78.318497   1959.619 301.319925  78.318496   1959.990 301.319925  78.318496   1959.990
+1654935003  1111767  42520.13257  301.320233  78.318416   1959.559 301.320233  78.318416   1959.921 301.320233  78.318416   1959.921
+1654935003  1111768  42520.13457  301.320541  78.318336   1959.605 301.320541  78.318336   1959.908 301.320541  78.318336   1959.908
+1654935003  1111769  42520.13657  301.320848  78.318256   1959.626 301.320848  78.318256   1959.990 301.320848  78.318256   1959.990
+1654935003  1111770  42520.13857  301.321153  78.318177   1959.672 301.321153  78.318177   1959.975 301.321153  78.318177   1959.975
+1654935003  1111771  42520.14057  301.321457  78.318097   1959.731 301.321457  78.318097   1960.085 301.321457  78.318097   1960.085
+1654935003  1111772  42520.14257  301.321761  78.318016   1959.752 301.321761  78.318016   1960.093 301.321761  78.318016   1960.093
+1654935003  1111773  42520.14457  301.322065  78.317935   1959.784 301.322065  78.317935   1960.094 301.322065  78.317935   1960.094
+1654935003  1111774  42520.14657  301.322371  78.317854   1959.775 301.322371  78.317854   1960.115 301.322371  78.317854   1960.115
+1654935003  1111775  42520.14857  301.322678  78.317773   1959.828 301.322678  78.317773   1960.192 301.322678  78.317773   1960.192
+1654935003  1111776  42520.15057  301.322983  78.317692   1959.850 301.322983  78.317692   1960.196 301.322983  78.317692   1960.196
+1654935003  1111777  42520.15257  301.323288  78.317611   1959.844 301.323288  78.317611   1960.148 301.323288  78.317611   1960.148
+1654935003  1111778  42520.15457  301.323592  78.317531   1959.838 301.323592  78.317531   1960.178 301.323592  78.317531   1960.178
+1654935003  1111779  42520.15657  301.323894  78.317450   1959.899 301.323894  78.317450   1960.247 301.323894  78.317450   1960.247
+1654935003  1111780  42520.15857  301.324198  78.317370   1959.813 301.324198  78.317369   1960.154 301.324198  78.317369   1960.154
+1654935003  1111781  42520.16057  301.324505  78.317289   1959.875 301.324504  78.317289   1960.222 301.324504  78.317289   1960.222
+1654935003  1111782  42520.16257  301.324813  78.317209   1959.862 301.324813  78.317209   1960.200 301.324813  78.317209   1960.200
+1654935003  1111783  42520.16456  301.325121  78.317129   1960.033 301.325121  78.317129   1960.380 301.325121  78.317129   1960.380
+1654935003  1111784  42520.16656  301.325431  78.317049   1960.000 301.325430  78.317049   1960.341 301.325430  78.317049   1960.341
+1654935003  1111785  42520.16856  301.325737  78.316969   1960.037 301.325737  78.316968   1960.311 301.325737  78.316968   1960.311
+1654935003  1111786  42520.17056  301.326043  78.316888   1960.080 301.326042  78.316888   1960.410 301.326042  78.316888   1960.410
+1654935003  1111787  42520.17256  301.326347  78.316807   1960.054 301.326347  78.316807   1960.330 301.326347  78.316807   1960.330
+1654935003  1111788  42520.17456  301.326651  78.316726   1960.151 301.326651  78.316726   1960.396 301.326651  78.316726   1960.396
+1654935003  1111789  42520.17656  301.326955  78.316645   1960.126 301.326954  78.316645   1960.425 301.326954  78.316645   1960.425
+1654935003  1111790  42520.17856  301.327257  78.316565   1960.090 301.327257  78.316565   1960.457 301.327257  78.316565   1960.457
+1654935003  1111791  42520.18056  301.327560  78.316485   1960.089 301.327560  78.316485   1960.441 301.327560  78.316485   1960.441
+1654935003  1111792  42520.18256  301.327862  78.316405   1960.153 301.327862  78.316405   1960.441 301.327862  78.316405   1960.441
+1654935003  1111793  42520.18456  301.328166  78.316324   1960.204 301.328165  78.316324   1960.523 301.328165  78.316324   1960.523
+1654935003  1111794  42520.18656  301.328470  78.316243   1960.302 301.328470  78.316243   1960.639 301.328470  78.316243   1960.639
+1654935003  1111795  42520.18856  301.328777  78.316162   1960.247 301.328776  78.316162   1960.596 301.328776  78.316162   1960.596
+1654935003  1111796  42520.19056  301.329084  78.316082   1960.320 301.329084  78.316082   1960.600 301.329084  78.316082   1960.600
+1654935003  1111797  42520.19256  301.329391  78.316002   1960.351 301.329390  78.316002   1960.694 301.329390  78.316002   1960.694
+1654935003  1111798  42520.19456  301.329697  78.315922   1960.389 301.329697  78.315922   1960.752 301.329697  78.315922   1960.752
+1654935003  1111799  42520.19656  301.330003  78.315842   1960.450 301.330002  78.315842   1960.742 301.330002  78.315842   1960.742
+1654935003  1111800  42520.19856  301.330307  78.315762   1960.486 301.330307  78.315762   1960.817 301.330307  78.315762   1960.817
+1654935003  1111801  42520.20055  301.330612  78.315682   1960.570 301.330611  78.315682   1960.869 301.330611  78.315682   1960.869
+1654935003  1111802  42520.20255  301.330917  78.315601   1960.569 301.330917  78.315601   1960.900 301.330917  78.315601   1960.900
+1654935003  1111803  42520.20455  301.331224  78.315520   1960.558 301.331223  78.315520   1960.966 301.331223  78.315520   1960.966
+1654935003  1111804  42520.20655  301.331531  78.315439   1960.637 301.331531  78.315439   1960.959 301.331531  78.315439   1960.959
+1654935003  1111805  42520.20855  301.331838  78.315358   1960.610 301.331838  78.315358   1960.909 301.331838  78.315358   1960.909
+1654935003  1111806  42520.21055  301.332144  78.315277   1960.735 301.332143  78.315277   1961.032 301.332143  78.315277   1961.032
+1654935003  1111807  42520.21255  301.332448  78.315196   1960.627 301.332448  78.315196   1960.978 301.332448  78.315196   1960.978
+1654935003  1111808  42520.21455  301.332753  78.315115   1960.631 301.332752  78.315115   1960.960 301.332752  78.315115   1960.960
+1654935003  1111809  42520.21655  301.333056  78.315034   1960.664 301.333055  78.315035   1961.027 301.333055  78.315035   1961.027
+1654935003  1111810  42520.21855  301.333360  78.314954   1960.794 301.333359  78.314954   1961.101 301.333359  78.314954   1961.101
+1654935003  1111811  42520.22055  301.333666  78.314873   1960.926 301.333666  78.314874   1961.093 301.333666  78.314874   1961.093
+1654935003  1111812  42520.22255  301.333973  78.314793   1960.851 301.333973  78.314793   1961.146 301.333973  78.314793   1961.146
+1654935003  1111813  42520.22455  301.334281  78.314713   1960.917 301.334280  78.314713   1961.189 301.334280  78.314713   1961.189
+1654935003  1111814  42520.22655  301.334589  78.314632   1960.855 301.334588  78.314632   1961.224 301.334588  78.314632   1961.224
+1654935003  1111815  42520.22855  301.334898  78.314551   1960.861 301.334897  78.314551   1961.260 301.334897  78.314551   1961.260
+1654935003  1111816  42520.23055  301.335206  78.314470   1960.915 301.335205  78.314470   1961.200 301.335205  78.314470   1961.200
+1654935003  1111817  42520.23255  301.335513  78.314389   1961.085 301.335513  78.314389   1961.315 301.335513  78.314389   1961.315
+1654935003  1111818  42520.23454  301.335821  78.314308   1961.016 301.335820  78.314308   1961.270 301.335820  78.314308   1961.270
+1654935003  1111819  42520.23654  301.336127  78.314227   1961.059 301.336127  78.314227   1961.281 301.336127  78.314227   1961.281
+1654935003  1111820  42520.23854  301.336433  78.314146   1961.099 301.336432  78.314146   1961.438 301.336432  78.314146   1961.438
+1654935003  1111821  42520.24054  301.336737  78.314065   1961.204 301.336737  78.314065   1961.504 301.336737  78.314065   1961.504
+1654935003  1111822  42520.24254  301.337044  78.313984   1961.151 301.337043  78.313984   1961.430 301.337043  78.313984   1961.430
+1654935003  1111823  42520.24454  301.337350  78.313903   1961.159 301.337350  78.313903   1961.378 301.337350  78.313903   1961.378
+1654935003  1111824  42520.24654  301.337657  78.313821   1961.224 301.337657  78.313821   1961.472 301.337657  78.313821   1961.472
+1654935003  1111825  42520.24854  301.337966  78.313740   1961.185 301.337965  78.313740   1961.404 301.337965  78.313740   1961.404
+1654935003  1111826  42520.25054  301.338274  78.313659   1961.265 301.338273  78.313659   1961.460 301.338273  78.313659   1961.460
+1654935003  1111827  42520.25254  301.338581  78.313578   1961.316 301.338581  78.313578   1961.489 301.338581  78.313578   1961.489
+1654935003  1111828  42520.25454  301.338889  78.313498   1961.256 301.338889  78.313498   1961.449 301.338889  78.313498   1961.449
+1654935003  1111829  42520.25654  301.339197  78.313418   1961.371 301.339196  78.313418   1961.517 301.339196  78.313418   1961.517
+1654935003  1111840  42520.27853  301.339274  78.313420   1961.241 301.339272  78.313420   1961.598 301.339272  78.313420   1961.598
+1654935003  1111841  42520.28053  301.338993  78.313504   1961.097 301.338992  78.313504   1961.442 301.338992  78.313504   1961.442
+1654935003  1111842  42520.28253  301.338713  78.313588   1961.151 301.338712  78.313588   1961.469 301.338712  78.313588   1961.469
+1654935003  1111843  42520.28453  301.338433  78.313671   1961.017 301.338432  78.313672   1961.324 301.338432  78.313672   1961.324
+1654935003  1111844  42520.28653  301.338151  78.313755   1960.998 301.338150  78.313755   1961.373 301.338150  78.313755   1961.373
+1654935003  1111845  42520.28853  301.337870  78.313838   1961.010 301.337869  78.313838   1961.412 301.337869  78.313838   1961.412
+1654935003  1111846  42520.29053  301.337587  78.313921   1961.021 301.337586  78.313922   1961.341 301.337586  78.313922   1961.341
+1654935003  1111847  42520.29253  301.337302  78.314004   1961.049 301.337301  78.314005   1961.293 301.337301  78.314005   1961.293
+1654935003  1111848  42520.29453  301.337017  78.314088   1961.085 301.337016  78.314088   1961.378 301.337016  78.314088   1961.378
+1654935003  1111849  42520.29653  301.336732  78.314171   1961.001 301.336731  78.314171   1961.323 301.336731  78.314171   1961.323
+1654935003  1111850  42520.29853  301.336448  78.314255   1960.957 301.336447  78.314255   1961.266 301.336447  78.314255   1961.266
+1654935003  1111851  42520.30053  301.336163  78.314338   1960.970 301.336162  78.314338   1961.337 301.336162  78.314338   1961.337
+1654935003  1111852  42520.30252  301.335881  78.314421   1960.970 301.335880  78.314421   1961.322 301.335880  78.314421   1961.322
+1654935003  1111853  42520.30452  301.335599  78.314504   1960.923 301.335599  78.314504   1961.228 301.335599  78.314504   1961.228
+1654935003  1111854  42520.30652  301.335320  78.314587   1960.820 301.335319  78.314587   1961.108 301.335319  78.314587   1961.108
+1654935003  1111855  42520.30852  301.335041  78.314670   1960.839 301.335040  78.314670   1961.135 301.335040  78.314670   1961.135
+1654935003  1111856  42520.31052  301.334761  78.314754   1960.765 301.334761  78.314754   1961.101 301.334761  78.314754   1961.101
+1654935003  1111857  42520.31252  301.334481  78.314837   1960.764 301.334480  78.314837   1961.123 301.334480  78.314837   1961.123
+1654935003  1111858  42520.31452  301.334200  78.314921   1960.757 301.334199  78.314921   1961.061 301.334199  78.314921   1961.061
+1654935003  1111859  42520.31652  301.333917  78.315004   1960.681 301.333916  78.315004   1961.016 301.333916  78.315004   1961.016
+1654935003  1111860  42520.31852  301.333634  78.315087   1960.738 301.333634  78.315087   1961.073 301.333634  78.315087   1961.073
+1654935003  1111861  42520.32052  301.333353  78.315170   1960.697 301.333352  78.315170   1960.991 301.333352  78.315170   1960.991
+1654935003  1111862  42520.32252  301.333072  78.315252   1960.656 301.333071  78.315253   1960.998 301.333071  78.315253   1960.998
+1654935003  1111863  42520.32452  301.332791  78.315335   1960.612 301.332790  78.315335   1960.919 301.332790  78.315335   1960.919
+1654935003  1111864  42520.32652  301.332509  78.315418   1960.589 301.332509  78.315418   1960.892 301.332509  78.315418   1960.892
+1654935003  1111865  42520.32852  301.332227  78.315501   1960.597 301.332227  78.315501   1960.935 301.332227  78.315501   1960.935
+1654935003  1111866  42520.33052  301.331945  78.315584   1960.502 301.331944  78.315584   1960.800 301.331944  78.315584   1960.800
+1654935003  1111867  42520.33252  301.331662  78.315667   1960.450 301.331662  78.315667   1960.859 301.331662  78.315667   1960.859
+1654935003  1111868  42520.33452  301.331381  78.315749   1960.500 301.331380  78.315749   1960.829 301.331380  78.315749   1960.829
+1654935003  1111869  42520.33651  301.331100  78.315832   1960.542 301.331099  78.315833   1960.891 301.331099  78.315833   1960.891
+1654935003  1111870  42520.33851  301.330820  78.315916   1960.545 301.330819  78.315916   1960.825 301.330819  78.315916   1960.825
+1654935003  1111871  42520.34051  301.330541  78.315999   1960.403 301.330541  78.315999   1960.690 301.330541  78.315999   1960.690
+1654935003  1111872  42520.34251  301.330263  78.316082   1960.343 301.330262  78.316082   1960.680 301.330262  78.316082   1960.680
+1654935003  1111873  42520.34451  301.329984  78.316164   1960.332 301.329984  78.316164   1960.661 301.329984  78.316164   1960.661
+1654935003  1111874  42520.34651  301.329706  78.316247   1960.332 301.329705  78.316247   1960.662 301.329705  78.316247   1960.662
+1654935003  1111875  42520.34851  301.329427  78.316330   1960.284 301.329426  78.316330   1960.648 301.329426  78.316330   1960.648
+1654935003  1111876  42520.35051  301.329147  78.316413   1960.279 301.329147  78.316413   1960.604 301.329147  78.316413   1960.604
+1654935003  1111877  42520.35251  301.328867  78.316496   1960.160 301.328867  78.316496   1960.513 301.328867  78.316496   1960.513
+1654935003  1111878  42520.35451  301.328585  78.316578   1960.202 301.328585  78.316578   1960.497 301.328585  78.316578   1960.497
+1654935003  1111879  42520.35651  301.328302  78.316661   1960.313 301.328301  78.316661   1960.659 301.328301  78.316661   1960.659
+1654935003  1111880  42520.35851  301.328018  78.316744   1960.255 301.328018  78.316744   1960.630 301.328018  78.316744   1960.630
+1654935003  1111881  42520.36051  301.327734  78.316827   1960.128 301.327734  78.316827   1960.456 301.327734  78.316827   1960.456
+1654935003  1111882  42520.36251  301.327452  78.316909   1960.106 301.327452  78.316909   1960.460 301.327452  78.316909   1960.460
+1654935003  1111883  42520.36451  301.327171  78.316991   1960.057 301.327171  78.316991   1960.347 301.327171  78.316991   1960.347
+1654935003  1111884  42520.36651  301.326893  78.317074   1960.011 301.326893  78.317074   1960.337 301.326893  78.317074   1960.337
+1654935003  1111885  42520.36851  301.326617  78.317157   1960.040 301.326617  78.317157   1960.362 301.326617  78.317157   1960.362
+1654935003  1111886  42520.37051  301.326340  78.317240   1959.931 301.326340  78.317240   1960.252 301.326340  78.317240   1960.252
+1654935003  1111887  42520.37250  301.326062  78.317324   1959.990 301.326061  78.317324   1960.276 301.326061  78.317324   1960.276
+1654935003  1111888  42520.37450  301.325783  78.317408   1959.941 301.325783  78.317408   1960.228 301.325783  78.317408   1960.228
+1654935003  1111889  42520.37650  301.325504  78.317491   1959.915 301.325503  78.317490   1960.215 301.325503  78.317490   1960.215
+1654935003  1111890  42520.37850  301.325224  78.317573   1959.864 301.325224  78.317573   1960.199 301.325224  78.317573   1960.199
+1654935003  1111891  42520.38050  301.324943  78.317656   1959.966 301.324943  78.317655   1960.250 301.324943  78.317655   1960.250
+1654935003  1111892  42520.38250  301.324662  78.317738   1959.830 301.324661  78.317738   1960.191 301.324661  78.317738   1960.191
+1654935003  1111893  42520.38450  301.324380  78.317820   1959.806 301.324380  78.317820   1960.164 301.324380  78.317820   1960.164
+1654935003  1111894  42520.38650  301.324097  78.317902   1959.738 301.324097  78.317902   1960.079 301.324097  78.317902   1960.079
+1654935003  1111895  42520.38850  301.323814  78.317985   1959.731 301.323814  78.317985   1960.109 301.323814  78.317985   1960.109
+1654935003  1111896  42520.39050  301.323533  78.318067   1959.695 301.323532  78.318067   1960.030 301.323532  78.318067   1960.030
+1654935003  1111897  42520.39250  301.323251  78.318151   1959.739 301.323251  78.318150   1960.030 301.323251  78.318150   1960.030
+1654935003  1111898  42520.39450  301.322972  78.318234   1959.634 301.322972  78.318234   1959.949 301.322972  78.318234   1959.949
+1654935003  1111899  42520.39650  301.322695  78.318318   1959.663 301.322695  78.318318   1959.969 301.322695  78.318318   1959.969
+1654935003  1111900  42520.39850  301.322418  78.318401   1959.524 301.322418  78.318401   1959.974 301.322418  78.318401   1959.974
+1654935003  1111901  42520.40050  301.322140  78.318485   1959.627 301.322140  78.318485   1959.968 301.322140  78.318485   1959.968
+1654935003  1111902  42520.40250  301.321862  78.318567   1959.519 301.321862  78.318567   1959.844 301.321862  78.318567   1959.844
+1654935003  1111903  42520.40450  301.321582  78.318650   1959.605 301.321582  78.318650   1959.894 301.321582  78.318650   1959.894
+1654935003  1111904  42520.40649  301.321299  78.318732   1959.597 301.321300  78.318732   1959.881 301.321300  78.318732   1959.881
+1654935003  1111905  42520.40849  301.321016  78.318815   1959.557 301.321016  78.318814   1959.935 301.321016  78.318814   1959.935
+1654935003  1111906  42520.41049  301.320733  78.318897   1959.557 301.320733  78.318897   1959.843 301.320733  78.318897   1959.843
+1654935003  1111907  42520.41249  301.320448  78.318981   1959.474 301.320448  78.318981   1959.777 301.320448  78.318981   1959.777
+1654935003  1111908  42520.41449  301.320165  78.319064   1959.406 301.320165  78.319064   1959.728 301.320165  78.319064   1959.728
+1654935003  1111909  42520.41649  301.319883  78.319148   1959.408 301.319883  78.319148   1959.697 301.319883  78.319148   1959.697
+1654935003  1111910  42520.41849  301.319602  78.319231   1959.468 301.319602  78.319231   1959.821 301.319602  78.319231   1959.821
+1654935003  1111911  42520.42049  301.319322  78.319314   1959.419 301.319322  78.319314   1959.721 301.319322  78.319314   1959.721
+1654935003  1111912  42520.42249  301.319045  78.319397   1959.345 301.319046  78.319397   1959.684 301.319046  78.319397   1959.684
+1654935003  1111913  42520.42449  301.318767  78.319480   1959.300 301.318768  78.319480   1959.616 301.318768  78.319480   1959.616
+1654935003  1111914  42520.42649  301.318489  78.319563   1959.325 301.318489  78.319563   1959.631 301.318489  78.319563   1959.631
+1654935003  1111915  42520.42849  301.318208  78.319647   1959.239 301.318209  78.319647   1959.539 301.318209  78.319647   1959.539
+1654935003  1111916  42520.43049  301.317926  78.319730   1959.218 301.317927  78.319730   1959.547 301.317927  78.319730   1959.547
+1654935003  1111917  42520.43249  301.317642  78.319814   1959.253 301.317642  78.319814   1959.532 301.317642  78.319814   1959.532
+1654935003  1111918  42520.43449  301.317357  78.319897   1959.153 301.317357  78.319897   1959.483 301.317357  78.319897   1959.483
+1654935003  1111919  42520.43649  301.317073  78.319980   1959.205 301.317073  78.319980   1959.508 301.317073  78.319980   1959.508
+1654935003  1111920  42520.43849  301.316789  78.320063   1959.197 301.316790  78.320063   1959.535 301.316790  78.320063   1959.535
+1654935003  1111921  42520.44048  301.316507  78.320146   1959.136 301.316508  78.320146   1959.446 301.316508  78.320146   1959.446
+1654935003  1111922  42520.44248  301.316228  78.320229   1959.079 301.316228  78.320229   1959.415 301.316228  78.320229   1959.415
+1654935003  1111923  42520.44448  301.315947  78.320313   1959.071 301.315948  78.320312   1959.409 301.315948  78.320312   1959.409
+1654935003  1111924  42520.44648  301.315666  78.320396   1958.978 301.315666  78.320396   1959.265 301.315666  78.320396   1959.265
+1654935003  1111925  42520.44848  301.315383  78.320479   1959.003 301.315384  78.320479   1959.323 301.315384  78.320479   1959.323
+1654935003  1111926  42520.45048  301.315101  78.320563   1959.102 301.315101  78.320562   1959.393 301.315101  78.320562   1959.393
+1654935003  1111927  42520.45248  301.314816  78.320647   1959.067 301.314817  78.320646   1959.382 301.314817  78.320646   1959.382
+1654935003  1111928  42520.45448  301.314533  78.320731   1958.965 301.314533  78.320730   1959.251 301.314533  78.320730   1959.251
+1654935003  1111929  42520.45648  301.314250  78.320815   1959.048 301.314251  78.320815   1959.331 301.314251  78.320815   1959.331
+1654935003  1111940  42520.47847  301.314328  78.320820   1958.972 301.314329  78.320820   1959.288 301.314329  78.320820   1959.288
+1654935003  1111941  42520.48047  301.314636  78.320739   1958.969 301.314637  78.320738   1959.252 301.314637  78.320738   1959.252
+1654935003  1111942  42520.48247  301.314947  78.320657   1959.045 301.314947  78.320657   1959.331 301.314947  78.320657   1959.331
+1654935003  1111943  42520.48447  301.315257  78.320575   1959.015 301.315257  78.320575   1959.291 301.315257  78.320575   1959.291
+1654935003  1111944  42520.48647  301.315567  78.320494   1958.961 301.315567  78.320494   1959.194 301.315567  78.320494   1959.194
+1654935003  1111945  42520.48847  301.315876  78.320413   1958.928 301.315877  78.320413   1959.274 301.315877  78.320413   1959.274
+1654935003  1111946  42520.49047  301.316184  78.320332   1958.995 301.316185  78.320332   1959.250 301.316185  78.320332   1959.250
+1654935003  1111947  42520.49247  301.316489  78.320251   1959.055 301.316490  78.320251   1959.382 301.316490  78.320251   1959.382
+1654935003  1111948  42520.49447  301.316795  78.320171   1959.055 301.316795  78.320170   1959.341 301.316795  78.320170   1959.341
+1654935003  1111949  42520.49647  301.317100  78.320090   1959.102 301.317101  78.320089   1959.399 301.317101  78.320089   1959.399
+1654935003  1111950  42520.49847  301.317407  78.320009   1959.087 301.317408  78.320008   1959.382 301.317408  78.320008   1959.382
+1654935003  1111951  42520.50047  301.317716  78.319927   1959.126 301.317716  78.319927   1959.412 301.317716  78.319927   1959.412
+1654935003  1111952  42520.50247  301.318027  78.319846   1959.211 301.318027  78.319846   1959.521 301.318027  78.319846   1959.521
+1654935003  1111953  42520.50447  301.318336  78.319765   1959.249 301.318337  78.319765   1959.537 301.318337  78.319765   1959.537
+1654935003  1111954  42520.50647  301.318644  78.319683   1959.208 301.318645  78.319683   1959.545 301.318645  78.319683   1959.545
+1654935003  1111955  42520.50846  301.318952  78.319602   1959.310 301.318952  78.319602   1959.607 301.318952  78.319602   1959.607
+1654935003  1111956  42520.51046  301.319258  78.319521   1959.263 301.319259  78.319521   1959.549 301.319259  78.319521   1959.549
+1654935003  1111957  42520.51246  301.319564  78.319440   1959.284 301.319564  78.319440   1959.613 301.319564  78.319440   1959.613
+1654935003  1111958  42520.51446  301.319870  78.319360   1959.349 301.319870  78.319360   1959.660 301.319870  78.319360   1959.660
+1654935003  1111959  42520.51646  301.320177  78.319280   1959.324 301.320177  78.319280   1959.665 301.320177  78.319280   1959.665
+1654935003  1111960  42520.51846  301.320484  78.319200   1959.389 301.320485  78.319199   1959.720 301.320485  78.319199   1959.720
+1654935003  1111961  42520.52046  301.320793  78.319119   1959.433 301.320793  78.319119   1959.728 301.320793  78.319119   1959.728
+1654935003  1111962  42520.52246  301.321103  78.319037   1959.425 301.321103  78.319037   1959.733 301.321103  78.319037   1959.733
+1654935003  1111963  42520.52446  301.321412  78.318955   1959.420 301.321412  78.318955   1959.744 301.321412  78.318955   1959.744
+1654935003  1111964  42520.52646  301.321719  78.318874   1959.438 301.321719  78.318874   1959.753 301.321719  78.318874   1959.753
+1654935003  1111965  42520.52846  301.322025  78.318793   1959.526 301.322025  78.318793   1959.827 301.322025  78.318793   1959.827
+1654935003  1111966  42520.53046  301.322331  78.318712   1959.555 301.322331  78.318712   1959.889 301.322331  78.318712   1959.889
+1654935003  1111967  42520.53246  301.322635  78.318632   1959.595 301.322635  78.318632   1959.901 301.322635  78.318632   1959.901
+1654935003  1111968  42520.53446  301.322939  78.318552   1959.546 301.322939  78.318552   1959.873 301.322939  78.318552   1959.873
+1654935003  1111969  42520.53646  301.323243  78.318472   1959.569 301.323243  78.318472   1959.861 301.323243  78.318472   1959.861
+1654935003  1111970  42520.53846  301.323547  78.318392   1959.593 301.323547  78.318392   1959.893 301.323547  78.318392   1959.893
+1654935003  1111971  42520.54046  301.323853  78.318312   1959.645 301.323853  78.318311   1959.977 301.323853  78.318311   1959.977
+1654935003  1111972  42520.54246  301.324162  78.318231   1959.654 301.324162  78.318231   1959.974 301.324162  78.318231   1959.974
+1654935003  1111973  42520.54445  301.324470  78.318150   1959.659 301.324470  78.318150   1959.997 301.324470  78.318150   1959.997
+1654935003  1111974  42520.54645  301.324779  78.318069   1959.767 301.324779  78.318069   1960.082 301.324779  78.318069   1960.082
+1654935003  1111975  42520.54845  301.325086  78.317989   1959.806 301.325086  78.317989   1960.137 301.325086  78.317989   1960.137
+1654935003  1111976  42520.55045  301.325392  78.317908   1959.872 301.325391  78.317908   1960.221 301.325391  78.317908   1960.221
+1654935003  1111977  42520.55245  301.325694  78.317828   1959.811 301.325694  78.317828   1960.156 301.325694  78.317828   1960.156
+1654935003  1111978  42520.55445  301.325997  78.317747   1959.862 301.325997  78.317747   1960.133 301.325997  78.317747   1960.133
+1654935003  1111979  42520.55645  301.326300  78.317667   1959.818 301.326300  78.317667   1960.143 301.326300  78.317667   1960.143
+1654935003  1111980  42520.55845  301.326604  78.317586   1959.914 301.326604  78.317586   1960.242 301.326604  78.317586   1960.242
+1654935003  1111981  42520.56045  301.326910  78.317506   1959.928 301.326910  78.317506   1960.260 301.326910  78.317506   1960.260
+1654935003  1111982  42520.56245  301.327218  78.317425   1959.963 301.327218  78.317425   1960.299 301.327218  78.317425   1960.299
+1654935003  1111983  42520.56445  301.327526  78.317344   1960.014 301.327526  78.317344   1960.363 301.327526  78.317344   1960.363
+1654935003  1111984  42520.56645  301.327834  78.317264   1960.033 301.327834  78.317264   1960.369 301.327834  78.317264   1960.369
+1654935003  1111985  42520.56845  301.328140  78.317184   1960.033 301.328140  78.317184   1960.355 301.328140  78.317184   1960.355
+1654935003  1111986  42520.57045  301.328446  78.317103   1960.107 301.328446  78.317103   1960.457 301.328446  78.317103   1960.457
+1654935003  1111987  42520.57245  301.328749  78.317024   1960.098 301.328749  78.317024   1960.437 301.328749  78.317024   1960.437
+1654935003  1111988  42520.57445  301.329053  78.316944   1960.014 301.329053  78.316944   1960.330 301.329053  78.316944   1960.330
+1654935003  1111989  42520.57645  301.329359  78.316864   1960.090 301.329358  78.316864   1960.401 301.329358  78.316864   1960.401
+1654935003  1111990  42520.57844  301.329664  78.316784   1960.187 301.329664  78.316784   1960.463 301.329664  78.316784   1960.463
+1654935003  1111991  42520.58044  301.329969  78.316703   1960.175 301.329969  78.316703   1960.504 301.329969  78.316703   1960.504
+1654935003  1111992  42520.58244  301.330275  78.316621   1960.223 301.330275  78.316621   1960.571 301.330275  78.316621   1960.571
+1654935003  1111993  42520.58444  301.330582  78.316540   1960.265 301.330581  78.316540   1960.599 301.330581  78.316540   1960.599
+1654935003  1111994  42520.58644  301.330888  78.316459   1960.277 301.330888  78.316459   1960.618 301.330888  78.316459   1960.618
+1654935003  1111995  42520.58844  301.331195  78.316378   1960.389 301.331194  78.316378   1960.699 301.331194  78.316378   1960.699
+1654935003  1111996  42520.59044  301.331501  78.316297   1960.344 301.331501  78.316297   1960.667 301.331501  78.316297   1960.667
+1654935003  1111997  42520.59244  301.331807  78.316217   1960.362 301.331806  78.316217   1960.724 301.331806  78.316217   1960.724
+1654935003  1111998  42520.59444  301.332112  78.316138   1960.403 301.332111  78.316138   1960.768 301.332111  78.316138   1960.768
+1654935003  1111999  42520.59644  301.332418  78.316058   1960.426 301.332417  78.316058   1960.783 301.332417  78.316058   1960.783
+1654935003  1112000  42520.59844  301.332724  78.315978   1960.470 301.332723  78.315978   1960.806 301.332723  78.315978   1960.806
+1654935003  1112001  42520.60044  301.333030  78.315897   1960.603 301.333030  78.315897   1960.903 301.333030  78.315897   1960.903
+1654935003  1112002  42520.60244  301.333339  78.315816   1960.497 301.333338  78.315816   1960.874 301.333338  78.315816   1960.874
+1654935003  1112003  42520.60444  301.333647  78.315735   1960.547 301.333646  78.315735   1960.884 301.333646  78.315735   1960.884
+1654935003  1112004  42520.60644  301.333953  78.315654   1960.571 301.333952  78.315654   1960.922 301.333952  78.315654   1960.922
+1654935003  1112005  42520.60844  301.334258  78.315573   1960.602 301.334257  78.315573   1960.943 301.334257  78.315573   1960.943
+1654935003  1112006  42520.61044  301.334561  78.315493   1960.699 301.334561  78.315493   1960.973 301.334561  78.315493   1960.973
+1654935003  1112007  42520.61243  301.334864  78.315412   1960.726 301.334864  78.315412   1961.037 301.334864  78.315412   1961.037
+1654935003  1112008  42520.61443  301.335169  78.315332   1960.658 301.335168  78.315332   1961.008 301.335168  78.315332   1961.008
+1654935003  1112009  42520.61643  301.335475  78.315251   1960.669 301.335474  78.315251   1960.990 301.335474  78.315251   1960.990
+1654935003  1112010  42520.61843  301.335780  78.315171   1960.825 301.335780  78.315171   1961.154 301.335780  78.315171   1961.154
+1654935003  1112011  42520.62043  301.336089  78.315090   1960.782 301.336088  78.315091   1961.127 301.336088  78.315091   1961.127
+1654935003  1112012  42520.62243  301.336401  78.315010   1960.819 301.336400  78.315010   1961.204 301.336400  78.315010   1961.204
+1654935003  1112013  42520.62443  301.336711  78.314929   1960.892 301.336710  78.314929   1961.204 301.336710  78.314929   1961.204
+1654935003  1112014  42520.62643  301.337019  78.314847   1960.881 301.337018  78.314847   1961.242 301.337018  78.314847   1961.242
+1654935003  1112015  42520.62843  301.337327  78.314766   1960.904 301.337326  78.314766   1961.238 301.337326  78.314766   1961.238
+1654935003  1112016  42520.63043  301.337633  78.314685   1960.957 301.337632  78.314685   1961.223 301.337632  78.314685   1961.223
+1654935003  1112017  42520.63243  301.337936  78.314604   1960.878 301.337935  78.314604   1961.179 301.337935  78.314604   1961.179
+1654935003  1112018  42520.63443  301.338240  78.314523   1960.990 301.338239  78.314523   1961.295 301.338239  78.314523   1961.295
+1654935003  1112019  42520.63643  301.338546  78.314443   1961.052 301.338545  78.314443   1961.370 301.338545  78.314443   1961.370
+1654935003  1112020  42520.63843  301.338853  78.314362   1961.031 301.338852  78.314362   1961.338 301.338852  78.314362   1961.338
+1654935003  1112021  42520.64043  301.339161  78.314281   1961.082 301.339160  78.314281   1961.406 301.339160  78.314281   1961.406
+1654935003  1112022  42520.64243  301.339471  78.314200   1961.080 301.339470  78.314200   1961.442 301.339470  78.314200   1961.442
+1654935003  1112023  42520.64443  301.339781  78.314119   1961.199 301.339780  78.314119   1961.520 301.339780  78.314119   1961.520
+1654935003  1112024  42520.64642  301.340092  78.314037   1961.193 301.340092  78.314037   1961.477 301.340092  78.314037   1961.477
+1654935003  1112025  42520.64842  301.340403  78.313956   1961.295 301.340402  78.313956   1961.610 301.340402  78.313956   1961.610
+1654935003  1112026  42520.65042  301.340713  78.313875   1961.265 301.340712  78.313875   1961.567 301.340712  78.313875   1961.567
+1654935003  1112027  42520.65242  301.341020  78.313794   1961.310 301.341019  78.313795   1961.651 301.341019  78.313795   1961.651
+1654935003  1112028  42520.65442  301.341328  78.313714   1961.303 301.341327  78.313714   1961.668 301.341327  78.313714   1961.668
+1654935003  1112029  42520.65642  301.341634  78.313632   1961.382 301.341633  78.313633   1961.664 301.341633  78.313633   1961.664
+1654935003  1112030  42520.65842  301.341938  78.313551   1961.835 301.341938  78.313551   1962.047 301.341938  78.313551   1962.047
+1654935003  1112039  42520.67642  301.341996  78.313555   1961.614 301.341995  78.313555   1961.932 301.341995  78.313555   1961.932
+1654935003  1112040  42520.67842  301.341715  78.313638   1961.273 301.341714  78.313639   1961.577 301.341714  78.313639   1961.577
+1654935003  1112041  42520.68041  301.341433  78.313722   1961.218 301.341432  78.313722   1961.534 301.341432  78.313722   1961.534
+1654935003  1112042  42520.68241  301.341154  78.313805   1961.164 301.341153  78.313805   1961.515 301.341153  78.313805   1961.515
+1654935003  1112043  42520.68441  301.340873  78.313888   1961.133 301.340872  78.313888   1961.418 301.340872  78.313888   1961.418
+1654935003  1112044  42520.68641  301.340589  78.313970   1961.149 301.340588  78.313970   1961.500 301.340588  78.313970   1961.500
+1654935003  1112045  42520.68841  301.340305  78.314053   1961.161 301.340304  78.314053   1961.450 301.340304  78.314053   1961.450
+1654935003  1112046  42520.69041  301.340023  78.314136   1961.124 301.340022  78.314136   1961.420 301.340022  78.314136   1961.420
+1654935003  1112047  42520.69241  301.339738  78.314220   1961.149 301.339737  78.314220   1961.476 301.339737  78.314220   1961.476
+1654935003  1112048  42520.69441  301.339456  78.314304   1961.089 301.339455  78.314304   1961.403 301.339455  78.314304   1961.403
+1654935003  1112049  42520.69641  301.339177  78.314388   1961.032 301.339176  78.314388   1961.328 301.339176  78.314388   1961.328
+1654935003  1112050  42520.69841  301.338898  78.314472   1960.971 301.338897  78.314472   1961.322 301.338897  78.314472   1961.322
+1654935003  1112051  42520.70041  301.338619  78.314555   1960.984 301.338618  78.314555   1961.281 301.338618  78.314555   1961.281
+1654935003  1112052  42520.70241  301.338341  78.314638   1960.849 301.338340  78.314638   1961.192 301.338340  78.314638   1961.192
+1654935003  1112053  42520.70441  301.338062  78.314721   1960.874 301.338061  78.314721   1961.178 301.338061  78.314721   1961.178
+1654935003  1112054  42520.70641  301.337781  78.314804   1960.863 301.337781  78.314804   1961.180 301.337781  78.314804   1961.180
+1654935003  1112055  42520.70841  301.337500  78.314887   1960.780 301.337499  78.314887   1961.110 301.337499  78.314887   1961.110
+1654935003  1112056  42520.71041  301.337216  78.314970   1960.833 301.337215  78.314970   1961.147 301.337215  78.314970   1961.147
+1654935003  1112057  42520.71241  301.336930  78.315054   1960.759 301.336930  78.315054   1961.101 301.336930  78.315054   1961.101
+1654935003  1112058  42520.71441  301.336646  78.315137   1960.767 301.336646  78.315137   1961.077 301.336646  78.315137   1961.077
+1654935003  1112059  42520.71640  301.336364  78.315220   1960.746 301.336364  78.315220   1961.028 301.336364  78.315220   1961.028
+1654935003  1112060  42520.71840  301.336084  78.315303   1960.724 301.336083  78.315303   1961.014 301.336083  78.315303   1961.014
+1654935003  1112061  42520.72040  301.335807  78.315386   1960.617 301.335806  78.315386   1960.959 301.335806  78.315386   1960.959
+1654935003  1112062  42520.72240  301.335531  78.315470   1960.631 301.335530  78.315470   1960.931 301.335530  78.315470   1960.931
+1654935003  1112063  42520.72440  301.335254  78.315553   1960.554 301.335253  78.315553   1960.849 301.335253  78.315553   1960.849
+1654935003  1112064  42520.72640  301.334976  78.315636   1960.578 301.334975  78.315636   1960.875 301.334975  78.315636   1960.875
+1654935003  1112065  42520.72840  301.334696  78.315719   1960.660 301.334695  78.315719   1960.993 301.334695  78.315719   1960.993
+1654935003  1112066  42520.73040  301.334414  78.315802   1960.535 301.334413  78.315802   1960.857 301.334413  78.315802   1960.857
+1654935003  1112067  42520.73240  301.334129  78.315885   1960.468 301.334129  78.315885   1960.819 301.334129  78.315885   1960.819
+1654935003  1112068  42520.73440  301.333846  78.315968   1960.537 301.333845  78.315968   1960.864 301.333845  78.315968   1960.864
+1654935003  1112069  42520.73640  301.333564  78.316051   1960.496 301.333563  78.316051   1960.828 301.333563  78.316051   1960.828
+1654935003  1112070  42520.73840  301.333283  78.316134   1960.405 301.333282  78.316134   1960.724 301.333282  78.316134   1960.724
+1654935003  1112071  42520.74040  301.333003  78.316217   1960.351 301.333002  78.316217   1960.674 301.333002  78.316217   1960.674
+1654935003  1112072  42520.74240  301.332725  78.316299   1960.351 301.332724  78.316299   1960.677 301.332724  78.316299   1960.677
+1654935003  1112073  42520.74440  301.332447  78.316382   1960.289 301.332446  78.316382   1960.568 301.332446  78.316382   1960.568
+1654935003  1112074  42520.74640  301.332169  78.316465   1960.322 301.332168  78.316465   1960.651 301.332168  78.316465   1960.651
+1654935003  1112075  42520.74840  301.331891  78.316547   1960.332 301.331891  78.316547   1960.630 301.331891  78.316547   1960.630
+1654935003  1112076  42520.75039  301.331614  78.316630   1960.266 301.331614  78.316630   1960.578 301.331614  78.316630   1960.578
+1654935003  1112077  42520.75239  301.331336  78.316714   1960.177 301.331336  78.316714   1960.526 301.331336  78.316714   1960.526
+1654935003  1112078  42520.75439  301.331058  78.316797   1960.182 301.331057  78.316797   1960.457 301.331057  78.316797   1960.457
+1654935003  1112079  42520.75639  301.330777  78.316880   1960.171 301.330777  78.316880   1960.485 301.330777  78.316880   1960.485
+1654935003  1112080  42520.75839  301.330497  78.316962   1960.100 301.330497  78.316962   1960.404 301.330497  78.316962   1960.404
+1654935003  1112081  42520.76039  301.330217  78.317044   1960.116 301.330217  78.317044   1960.448 301.330217  78.317044   1960.448
+1654935003  1112082  42520.76239  301.329938  78.317127   1960.133 301.329937  78.317127   1960.457 301.329937  78.317127   1960.457
+1654935003  1112083  42520.76439  301.329658  78.317209   1960.017 301.329658  78.317209   1960.326 301.329658  78.317209   1960.326
+1654935003  1112084  42520.76639  301.329380  78.317292   1960.015 301.329379  78.317292   1960.298 301.329379  78.317292   1960.298
+1654935003  1112085  42520.76839  301.329102  78.317375   1959.967 301.329102  78.317375   1960.306 301.329102  78.317375   1960.306
+1654935003  1112086  42520.77039  301.328821  78.317458   1959.943 301.328821  78.317458   1960.270 301.328821  78.317458   1960.270
+1654935003  1112087  42520.77239  301.328540  78.317542   1959.987 301.328540  78.317542   1960.295 301.328540  78.317542   1960.295
+1654935003  1112088  42520.77439  301.328259  78.317625   1960.014 301.328259  78.317625   1960.311 301.328259  78.317625   1960.311
+1654935003  1112089  42520.77639  301.327979  78.317708   1960.027 301.327979  78.317708   1960.349 301.327979  78.317708   1960.349
+1654935003  1112090  42520.77839  301.327699  78.317791   1959.909 301.327699  78.317791   1960.202 301.327699  78.317791   1960.202
+1654935003  1112091  42520.78039  301.327420  78.317874   1959.880 301.327420  78.317874   1960.176 301.327420  78.317874   1960.176
+1654935003  1112092  42520.78239  301.327141  78.317957   1959.856 301.327141  78.317957   1960.196 301.327141  78.317957   1960.196
+1654935003  1112093  42520.78438  301.326862  78.318040   1959.768 301.326862  78.318040   1960.110 301.326862  78.318040   1960.110
+1654935003  1112094  42520.78638  301.326580  78.318123   1959.717 301.326580  78.318123   1960.068 301.326580  78.318123   1960.068
+1654935003  1112095  42520.78838  301.326299  78.318205   1959.693 301.326299  78.318205   1960.002 301.326299  78.318205   1960.002
+1654935003  1112096  42520.79038  301.326019  78.318288   1959.717 301.326019  78.318288   1960.020 301.326019  78.318288   1960.020
+1654935003  1112097  42520.79238  301.325739  78.318371   1959.681 301.325739  78.318371   1960.003 301.325739  78.318371   1960.003
+1654935003  1112098  42520.79438  301.325461  78.318454   1959.617 301.325461  78.318454   1959.941 301.325461  78.318454   1959.941
+1654935003  1112099  42520.79638  301.325184  78.318537   1959.548 301.325184  78.318537   1959.881 301.325184  78.318537   1959.881
+1654935003  1112100  42520.79838  301.324906  78.318620   1959.606 301.324906  78.318620   1959.885 301.324906  78.318620   1959.885
+1654935003  1112101  42520.80038  301.324627  78.318703   1959.618 301.324627  78.318703   1959.898 301.324627  78.318703   1959.898
+1654935003  1112102  42520.80238  301.324347  78.318786   1959.586 301.324347  78.318786   1959.912 301.324347  78.318786   1959.912
+1654935003  1112103  42520.80438  301.324066  78.318869   1959.554 301.324066  78.318868   1959.872 301.324066  78.318868   1959.872
+1654935003  1112104  42520.80638  301.323786  78.318951   1959.570 301.323786  78.318951   1959.840 301.323786  78.318951   1959.840
+1654935003  1112105  42520.80838  301.323506  78.319034   1959.525 301.323506  78.319034   1959.813 301.323506  78.319034   1959.813
+1654935003  1112106  42520.81038  301.323226  78.319117   1959.441 301.323226  78.319117   1959.765 301.323226  78.319117   1959.765
+1654935003  1112107  42520.81238  301.322946  78.319200   1959.459 301.322946  78.319200   1959.772 301.322946  78.319200   1959.772
+1654935003  1112108  42520.81438  301.322666  78.319283   1959.469 301.322666  78.319283   1959.750 301.322666  78.319283   1959.750
+1654935003  1112109  42520.81638  301.322385  78.319367   1959.520 301.322385  78.319366   1959.792 301.322385  78.319366   1959.792
+1654935003  1112110  42520.81837  301.322105  78.319450   1959.409 301.322105  78.319450   1959.706 301.322105  78.319450   1959.706
+1654935003  1112111  42520.82037  301.321825  78.319533   1959.365 301.321825  78.319533   1959.669 301.321825  78.319533   1959.669
+1654935003  1112112  42520.82237  301.321547  78.319616   1959.297 301.321547  78.319616   1959.660 301.321547  78.319616   1959.660
+1654935003  1112113  42520.82437  301.321268  78.319700   1959.255 301.321268  78.319700   1959.557 301.321268  78.319700   1959.557
+1654935003  1112114  42520.82637  301.320988  78.319783   1959.256 301.320988  78.319783   1959.569 301.320988  78.319783   1959.569
+1654935003  1112115  42520.82837  301.320706  78.319867   1959.222 301.320707  78.319867   1959.508 301.320707  78.319867   1959.508
+1654935003  1112116  42520.83037  301.320423  78.319950   1959.209 301.320424  78.319950   1959.519 301.320424  78.319950   1959.519
+1654935003  1112117  42520.83237  301.320138  78.320033   1959.260 301.320139  78.320033   1959.533 301.320139  78.320033   1959.533
+1654935003  1112118  42520.83437  301.319855  78.320116   1959.227 301.319855  78.320116   1959.524 301.319855  78.320116   1959.524
+1654935003  1112119  42520.83637  301.319574  78.320199   1959.188 301.319574  78.320199   1959.516 301.319574  78.320199   1959.516
+1654935003  1112120  42520.83837  301.319294  78.320283   1959.102 301.319295  78.320283   1959.375 301.319295  78.320283   1959.375
+1654935003  1112121  42520.84037  301.319015  78.320366   1959.075 301.319015  78.320366   1959.342 301.319015  78.320366   1959.342
+1654935003  1112122  42520.84237  301.318735  78.320451   1959.037 301.318735  78.320450   1959.329 301.318735  78.320450   1959.329
+1654935003  1112123  42520.84437  301.318454  78.320535   1959.110 301.318454  78.320534   1959.367 301.318454  78.320534   1959.367
+1654935003  1112124  42520.84637  301.318172  78.320618   1958.953 301.318172  78.320618   1959.213 301.318172  78.320618   1959.213
+1654935003  1112125  42520.84837  301.317890  78.320702   1958.997 301.317890  78.320701   1959.240 301.317890  78.320701   1959.240
+1654935003  1112126  42520.85037  301.317607  78.320785   1958.889 301.317608  78.320785   1959.154 301.317608  78.320785   1959.154
+1654935003  1112127  42520.85236  301.317326  78.320869   1958.876 301.317326  78.320869   1959.190 301.317326  78.320869   1959.190
+1654935003  1112128  42520.85436  301.317043  78.320953   1958.907 301.317044  78.320952   1959.209 301.317044  78.320952   1959.209
+1654935003  1112129  42520.85636  301.316759  78.321036   1959.081 301.316760  78.321036   1959.370 301.316760  78.321036   1959.370
+1654935003  1112139  42520.87636  301.316543  78.321121   1959.666 301.316543  78.321121   1959.850 301.316543  78.321121   1959.850
+1654935003  1112140  42520.87836  301.316849  78.321040   1958.975 301.316850  78.321040   1959.229 301.316850  78.321040   1959.229
+1654935003  1112141  42520.88036  301.317158  78.320959   1958.911 301.317158  78.320958   1959.191 301.317158  78.320958   1959.191
+1654935003  1112142  42520.88236  301.317467  78.320877   1958.852 301.317468  78.320877   1959.113 301.317468  78.320877   1959.113
+1654935003  1112143  42520.88436  301.317776  78.320796   1958.891 301.317777  78.320796   1959.136 301.317777  78.320796   1959.136
+1654935003  1112144  42520.88636  301.318084  78.320715   1958.966 301.318084  78.320715   1959.269 301.318084  78.320715   1959.269
+1654935003  1112145  42520.88835  301.318390  78.320634   1958.976 301.318390  78.320634   1959.244 301.318390  78.320634   1959.244
+1654935003  1112146  42520.89035  301.318696  78.320553   1959.050 301.318697  78.320553   1959.318 301.318697  78.320553   1959.318
+1654935003  1112147  42520.89235  301.319003  78.320472   1959.027 301.319003  78.320472   1959.338 301.319003  78.320472   1959.338
+1654935003  1112148  42520.89435  301.319310  78.320391   1959.081 301.319310  78.320391   1959.350 301.319310  78.320391   1959.350
+1654935003  1112149  42520.89635  301.319618  78.320310   1959.141 301.319619  78.320310   1959.401 301.319619  78.320310   1959.401
+1654935003  1112150  42520.89835  301.319927  78.320230   1959.131 301.319927  78.320230   1959.439 301.319927  78.320230   1959.439
+1654935003  1112151  42520.90035  301.320235  78.320149   1959.206 301.320236  78.320149   1959.482 301.320236  78.320149   1959.482
+1654935003  1112152  42520.90235  301.320543  78.320069   1959.176 301.320543  78.320069   1959.459 301.320543  78.320069   1959.459
diff --git a/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml
new file mode 100644
index 0000000..bbc969b
--- /dev/null
+++ b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml
@@ -0,0 +1,780 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE GranuleMetaDataFile SYSTEM "http://ecsinfo.gsfc.nasa.gov/ECSInfo/ecsmetadata/dtds/DPL/ECS/ScienceGranuleMetadata.dtd">
+<GranuleMetaDataFile>
+    <DTDVersion>1.0</DTDVersion>
+    <DataCenterId>NSIDC</DataCenterId>
+    <GranuleURMetaData>
+        <GranuleUR>SC:ILVIS2.001:51203496</GranuleUR>
+        <DbID>51203496</DbID>
+        <InsertTime>2014-08-15 14:06:54.441</InsertTime>
+        <LastUpdate>2014-08-15 14:06:54.441</LastUpdate>
+        <CollectionMetaData>
+            <ShortName>ILVIS2</ShortName>
+            <VersionID>1</VersionID>
+        </CollectionMetaData>
+        <DataFiles>
+            <DataFileContainer>
+                <DistributedFileName>ILVIS2_GL2009_0414_R1401_042504.TXT</DistributedFileName>
+                <FileSize>93100358</FileSize>
+                <ChecksumType>MD5</ChecksumType>
+                <Checksum>4047b1ed5f3a0c19712ae3117ddc0f78</Checksum>
+                <ChecksumOrigin>DPLIngst</ChecksumOrigin>
+            </DataFileContainer>
+        </DataFiles>
+        <ECSDataGranule>
+            <SizeMBECSDataGranule>88.7874</SizeMBECSDataGranule>
+            <LocalGranuleID>ILVIS2_GL2009_0414_R1401_042504.TXT</LocalGranuleID>
+            <ProductionDateTime>2014-01-16 15:43:57.000</ProductionDateTime>
+            <LocalVersionID>001</LocalVersionID>
+        </ECSDataGranule>
+        <RangeDateTime>
+            <RangeEndingTime>12:16:19.682080</RangeEndingTime>
+            <RangeEndingDate>2009-04-14</RangeEndingDate>
+            <RangeBeginningTime>11:48:24.483130</RangeBeginningTime>
+            <RangeBeginningDate>2009-04-14</RangeBeginningDate>
+        </RangeDateTime>
+        <SpatialDomainContainer>
+            <HorizontalSpatialDomainContainer>
+                <GPolygon>
+                    <Boundary>
+                        <Point>
+                            <PointLongitude>-47.14842</PointLongitude>
+                            <PointLatitude>79.51872</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-46.9909</PointLongitude>
+                            <PointLatitude>79.51872</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-47.0166</PointLongitude>
+                            <PointLatitude>79.50434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-48.8528</PointLongitude>
+                            <PointLatitude>79.36034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-49.07076</PointLongitude>
+                            <PointLatitude>79.34234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.1236</PointLongitude>
+                            <PointLatitude>79.25234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.76171</PointLongitude>
+                            <PointLatitude>79.19474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.18166</PointLongitude>
+                            <PointLatitude>79.15514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.56231</PointLongitude>
+                            <PointLatitude>79.11914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.78311</PointLongitude>
+                            <PointLatitude>79.09754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.96401</PointLongitude>
+                            <PointLatitude>79.07954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.04428</PointLongitude>
+                            <PointLatitude>79.07234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.2254</PointLongitude>
+                            <PointLatitude>79.05434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.30574</PointLongitude>
+                            <PointLatitude>79.04714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.48705</PointLongitude>
+                            <PointLatitude>79.02914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.58806</PointLongitude>
+                            <PointLatitude>79.01834</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.72934</PointLongitude>
+                            <PointLatitude>79.00394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.87074</PointLongitude>
+                            <PointLatitude>78.98954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.95132</PointLongitude>
+                            <PointLatitude>78.98234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.01223</PointLongitude>
+                            <PointLatitude>78.97514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.11351</PointLongitude>
+                            <PointLatitude>78.96434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.19416</PointLongitude>
+                            <PointLatitude>78.95714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.25516</PointLongitude>
+                            <PointLatitude>78.94994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.35655</PointLongitude>
+                            <PointLatitude>78.93914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.458</PointLongitude>
+                            <PointLatitude>78.92834</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.5999</PointLongitude>
+                            <PointLatitude>78.91394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.70146</PointLongitude>
+                            <PointLatitude>78.90314</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.76264</PointLongitude>
+                            <PointLatitude>78.89594</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.8643</PointLongitude>
+                            <PointLatitude>78.88514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.966</PointLongitude>
+                            <PointLatitude>78.87434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.06776</PointLongitude>
+                            <PointLatitude>78.86354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.16956</PointLongitude>
+                            <PointLatitude>78.85274</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.27143</PointLongitude>
+                            <PointLatitude>78.84194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.39421</PointLongitude>
+                            <PointLatitude>78.82754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.45564</PointLongitude>
+                            <PointLatitude>78.82034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.55765</PointLongitude>
+                            <PointLatitude>78.80954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.61911</PointLongitude>
+                            <PointLatitude>78.80234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.72112</PointLongitude>
+                            <PointLatitude>78.79154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.82312</PointLongitude>
+                            <PointLatitude>78.78074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.88453</PointLongitude>
+                            <PointLatitude>78.77354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.94588</PointLongitude>
+                            <PointLatitude>78.76634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.00717</PointLongitude>
+                            <PointLatitude>78.75914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.06837</PointLongitude>
+                            <PointLatitude>78.75194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.12944</PointLongitude>
+                            <PointLatitude>78.74474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.19036</PointLongitude>
+                            <PointLatitude>78.73754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.25115</PointLongitude>
+                            <PointLatitude>78.73034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.35178</PointLongitude>
+                            <PointLatitude>78.71954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.43267</PointLongitude>
+                            <PointLatitude>78.70874</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.53263</PointLongitude>
+                            <PointLatitude>78.69794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.59264</PointLongitude>
+                            <PointLatitude>78.69074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.69202</PointLongitude>
+                            <PointLatitude>78.67994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.77183</PointLongitude>
+                            <PointLatitude>78.66914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.83129</PointLongitude>
+                            <PointLatitude>78.66194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.89062</PointLongitude>
+                            <PointLatitude>78.65474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.98892</PointLongitude>
+                            <PointLatitude>78.64394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.04789</PointLongitude>
+                            <PointLatitude>78.63674</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.16544</PointLongitude>
+                            <PointLatitude>78.62234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.32109</PointLongitude>
+                            <PointLatitude>78.60434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.37932</PointLongitude>
+                            <PointLatitude>78.59714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.43741</PointLongitude>
+                            <PointLatitude>78.58994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.53372</PointLongitude>
+                            <PointLatitude>78.57914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.64911</PointLongitude>
+                            <PointLatitude>78.56474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.70661</PointLongitude>
+                            <PointLatitude>78.55754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.76399</PointLongitude>
+                            <PointLatitude>78.55034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.85913</PointLongitude>
+                            <PointLatitude>78.53954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.93535</PointLongitude>
+                            <PointLatitude>78.52874</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.99222</PointLongitude>
+                            <PointLatitude>78.52154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.06804</PointLongitude>
+                            <PointLatitude>78.51074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.1246</PointLongitude>
+                            <PointLatitude>78.50354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.18104</PointLongitude>
+                            <PointLatitude>78.49634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.27468</PointLongitude>
+                            <PointLatitude>78.48554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.3308</PointLongitude>
+                            <PointLatitude>78.47834</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.3868</PointLongitude>
+                            <PointLatitude>78.47114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.44267</PointLongitude>
+                            <PointLatitude>78.46394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.49842</PointLongitude>
+                            <PointLatitude>78.45674</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.55403</PointLongitude>
+                            <PointLatitude>78.44954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.60954</PointLongitude>
+                            <PointLatitude>78.44234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.66493</PointLongitude>
+                            <PointLatitude>78.43514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.77533</PointLongitude>
+                            <PointLatitude>78.42074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.83035</PointLongitude>
+                            <PointLatitude>78.41354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.88526</PointLongitude>
+                            <PointLatitude>78.40634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.97643</PointLongitude>
+                            <PointLatitude>78.39554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.08549</PointLongitude>
+                            <PointLatitude>78.38114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.1941</PointLongitude>
+                            <PointLatitude>78.36674</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.24823</PointLongitude>
+                            <PointLatitude>78.35954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.35613</PointLongitude>
+                            <PointLatitude>78.34514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.40991</PointLongitude>
+                            <PointLatitude>78.33794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.49927</PointLongitude>
+                            <PointLatitude>78.32714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.57057</PointLongitude>
+                            <PointLatitude>78.31634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.69479</PointLongitude>
+                            <PointLatitude>78.30194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.78521</PointLongitude>
+                            <PointLatitude>78.29474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.78521</PointLongitude>
+                            <PointLatitude>78.31274</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.69463</PointLongitude>
+                            <PointLatitude>78.33074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.58805</PointLongitude>
+                            <PointLatitude>78.33434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.57021</PointLongitude>
+                            <PointLatitude>78.33794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.48069</PointLongitude>
+                            <PointLatitude>78.35954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.44489</PointLongitude>
+                            <PointLatitude>78.36314</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.39105</PointLongitude>
+                            <PointLatitude>78.37034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.33709</PointLongitude>
+                            <PointLatitude>78.37754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.28301</PointLongitude>
+                            <PointLatitude>78.38474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.21085</PointLongitude>
+                            <PointLatitude>78.39194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-58.06556</PointLongitude>
+                            <PointLatitude>78.41354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.95612</PointLongitude>
+                            <PointLatitude>78.42794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.90122</PointLongitude>
+                            <PointLatitude>78.43514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.84621</PointLongitude>
+                            <PointLatitude>78.44234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.77288</PointLongitude>
+                            <PointLatitude>78.44954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.62495</PointLongitude>
+                            <PointLatitude>78.47114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.56935</PointLongitude>
+                            <PointLatitude>78.47834</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.5136</PointLongitude>
+                            <PointLatitude>78.48554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.45773</PointLongitude>
+                            <PointLatitude>78.49274</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.40174</PointLongitude>
+                            <PointLatitude>78.49994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.30832</PointLongitude>
+                            <PointLatitude>78.51074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.25201</PointLongitude>
+                            <PointLatitude>78.51794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.13901</PointLongitude>
+                            <PointLatitude>78.53234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-57.08232</PointLongitude>
+                            <PointLatitude>78.53954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.98775</PointLongitude>
+                            <PointLatitude>78.55034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.81631</PointLongitude>
+                            <PointLatitude>78.57194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.7014</PointLongitude>
+                            <PointLatitude>78.58634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.64374</PointLongitude>
+                            <PointLatitude>78.59354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.58597</PointLongitude>
+                            <PointLatitude>78.60074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.52805</PointLongitude>
+                            <PointLatitude>78.60794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.47</PointLongitude>
+                            <PointLatitude>78.61514</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.41183</PointLongitude>
+                            <PointLatitude>78.62234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.35353</PointLongitude>
+                            <PointLatitude>78.62954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.29509</PointLongitude>
+                            <PointLatitude>78.63674</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.23651</PointLongitude>
+                            <PointLatitude>78.64394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.15878</PointLongitude>
+                            <PointLatitude>78.65114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.07998</PointLongitude>
+                            <PointLatitude>78.66194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-56.02091</PointLongitude>
+                            <PointLatitude>78.66914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.96172</PointLongitude>
+                            <PointLatitude>78.67634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.80355</PointLongitude>
+                            <PointLatitude>78.69434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.68407</PointLongitude>
+                            <PointLatitude>78.70874</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.62412</PointLongitude>
+                            <PointLatitude>78.71594</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.5038</PointLongitude>
+                            <PointLatitude>78.73034</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.40349</PointLongitude>
+                            <PointLatitude>78.74114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.30281</PointLongitude>
+                            <PointLatitude>78.75194</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.24199</PointLongitude>
+                            <PointLatitude>78.75914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.14071</PointLongitude>
+                            <PointLatitude>78.76994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.07955</PointLongitude>
+                            <PointLatitude>78.77714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-55.01829</PointLongitude>
+                            <PointLatitude>78.78434</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.95697</PointLongitude>
+                            <PointLatitude>78.79154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.85508</PointLongitude>
+                            <PointLatitude>78.80234</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.79369</PointLongitude>
+                            <PointLatitude>78.80954</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.73229</PointLongitude>
+                            <PointLatitude>78.81674</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.67089</PointLongitude>
+                            <PointLatitude>78.82394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.56895</PointLongitude>
+                            <PointLatitude>78.83474</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.46705</PointLongitude>
+                            <PointLatitude>78.84554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.36521</PointLongitude>
+                            <PointLatitude>78.85634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.3039</PointLongitude>
+                            <PointLatitude>78.86354</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.24261</PointLongitude>
+                            <PointLatitude>78.87074</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-54.18135</PointLongitude>
+                            <PointLatitude>78.87794</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.99878</PointLongitude>
+                            <PointLatitude>78.89594</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.93761</PointLongitude>
+                            <PointLatitude>78.90314</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.83605</PointLongitude>
+                            <PointLatitude>78.91394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.77492</PointLongitude>
+                            <PointLatitude>78.92114</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.63308</PointLongitude>
+                            <PointLatitude>78.93554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.53167</PointLongitude>
+                            <PointLatitude>78.94634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.43031</PointLongitude>
+                            <PointLatitude>78.95714</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.2887</PointLongitude>
+                            <PointLatitude>78.97154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.14719</PointLongitude>
+                            <PointLatitude>78.98594</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-53.08629</PointLongitude>
+                            <PointLatitude>78.99314</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.94492</PointLongitude>
+                            <PointLatitude>79.00754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.76342</PointLongitude>
+                            <PointLatitude>79.02554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.62227</PointLongitude>
+                            <PointLatitude>79.03994</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.40088</PointLongitude>
+                            <PointLatitude>79.06154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.25998</PointLongitude>
+                            <PointLatitude>79.07594</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-52.07906</PointLongitude>
+                            <PointLatitude>79.09394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.85822</PointLongitude>
+                            <PointLatitude>79.11554</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.77808</PointLongitude>
+                            <PointLatitude>79.12274</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.4775</PointLongitude>
+                            <PointLatitude>79.15154</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-51.13736</PointLongitude>
+                            <PointLatitude>79.18394</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.97762</PointLongitude>
+                            <PointLatitude>79.19834</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.85788</PointLongitude>
+                            <PointLatitude>79.20914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.77808</PointLongitude>
+                            <PointLatitude>79.21634</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-50.10077</PointLongitude>
+                            <PointLatitude>79.27754</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-49.86215</PointLongitude>
+                            <PointLatitude>79.29914</PointLatitude>
+                        </Point>
+                        <Point>
+                            <PointLongitude>-47.21337</PointLongitude>
+                            <PointLatitude>79.51514</PointLatitude>
+                        </Point>
+                    </Boundary>
+                </GPolygon>
+            </HorizontalSpatialDomainContainer>
+        </SpatialDomainContainer>
+        <Platform>
+            <PlatformShortName>P-3B</PlatformShortName>
+            <Instrument>
+                <InstrumentShortName>LVIS</InstrumentShortName>
+                <Sensor>
+                    <SensorShortName>LVIS</SensorShortName>
+                </Sensor>
+            </Instrument>
+        </Platform>
+        <Campaign>
+            <CampaignShortName>2009_GR_NASA</CampaignShortName>
+        </Campaign>
+        <PSAs>
+            <PSA>
+                <PSAName>SIPSMetGenVersion</PSAName>
+                <PSAValue>0.1.0.0</PSAValue>
+            </PSA>
+            <PSA>
+                <PSAName>ThemeID</PSAName>
+                <PSAValue>2009_GR_NASA</PSAValue>
+            </PSA>
+            <PSA>
+                <PSAName>AircraftID</PSAName>
+                <PSAValue>N426NA</PSAValue>
+            </PSA>
+        </PSAs>
+    </GranuleURMetaData>
+</GranuleMetaDataFile>
+
diff --git a/test/data/ilvis2/ilvis.xml b/test/data/ilvis2/ilvis.xml
new file mode 100644
index 0000000..321c625
--- /dev/null
+++ b/test/data/ilvis2/ilvis.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            ilvis.las
+        </Option>
+        <Reader type="readers.ilvis2">
+            <Option name="filename">
+                ILVIS2_GL2009_0414_R1401_042504.TXT
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/las/autzen_trim.las b/test/data/las/autzen_trim.las
new file mode 100644
index 0000000..0eee55d
Binary files /dev/null and b/test/data/las/autzen_trim.las differ
diff --git a/test/data/las/test_epsg_4047.las b/test/data/las/test_epsg_4047.las
new file mode 100644
index 0000000..9bea647
Binary files /dev/null and b/test/data/las/test_epsg_4047.las differ
diff --git a/test/data/las/test_epsg_4326.las b/test/data/las/test_epsg_4326.las
new file mode 100644
index 0000000..dcd5c9a
Binary files /dev/null and b/test/data/las/test_epsg_4326.las differ
diff --git a/test/data/las/test_epsg_4326x3.las b/test/data/las/test_epsg_4326x3.las
new file mode 100644
index 0000000..fb860f1
Binary files /dev/null and b/test/data/las/test_epsg_4326x3.las differ
diff --git a/test/data/las/test_utm16.las b/test/data/las/test_utm16.las
new file mode 100644
index 0000000..467fbe0
Binary files /dev/null and b/test/data/las/test_utm16.las differ
diff --git a/test/data/las/test_utm17.las b/test/data/las/test_utm17.las
new file mode 100644
index 0000000..74f3d3d
Binary files /dev/null and b/test/data/las/test_utm17.las differ
diff --git a/test/data/laz/autzen_trim.laz b/test/data/laz/autzen_trim.laz
new file mode 100644
index 0000000..a17c67d
Binary files /dev/null and b/test/data/laz/autzen_trim.laz differ
diff --git a/test/data/misc/opts2json.txt b/test/data/misc/opts2json.txt
index 7bf6c6c..5db3e80 100644
--- a/test/data/misc/opts2json.txt
+++ b/test/data/misc/opts2json.txt
@@ -1,42 +1,24 @@
 {
   "options" :
   {
-    "test1" :
+    "testa" :
     {
       "value" : "This is a test",
       "description" : ""
     },
-    "test2" :
+    "testb" :
     {
       "value" : "56",
       "description" : ""
     },
-    "test3" :
+    "testc" :
     {
       "value" : "27.5",
-      "description" : "Testing test3"
+      "description" : "Testing testc"
     },
-    "test3.5" :
+    "teste" :
     {
-      "value" : "3.5",
-      "description" : ""
-      "options" :
-      {
-        "subtest1" :
-        {
-          "value" : "Subtest1",
-          "description" : ""
-        },
-        "subtest2" :
-        {
-          "value" : "Subtest2",
-          "description" : ""
-        }
-      }
-    },
-    "test4" :
-    {
-      "value" : "Testing option test 4",
+      "value" : "Testing option test e",
       "description" : ""
     }
   }
diff --git a/test/data/misc/opts2json_meta.txt b/test/data/misc/opts2json_meta.txt
index 57b7950..ec38103 100644
--- a/test/data/misc/opts2json_meta.txt
+++ b/test/data/misc/opts2json_meta.txt
@@ -1,43 +1,25 @@
 {
   "options":
   {
-    "test1":
+    "testa":
     {
       "description": "",
       "value": "This is a test"
     },
-    "test2":
+    "testb":
     {
       "description": "",
       "value": "56"
     },
-    "test3":
+    "testc":
     {
-      "description": "Testing test3",
+      "description": "Testing testc",
       "value": "27.5"
     },
-    "test3.5":
+    "teste":
     {
       "description": "",
-      "options":
-      {
-        "subtest1":
-        {
-          "description": "",
-          "value": "Subtest1"
-        },
-        "subtest2":
-        {
-          "description": "",
-          "value": "Subtest2"
-        }
-      },
-      "value": "3.5"
-    },
-    "test4":
-    {
-      "description": "",
-      "value": "Testing option test 4"
+      "value": "Testing option test e"
     }
   }
 }
diff --git a/test/data/pipeline/tindex.xml b/test/data/pipeline/tindex.xml
new file mode 100644
index 0000000..c55b553
--- /dev/null
+++ b/test/data/pipeline/tindex.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Reader type="readers.tindex">
+            <Option name="sql">
+                SELECT * from pdal
+            </Option>
+           <Option name="filter_srs">
+                +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+            </Option>
+           <Option name="merge">
+               true
+            </Option>
+            <Option name="filename">
+                /Users/hobu/dev/git/pdal/test/temp/index.sqlite
+            </Option>
+            <Option name="where">
+                location LIKE '%nteresting.las%'
+            </Option>
+            <Option name="boundary">
+                ([635629.85, 638982.55], [848999.70 , 853535.43])
+            </Option>
+            <Option name="polygon">
+                POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/tindex.xml.in b/test/data/pipeline/tindex.xml.in
new file mode 100644
index 0000000..050fc97
--- /dev/null
+++ b/test/data/pipeline/tindex.xml.in
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Reader type="readers.tindex">
+            <Option name="sql">
+                SELECT * from pdal
+            </Option>
+           <Option name="filter_srs">
+                +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+            </Option>
+           <Option name="merge">
+               true
+            </Option>
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/temp/index.sqlite
+            </Option>
+            <Option name="where">
+                location LIKE '%nteresting.las%'
+            </Option>
+            <Option name="boundary">
+                ([635629.85, 638982.55], [848999.70 , 853535.43])
+            </Option>
+            <Option name="polygon">
+                POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index ec161f0..f7fe820 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -21,6 +21,7 @@ include_directories(
     ${PROJECT_SOURCE_DIR}/io/bpf
     ${PROJECT_SOURCE_DIR}/io/buffer
     ${PROJECT_SOURCE_DIR}/io/faux
+    ${PROJECT_SOURCE_DIR}/io/ilvis2
     ${PROJECT_SOURCE_DIR}/io/las
     ${PROJECT_SOURCE_DIR}/io/optech
     ${PROJECT_SOURCE_DIR}/io/ply
@@ -32,8 +33,11 @@ include_directories(
     ${PROJECT_SOURCE_DIR}/filters/colorization
     ${PROJECT_SOURCE_DIR}/filters/crop
     ${PROJECT_SOURCE_DIR}/filters/decimation
+    ${PROJECT_SOURCE_DIR}/filters/divider
     ${PROJECT_SOURCE_DIR}/filters/ferry
+    ${PROJECT_SOURCE_DIR}/filters/merge
     ${PROJECT_SOURCE_DIR}/filters/mortonorder
+    ${PROJECT_SOURCE_DIR}/filters/randomize
     ${PROJECT_SOURCE_DIR}/filters/reprojection
     ${PROJECT_SOURCE_DIR}/filters/range
     ${PROJECT_SOURCE_DIR}/filters/sort
@@ -74,6 +78,7 @@ endif()
 PDAL_ADD_TEST(pdal_io_bpf_test FILES io/bpf/BPFTest.cpp)
 PDAL_ADD_TEST(pdal_io_buffer_test FILES io/buffer/BufferTest.cpp)
 PDAL_ADD_TEST(pdal_io_faux_test FILES io/faux/FauxReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_ilvis2_test FILES io/ilvis2/Ilvis2ReaderTest.cpp)
 PDAL_ADD_TEST(pdal_io_las_reader_test FILES io/las/LasReaderTest.cpp)
 PDAL_ADD_TEST(pdal_io_las_writer_test FILES io/las/LasWriterTest.cpp)
 PDAL_ADD_TEST(pdal_io_optech_test FILES io/optech/OptechReaderTest.cpp)
@@ -91,10 +96,12 @@ PDAL_ADD_TEST(pdal_filters_chipper_test FILES filters/ChipperTest.cpp)
 PDAL_ADD_TEST(pdal_filters_colorization_test FILES filters/ColorizationFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_crop_test FILES filters/CropFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_decimation_test FILES filters/DecimationFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_divider_test FILES filters/DividerFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_ferry_test FILES filters/FerryFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_merge_test FILES filters/MergeTest.cpp)
 PDAL_ADD_TEST(pdal_filters_reprojection_test FILES filters/ReprojectionFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_range_test FILES filters/RangeFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_randomize_test FILES filters/RandomizeFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_sort_test FILES filters/SortFilterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_splitter_test FILES filters/SplitterTest.cpp)
 PDAL_ADD_TEST(pdal_filters_stats_test FILES filters/StatsFilterTest.cpp)
diff --git a/test/unit/MetadataTest.cpp b/test/unit/MetadataTest.cpp
index ceece14..91cb420 100644
--- a/test/unit/MetadataTest.cpp
+++ b/test/unit/MetadataTest.cpp
@@ -283,30 +283,13 @@ TEST(MetadataTest, sanitize)
 }
 **/
 
-TEST(MetadataTest, test_metadata_stage)
+// Make sure that we handle double-precision values to 10 decimal places.
+TEST(MetadataTest, test_float)
 {
-//ABELL
-/**
-    PointTable table;
-
-    LasReader reader(Support::datapath("interesting.las"));
-    reader.prepare(table);
-
-    MetadataNode file_metadata = table->metadata();
+    MetadataNode n("top");
+    MetadataNode n2 = n.add("test", 1e-20);
+    EXPECT_DOUBLE_EQ(n2.value<double>(), 1e-20);
 
-    EXPECT_EQ(file_metadata.toPTree().get_child("metadata").size(),
-        32);
-
-    PointTable readerTable;
-    PipelineManager mgr;
-    PipelineReader specReader(mgr);
-    specReader.readPipeline(
-        Support::datapath("pipeline/pipeline_metadata_reader.xml"));
-    std::shared_ptr<Stage> stage(mgr.getStage());
-
-    stage->prepare(readerTable);
-    MetadataNode pipeline_metadata = readerTable->metadata();
-    EXPECT_EQ(
-        pipeline_metadata.toPTree().get_child("metadata").size(), 32);
-**/
+    n2 = n.add("test2", 1.12345678);
+    EXPECT_DOUBLE_EQ(n2.value<double>(), 1.12345678);
 }
diff --git a/test/unit/OptionsTest.cpp b/test/unit/OptionsTest.cpp
index 35f88fb..7d0728d 100644
--- a/test/unit/OptionsTest.cpp
+++ b/test/unit/OptionsTest.cpp
@@ -132,33 +132,10 @@ TEST(OptionsTest, test_options_copy_ctor)
 
     Options copy(opts);
 
-    opt_i.setOptions(copy);
-
     EXPECT_TRUE(copy.hasOption("my_int"));
     EXPECT_TRUE(copy.hasOption("my_string"));
 }
 
-TEST(OptionsTest, test_options_multi)
-{
-    Option opt_i("a", 1, "This is my integral option.");
-    const Option opt_s("b", "2", "This is my stringy option.");
-
-    Options opts;
-    opts.add(opt_i);
-    opts.add(opt_s);
-
-    Option opt;
-    opt.setOptions(opts);
-
-    boost::optional<Options const&> o = opt.getOptions();
-
-    Option const& i = o->getOption("a");
-    EXPECT_EQ(i.getValue<int>(), 1);
-
-    Option const& s = o->getOption("b");
-    EXPECT_EQ(s.getValue<std::string>(), "2");
-}
-
 TEST(OptionsTest, test_options_writing)
 {
     Options opts;
@@ -305,20 +282,13 @@ TEST(OptionsTest, implicitdefault)
 TEST(OptionsTest, metadata)
 {
     Options ops;
-    ops.add("test1", "This is a test");
-    ops.add("test2", 56);
-    ops.add("test3", 27.5, "Testing test3");
+    ops.add("testa", "This is a test");
+    ops.add("testb", 56);
+    ops.add("testc", 27.5, "Testing testc");
 
-    Option op35("test3.5", 3.5);
+    Option op35("testd", 3.5);
 
-    Options subops;
-    subops.add("subtest1", "Subtest1");
-    subops.add("subtest2", "Subtest2");
-
-    op35.setOptions(subops);
-
-    ops.add(op35);
-    ops.add("test4", "Testing option test 4");
+    ops.add("teste", "Testing option test e");
 
     MetadataNode node = ops.toMetadata();
 
@@ -361,3 +331,11 @@ TEST(OptionsTest, conditional)
     EXPECT_EQ(ops.getValueOrDefault("bazel", std::string()), "win");
 }
 
+TEST(OptionsTest, valid)
+{
+    EXPECT_TRUE(Option::nameValid("foo_123_bar_baz", false));
+    EXPECT_FALSE(Option::nameValid("foo_123_bar-baz", false));
+    EXPECT_FALSE(Option::nameValid("Afoo_123_bar_baz", false));
+    EXPECT_FALSE(Option::nameValid("1foo_123_bar_baz", false));
+    EXPECT_FALSE(Option::nameValid("1foo_123_bar_baz", false));
+}
diff --git a/test/unit/PDALUtilsTest.cpp b/test/unit/PDALUtilsTest.cpp
index 3a1c731..b91ebf6 100644
--- a/test/unit/PDALUtilsTest.cpp
+++ b/test/unit/PDALUtilsTest.cpp
@@ -43,20 +43,13 @@ using namespace pdal;
 TEST(PDALUtilsTest, options1)
 {
     Options ops;
-    ops.add("test1", "This is a test");
-    ops.add("test2", 56);
-    ops.add("test3", 27.5, "Testing test3");
+    ops.add("testa", "This is a test");
+    ops.add("testb", 56);
+    ops.add("testc", 27.5, "Testing testc");
 
-    Option op35("test3.5", 3.5);
+    Option op35("testd", 3.5);
 
-    Options subops;
-    subops.add("subtest1", "Subtest1");
-    subops.add("subtest2", "Subtest2");
-
-    op35.setOptions(subops);
-
-    ops.add(op35);
-    ops.add("test4", "Testing option test 4");
+    ops.add("teste", "Testing option test e");
 
     std::string goodfile(Support::datapath("misc/opts2json.txt"));
     std::string testfile(Support::temppath("opts2json.txt"));
diff --git a/test/unit/PointViewTest.cpp b/test/unit/PointViewTest.cpp
index ce62a3c..c6e39d2 100644
--- a/test/unit/PointViewTest.cpp
+++ b/test/unit/PointViewTest.cpp
@@ -446,3 +446,14 @@ TEST(PointViewTest, order)
         pi = si;
     }
 }
+
+// Per discussions with @abellgithub (https://github.com/gadomski/PDAL/commit/c1d54e56e2de841d37f2a1b1c218ed723053f6a9#commitcomment-14415138)
+// we only do bounds checking on `PointView`s when in debug mode.
+#ifndef NDEBUG
+TEST(PointViewDeathTest, out_of_bounds)
+{
+    PointTable point_table;
+    auto point_view = makeTestView(point_table, 1);
+    EXPECT_DEATH(point_view->getFieldAs<uint8_t>(Dimension::Id::X, 1), "< m_size");
+}
+#endif
diff --git a/test/unit/SpatialReferenceTest.cpp b/test/unit/SpatialReferenceTest.cpp
index 138c549..c826d0a 100644
--- a/test/unit/SpatialReferenceTest.cpp
+++ b/test/unit/SpatialReferenceTest.cpp
@@ -36,6 +36,8 @@
 
 #include <pdal/SpatialReference.hpp>
 #include <pdal/util/FileUtils.hpp>
+#include <ReprojectionFilter.hpp>
+#include <MergeFilter.hpp>
 #include <LasWriter.hpp>
 #include <LasReader.hpp>
 
@@ -185,18 +187,21 @@ TEST(SpatialReferenceTest, test_read_srs)
 #endif
 
 
-//NOTE - The source file uses Geotiff spatial reference, so this only
-//  works if we have the necessary library.
 #ifdef PDAL_HAVE_LIBGEOTIFF
 
 // Try writing a compound coordinate system to file and ensure we get back
 // WKT with the geoidgrids (from the WKT VLR).
+
+//ABELL - Commenting out for now.  If someone can find a good vertical
+//  datum that transforms consistently in and out of GeoTiff encoding,
+//  throw it in and turn this on.
+/**
 TEST(SpatialReferenceTest, test_vertical_datums)
 {
     std::string tmpfile(Support::temppath("tmp_srs.las"));
     FileUtils::deleteFile(tmpfile);
 
-    const std::string wkt = "COMPD_CS[\"WGS 84 + VERT_CS\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003con [...]
+    const std::string wkt = "COMPD_CS[\"unknown\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a [...]
 
     SpatialReference ref;
     ref.setFromUserInput(wkt);
@@ -210,7 +215,6 @@ TEST(SpatialReferenceTest, test_vertical_datums)
     LasReader reader;
     reader.setOptions(ops1);
 
-    // need to scope the writer, so that's it dtor can use the stream
     Options opts;
     opts.add("filename", tmpfile);
 
@@ -232,11 +236,12 @@ TEST(SpatialReferenceTest, test_vertical_datums)
     const SpatialReference ref2 = reader2.getSpatialReference();
     const std::string wkt2 = ref2.getWKT(SpatialReference::eCompoundOK);
 
-    EXPECT_TRUE(wkt == wkt2);
+    EXPECT_EQ(wkt, wkt2);
 
     // Cleanup
     FileUtils::deleteFile(tmpfile);
 }
+**/
 #endif //PDAL_HAVE_LIBGEOTIFF
 
 
@@ -270,6 +275,7 @@ TEST(SpatialReferenceTest, test_writing_vlr)
         LasWriter writer;
 
         writerOpts.add("filename", tmpfile);
+        writerOpts.add("minor_version", 4);
         writer.setOptions(writerOpts);
         writer.setInput(readerx);
         writer.prepare(table);
@@ -289,7 +295,7 @@ TEST(SpatialReferenceTest, test_writing_vlr)
 
         SpatialReference result_ref = reader.getSpatialReference();
 
-        EXPECT_EQ(reader.header().vlrCount(), 5u);
+        EXPECT_EQ(reader.header().vlrCount(), 2u);
         std::string wkt = result_ref.getWKT();
         EXPECT_EQ(wkt, reference_wkt);
     }
@@ -332,3 +338,52 @@ TEST(SpatialReferenceTest, test_vertical_and_horizontal)
     EXPECT_EQ(vert, vertical);
 
 }
+
+#if defined(PDAL_HAVE_LIBGEOTIFF)
+TEST(SpatialReferenceTest, merge)
+{
+    Options o1;
+    o1.add("filename", Support::datapath("las/test_utm17.las"));
+    LasReader r1;
+    r1.setOptions(o1);
+
+    Options o2;
+    o2.add("filename", Support::datapath("las/test_epsg_4326.las"));
+    LasReader r2;
+    r2.setOptions(o2);
+
+    Options o3;
+//    o3.add("filename", Support::datapath("las/test_epsg_4047.las"));
+    o3.add("filename", Support::datapath("las/test_utm16.las"));
+    LasReader r3;
+    r3.setOptions(o3);
+
+    Options o4;
+    o4.add("out_srs", "EPSG:4326");
+    ReprojectionFilter repro;
+    repro.setOptions(o4);
+    repro.setInput(r1);
+    repro.setInput(r2);
+    repro.setInput(r3);
+
+    MergeFilter merge;
+    merge.setInput(repro);
+
+    FileUtils::deleteFile(Support::temppath("triple.las"));
+    Options o5;
+    o5.add("filename", Support::temppath("triple.las"));
+    o5.add("scale_x", .0001);
+    o5.add("scale_y", .0001);
+    o5.add("scale_z", .0001);
+    LasWriter w;
+    w.setOptions(o5);
+    w.setInput(merge);
+
+    PointTable t1;
+    w.prepare(t1);
+    w.execute(t1);
+
+    Support::checkXYZ(Support::temppath("triple.las"),
+        Support::datapath("las/test_epsg_4326x3.las"));
+}
+#endif
diff --git a/test/unit/Support.cpp b/test/unit/Support.cpp
index 349c110..0bc7f06 100644
--- a/test/unit/Support.cpp
+++ b/test/unit/Support.cpp
@@ -46,6 +46,7 @@
 #include <pdal/util/FileUtils.hpp>
 #include <pdal/Options.hpp>
 #include <pdal/Stage.hpp>
+#include <pdal/StageFactory.hpp>
 #include "TestConfig.hpp"
 
 using namespace pdal;
@@ -283,6 +284,56 @@ bool Support::compare_text_files(std::istream& str1, std::istream& str2)
     return diff_text_files(str1, str2) == 0;
 }
 
+
+void Support::checkXYZ(const std::string& file1, const std::string& file2)
+{
+    StageFactory f;
+
+    const std::string driver1 = f.inferReaderDriver(file1);
+    EXPECT_NE(driver1, "") << "Can't find driver";
+
+    const std::string driver2 = f.inferReaderDriver(file2);
+    EXPECT_NE(driver2, "") << "Can't find driver";
+    
+    Stage *reader1 = f.createStage(driver1);
+    EXPECT_NE(reader1, (Stage *)NULL) << "Couldn't create stage";
+    
+    Stage *reader2 = f.createStage(driver2);
+    EXPECT_NE(reader1, (Stage *)NULL) << "Couldn't create stage";
+
+    Options o1;
+    o1.add("filename", file1);
+    reader1->setOptions(o1);
+    PointTable t1;
+    reader1->prepare(t1);
+    PointViewSet s1 = reader1->execute(t1);
+    EXPECT_EQ(s1.size(), 1u);
+    PointViewPtr v1 = *s1.begin();
+
+    Options o2;
+    o2.add("filename", file2);
+    reader2->setOptions(o2);
+    PointTable t2;
+    reader2->prepare(t2);
+    PointViewSet s2 = reader2->execute(t2);
+    EXPECT_EQ(s2.size(), 1u);
+    PointViewPtr v2 = *s2.begin();
+
+    EXPECT_EQ(v1->size(), v2->size()) << "Files " << file1 << " and " <<
+        file2 << " have different point counts.";
+    for (PointId idx = 0; idx < v1->size(); ++idx)
+    {
+        using namespace Dimension;
+        ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::X, idx),
+            v2->getFieldAs<double>(Id::X, idx)) << "Index = " << idx;
+        ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::Y, idx),
+            v2->getFieldAs<double>(Id::Y, idx)) << "Index = " << idx;
+        ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::Z, idx),
+            v2->getFieldAs<double>(Id::Z, idx)) << "Index = " << idx;
+    }
+}
+
+
 void Support::check_pN(const pdal::PointView& data, PointId index,
     double xref, double yref, double zref)
 {
diff --git a/test/unit/Support.hpp b/test/unit/Support.hpp
index 6b68be8..4fad864 100644
--- a/test/unit/Support.hpp
+++ b/test/unit/Support.hpp
@@ -117,6 +117,8 @@ public:
         const std::string& file2);
     static bool compare_text_files(std::istream& str1, std::istream& str2);
 
+    static void checkXYZ(const std::string& file1, const std::string& file2);
+
     // validate a point's XYZ values
     static void check_pN(const pdal::PointView& data,
                          pdal::PointId index,
diff --git a/test/unit/filters/ColorizationFilterTest.cpp b/test/unit/filters/ColorizationFilterTest.cpp
index bd1d888..926fb3c 100644
--- a/test/unit/filters/ColorizationFilterTest.cpp
+++ b/test/unit/filters/ColorizationFilterTest.cpp
@@ -86,27 +86,7 @@ TEST(ColorizationFilterTest, test1)
 {
     Options options;
 
-    Option red("dimension", "Red");
-    Options subRed;
-    subRed.add("band", 1);
-    subRed.add("scale", 1.0f, "scale factor for this dimension");
-    red.setOptions(subRed);
-    options.add(red);
-
-    Option green("dimension", "Green");
-    Options subGreen;
-    subGreen.add("band", 2);
-    subGreen.add("scale", 1.0f, "scale factor for this dimension");
-    green.setOptions(subGreen);
-    options.add(green);
-
-    Option blue("dimension", "Blue", "");
-    Options subBlue;
-    subBlue.add("band", 3);
-    subBlue.add("scale", 255.0f, "scale factor for this dimension");
-    blue.setOptions(subBlue);
-    options.add(blue);
-
+    options.add("dimensions", "Red, Green,Blue::255  ");
     options.add("raster", Support::datapath("autzen/autzen.jpg"),
         "raster to read");
 
@@ -138,27 +118,7 @@ TEST(ColorizationFilterTest, test3)
 {
     Options options;
 
-    Option red("dimension", "Foo");
-    Options subRed;
-    subRed.add("band", 1);
-    subRed.add("scale", 1.0f, "scale factor for this dimension");
-    red.setOptions(subRed);
-    options.add(red);
-
-    Option green("dimension", "Bar");
-    Options subGreen;
-    subGreen.add("band", 2);
-    subGreen.add("scale", 1.0f, "scale factor for this dimension");
-    green.setOptions(subGreen);
-    options.add(green);
-
-    Option blue("dimension", "Baz", "");
-    Options subBlue;
-    subBlue.add("band", 3);
-    subBlue.add("scale", 255.0f, "scale factor for this dimension");
-    blue.setOptions(subBlue);
-    options.add(blue);
-
+    options.add("dimensions", "Foo:1,Bar:2,Baz:3:255");
     options.add("raster", Support::datapath("autzen/autzen.jpg"),
         "raster to read");
 
diff --git a/test/unit/filters/CropFilterTest.cpp b/test/unit/filters/CropFilterTest.cpp
index 29829d0..4740528 100644
--- a/test/unit/filters/CropFilterTest.cpp
+++ b/test/unit/filters/CropFilterTest.cpp
@@ -159,40 +159,22 @@ TEST(CropFilterTest, test_crop_polygon_reprojection)
 #ifdef PDAL_HAVE_GEOS
     Options options;
 
-    Option in_srs("spatialreference",Support::datapath("autzen/autzen-srs.wkt"), "Input SRS");
-    Option out_srs("out_srs","EPSG:4326", "Output SRS to reproject to");
-    Option x_dim("x_dim", std::string("readers.las.X"),
-        "Dimension name to use for 'X' data");
-    Option y_dim("y_dim", std::string("readers.las.Y"),
-        "Dimension name to use for 'Y' data");
-    Option z_dim("z_dim", std::string("readers.las.Z"),
-        "Dimension name to use for 'Z' data");
-    Option x_scale("scale_x", 0.0000001f, "Scale for output X data "
-        "in the case when 'X' dimension data are to be scaled.  Defaults "
-        "to '1.0'.  If not set, the Dimensions's scale will be used");
-    Option y_scale("scale_y", 0.0000001f, "Scale for output Y data "
-        "in the case when 'Y' dimension data are to be scaled.  Defaults "
-        "to '1.0'.  If not set, the Dimensions's scale will be used");
-    Option filename("filename", Support::datapath("las/1.2-with-color.las"));
-    Option debug("debug", true, "");
-    Option verbose("verbose", 9, "");
-    // options.add(debug);
-    // options.add(verbose);
-    options.add(in_srs);
-    options.add(out_srs);
-    options.add(x_dim);
-    options.add(y_dim);
-    options.add(z_dim);
-    options.add(x_scale);
-    options.add(y_scale);
-    options.add(filename);
+    options.add("spatialreference", Support::datapath("autzen/autzen-srs.wkt"));
+    options.add("out_srs", "EPSG:4326");
+    options.add("x_dim", std::string("readers.las.X"));
+    options.add("y_dim", std::string("readers.las.Y"));
+    options.add("z_dim", std::string("readers.las.Z"));
+    options.add("scale_x", 0.0000001f);
+    options.add("scale_y", 0.0000001f);
+    options.add("filename", Support::datapath("las/1.2-with-color.las"));
 
     std::istream* wkt_stream = FileUtils::openFile(
         Support::datapath("autzen/autzen-selection-dd.wkt"));
     std::stringstream strbuf;
     strbuf << wkt_stream->rdbuf();
     std::string wkt(strbuf.str());
-    Option polygon("polygon", wkt, "");
+
+    Option polygon("polygon", wkt);
     options.add(polygon);
 
     LasReader reader;
diff --git a/test/unit/filters/DividerFilterTest.cpp b/test/unit/filters/DividerFilterTest.cpp
new file mode 100644
index 0000000..5b43411
--- /dev/null
+++ b/test/unit/filters/DividerFilterTest.cpp
@@ -0,0 +1,204 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <FauxReader.hpp>
+#include <DividerFilter.hpp>
+
+using namespace pdal;
+
+TEST(DividerFilterTest, partition_count)
+{
+    point_count_t count = 1000;
+
+    Options readerOps;
+    readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+    readerOps.add("mode", "ramp");
+    readerOps.add("num_points", count);
+
+    FauxReader r;
+    r.setOptions(readerOps);
+
+    Options filterOps;
+    filterOps.add("count", 10);
+    DividerFilter f;
+    f.setInput(r);
+    f.setOptions(filterOps);
+
+    PointTable t;
+    f.prepare(t);
+    PointViewSet s = f.execute(t);
+
+    EXPECT_EQ(s.size(), 10u);
+
+    PointId i = 0;
+    for (PointViewPtr v : s)
+    {
+        EXPECT_EQ(v->size(), 100u);
+        for (PointId p = 0; p < v->size(); ++p)
+        {
+            EXPECT_DOUBLE_EQ((double)(i + 1),
+                v->getFieldAs<double>(Dimension::Id::X, p));
+            i++;
+        }
+    }
+}
+
+TEST(DividerFilterTest, partition_capacity)
+{
+    point_count_t count = 1000;
+
+    Options readerOps;
+    readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+    readerOps.add("mode", "ramp");
+    readerOps.add("num_points", count);
+
+    FauxReader r;
+    r.setOptions(readerOps);
+
+    Options filterOps;
+    filterOps.add("capacity", 25);
+    DividerFilter f;
+    f.setInput(r);
+    f.setOptions(filterOps);
+
+    PointTable t;
+    f.prepare(t);
+    PointViewSet s = f.execute(t);
+
+    EXPECT_EQ(s.size(), 40u);
+
+    PointId i = 0;
+    for (PointViewPtr v : s)
+    {
+        EXPECT_EQ(v->size(), 25u);
+        for (PointId p = 0; p < v->size(); ++p)
+        {
+            EXPECT_DOUBLE_EQ((double)(i + 1),
+                v->getFieldAs<double>(Dimension::Id::X, p));
+            i++;
+        }
+    }
+}
+
+TEST(DividerFilterTest, round_robin_count)
+{
+    point_count_t count = 1000;
+
+    Options readerOps;
+    readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+    readerOps.add("mode", "ramp");
+    readerOps.add("num_points", count);
+
+    FauxReader r;
+    r.setOptions(readerOps);
+
+    Options filterOps;
+    filterOps.add("count", 10);
+    filterOps.add("mode", "round_robin");
+    DividerFilter f;
+    f.setInput(r);
+    f.setOptions(filterOps);
+
+    PointTable t;
+    f.prepare(t);
+    PointViewSet s = f.execute(t);
+
+    EXPECT_EQ(s.size(), 10u);
+
+    PointId i = 0;
+    for (PointViewPtr v : s)
+        EXPECT_EQ(v->size(), 100u);
+
+    unsigned viewNum = 0;
+    PointId start = 1;
+    for (PointViewPtr v : s)
+    {
+        double value = start;
+        for (PointId i = 0 ; i < v->size(); i++)
+        {
+            EXPECT_DOUBLE_EQ((double)value,
+                v->getFieldAs<double>(Dimension::Id::X, i));
+            value += 10;
+        }
+        start++;
+    }
+}
+
+
+TEST(DividerFilterTest, round_robin_capacity)
+{
+    point_count_t count = 1000;
+
+    Options readerOps;
+    readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+    readerOps.add("mode", "ramp");
+    readerOps.add("num_points", count);
+
+    FauxReader r;
+    r.setOptions(readerOps);
+
+    Options filterOps;
+    filterOps.add("capacity", 25);
+    filterOps.add("mode", "round_robin");
+    DividerFilter f;
+    f.setInput(r);
+    f.setOptions(filterOps);
+
+    PointTable t;
+    f.prepare(t);
+    PointViewSet s = f.execute(t);
+
+    EXPECT_EQ(s.size(), 40u);
+
+    PointId i = 0;
+    for (PointViewPtr v : s)
+        EXPECT_EQ(v->size(), 25u);
+
+    unsigned viewNum = 0;
+    PointId start = 1;
+    for (PointViewPtr v : s)
+    {
+        double value = start;
+        for (PointId i = 0 ; i < v->size(); i++)
+        {
+            EXPECT_DOUBLE_EQ((double)value,
+                v->getFieldAs<double>(Dimension::Id::X, i));
+            value += 40;
+        }
+        start++;
+    }
+}
+
diff --git a/test/unit/filters/FerryFilterTest.cpp b/test/unit/filters/FerryFilterTest.cpp
index 57dba86..442941f 100644
--- a/test/unit/filters/FerryFilterTest.cpp
+++ b/test/unit/filters/FerryFilterTest.cpp
@@ -88,21 +88,47 @@ TEST(FerryFilterTest, test_ferry_invalid)
     LasReader reader;
     reader.setOptions(ops1);
 
-    Options options;
+    Options op1;
+    
+    op1.add("dimensions", "X=X");
 
-    Option x("dimension", "X", "");
-    Option toX("to","X", "");
-    Options xO;
-    xO.add(toX);
-    x.setOptions(xO);
-    options.add(x);
-
-    FerryFilter ferry;
-    ferry.setInput(reader);
-    ferry.setOptions(options);
+    FerryFilter f1;
+    f1.setInput(reader);
+    f1.setOptions(op1);
 
     PointTable table;
 
-    EXPECT_THROW(ferry.prepare(table), pdal_error);
+    // Make sure we can't ferry to ourselves.
+    EXPECT_THROW(f1.prepare(table), pdal_error);
+
+    Options op2;
+
+    op2.add("dimension", "X=NewX");
+    FerryFilter f2;
+    f2.setInput(reader);
+    f2.setOptions(op2);
+
+    // Make sure we reject old option name.
+    EXPECT_THROW(f2.prepare(table), pdal_error);
+
+    Options op3;
+
+    op3.add("dimensions", "NewX = X");
+    FerryFilter f3;
+    f3.setInput(reader);
+    f3.setOptions(op3);
+
+    // Make sure we reject bad source dimension.
+    EXPECT_THROW(f3.prepare(table), pdal_error);
+
+    Options op4;
+
+    op4.add("dimensions", "X = Y, X = NewZ = NewQ");
+    FerryFilter f4;
+    f4.setInput(reader);
+    f4.setOptions(op4);
+
+    // Make sure we reject bad option format.
+    EXPECT_THROW(f4.prepare(table), pdal_error);
 }
 
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/filters/MergeTest.cpp
index bee0b74..1c67e2b 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/filters/MergeTest.cpp
@@ -54,3 +54,43 @@ TEST(MergeTest, test1)
     PointViewPtr view = *viewSet.begin();
     EXPECT_EQ(view->size(), 2130u);
 }
+
+TEST(MergeTest, test2)
+{
+    using namespace pdal;
+
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(Support::configuredpath("filters/merge2.xml"));
+    mgr.execute();
+
+    PointViewSet viewSet = mgr.views();
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 2130u);
+}
+
+TEST(MergeTest, test3)
+{
+    using namespace pdal;
+
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(Support::configuredpath("filters/merge3.xml"));
+
+    std::ostringstream oss;
+    std::ostream& o = std::clog;
+    auto ctx = Utils::redirect(o, oss);
+
+    mgr.execute();
+    std::string s = oss.str();
+    EXPECT_TRUE(s.find("inconsistent spatial references") != s.npos);
+    Utils::restore(o, ctx);
+
+    PointViewSet viewSet = mgr.views();
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 2130u);
+}
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/filters/RandomizeFilterTest.cpp
similarity index 67%
copy from test/unit/filters/MergeTest.cpp
copy to test/unit/filters/RandomizeFilterTest.cpp
index bee0b74..44dcb7a 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/filters/RandomizeFilterTest.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
 *
 * All rights reserved.
 *
@@ -34,23 +34,40 @@
 
 #include <pdal/pdal_test_main.hpp>
 
-#include <pdal/PipelineManager.hpp>
-#include <pdal/PipelineReader.hpp>
+#include <FauxReader.hpp>
+#include <RandomizeFilter.hpp>
 
-#include "Support.hpp"
+using namespace pdal;
 
-TEST(MergeTest, test1)
+TEST(RandomizeFilterTest, simple)
 {
-    using namespace pdal;
+    // This isn't a real test.  It's just here to allow easy debugging.
 
-    PipelineManager mgr;
-    PipelineReader specReader(mgr);
-    specReader.readPipeline(Support::configuredpath("filters/merge.xml"));
-    mgr.execute();
+    point_count_t count = 1000;
 
-    PointViewSet viewSet = mgr.views();
+    Options readerOps;
+    readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+    readerOps.add("mode", "ramp");
+    readerOps.add("num_points", count);
 
-    EXPECT_EQ(viewSet.size(), 1u);
-    PointViewPtr view = *viewSet.begin();
-    EXPECT_EQ(view->size(), 2130u);
+    FauxReader r;
+    r.setOptions(readerOps);
+
+    RandomizeFilter f;
+    f.setInput(r);
+
+    PointTable t;
+    f.prepare(t);
+    PointViewSet s = f.execute(t);
+
+    EXPECT_EQ(s.size(), 1u);
+    PointViewPtr v = *s.begin();
+    EXPECT_EQ(v->size(), (size_t)count);
+
+/**
+    for (PointId i = 0; i < count; i++)
+        std::cerr << "X[" << i << "] = " <<
+            v->getFieldAs<double>(Dimension::Id::X, i) << "!\n";
+**/
 }
+
diff --git a/test/unit/filters/RangeFilterTest.cpp b/test/unit/filters/RangeFilterTest.cpp
index a57fc45..0e3f550 100644
--- a/test/unit/filters/RangeFilterTest.cpp
+++ b/test/unit/filters/RangeFilterTest.cpp
@@ -48,7 +48,7 @@ TEST(RangeFilterTest, createStage)
     EXPECT_TRUE(filter.get());
 }
 
-TEST(RangeFilterTest, noDimension)
+TEST(RangeFilterTest, noLimits)
 {
     RangeFilter filter;
 
@@ -56,18 +56,6 @@ TEST(RangeFilterTest, noDimension)
     EXPECT_THROW(filter.prepare(table), pdal_error);
 }
 
-TEST(RangeFilterTest, noRange)
-{
-    Options rangeOps;
-    rangeOps.add("dimension", "Z");
-
-    RangeFilter filter;
-    filter.setOptions(rangeOps);
-
-    PointTable table;
-    EXPECT_THROW(filter.prepare(table), pdal_error);
-}
-
 TEST(RangeFilterTest, singleDimension)
 {
     BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
@@ -80,15 +68,8 @@ TEST(RangeFilterTest, singleDimension)
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options range;
-    range.add("min", 4);
-    range.add("max", 6);
-
-    Option dim("dimension", "Z");
-    dim.setOptions(range);
-
     Options rangeOps;
-    rangeOps.add(dim);
+    rangeOps.add("limits", "Z(3.50:6]  ");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -118,23 +99,9 @@ TEST(RangeFilterTest, multipleDimensions)
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options y_range;
-    y_range.add("min", 4);
-    y_range.add("max", 6);
-
-    Option y_dim("dimension", "Y");
-    y_dim.setOptions(y_range);
-
-    Options z_range;
-    z_range.add("min", 4);
-    z_range.add("max", 6);
-
-    Option z_dim("dimension", "Z");
-    z_dim.setOptions(z_range);
-
     Options rangeOps;
-    rangeOps.add(y_dim);
-    rangeOps.add(z_dim);
+    rangeOps.add("limits", "Y[4.00e0:+6]");
+    rangeOps.add("limits", "Z[4:6]");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -155,6 +122,45 @@ TEST(RangeFilterTest, multipleDimensions)
     EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
 }
 
+TEST(RangeFilterTest, multipleDimsBusted)
+{
+    BOX3D srcBounds(1, 3, 5, 1, 3, 5);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 1);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options rangeOps1;
+    rangeOps1.add("limits", "X[1:1], Y[27:27]");
+
+    RangeFilter f1;
+    f1.setOptions(rangeOps1);
+    f1.setInput(reader);
+
+    PointTable t1;
+    f1.prepare(t1);
+    PointViewSet s1 = f1.execute(t1);
+    PointViewPtr v1 = *s1.begin();
+
+    Options rangeOps2;
+    rangeOps2.add("limits", "Y[27:27], X[1:1]");
+
+    RangeFilter f2;
+    f2.setOptions(rangeOps2);
+    f2.setInput(reader);
+
+    PointTable t2;
+    f2.prepare(t2);
+    PointViewSet s2 = f2.execute(t2);
+    PointViewPtr v2 = *s2.begin();
+
+    EXPECT_EQ(v1->size(), v2->size());
+}
+
 TEST(RangeFilterTest, onlyMin)
 {
     BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
@@ -167,14 +173,8 @@ TEST(RangeFilterTest, onlyMin)
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options range;
-    range.add("min", 6);
-
-    Option dim("dimension", "Z");
-    dim.setOptions(range);
-
     Options rangeOps;
-    rangeOps.add(dim);
+    rangeOps.add("limits", "Z[6:]");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -207,14 +207,8 @@ TEST(RangeFilterTest, onlyMax)
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options range;
-    range.add("max", 5);
-
-    Option dim("dimension", "Z");
-    dim.setOptions(range);
-
     Options rangeOps;
-    rangeOps.add(dim);
+    rangeOps.add("limits", "Z[:5]");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -234,8 +228,7 @@ TEST(RangeFilterTest, onlyMax)
     EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
 }
 
-
-TEST(RangeFilterTest, equals)
+TEST(RangeFilterTest, negation)
 {
     BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
 
@@ -244,17 +237,46 @@ TEST(RangeFilterTest, equals)
     ops.add("mode", "ramp");
     ops.add("num_points", 10);
 
+    StageFactory f;
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options range;
-    range.add("equals", 5);
+    Options rangeOps;
+    rangeOps.add("limits", "Z![2:5]");
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(6u, view->size());
+    EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(7.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+    EXPECT_FLOAT_EQ(8.0, view->getFieldAs<double>(Dimension::Id::Z, 3));
+    EXPECT_FLOAT_EQ(9.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
+    EXPECT_FLOAT_EQ(10.0, view->getFieldAs<double>(Dimension::Id::Z, 5));
+}
 
-    Option dim("dimension", "Z");
-    dim.setOptions(range);
+TEST(RangeFilterTest, equals)
+{
+    BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
 
     Options rangeOps;
-    rangeOps.add(dim);
+    rangeOps.add("limits", "Z[5:5]");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -282,15 +304,8 @@ TEST(RangeFilterTest, negativeValues)
     FauxReader reader;
     reader.setOptions(ops);
 
-    Options range;
-    range.add("min", -1);
-    range.add("max", 1);
-
-    Option dim("dimension", "Z");
-    dim.setOptions(range);
-
     Options rangeOps;
-    rangeOps.add(dim);
+    rangeOps.add("limits", "Z[-1:1)");
 
     RangeFilter filter;
     filter.setOptions(rangeOps);
@@ -302,9 +317,40 @@ TEST(RangeFilterTest, negativeValues)
     PointViewPtr view = *viewSet.begin();
 
     EXPECT_EQ(1u, viewSet.size());
-    EXPECT_EQ(3u, view->size());
+    EXPECT_EQ(2u, view->size());
     EXPECT_FLOAT_EQ(-1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
     EXPECT_FLOAT_EQ(0.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
-    EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+}
+
+TEST(RangeFilterTest, simple_logic)
+{
+
+    Options ops;
+    ops.add("bounds", BOX3D(1, 101, 201, 10, 110, 210));
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options rangeOps;
+    rangeOps.add("limits", "Y[108:109], X[2:5], Z[1:1000], X[7:9], Y[103:105]");
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(5u, view->size());
+    EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 0), 3);
+    EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 1), 4);
+    EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 2), 5);
+    EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 3), 8);
+    EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 4), 9);
 }
 
diff --git a/test/unit/filters/StatsFilterTest.cpp b/test/unit/filters/StatsFilterTest.cpp
index 901d142..299fe47 100644
--- a/test/unit/filters/StatsFilterTest.cpp
+++ b/test/unit/filters/StatsFilterTest.cpp
@@ -167,17 +167,17 @@ TEST(Stats, metadata)
     {
         if (findNode(*mi, "name", "X").valid())
         {
-            EXPECT_EQ(mi->findChild("average").value(), "1");
-            EXPECT_EQ(mi->findChild("minimum").value(), "1");
-            EXPECT_EQ(mi->findChild("maximum").value(), "1");
-            EXPECT_EQ(mi->findChild("count").value(), "1000");
+            EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 1.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 1.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 1.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0);
         }
         if (findNode(*mi, "name", "Z").valid())
         {
-            EXPECT_EQ(mi->findChild("average").value(), "3");
-            EXPECT_EQ(mi->findChild("minimum").value(), "3");
-            EXPECT_EQ(mi->findChild("maximum").value(), "3");
-            EXPECT_EQ(mi->findChild("count").value(), "1000");
+            EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 3.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 3.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 3.0);
+            EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0);
         }
     }
 }
diff --git a/test/unit/io/bpf/BPFTest.cpp b/test/unit/io/bpf/BPFTest.cpp
index 7fcc40a..b81d7dd 100644
--- a/test/unit/io/bpf/BPFTest.cpp
+++ b/test/unit/io/bpf/BPFTest.cpp
@@ -553,3 +553,68 @@ TEST(BPFTest, flex2)
     r.setOptions(ops);
     EXPECT_EQ(r.preview().m_pointCount, 1065u);
 }
+
+TEST(BPFTest, outputdims)
+{
+    Options ops;
+    ops.add("filename", Support::datapath("bpf/autzen-dd.bpf"));
+
+    BpfReader reader;
+    reader.setOptions(ops);
+
+    std::string testfile(Support::temppath("test.bpf"));
+
+    FileUtils::deleteFile(testfile);
+    Options writerOps;
+    writerOps.add("filename", testfile);
+    writerOps.add("output_dims", "X, Y, Z, Red, Green");
+
+    BpfWriter writer;
+    writer.setInput(reader);
+    writer.setOptions(writerOps);
+    
+    PointTable t;
+    writer.prepare(t);
+    writer.execute(t);
+
+    Options o2;
+    o2.add("filename", testfile);
+
+    BpfReader r;
+    r.setOptions(o2);
+
+    PointTable t2;
+    r.prepare(t2);
+
+    StringList dimNames;
+    Dimension::IdList dimList = t2.layout()->dims(); 
+    EXPECT_EQ(dimList.size(), 5u);
+    for (auto di : dimList)
+        dimNames.push_back(t2.layout()->dimName(di));
+
+    const char *dims[] =
+    {
+        "Green",
+        "Red",
+        "X",
+        "Y",
+        "Z"
+    };
+   
+    std::sort(dimNames.begin(), dimNames.end());
+    EXPECT_TRUE(CheckEqualCollections(dimNames.begin(),
+        dimNames.end(), std::begin(dims)));
+
+    Options o3;
+    o3.add("filename", testfile);
+    o3.add("output_dims", "Y, Z, Red, Green");
+
+    BpfWriter w3;
+    w3.setOptions(o3);
+    
+    // Missing X dimension.
+    PointTable t3;
+    EXPECT_THROW(w3.prepare(t3), pdal_error);
+    
+}
+
diff --git a/test/unit/io/faux/FauxReaderTest.cpp b/test/unit/io/faux/FauxReaderTest.cpp
index f0195dd..365e8a3 100644
--- a/test/unit/io/faux/FauxReaderTest.cpp
+++ b/test/unit/io/faux/FauxReaderTest.cpp
@@ -214,3 +214,26 @@ TEST(FauxReaderTest, test_return_number)
         EXPECT_EQ(numberOfReturns, 9);
     }
 }
+
+
+TEST(FauxReaderTest, one_point)
+{
+    Options ops;
+
+    ops.add("bounds", BOX3D(1, 2, 3, 1, 2, 3));
+    ops.add("count", 1);
+    ops.add("mode", "ramp");
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    PointTable table;
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1u);
+
+    EXPECT_EQ(1, view->getFieldAs<int>(Dimension::Id::X, 0));
+    EXPECT_EQ(2, view->getFieldAs<int>(Dimension::Id::Y, 0));
+    EXPECT_EQ(3, view->getFieldAs<int>(Dimension::Id::Z, 0));
+}
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
similarity index 59%
copy from test/unit/filters/MergeTest.cpp
copy to test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
index bee0b74..0eb2c1a 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
@@ -1,5 +1,5 @@
 /******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
 *
 * All rights reserved.
 *
@@ -34,23 +34,55 @@
 
 #include <pdal/pdal_test_main.hpp>
 
-#include <pdal/PipelineManager.hpp>
+#include <pdal/Options.hpp>
 #include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PointView.hpp>
+
+#include <Ilvis2Reader.hpp>
 
 #include "Support.hpp"
 
-TEST(MergeTest, test1)
+using namespace pdal;
+
+void checkPoint(const PointView& data, PointId index, double time,
+    double latitude, double longitude, double altitude)
 {
-    using namespace pdal;
+    auto checkDimension = [&data,index](Dimension::Id::Enum dim,
+        double expected)
+    {
+        double actual = data.getFieldAs<double>(dim, index);
+        EXPECT_FLOAT_EQ(expected, actual);
+    };
 
-    PipelineManager mgr;
-    PipelineReader specReader(mgr);
-    specReader.readPipeline(Support::configuredpath("filters/merge.xml"));
-    mgr.execute();
+    checkDimension(Dimension::Id::Y, latitude);
+    checkDimension(Dimension::Id::X, longitude);
+    checkDimension(Dimension::Id::Z, altitude);
+    checkDimension(Dimension::Id::GpsTime, time);
+}
 
-    PointViewSet viewSet = mgr.views();
+TEST(Ilvis2ReaderTest, testRead)
+{
+    Option filename("filename", Support::datapath("ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT"), "");
+    Options options(filename);
+    std::shared_ptr<Ilvis2Reader> reader(new Ilvis2Reader);
+    reader->setOptions(options);
 
+    PointTable table;
+
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
     EXPECT_EQ(viewSet.size(), 1u);
     PointViewPtr view = *viewSet.begin();
-    EXPECT_EQ(view->size(), 2130u);
+
+    EXPECT_EQ(view->size(), 998u);
+
+    checkPoint(*view.get(), 0, 42504.48313,
+             78.307673,121.21479,1956.583
+            );
+
+    checkPoint(*view.get(), 996, 42520.90035,
+             78.320149, 121.32024, 1959.206
+            );
 }
+
diff --git a/test/unit/io/las/LasReaderTest.cpp b/test/unit/io/las/LasReaderTest.cpp
index e967dcd..269671c 100644
--- a/test/unit/io/las/LasReaderTest.cpp
+++ b/test/unit/io/las/LasReaderTest.cpp
@@ -393,6 +393,53 @@ TEST(LasReaderTest, callback)
     EXPECT_EQ(count, (point_count_t)1065);
 }
 
+#ifdef PDAL_HAVE_LAZPERF
+// LAZ files are normally written in chunks of 50,000, so a file of size
+// 110,000 ensures we read some whole chunks and a partial.
+TEST(LasReaderTest, lazperf)
+{
+    Options ops1;
+    ops1.add("filename", Support::datapath("laz/autzen_trim.laz"));
+    ops1.add("compression", "lazperf");
+
+    LasReader lazReader;
+    lazReader.setOptions(ops1);
+
+    PointTable t1;
+    lazReader.prepare(t1);
+    PointViewSet pbSet = lazReader.execute(t1);
+    EXPECT_EQ(pbSet.size(), 1UL);
+    PointViewPtr view1 = *pbSet.begin();
+    EXPECT_EQ(view1->size(), (point_count_t)110000);
+
+    Options ops2;
+    ops2.add("filename", Support::datapath("las/autzen_trim.las"));
+
+    LasReader lasReader;
+    lasReader.setOptions(ops2);
+
+    PointTable t2;
+    lasReader.prepare(t2);
+    pbSet = lasReader.execute(t2);
+    EXPECT_EQ(pbSet.size(), 1UL);
+    PointViewPtr view2 = *pbSet.begin();
+    EXPECT_EQ(view2->size(), (point_count_t)110000);
+
+    DimTypeList dims = view1->dimTypes();
+    size_t pointSize = view1->pointSize();
+    EXPECT_EQ(view1->pointSize(), view2->pointSize());
+    // Validate some point data.
+    std::unique_ptr<char> buf1(new char[pointSize]);
+    std::unique_ptr<char> buf2(new char[pointSize]);
+    for (PointId i = 0; i < 110000; i += 100)
+    {
+       view1->getPackedPoint(dims, i, buf1.get());
+       view2->getPackedPoint(dims, i, buf2.get());
+       EXPECT_EQ(memcmp(buf1.get(), buf2.get(), pointSize), 0);
+    }
+}
+#endif
+
 
 // The header of 1.2-with-color-clipped says that it has 1065 points,
 // but it really only has 1064.
diff --git a/test/unit/io/las/LasWriterTest.cpp b/test/unit/io/las/LasWriterTest.cpp
index 7f2c96f..acb83e9 100644
--- a/test/unit/io/las/LasWriterTest.cpp
+++ b/test/unit/io/las/LasWriterTest.cpp
@@ -41,6 +41,7 @@
 #include <LasHeader.hpp>
 #include <LasReader.hpp>
 #include <LasWriter.hpp>
+#include <BpfReader.hpp>
 
 #include <pdal/PointView.hpp>
 #include <pdal/StageFactory.hpp>
@@ -127,10 +128,13 @@ TEST(LasWriterTest, auto_offset)
 
     table.layout()->registerDim(Id::X);
 
+    BufferReader bufferReader;
+
     PointViewPtr view(new PointView(table));
     view->setField(Id::X, 0, 125000.00);
     view->setField(Id::X, 1, 74529.00);
     view->setField(Id::X, 2, 523523.02);
+    bufferReader.addView(view);
 
     Options writerOps;
     writerOps.add("filename", FILENAME);
@@ -139,12 +143,10 @@ TEST(LasWriterTest, auto_offset)
 
     LasWriter writer;
     writer.setOptions(writerOps);
+    writer.setInput(bufferReader);
 
     writer.prepare(table);
-
-    WriterWrapper::ready(writer, table);
-    WriterWrapper::write(writer, view);
-    WriterWrapper::done(writer, table);
+    writer.execute(table);
 
     Options readerOps;
     readerOps.add("filename", FILENAME);
@@ -207,12 +209,13 @@ TEST(LasWriterTest, extra_dims)
     Options reader2Ops;
     reader2Ops.add("filename", Support::temppath("simple.las"));
     reader2Ops.add("extra_dims", "R1 =int32, B1= int16 ,G1=int32_t");
-    std::shared_ptr<LasReader> reader2(new LasReader);
-    reader2->setOptions(reader2Ops);
+
+    LasReader reader2;
+    reader2.setOptions(reader2Ops);
 
     PointTable readTable;
-    reader2->prepare(readTable);
-    viewSet = reader2->execute(readTable);
+    reader2.prepare(readTable);
+    viewSet = reader2.execute(readTable);
     pb = *viewSet.begin();
     Dimension::Id::Enum r1 = readTable.layout()->findDim("R1");
     EXPECT_TRUE(r1 != Dimension::Id::Unknown);
@@ -231,6 +234,60 @@ TEST(LasWriterTest, extra_dims)
     }
 }
 
+TEST(LasWriterTest, all_extra_dims)
+{
+    Options readerOps;
+
+    readerOps.add("filename", Support::datapath("bpf/simple-extra.bpf"));
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    FileUtils::deleteFile(Support::temppath("simple.las"));
+
+    Options writerOps;
+    writerOps.add("extra_dims", "all");
+    writerOps.add("filename", Support::temppath("simple.las"));
+    writerOps.add("minor_version", 4);
+    LasWriter writer;
+    writer.setInput(reader);
+    writer.setOptions(writerOps);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+
+    Options ops;
+    ops.add("filename", Support::temppath("simple.las"));
+
+    LasReader r;
+    r.setOptions(ops);
+
+    PointTable t2;
+    r.prepare(t2);
+    Dimension::Id::Enum foo = t2.layout()->findDim("Foo");
+    Dimension::Id::Enum bar = t2.layout()->findDim("Bar");
+    Dimension::Id::Enum baz = t2.layout()->findDim("Baz");
+
+    PointViewSet s = r.execute(t2);
+    EXPECT_EQ(s.size(), 1u);
+    PointViewPtr v = *s.begin();
+
+    // We test for floats instead of doubles because when X, Y and Z
+    // get written, they are written scaled, which loses precision.  The
+    // foo, bar and baz values are written as full-precision doubles.
+    for (PointId i = 0; i < v->size(); ++i)
+    {
+        using namespace Dimension;
+
+        EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::X, i),
+            v->getFieldAs<float>(foo, i));
+        EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::Y, i),
+            v->getFieldAs<float>(bar, i));
+        EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::Z, i),
+            v->getFieldAs<float>(baz, i));
+    }
+}
+
 // Merge a couple of 1.4 LAS files with point formats 1 and 6.  Write the
 // output with version 3.  Verify that you get point format 3 (default),
 // LAS 1.3 output and other header data forwarded.
@@ -461,6 +518,76 @@ TEST(LasWriterTest, flex2)
     EXPECT_EQ(r.preview().m_pointCount, 1065u);
 }
 
+#if defined(PDAL_HAVE_LAZPERF) && defined(PDAL_HAVE_LASZIP)
+// LAZ files are normally written in chunks of 50,000, so a file of size
+// 110,000 ensures we read some whole chunks and a partial.
+TEST(LasWriterTest, lazperf)
+{
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("las/autzen_trim.las"));
+
+    LasReader lazReader;
+    lazReader.setOptions(readerOps);
+
+    std::string testfile(Support::temppath("temp.laz"));
+
+    FileUtils::deleteFile(testfile);
+
+    Options writerOps;
+    writerOps.add("filename", testfile);
+    writerOps.add("compression", "lazperf");
+
+    LasWriter lazWriter;
+    lazWriter.setOptions(writerOps);
+    lazWriter.setInput(lazReader);
+
+    PointTable t;
+    lazWriter.prepare(t);
+    lazWriter.execute(t);
+
+    // Now test the points were properly written.  Use laszip.
+    Options ops1;
+    ops1.add("filename", testfile);
+
+    LasReader r1;
+    r1.setOptions(ops1);
+
+    PointTable t1;
+    r1.prepare(t1);
+    PointViewSet set1 = r1.execute(t1); 
+    PointViewPtr view1 = *set1.begin();
+
+    Options ops2;
+    ops2.add("filename", Support::datapath("las/autzen_trim.las"));
+
+    LasReader r2;
+    r2.setOptions(ops2);
+
+    PointTable t2;
+    r2.prepare(t2);
+    PointViewSet set2 = r2.execute(t2); 
+    PointViewPtr view2 = *set2.begin();
+
+    EXPECT_EQ(view1->size(), view2->size());
+    EXPECT_EQ(view1->size(), (point_count_t)110000);
+
+    DimTypeList dims = view1->dimTypes();
+    size_t pointSize = view1->pointSize();
+    EXPECT_EQ(view1->pointSize(), view2->pointSize());
+
+   // Validate some point data.
+    std::unique_ptr<char> buf1(new char[pointSize]);
+    std::unique_ptr<char> buf2(new char[pointSize]);
+    for (PointId i = 0; i < view1->pointSize(); i += 100)
+    {
+       view1->getPackedPoint(dims, i, buf1.get());
+       view2->getPackedPoint(dims, i, buf2.get());
+       EXPECT_EQ(memcmp(buf1.get(), buf2.get(), pointSize), 0);
+    }
+}
+#endif
+
+
 /**
 namespace
 {
@@ -522,57 +649,6 @@ TEST(LasWriterTest, simple)
 
 //ABELL
 /**
-TEST(LasWriterTest, LasWriterTest_test_simple_laz)
-{
-    PointTable table;
-
-    WriterOpts writerOpts;
-    writerOpts.add("compressed", true);
-    writerOpts.add("creation_year", 0);
-    writerOpts.add("creation_doy", 0);
-    writerOpts.add("system_id", "");
-    writerOpts.add("software_id", "TerraScan");
-
-
-    // remove file from earlier run, if needed
-    FileUtils::deleteFile("laszip/LasWriterTest_test_simple_laz.laz");
-
-    LasReader reader(Support::datapath("laszip/basefile.las"));
-
-    std::ostream* ofs = FileUtils::createFile(
-        Support::temppath("LasWriterTest_test_simple_laz.laz"));
-
-    // need to scope the writer, so that's it dtor can use the stream
-    std::shared_ptr<LasWriter> writer(new LasWriter)(ofs);
-    writer->setOptions(writer);
-    writer->setInput(&reader);
-
-    writer->prepare(table);
-    writer->execute(table);
-
-    FileUtils::closeFile(ofs);
-
-    {
-        LasReader reader(
-            Support::temppath("LasWriterTest_test_simple_laz.laz"));
-    }
-
-    // these two files only differ by the description string in the VLR.
-    // This now skips the entire LASzip VLR for comparison.
-    const uint32_t numdiffs =Support::diff_files(
-        Support::temppath("LasWriterTest_test_simple_laz.laz"),
-        Support::datapath("laszip/laszip-generated.laz"),
-        227, 106);
-    EXPECT_EQ(numdiffs, 0u);
-
-    if (numdiffs == 0)
-        FileUtils::deleteFile(
-            Support::temppath("LasWriterTest_test_simple_laz.laz"));
-}
-**/
-
-//ABELL
-/**
 static void test_a_format(const std::string& refFile, uint8_t majorVersion,
     uint8_t minorVersion, int pointFormat)
 {
diff --git a/vendor/rply-1.1.3/LICENSE b/vendor/rply-1.1.4/LICENSE
similarity index 94%
rename from vendor/rply-1.1.3/LICENSE
rename to vendor/rply-1.1.4/LICENSE
index 5c07c9a..ca893cb 100644
--- a/vendor/rply-1.1.3/LICENSE
+++ b/vendor/rply-1.1.4/LICENSE
@@ -1,5 +1,5 @@
-RPly 1.1.3 license
-Copyright � 2003-2013 Diego Nehab.
+RPly 1.1.4 license
+Copyright � 2003-2015 Diego Nehab.
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the "Software"),
diff --git a/vendor/rply-1.1.3/etc/convert.c b/vendor/rply-1.1.4/etc/convert.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/convert.c
rename to vendor/rply-1.1.4/etc/convert.c
diff --git a/vendor/rply-1.1.3/etc/dump.c b/vendor/rply-1.1.4/etc/dump.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/dump.c
rename to vendor/rply-1.1.4/etc/dump.c
diff --git a/vendor/rply-1.1.3/etc/input.ply b/vendor/rply-1.1.4/etc/input.ply
similarity index 100%
rename from vendor/rply-1.1.3/etc/input.ply
rename to vendor/rply-1.1.4/etc/input.ply
diff --git a/vendor/rply-1.1.3/etc/sconvert.c b/vendor/rply-1.1.4/etc/sconvert.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/sconvert.c
rename to vendor/rply-1.1.4/etc/sconvert.c
diff --git a/vendor/rply-1.1.3/manual/manual.html b/vendor/rply-1.1.4/manual/manual.html
similarity index 79%
rename from vendor/rply-1.1.3/manual/manual.html
rename to vendor/rply-1.1.4/manual/manual.html
index 62f5b95..fa8e9f5 100644
--- a/vendor/rply-1.1.3/manual/manual.html
+++ b/vendor/rply-1.1.4/manual/manual.html
@@ -35,7 +35,7 @@ RPly: ANSI C library for PLY file format input and output
 
 <p>RPly is a library that lets applications read and write PLY files.  The
 PLY file format is widely used to store geometric information, such as 3D
-models, but is general enough to be useful for other purposes.  
+models, but is general enough to be useful for other purposes.
 </p>
 
 <p>There are other libraries out there, of course. I tried using them and
@@ -46,23 +46,23 @@ hope you are as happy with it as I am. </p>
 open-source, ANSI C, efficient, and well tested. I will keep supporting it
 for a while because all my tools use the library for input/output. The highlights are: </p>
 <ul>
-<li> A callback mechanism that makes PLY file input straightforward; 
-<li> Support for the full range of numeric formats though the user only 
+<li> A callback mechanism that makes PLY file input straightforward;
+<li> Support for the full range of numeric formats though the user only
 deals with doubles;
 <li> Binary (big and little endian) and text modes are fully supported;
 <li> Input and output are buffered for efficiency;
-<li> Available under the 
-<a href=http://www.opensource.org/licenses/mit-license.html>MIT license</a> 
+<li> Available under the
+<a href=http://www.opensource.org/licenses/mit-license.html>MIT license</a>
 for added freedom.
 </ul>
 
 <p>
 The format was developed at <a
-href=http://graphics.stanford.edu/data/3Dscanrep/>Stanford University</a> 
+href=http://graphics.stanford.edu/data/3Dscanrep/>Stanford University</a>
 for use with their 3D scanning projects. Greg Turk's PLY library, available
 from <a href=http://www.cc.gatech.edu/projects/large_models>
 Georgia Institute of Technology</a>, seems to be the standard reference
-to the PLY file format, although there are some variations out there. 
+to the PLY file format, although there are some variations out there.
 </p>
 
 <p> Whatever documentation and examples were found, were taken into
@@ -73,20 +73,25 @@ In practice, the library works with all PLY files that I could find.  </p>
 <h2>Download</h2>
 
 <p>
-Version 1.1.3 of RPly is available for download in source
-code from <a href=rply-1.1.3.tar.gz>this link</a>. Examples and documentation 
+Version 1.1.4 of RPly is available for download in source
+code from <a href=rply-1.1.4.tar.gz>this link</a>. Examples and documentation
 are packed inside the tarball. Have fun!
 </p>
 
 <p>
-Copyright © 2003-2013 Diego Nehab. All rights reserved. <br>
+Copyright © 2003-2015 Diego Nehab. All rights reserved. <br>
 Author: <A href="http://www.impa.br/~diego">Diego Nehab</a>
 </p>
 
 <h2>What's new?</h2>
 
 <ul>
-<li> Remove trailing white space from lines in ASCII output.
+<li> Fixed bug that prevented reading of ASCII files that
+are not terminated by a whitespace;
+<li> Added <tt>ply_open_from_file</tt> and
+<tt>ply_create_to_file</tt> variants to <tt>ply_open</tt>
+and <tt>ply_create</tt>, respectively, that receive file
+pointers instead of file names.
 </ul>
 
 <h2> RPly's idea of what a PLY file is </h2>
@@ -105,20 +110,20 @@ of its properties. Properties values also appear in the order of their
 declaration. Here is a sample PLY file describing a triangle: </p>
 
 <pre class=example>
-ply 
+ply
 format ascii 1.0
 comment this is a simple file
 obj_info any data, in one line of free form text
 element vertex 3
 property float x
 property float y
-property float z 
+property float z
 element face 1
 property list uchar int vertex_indices
 end_header
 -1 0 0
  0 1 0
- 1 0 0 
+ 1 0 0
 3 0 1 2
 </pre>
 
@@ -158,7 +163,7 @@ instance will be given. This element consists of a <tt>list</tt> property,
 named <tt>vertex_indices</tt>. Lists are sequences on which the
 first value, the <em>length</em>, gives the number of remaining values. List properties are described by the scalar
 type of their length field and the scalar type of the remaining fields.
-In the case of <tt>vertex_indices</tt>, the length field 
+In the case of <tt>vertex_indices</tt>, the length field
 is of type <tt>uchar</tt> and the remaining values are of type
 <tt>int</tt>. </p>
 
@@ -166,7 +171,7 @@ is of type <tt>uchar</tt> and the remaining values are of type
 declared in the header.  First come the 3 elements of type <tt>vertex</tt>,
 each represented by the value of their properties <tt>x</tt>, <tt>y</tt>
 and <tt>z</tt>. Then comes the single <tt>face</tt> element, composed by a
-single list of type <tt>vertex_indices</tt> containing 3 values 
+single list of type <tt>vertex_indices</tt> containing 3 values
 (0 1 2).</p>
 
 <h2> How to read a file with RPly </h2>
@@ -183,7 +188,7 @@ header come the vertices, and finally the triangles. Here is the sample
 code for the program:</p>
 
 <pre class=example>
-#include <stdio.h> 
+#include <stdio.h>
 #include "rply.h"
 
 static int vertex_cb(p_ply_argument argument) {
@@ -200,13 +205,13 @@ static int face_cb(p_ply_argument argument) {
     ply_get_argument_property(argument, NULL, &length, &value_index);
     switch (value_index) {
         case 0:
-        case 1: 
+        case 1:
             printf("%g ", ply_get_argument_value(argument));
             break;
         case 2:
             printf("%g\n", ply_get_argument_value(argument));
             break;
-        default: 
+        default:
             break;
     }
     return 1;
@@ -232,9 +237,9 @@ int main(void) {
 can be  associated with each property of each element. For scalar
 properties, the callback is invoked once for each instance. For list
 properties, the callback is invoked first with the number of
-entries in the instance, and then once for each of the data entries. 
+entries in the instance, and then once for each of the data entries.
 <em>This is exactly the order in which the data items appear in the
-file.</em></p> 
+file.</em></p>
 
 <p> To keep things simple, values are always passed as <tt>double</tt>,
 regardless of how they are stored in the file. From its parameters,
@@ -250,7 +255,7 @@ of the <tt>vertex</tt> element properties and the <tt>face</tt> property
 (using <tt>ply_set_read_cb</tt>). Finally, we invoke the main RPly reading
 function, <tt>ply_read</tt>. This function reads all data in the file,
 passing the data to the appropriate callbacks.  After all reading is done,
-we call <tt>ply_close</tt> to release any resources used by RPly.</p> 
+we call <tt>ply_close</tt> to release any resources used by RPly.</p>
 
 <p>There are some details, of course. <tt>Ply_set_read_cb</tt> returns the
 number of instances of the target property (which is the same as the number
@@ -266,7 +271,7 @@ property (notice the last argument of <tt>ply_set_read_cb</tt>).</p>
 <p><tt>Vertex_cb</tt> gets the user data and the property value from it's
 argument and prints accordingly.  The <tt>face_cb</tt> callback is a bit
 more complicated because lists are more complicated.  Since the
-simple file format only supports triangles, it only prints the first 
+simple file format only supports triangles, it only prints the first
 3 list values, after which it breaks the line. </p>
 
 <p> The output of the program, as expected, is: </p>
@@ -302,10 +307,10 @@ properties, we add comments and obj_infos. We then write the header with
 one by one, with calls to <tt>ply_write</tt>, <em>in the same order they
 are to appear in the file</em>.  Again, to simplify things, this function
 receives data as <tt>double</tt> and performs the needed conversion. Here
-is the code for the example: </p> 
+is the code for the example: </p>
 
 <pre class=example>
-#include <stdio.h> 
+#include <stdio.h>
 #include "rply.h"
 
 static int callback(p_ply_argument argument) {
@@ -330,13 +335,13 @@ static int setup_callbacks(p_ply iply, p_ply oply) {
         while ((property = ply_get_next_property(element, property))) {
             const char *property_name;
             e_ply_type type, length_type, value_type;
-            ply_get_property_info(property, &property_name, &type, 
+            ply_get_property_info(property, &property_name, &type,
                     &length_type, &value_type);
             /* setup input callback for this property */
-            if (!ply_set_read_cb(iply, element_name, property_name, callback, 
+            if (!ply_set_read_cb(iply, element_name, property_name, callback,
                     oply, 0)) return 0;
             /* add this property to output file */
-            if (!ply_add_property(oply, property_name, type, length_type, 
+            if (!ply_add_property(oply, property_name, type, length_type,
                     value_type)) return 0;
         }
     }
@@ -345,26 +350,26 @@ static int setup_callbacks(p_ply iply, p_ply oply) {
 
 int main(int argc, char *argv[]) {
     const char *value;
-    p_ply iply, oply; 
+    p_ply iply, oply;
     iply = ply_open("input.ply", NULL, 0, NULL);
-    if (!iply) return 1; 
-    if (!ply_read_header(iply)) return 1; 
+    if (!iply) return 1;
+    if (!ply_read_header(iply)) return 1;
     oply = ply_create("output.ply", PLY_LITTLE_ENDIAN, NULL, 0, NULL);
     if (!oply) return 1;
-    if (!setup_callbacks(iply, oply)) return 1; 
+    if (!setup_callbacks(iply, oply)) return 1;
     /* pass comments and obj_infos from input to output */
     value = NULL;
     while ((value = ply_get_next_comment(iply, value)))
-        if (!ply_add_comment(oply, value)) return 1; 
+        if (!ply_add_comment(oply, value)) return 1;
     value = NULL;
     while ((value = ply_get_next_obj_info(iply, value)))
         if (!ply_add_obj_info(oply, value)) return 1;;
     /* write output header */
-    if (!ply_write_header(oply)) return 1; 
+    if (!ply_write_header(oply)) return 1;
     /* read input file generating callbacks that pass data to output file */
-    if (!ply_read(iply)) return 1; 
+    if (!ply_read(iply)) return 1;
     /* close up, we are done */
-    if (!ply_close(iply)) return 1; 
+    if (!ply_close(iply)) return 1;
     if (!ply_close(oply)) return 1;
     return 0;
 }
@@ -393,7 +398,7 @@ locale for numeric formatting. RPly relies on library
 functions (such as <tt>fprintf</tt> and <tt>strtod</tt>)
 that are affected by the current locale. If your software
 modifies the locale (or if it uses another library/toolkit that
-does) and you use RPly under the modified locale, you may be 
+does) and you use RPly under the modified locale, you may be
 unable to read or write properly formatted ASCII PLY files.
 </p>
 
@@ -431,11 +436,11 @@ and returns a handle to it.
 
 <p class=arguments>
 <tt>Name</tt> is the file name, and <tt>error_cb</tt> is a function to
-be called when an error is found. 
+be called when an error is found.
 Arguments <tt>idata</tt>
 and <tt>pdata</tt> are available to the error callback via the
-<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a> 
-function.  
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
 If <tt>error_cb</tt> is NULL, the default
 error callback is used. It prints a message to the standard error stream.
 </p>
@@ -449,6 +454,41 @@ Note: <tt>Error_cb</tt> is of type <tt>void
     (*p_ply_error_cb)(p_ply ply, const char *message)</tt>.
 </p>
 
+<!-- ply_open_from_file ++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_open_from_file>
+p_ply <b>ply_open_from_file</b>(FILE *file_pointer, p_ply_error_cb error_cb, long idata, void *pdata)
+</p>
+
+<p class=description>
+Checks if the FILE pointer points to a valid PLY file and returns a
+handle to it. The handle can be used wherever a handle returned by <a
+href=#ply_open><tt>ply_open</tt></a> is accepted.
+</p>
+
+<p class=arguments>
+<tt>File_pointer</tt> is the FILE pointer open for reading, and <tt>error_cb</tt> is a function to be called when an error is found.
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+    (*p_ply_error_cb)(p_ply ply, const char *message)</tt>.
+</p>
+
+<p class=note>
+Note: This function is declared in header <tt>rplyfile.h</tt>.
+</p>
+
 <!-- ply_get_ply_user_data ++++++++++++++++++++++++++++++++++++++++ -->
 
 <p class=name id=ply_get_ply_user_data>
@@ -456,7 +496,7 @@ int <b>ply_get_ply_user_data</b>(p_ply_ply ply, void *pdata, long *idata)
 </p>
 
 <p class=description>
-Retrieves user data from the ply handle. 
+Retrieves user data from the ply handle.
 </p>
 
 <p class=arguments>
@@ -467,7 +507,7 @@ Retrieves user data from the ply handle.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 
@@ -478,22 +518,23 @@ int <b>ply_read_header</b>(p_ply ply)
 </p>
 
 <p class=description>
-Reads and parses the header of a PLY file. 
-After a call to this function, the query functions 
+Reads and parses the header of a PLY file.
+After a call to this function, the query functions
 <a href=#ply_get_next_element><tt>ply_get_next_element</tt></a>,
 <a href=#ply_get_next_property><tt>ply_get_next_property</tt></a>,
 <a href=#ply_get_next_comment><tt>ply_get_next_comment</tt></a>, and
 <a href=#ply_get_next_obj_info><tt>ply_get_next_obj_info</tt></a> can be
-called. Callbacks can also be set with the 
-<a href=#ply_set_read_cb><tt>ply_set_read_cb</tt></a> function. 
+called. Callbacks can also be set with the
+<a href=#ply_set_read_cb><tt>ply_set_read_cb</tt></a> function.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by <a
+href=#ply_open><tt>ply_open</tt></a>.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_set_read_cb +++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -518,35 +559,35 @@ Sets up the callback to be invoked when the value of a property is read.
 <tt>Element_name</tt> and <tt>property_name</tt> are the names of the
 element and property of interest. <tt>Read_cb</tt> is the callback
 function.  <tt>Pdata</tt> and <tt>idata</tt> are user data to be passed to
-the callback function.  
+the callback function.
 </p>
 
 <p class=return>
-Returns the number of instances of the element of interest. 
+Returns the number of instances of the element of interest.
 </p>
 
 <p class=note>
-Note: <tt>Read_cb</tt> is of type 
-<tt>int (*p_ply_read_cb)(p_ply_argument argument)</tt>. 
-The callback should return 1 to continue the reading process, 
-or return 0 to abort. 
+Note: <tt>Read_cb</tt> is of type
+<tt>int (*p_ply_read_cb)(p_ply_argument argument)</tt>.
+The callback should return 1 to continue the reading process,
+or return 0 to abort.
 
 <!-- ply_get_argument_element ++++++++++++++++++++++++++++++++++++++++ -->
 
 <p class=name id=ply_get_argument_element>
 int <b>ply_get_argument_element</b>(<br>
    p_ply_argument argument,<br>
-   p_ply_element *element,<br> 
+   p_ply_element *element,<br>
    long *instance_index<br>
 )
 </p>
 
 <p class=description>
-Retrieves element information from the callback argument. 
+Retrieves element information from the callback argument.
 </p>
 
 <p class=arguments>
-<tt>Argument</tt> is the handle passed to the callback. 
+<tt>Argument</tt> is the handle passed to the callback.
 <tt>Element</tt> receives a handle to the element
 originating the callback. <tt>Instance_index</tt> receives
 the index of the instance of the element
@@ -554,7 +595,7 @@ being read. <tt>Element</tt> and <tt>instance_index</tt> can be NULL.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <p class=note>
@@ -574,11 +615,11 @@ int <b>ply_get_argument_property</b>(<br>
 </p>
 
 <p class=description>
-Retrieves property information from the callback argument. 
+Retrieves property information from the callback argument.
 </p>
 
 <p class=arguments>
-<tt>Argument</tt> is the handle passed to the callback. 
+<tt>Argument</tt> is the handle passed to the callback.
 <tt>Property</tt> receives a handle to the property
 originating the callback. <tt>Length</tt> receives the number
 of values in the list property (1 for scalar properties).
@@ -589,7 +630,7 @@ gives the number of entries). <tt>Property</tt>, <tt>length</tt> and
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <p class=note>
@@ -605,7 +646,7 @@ int <b>ply_get_argument_user_data</b>(p_ply_argument argument, void *pdata,
 </p>
 
 <p class=description>
-Retrieves the user data from the callback argument. 
+Retrieves the user data from the callback argument.
 </p>
 
 <p class=arguments>
@@ -616,7 +657,7 @@ Retrieves the user data from the callback argument.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_get_argument_value +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -626,7 +667,7 @@ double <b>ply_get_argument_value</b>(p_ply_argument argument)
 </p>
 
 <p class=description>
-Retrieves the property value from the callback argument. 
+Retrieves the property value from the callback argument.
 </p>
 
 <p class=arguments>
@@ -634,7 +675,7 @@ Retrieves the property value from the callback argument.
 </p>
 
 <p class=return>
-Returns the property value. 
+Returns the property value.
 </p>
 
 <!-- ply_read +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -644,15 +685,15 @@ int <b>ply_read</b>(p_ply ply)
 </p>
 
 <p class=description>
-Reads all data in file, calling appropriate callbacks. 
+Reads all data in file, calling appropriate callbacks.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_get_next_element ++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -662,11 +703,11 @@ p_ply_element <b>ply_get_next_element</b>(p_ply ply, p_ply_element last)
 </p>
 
 <p class=description>
-Iterates over all elements on the header of a PLY file. 
+Iterates over all elements on the header of a PLY file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
 <a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
 on the handle otherwise no elements will be found.
 <tt>Last</tt> is NULL to retrieve the first element, and an element to
@@ -674,7 +715,7 @@ retrieve the next element.
 </p>
 
 <p class=return>
-Returns the next element, or NULL if no more elements. 
+Returns the next element, or NULL if no more elements.
 </p>
 
 <p class=note>
@@ -689,17 +730,17 @@ p_ply_property <b>ply_get_next_property</b>(p_ply_element element, p_ply_propert
 </p>
 
 <p class=description>
-Iterates over all properties of an element. 
+Iterates over all properties of an element.
 </p>
 
 <p class=arguments>
-<tt>Element</tt> is an element handle. 
+<tt>Element</tt> is an element handle.
 <tt>Last</tt> is NULL to retrieve the first property, and a property to
 retrieve the next property.
 </p>
 
 <p class=return>
-Returns the next property, or NULL if no more properties. 
+Returns the next property, or NULL if no more properties.
 </p>
 
 <p class=note>
@@ -714,11 +755,11 @@ const char *<b>ply_get_next_comment</b>(p_ply ply, const char *last)
 </p>
 
 <p class=description>
-Iterates over all comments on the header of a PLY file. 
+Iterates over all comments on the header of a PLY file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
 <a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
 on the handle otherwise no comments will be found.
 <tt>Last</tt> is NULL to retrieve the first comment, and a comment to
@@ -726,7 +767,7 @@ retrieve the next comment.
 </p>
 
 <p class=return>
-Returns the next comment, or NULL if no more comments. 
+Returns the next comment, or NULL if no more comments.
 </p>
 
 <!-- ply_get_next_obj_info +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -736,11 +777,11 @@ const char *<b>ply_get_next_obj_info</b>(p_ply ply, const char *last)
 </p>
 
 <p class=description>
-Iterates over all obj_infos on the header of a PLY file. 
+Iterates over all obj_infos on the header of a PLY file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
 <a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
 on the handle otherwise no obj_infos will be found.
 <tt>Last</tt> is NULL to retrieve the first obj_info, and a obj_info to
@@ -748,7 +789,7 @@ retrieve the next obj_info.
 </p>
 
 <p class=return>
-Returns the next obj_info, or NULL if no more obj_infos. 
+Returns the next obj_info, or NULL if no more obj_infos.
 </p>
 
 <!-- ply_get_element_info ++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -759,18 +800,18 @@ int <b>ply_get_element_info</b>(p_ply_element element, const char** name,
 </p>
 
 <p class=description>
-Retrieves information from an element handle. 
+Retrieves information from an element handle.
 </p>
 
 <p class=arguments>
-<tt>Element</tt> is the handle of the element of interest. 
-<tt>Name</tt> receives the internal copy of the element name. 
-<tt>Ninstances</tt> receives the number of instances of this element 
+<tt>Element</tt> is the handle of the element of interest.
+<tt>Name</tt> receives the internal copy of the element name.
+<tt>Ninstances</tt> receives the number of instances of this element
 in the file. Both <tt>name</tt> and <tt>ninstances</tt> can be NULL.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_get_property_info +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -786,30 +827,30 @@ int <b>ply_get_property_info</b>(<br>
 </p>
 
 <p class=description>
-Retrieves information from a property handle. 
+Retrieves information from a property handle.
 </p>
 
 <p class=arguments>
-<tt>Property</tt> is the handle of the property of interest. 
-<tt>Name</tt> receives the internal copy of the property name. 
-<tt>Type</tt> receives the property type. 
-<tt>Length_type</tt> receives the scalar type of the first entry 
-in a list property (the one that gives the number of entries). 
-<tt>Value_type</tt> receives the scalar type of the remaining list entries. 
+<tt>Property</tt> is the handle of the property of interest.
+<tt>Name</tt> receives the internal copy of the property name.
+<tt>Type</tt> receives the property type.
+<tt>Length_type</tt> receives the scalar type of the first entry
+in a list property (the one that gives the number of entries).
+<tt>Value_type</tt> receives the scalar type of the remaining list entries.
 <tt>Name</tt>, <tt>type</tt>, <tt>length_type</tt>, and
 <tt>value_type</tt> can be NULL.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
-<p class=note> 
+<p class=note>
 Note: <tt>Length_type</tt> and <tt>value_type</tt> can
 receive any of the constants for scalar types defined in
 <tt>e_ply_type</tt>. <tt>Type</tt> can, in addition, be <tt>PLY_LIST</tt>,
 in which case the property is a list property and the fields
-<tt>length_type</tt> and <tt>value_type</tt> become meaningful.  
+<tt>length_type</tt> and <tt>value_type</tt> become meaningful.
 </p>
 
 <!-- ply_create ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -820,19 +861,55 @@ p_ply <b>ply_create</b>(const char *name, e_ply_storage_mode storage_mode,
 </p>
 
 <p class=description>
-Creates a PLY file for writing. 
+Creates a PLY file for writing.
 </p>
 
 <p class=arguments>
 <tt>Name</tt> is the file name, <tt>storage_mode</tt> is the file storage mode
 (<tt>PLY_ASCII</tt>, <tt>PLY_LITTLE_ENDIAN</tt>,
 <tt>PLY_BIG_ENDIAN</tt>, or <tt>PLY_DEFAULT</tt> to
-automatically detect host endianess). 
-<tt>Error_cb</tt> is a function to be called when an error is found. 
+automatically detect host endianess).
+<tt>Error_cb</tt> is a function to be called when an error is found.
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+    (*p_ply_error_cb)(const char *message)</tt>
+</p>
+
+<!-- ply_create_to_file ++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_create_to_file>
+p_ply <b>ply_create_to_file</b>(FILE *file_pointer, e_ply_storage_mode storage_mode, p_ply_error_cb error_cb)
+</p>
+
+<p class=description>
+Creates a PLY file to be written to a FILE pointer and
+returns a handle to it.
+The handle can be used wherever a handle returned by <a
+href=#ply_create><tt>ply_create</tt></a> is accepted.
+</p>
+
+<p class=arguments>
+<tt>File_pointer</tt> a pointer to a file open for writing, <tt>storage_mode</tt> is the file storage mode
+(<tt>PLY_ASCII</tt>, <tt>PLY_LITTLE_ENDIAN</tt>,
+<tt>PLY_BIG_ENDIAN</tt>, or <tt>PLY_DEFAULT</tt> to
+automatically detect host endianess).
+<tt>Error_cb</tt> is a function to be called when an error is found.
 Arguments <tt>idata</tt>
 and <tt>pdata</tt> are available to the error callback via the
-<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a> 
-function.  
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
 If <tt>error_cb</tt> is NULL, the default
 error callback is used. It prints a message to the standard error stream.
 </p>
@@ -846,6 +923,10 @@ Note: <tt>Error_cb</tt> is of type <tt>void
     (*p_ply_error_cb)(const char *message)</tt>
 </p>
 
+<p class=note>
+Note: This function is declared in header <tt>rplyfile.h</tt>.
+</p>
+
 <!-- ply_add_element +++++++++++++++++++++++++++++++++++++++++++++++++ -->
 
 <p class=name id=ply_add_element>
@@ -853,18 +934,18 @@ int <b>ply_add_element</b>(p_ply ply, const char *name, long ninstances)
 </p>
 
 <p class=description>
-Adds a new element to the ply file. 
+Adds a new element to the ply file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
+<tt>Ply</tt> is a handle returned by
 <a href=#ply_create><tt>ply_create</tt></a>, <tt>name</tt> is the element
 name and <tt>ninstances</tt> is the number of instances of this element that
 will be written to the file.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_add_property ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -874,29 +955,29 @@ int <b>ply_add_property</b>(<br>
    p_ply ply,<br>
    const char *name,<br>
    e_ply_type type,<br>
-   e_ply_type length_type,<br> 
+   e_ply_type length_type,<br>
    e_ply_type value_type<br>
 )
 </p>
 
 <p class=description>
-Adds a new property to the last element added to the ply file. 
+Adds a new property to the last element added to the ply file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>name</tt> is the 
-property name. 
-<tt>Type</tt> is the property type. 
-<tt>Length_type</tt> is the scalar type of the first entry 
-in a list property (the one that gives the number of entries). 
-<tt>Value_type</tt> is the scalar type of the remaining list entries. 
-If <tt>type</tt> is not <tt>PLY_LIST</tt>, <tt>length_type</tt> and 
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>name</tt> is the
+property name.
+<tt>Type</tt> is the property type.
+<tt>Length_type</tt> is the scalar type of the first entry
+in a list property (the one that gives the number of entries).
+<tt>Value_type</tt> is the scalar type of the remaining list entries.
+If <tt>type</tt> is not <tt>PLY_LIST</tt>, <tt>length_type</tt> and
 <tt>value_type</tt> are ignored.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <p class=note>
@@ -920,7 +1001,7 @@ int <b>ply_add_list_property</b>(<br>
 
 <p class=description>
 Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
-<tt>type</tt> is <tt>PLY_LIST</tt>. 
+<tt>type</tt> is <tt>PLY_LIST</tt>.
 </p>
 
 <!-- ply_add_scalar_property +++++++++++++++++++++++++++++++++++++++++ -->
@@ -931,7 +1012,7 @@ int <b>ply_add_scalar_property</b>(p_ply ply, const char *name, e_ply_type type)
 
 <p class=description>
 Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
-<tt>type</tt> is <em>not</em> <tt>PLY_LIST</tt>. 
+<tt>type</tt> is <em>not</em> <tt>PLY_LIST</tt>.
 </p>
 
 <!-- ply_add_comment +++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -941,17 +1022,17 @@ int <b>ply_add_comment</b>(p_ply ply, const char *comment);
 </p>
 
 <p class=description>
-Adds a comment to a PLY file. 
+Adds a comment to a PLY file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the 
-comment text. 
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
+comment text.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_add_obj_info ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -961,17 +1042,17 @@ int <b>ply_add_obj_info</b>(p_ply ply, const char *obj_info);
 </p>
 
 <p class=description>
-Adds a obj_info to a PLY file. 
+Adds a obj_info to a PLY file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>obj_info</tt> is the 
-obj_info text. 
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>obj_info</tt> is the
+obj_info text.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_write_header ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -982,17 +1063,17 @@ int <b>ply_write_header</b>(p_ply ply);
 
 <p class=description>
 Writes the PLY file header to disk, after all elements, properties,
-comments and obj_infos have been added to the handle. 
+comments and obj_infos have been added to the handle.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the 
-comment text. 
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
+comment text.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_write +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1002,19 +1083,19 @@ int <b>ply_write</b>(p_ply ply, double value);
 </p>
 
 <p class=description>
-Passes a value to be stored in the PLY file. 
-Values must be passed in the order they will appear in the file. 
+Passes a value to be stored in the PLY file.
+Values must be passed in the order they will appear in the file.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
+<tt>Ply</tt> is a handle returned by
 <a href=#ply_create><tt>ply_create</tt></a> and <tt>value</tt> is the
-value to be stored.  For simplicity, values are always passed as 
+value to be stored.  For simplicity, values are always passed as
 <tt>double</tt> and conversion is performed as needed.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- ply_close +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1025,17 +1106,17 @@ int <b>ply_close</b>(p_ply ply);
 
 <p class=description>
 Closes the handle and ensures that all resources have been freed and data
-have been written. 
+have been written.
 </p>
 
 <p class=arguments>
-<tt>Ply</tt> is a handle returned by 
-<a href=#ply_create><tt>ply_create</tt></a> or by 
-<a href=#ply_open><tt>ply_open</tt></a>. 
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> or by
+<a href=#ply_open><tt>ply_open</tt></a>.
 </p>
 
 <p class=return>
-Returns 1 in case of success, 0 otherwise. 
+Returns 1 in case of success, 0 otherwise.
 </p>
 
 <!-- footer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1046,7 +1127,7 @@ Returns 1 in case of success, 0 otherwise.
 <p>
 <small>
 Last modified by Diego Nehab on <br>
-Thu Jul  4 15:25:50 BRT 2013
+Fri Aug 21 17:11:09 BRT 2015
 </small>
 </p>
 </center>
diff --git a/vendor/rply-1.1.3/manual/reference.css b/vendor/rply-1.1.4/manual/reference.css
similarity index 100%
rename from vendor/rply-1.1.3/manual/reference.css
rename to vendor/rply-1.1.4/manual/reference.css
diff --git a/vendor/rply-1.1.3/manual/rply.png b/vendor/rply-1.1.4/manual/rply.png
similarity index 100%
rename from vendor/rply-1.1.3/manual/rply.png
rename to vendor/rply-1.1.4/manual/rply.png
diff --git a/vendor/rply-1.1.3/rply.c b/vendor/rply-1.1.4/rply.c
similarity index 91%
rename from vendor/rply-1.1.3/rply.c
rename to vendor/rply-1.1.4/rply.c
index 6cbb82a..c4105ef 100644
--- a/vendor/rply-1.1.3/rply.c
+++ b/vendor/rply-1.1.4/rply.c
@@ -17,6 +17,7 @@
 #include <stddef.h>
 
 #include "rply.h"
+#include "rplyfile.h"
 
 /* ----------------------------------------------------------------------
  * Make sure we get our integer types right
@@ -58,14 +59,14 @@ typedef uint32_t t_ply_uint32;
 #endif
 
 /* ----------------------------------------------------------------------
- * Constants 
+ * Constants
  * ---------------------------------------------------------------------- */
 #define WORDSIZE 256
 #define LINESIZE 1024
 #define BUFFERSIZE (8*1024)
 
 typedef enum e_ply_io_mode_ {
-    PLY_READ, 
+    PLY_READ,
     PLY_WRITE
 } e_ply_io_mode;
 
@@ -74,9 +75,9 @@ static const char *const ply_storage_mode_list[] = {
 };     /* order matches e_ply_storage_mode enum */
 
 static const char *const ply_type_list[] = {
-    "int8", "uint8", "int16", "uint16", 
+    "int8", "uint8", "int16", "uint16",
     "int32", "uint32", "float32", "float64",
-    "char", "uchar", "short", "ushort", 
+    "char", "uchar", "short", "ushort",
     "int", "uint", "float", "double",
     "list", NULL
 };     /* order matches e_ply_type enum */
@@ -121,7 +122,7 @@ typedef struct t_ply_property_ {
     p_ply_read_cb read_cb;
     void *pdata;
     long idata;
-} t_ply_property; 
+} t_ply_property;
 
 /* ----------------------------------------------------------------------
  * Element information
@@ -143,8 +144,8 @@ typedef struct t_ply_element_ {
 /* ----------------------------------------------------------------------
  * Input/output driver
  *
- * Depending on file mode, different functions are used to read/write 
- * property fields. The drivers make it transparent to read/write in ascii, 
+ * Depending on file mode, different functions are used to read/write
+ * property fields. The drivers make it transparent to read/write in ascii,
  * big endian or little endian cases.
  * ---------------------------------------------------------------------- */
 typedef int (*p_ply_ihandler)(p_ply ply, double *value);
@@ -166,7 +167,7 @@ typedef struct t_ply_odriver_ {
 typedef t_ply_odriver *p_ply_odriver;
 
 /* ----------------------------------------------------------------------
- * Ply file handle. 
+ * Ply file handle.
  *
  * io_mode: read or write (from e_ply_io_mode)
  * storage_mode: mode of file associated with handle (from e_ply_storage_mode)
@@ -177,15 +178,15 @@ typedef t_ply_odriver *p_ply_odriver;
  * obj_info: obj_info items for this file
  * nobj_infos: number of obj_info items in file
  * fp: file pointer associated with ply file
- * rn: skip extra char after end_header? 
+ * rn: skip extra char after end_header?
  * buffer: last word/chunck of data read from ply file
  * buffer_first, buffer_last: interval of untouched good data in buffer
  * buffer_token: start of parsed token (line or word) in buffer
- * idriver, odriver: input driver used to get property fields from file 
+ * idriver, odriver: input driver used to get property fields from file
  * argument: storage space for callback arguments
  * welement, wproperty: element/property type being written
  * winstance_index: index of instance of current element being written
- * wvalue_index: index of list property value being written 
+ * wvalue_index: index of list property value being written
  * wlength: number of values in list property being written
  * error_cb: error callback
  * pdata/idata: user data defined with ply_open/ply_create
@@ -200,6 +201,7 @@ typedef struct t_ply_ {
     char *obj_info;
     long nobj_infos;
     FILE *fp;
+    int own_fp;
     int rn;
     char buffer[BUFFERSIZE];
     size_t buffer_first, buffer_token, buffer_last;
@@ -239,13 +241,13 @@ static void ply_reverse(void *anydata, size_t size);
  * ---------------------------------------------------------------------- */
 static int ply_find_string(const char *item, const char* const list[]);
 static p_ply_element ply_find_element(p_ply ply, const char *name);
-static p_ply_property ply_find_property(p_ply_element element, 
+static p_ply_property ply_find_property(p_ply_element element,
         const char *name);
 
 /* ----------------------------------------------------------------------
  * Header parsing
  * ---------------------------------------------------------------------- */
-static int ply_read_header_magic(p_ply ply); 
+static int ply_read_header_magic(p_ply ply);
 static int ply_read_header_format(p_ply ply);
 static int ply_read_header_comment(p_ply ply);
 static int ply_read_header_obj_info(p_ply ply);
@@ -273,18 +275,18 @@ static void *ply_grow_array(p_ply ply, void **pointer, long *nmemb, long size);
  * Special functions
  * ---------------------------------------------------------------------- */
 static e_ply_storage_mode ply_arch_endian(void);
-static int ply_type_check(void); 
+static int ply_type_check(void);
 
 /* ----------------------------------------------------------------------
  * Auxiliary read functions
  * ---------------------------------------------------------------------- */
-static int ply_read_element(p_ply ply, p_ply_element element, 
+static int ply_read_element(p_ply ply, p_ply_element element,
         p_ply_argument argument);
-static int ply_read_property(p_ply ply, p_ply_element element, 
+static int ply_read_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument);
-static int ply_read_list_property(p_ply ply, p_ply_element element, 
+static int ply_read_list_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument);
-static int ply_read_scalar_property(p_ply ply, p_ply_element element, 
+static int ply_read_scalar_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument);
 
 /* ----------------------------------------------------------------------
@@ -295,10 +297,10 @@ static int ply_read_scalar_property(p_ply ply, p_ply_element element,
 #define BLINE(p) (p->buffer + p->buffer_token)
 
 /* pointer to start of untouched bytes in buffer */
-#define BFIRST(p) (p->buffer + p->buffer_first) 
+#define BFIRST(p) (p->buffer + p->buffer_first)
 
 /* number of bytes untouched in buffer */
-#define BSIZE(p) (p->buffer_last - p->buffer_first) 
+#define BSIZE(p) (p->buffer_last - p->buffer_first)
 
 /* consumes data from buffer */
 #define BSKIP(p, s) (p->buffer_first += s)
@@ -312,18 +314,17 @@ static int BREFILL(p_ply ply) {
     ply->buffer_first = ply->buffer_token = 0;
     /* fill remaining with new data */
     size = fread(ply->buffer+size, 1, BUFFERSIZE-size-1, ply->fp);
-    /* place sentinel so we can use str* functions with buffer */
-    ply->buffer[BUFFERSIZE-1] = '\0';
-    /* check if read failed */
-    if (size <= 0) return 0;
     /* increase size to account for new data */
     ply->buffer_last += size;
-    return 1;
+    /* place sentinel so we can use str* functions with buffer */
+    ply->buffer[ply->buffer_last] = '\0';
+    /* check if read failed */
+    return size > 0;
 }
 
 /* We don't care about end-of-line, generally, because we
  * separate words by any white-space character.
- * Unfortunately, in binary mode, right after 'end_header', 
+ * Unfortunately, in binary mode, right after 'end_header',
  * we have to know *exactly* how many characters to skip */
 /* We use the end-of-line marker after the 'ply' magic
  * number to figure out what to do */
@@ -334,7 +335,7 @@ static int ply_read_header_magic(p_ply ply) {
         return 0;
     }
     /* check if it is ply */
-    if (magic[0] != 'p' || magic[1] != 'l' || magic[2] != 'y' 
+    if (magic[0] != 'p' || magic[1] != 'l' || magic[2] != 'y'
             || !isspace(magic[3])) {
         ply->error_cb(ply, "Wrong magic number. Expected 'ply'");
         return 0;
@@ -352,32 +353,43 @@ static int ply_read_header_magic(p_ply ply) {
 /* ----------------------------------------------------------------------
  * Read support functions
  * ---------------------------------------------------------------------- */
-p_ply ply_open(const char *name, p_ply_error_cb error_cb, 
+p_ply ply_open(const char *name, p_ply_error_cb error_cb,
         long idata, void *pdata) {
-    FILE *fp = NULL; 
-    p_ply ply = ply_alloc();
+    FILE *fp;
+    p_ply ply;
     if (error_cb == NULL) error_cb = ply_error_cb;
-    if (!ply) {
-        error_cb(NULL, "Out of memory");
+    assert(name);
+    fp = fopen(name, "rb");
+    if (!fp) {
+        error_cb(NULL, "Unable to open file");
         return NULL;
     }
-    ply->idata = idata;
-    ply->pdata = pdata;
-    ply->io_mode = PLY_READ;
-    ply->error_cb = error_cb;
+    ply = ply_open_from_file(fp, error_cb, idata, pdata);
+    if (ply) ply->own_fp = 1;
+    else fclose(fp);
+    return ply;
+}
+
+p_ply ply_open_from_file(FILE *fp, p_ply_error_cb error_cb,
+        long idata, void *pdata) {
+    p_ply ply;
+    if (error_cb == NULL) error_cb = ply_error_cb;
+    assert(fp);
     if (!ply_type_check()) {
         error_cb(ply, "Incompatible type system");
-        free(ply);
         return NULL;
     }
-    assert(name);
-    fp = fopen(name, "rb");
-    if (!fp) {
-        error_cb(ply, "Unable to open file");
-        free(ply);
+    ply = ply_alloc();
+    if (!ply) {
+        error_cb(NULL, "Out of memory");
         return NULL;
     }
+    ply->idata = idata;
+    ply->pdata = pdata;
+    ply->io_mode = PLY_READ;
+    ply->error_cb = error_cb;
     ply->fp = fp;
+    ply->own_fp = 0;
     return ply;
 }
 
@@ -392,8 +404,8 @@ int ply_read_header(p_ply ply) {
     }
     /* parse elements, comments or obj_infos until the end of header */
     while (strcmp(BWORD(ply), "end_header")) {
-        if (!ply_read_header_comment(ply) && 
-                !ply_read_header_element(ply) && 
+        if (!ply_read_header_comment(ply) &&
+                !ply_read_header_element(ply) &&
                 !ply_read_header_obj_info(ply)) {
             ply_ferror(ply, "Unexpected token '%s'", BWORD(ply));
             return 0;
@@ -410,10 +422,10 @@ int ply_read_header(p_ply ply) {
     return 1;
 }
 
-long ply_set_read_cb(p_ply ply, const char *element_name, 
-        const char* property_name, p_ply_read_cb read_cb, 
+long ply_set_read_cb(p_ply ply, const char *element_name,
+        const char* property_name, p_ply_read_cb read_cb,
         void *pdata, long idata) {
-    p_ply_element element = NULL; 
+    p_ply_element element = NULL;
     p_ply_property property = NULL;
     assert(ply && element_name && property_name);
     element = ply_find_element(ply, element_name);
@@ -444,25 +456,34 @@ int ply_read(p_ply ply) {
 /* ----------------------------------------------------------------------
  * Write support functions
  * ---------------------------------------------------------------------- */
-p_ply ply_create(const char *name, e_ply_storage_mode storage_mode, 
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
         p_ply_error_cb error_cb, long idata, void *pdata) {
+    p_ply ply = NULL;
     FILE *fp = NULL;
-    p_ply ply = ply_alloc();
+    assert(name && storage_mode <= PLY_DEFAULT);
     if (error_cb == NULL) error_cb = ply_error_cb;
-    if (!ply) {
-        error_cb(NULL, "Out of memory");
+    fp = fopen(name, "wb");
+    if (!fp) {
+        error_cb(ply, "Unable to create file");
         return NULL;
     }
+    ply = ply_create_to_file(fp, storage_mode, error_cb, idata, pdata);
+    if (ply) ply->own_fp = 1;
+    else fclose(fp);
+    return ply;
+}
+
+p_ply ply_create_to_file(FILE *fp, e_ply_storage_mode storage_mode,
+        p_ply_error_cb error_cb, long idata, void *pdata) {
+    p_ply ply;
+    assert(fp && storage_mode <= PLY_DEFAULT);
     if (!ply_type_check()) {
         error_cb(ply, "Incompatible type system");
-        free(ply);
         return NULL;
     }
-    assert(name && storage_mode <= PLY_DEFAULT);
-    fp = fopen(name, "wb");
-    if (!fp) {
-        error_cb(ply, "Unable to create file");
-        free(ply);
+    ply = ply_alloc();
+    if (!ply) {
+        error_cb(NULL, "Out of memory");
         return NULL;
     }
     ply->idata = idata;
@@ -470,15 +491,17 @@ p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
     ply->io_mode = PLY_WRITE;
     if (storage_mode == PLY_DEFAULT) storage_mode = ply_arch_endian();
     if (storage_mode == PLY_ASCII) ply->odriver = &ply_odriver_ascii;
-    else if (storage_mode == ply_arch_endian()) 
+    else if (storage_mode == ply_arch_endian())
         ply->odriver = &ply_odriver_binary;
     else ply->odriver = &ply_odriver_binary_reverse;
     ply->storage_mode = storage_mode;
     ply->fp = fp;
+    ply->own_fp = 0;
     ply->error_cb = error_cb;
     return ply;
 }
 
+
 int ply_add_element(p_ply ply, const char *name, long ninstances) {
     p_ply_element element = NULL;
     assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
@@ -512,7 +535,7 @@ int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type) {
     return 1;
 }
 
-int ply_add_list_property(p_ply ply, const char *name, 
+int ply_add_list_property(p_ply ply, const char *name,
         e_ply_type length_type, e_ply_type value_type) {
     p_ply_element element = NULL;
     p_ply_property property = NULL;
@@ -540,9 +563,9 @@ int ply_add_list_property(p_ply ply, const char *name,
 
 int ply_add_property(p_ply ply, const char *name, e_ply_type type,
         e_ply_type length_type, e_ply_type value_type) {
-    if (type == PLY_LIST) 
+    if (type == PLY_LIST)
         return ply_add_list_property(ply, name, length_type, value_type);
-    else 
+    else
         return ply_add_scalar_property(ply, name, type);
 }
 
@@ -577,9 +600,9 @@ int ply_add_obj_info(p_ply ply, const char *obj_info) {
 int ply_write_header(p_ply ply) {
     long i, j;
     assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
-    assert(ply->element || ply->nelements == 0); 
-    assert(!ply->element || ply->nelements > 0); 
-    if (fprintf(ply->fp, "ply\nformat %s 1.0\n", 
+    assert(ply->element || ply->nelements == 0);
+    assert(!ply->element || ply->nelements > 0);
+    if (fprintf(ply->fp, "ply\nformat %s 1.0\n",
                 ply_storage_mode_list[ply->storage_mode]) <= 0) goto error;
     for (i = 0; i < ply->ncomments; i++)
         if (fprintf(ply->fp, "comment %s\n", ply->comment + LINESIZE*i) <= 0)
@@ -589,19 +612,19 @@ int ply_write_header(p_ply ply) {
             goto error;
     for (i = 0; i < ply->nelements; i++) {
         p_ply_element element = &ply->element[i];
-        assert(element->property || element->nproperties == 0); 
-        assert(!element->property || element->nproperties > 0); 
-        if (fprintf(ply->fp, "element %s %ld\n", element->name, 
+        assert(element->property || element->nproperties == 0);
+        assert(!element->property || element->nproperties > 0);
+        if (fprintf(ply->fp, "element %s %ld\n", element->name,
                     element->ninstances) <= 0) goto error;
         for (j = 0; j < element->nproperties; j++) {
             p_ply_property property = &element->property[j];
             if (property->type == PLY_LIST) {
-                if (fprintf(ply->fp, "property list %s %s %s\n", 
+                if (fprintf(ply->fp, "property list %s %s %s\n",
                             ply_type_list[property->length_type],
                             ply_type_list[property->value_type],
                             property->name) <= 0) goto error;
             } else {
-                if (fprintf(ply->fp, "property %s %s\n", 
+                if (fprintf(ply->fp, "property %s %s\n",
                             ply_type_list[property->type],
                             property->name) <= 0) goto error;
             }
@@ -633,9 +656,9 @@ int ply_write(p_ply ply, double value) {
         ply->wlength = 0;
     }
     if (!ply->odriver->ohandler[type](ply, value)) {
-        ply_ferror(ply, "Failed writing %s of %s %d (%s: %s)", 
-                    property->name, element->name, 
-                    ply->winstance_index, 
+        ply_ferror(ply, "Failed writing %s of %s %d (%s: %s)",
+                    property->name, element->name,
+                    ply->winstance_index,
                     ply->odriver->name, ply_type_list[type]);
         return 0;
     }
@@ -658,9 +681,9 @@ int ply_write(p_ply ply, double value) {
         } while (ply->welement < ply->nelements && !element->ninstances);
     }
     if (ply->storage_mode == PLY_ASCII) {
-        return (!spaceafter || putc(' ', ply->fp) > 0) && 
+        return (!spaceafter || putc(' ', ply->fp) > 0) &&
                (!breakafter || putc('\n', ply->fp) > 0);
-    } else { 
+    } else {
         return 1;
     }
 }
@@ -671,12 +694,12 @@ int ply_close(p_ply ply) {
     assert(ply->element || ply->nelements == 0);
     assert(!ply->element || ply->nelements > 0);
     /* write last chunk to file */
-    if (ply->io_mode == PLY_WRITE && 
+    if (ply->io_mode == PLY_WRITE &&
       fwrite(ply->buffer, 1, ply->buffer_last, ply->fp) < ply->buffer_last) {
         ply_ferror(ply, "Error closing up");
         return 0;
     }
-    fclose(ply->fp);
+    if (ply->own_fp) fclose(ply->fp);
     /* free all memory used by handle */
     if (ply->element) {
         for (i = 0; i < ply->nelements; i++) {
@@ -694,7 +717,7 @@ int ply_close(p_ply ply) {
 /* ----------------------------------------------------------------------
  * Query support functions
  * ---------------------------------------------------------------------- */
-p_ply_element ply_get_next_element(p_ply ply, 
+p_ply_element ply_get_next_element(p_ply ply,
         p_ply_element last) {
     assert(ply);
     if (!last) return ply->element;
@@ -711,7 +734,7 @@ int ply_get_element_info(p_ply_element element, const char** name,
     return 1;
 }
 
-p_ply_property ply_get_next_property(p_ply_element element, 
+p_ply_property ply_get_next_property(p_ply_element element,
         p_ply_property last) {
     assert(element);
     if (!last) return element->property;
@@ -733,7 +756,7 @@ int ply_get_property_info(p_ply_property property, const char** name,
 
 const char *ply_get_next_comment(p_ply ply, const char *last) {
     assert(ply);
-    if (!last) return ply->comment; 
+    if (!last) return ply->comment;
     last += LINESIZE;
     if (last < ply->comment + LINESIZE*ply->ncomments) return last;
     else return NULL;
@@ -741,16 +764,16 @@ const char *ply_get_next_comment(p_ply ply, const char *last) {
 
 const char *ply_get_next_obj_info(p_ply ply, const char *last) {
     assert(ply);
-    if (!last) return ply->obj_info; 
+    if (!last) return ply->obj_info;
     last += LINESIZE;
     if (last < ply->obj_info + LINESIZE*ply->nobj_infos) return last;
     else return NULL;
 }
 
 /* ----------------------------------------------------------------------
- * Callback argument support functions 
+ * Callback argument support functions
  * ---------------------------------------------------------------------- */
-int ply_get_argument_element(p_ply_argument argument, 
+int ply_get_argument_element(p_ply_argument argument,
         p_ply_element *element, long *instance_index) {
     assert(argument);
     if (!argument) return 0;
@@ -759,7 +782,7 @@ int ply_get_argument_element(p_ply_argument argument,
     return 1;
 }
 
-int ply_get_argument_property(p_ply_argument argument, 
+int ply_get_argument_property(p_ply_argument argument,
         p_ply_property *property, long *length, long *value_index) {
     assert(argument);
     if (!argument) return 0;
@@ -769,7 +792,7 @@ int ply_get_argument_property(p_ply_argument argument,
     return 1;
 }
 
-int ply_get_argument_user_data(p_ply_argument argument, void **pdata, 
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
         long *idata) {
     assert(argument);
     if (!argument) return 0;
@@ -795,11 +818,11 @@ int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata) {
 /* ----------------------------------------------------------------------
  * Internal functions
  * ---------------------------------------------------------------------- */
-static int ply_read_list_property(p_ply ply, p_ply_element element, 
+static int ply_read_list_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument) {
     int l;
     p_ply_read_cb read_cb = property->read_cb;
-    p_ply_ihandler *driver = ply->idriver->ihandler; 
+    p_ply_ihandler *driver = ply->idriver->ihandler;
     /* get list length */
     p_ply_ihandler handler = driver[property->length_type];
     double length;
@@ -824,7 +847,7 @@ static int ply_read_list_property(p_ply ply, p_ply_element element,
         argument->value_index = l;
         if (!handler(ply, &argument->value)) {
             ply_ferror(ply, "Error reading value number %d of '%s' of "
-                    "'%s' number %d", l+1, property->name, 
+                    "'%s' number %d", l+1, property->name,
                     element->name, argument->instance_index);
             return 0;
         }
@@ -837,10 +860,10 @@ static int ply_read_list_property(p_ply ply, p_ply_element element,
     return 1;
 }
 
-static int ply_read_scalar_property(p_ply ply, p_ply_element element, 
+static int ply_read_scalar_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument) {
     p_ply_read_cb read_cb = property->read_cb;
-    p_ply_ihandler *driver = ply->idriver->ihandler; 
+    p_ply_ihandler *driver = ply->idriver->ihandler;
     p_ply_ihandler handler = driver[property->type];
     argument->length = 1;
     argument->value_index = 0;
@@ -856,15 +879,15 @@ static int ply_read_scalar_property(p_ply ply, p_ply_element element,
     return 1;
 }
 
-static int ply_read_property(p_ply ply, p_ply_element element, 
+static int ply_read_property(p_ply ply, p_ply_element element,
         p_ply_property property, p_ply_argument argument) {
-    if (property->type == PLY_LIST) 
+    if (property->type == PLY_LIST)
         return ply_read_list_property(ply, element, property, argument);
-    else 
+    else
         return ply_read_scalar_property(ply, element, property, argument);
 }
 
-static int ply_read_element(p_ply ply, p_ply_element element, 
+static int ply_read_element(p_ply ply, p_ply_element element,
         p_ply_argument argument) {
     long j, k;
     /* for each element of this type */
@@ -886,7 +909,7 @@ static int ply_read_element(p_ply ply, p_ply_element element,
 static int ply_find_string(const char *item, const char* const list[]) {
     int i;
     assert(item && list);
-    for (i = 0; list[i]; i++) 
+    for (i = 0; list[i]; i++)
         if (!strcmp(list[i], item)) return i;
     return -1;
 }
@@ -894,26 +917,26 @@ static int ply_find_string(const char *item, const char* const list[]) {
 static p_ply_element ply_find_element(p_ply ply, const char *name) {
     p_ply_element element;
     int i, nelements;
-    assert(ply && name); 
+    assert(ply && name);
     element = ply->element;
     nelements = ply->nelements;
-    assert(element || nelements == 0); 
-    assert(!element || nelements > 0); 
-    for (i = 0; i < nelements; i++) 
+    assert(element || nelements == 0);
+    assert(!element || nelements > 0);
+    for (i = 0; i < nelements; i++)
         if (!strcmp(element[i].name, name)) return &element[i];
     return NULL;
 }
 
-static p_ply_property ply_find_property(p_ply_element element, 
+static p_ply_property ply_find_property(p_ply_element element,
         const char *name) {
     p_ply_property property;
     int i, nproperties;
-    assert(element && name); 
+    assert(element && name);
     property = element->property;
     nproperties = element->nproperties;
-    assert(property || nproperties == 0); 
-    assert(!property || nproperties > 0); 
-    for (i = 0; i < nproperties; i++) 
+    assert(property || nproperties == 0);
+    assert(!property || nproperties > 0);
+    for (i = 0; i < nproperties; i++)
         if (!strcmp(property[i].name, name)) return &property[i];
     return NULL;
 }
@@ -942,9 +965,9 @@ static int ply_read_word(p_ply ply) {
                 ply_ferror(ply, "Unexpected end of file");
                 return 0;
             }
-        } else break; 
-    } 
-    BSKIP(ply, t); 
+        } else break;
+    }
+    BSKIP(ply, t);
     /* look for a space after the current word */
     t = strcspn(BFIRST(ply), " \n\r\t");
     /* if we didn't reach the end of the buffer, we are done */
@@ -1000,7 +1023,7 @@ static int ply_read_line(p_ply ply) {
         BSKIP(ply, 1);
         return ply_check_line(ply);
     } else {
-        end = ply->buffer + BSIZE(ply); 
+        end = ply->buffer + BSIZE(ply);
         /* otherwise, try to refill buffer */
         if (!BREFILL(ply)) {
             ply_ferror(ply, "Unexpected end of file");
@@ -1107,7 +1130,7 @@ static void ply_element_init(p_ply_element element) {
     element->name[0] = '\0';
     element->ninstances = 0;
     element->property = NULL;
-    element->nproperties = 0; 
+    element->nproperties = 0;
 }
 
 static void ply_property_init(p_ply_property property) {
@@ -1127,7 +1150,7 @@ static p_ply ply_alloc(void) {
     return ply;
 }
 
-static void *ply_grow_array(p_ply ply, void **pointer, 
+static void *ply_grow_array(p_ply ply, void **pointer,
         long *nmemb, long size) {
     void *temp = *pointer;
     long count = *nmemb + 1;
@@ -1144,14 +1167,14 @@ static void *ply_grow_array(p_ply ply, void **pointer,
 
 static p_ply_element ply_grow_element(p_ply ply) {
     p_ply_element element = NULL;
-    assert(ply); 
-    assert(ply->element || ply->nelements == 0); 
-    assert(!ply->element || ply->nelements > 0); 
-    element = (p_ply_element) ply_grow_array(ply, (void **) &ply->element, 
+    assert(ply);
+    assert(ply->element || ply->nelements == 0);
+    assert(!ply->element || ply->nelements > 0);
+    element = (p_ply_element) ply_grow_array(ply, (void **) &ply->element,
             &ply->nelements, sizeof(t_ply_element));
     if (!element) return NULL;
     ply_element_init(element);
-    return element; 
+    return element;
 }
 
 static p_ply_property ply_grow_property(p_ply ply, p_ply_element element) {
@@ -1160,8 +1183,8 @@ static p_ply_property ply_grow_property(p_ply ply, p_ply_element element) {
     assert(element);
     assert(element->property || element->nproperties == 0);
     assert(!element->property || element->nproperties > 0);
-    property = (p_ply_property) ply_grow_array(ply, 
-            (void **) &element->property, 
+    property = (p_ply_property) ply_grow_array(ply,
+            (void **) &element->property,
             &element->nproperties, sizeof(t_ply_property));
     if (!property) return NULL;
     ply_property_init(property);
@@ -1175,7 +1198,7 @@ static int ply_read_header_format(p_ply ply) {
     ply->storage_mode = ply_find_string(BWORD(ply), ply_storage_mode_list);
     if (ply->storage_mode == (e_ply_storage_mode) (-1)) return 0;
     if (ply->storage_mode == PLY_ASCII) ply->idriver = &ply_idriver_ascii;
-    else if (ply->storage_mode == ply_arch_endian()) 
+    else if (ply->storage_mode == ply_arch_endian())
         ply->idriver = &ply_idriver_binary;
     else ply->idriver = &ply_idriver_binary_reverse;
     if (!ply_read_word(ply)) return 0;
@@ -1250,7 +1273,7 @@ static int ply_read_header_element(p_ply ply) {
     element->ninstances = dummy;
     /* get all properties for this element */
     if (!ply_read_word(ply)) return 0;
-    while (ply_read_header_property(ply) || 
+    while (ply_read_header_property(ply) ||
         ply_read_header_comment(ply) || ply_read_header_obj_info(ply))
         /* do nothing */;
     return 1;
@@ -1349,7 +1372,7 @@ static int obinary_int8(p_ply ply, double value) {
 static int obinary_uint8(p_ply ply, double value) {
     t_ply_uint8 uint8 = (t_ply_uint8) value;
     if (value > PLY_UINT8_MAX || value < 0) return 0;
-    return ply->odriver->ochunk(ply, &uint8, sizeof(uint8)); 
+    return ply->odriver->ochunk(ply, &uint8, sizeof(uint8));
 }
 
 static int obinary_int16(p_ply ply, double value) {
@@ -1361,7 +1384,7 @@ static int obinary_int16(p_ply ply, double value) {
 static int obinary_uint16(p_ply ply, double value) {
     t_ply_uint16 uint16 = (t_ply_uint16) value;
     if (value > PLY_UINT16_MAX || value < 0) return 0;
-    return ply->odriver->ochunk(ply, &uint16, sizeof(uint16)); 
+    return ply->odriver->ochunk(ply, &uint16, sizeof(uint16));
 }
 
 static int obinary_int32(p_ply ply, double value) {
@@ -1383,7 +1406,7 @@ static int obinary_float32(p_ply ply, double value) {
 }
 
 static int obinary_float64(p_ply ply, double value) {
-    return ply->odriver->ochunk(ply, &value, sizeof(value)); 
+    return ply->odriver->ochunk(ply, &value, sizeof(value));
 }
 
 /* ----------------------------------------------------------------------
@@ -1570,7 +1593,7 @@ static t_ply_odriver ply_odriver_binary_reverse = {
 };
 
 /* ----------------------------------------------------------------------
- * Copyright (C) 2003-2011 Diego Nehab.  All rights reserved.
+ * Copyright (C) 2003-2015 Diego Nehab.  All rights reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
diff --git a/vendor/rply-1.1.3/rply.h b/vendor/rply-1.1.4/rply.h
similarity index 92%
rename from vendor/rply-1.1.3/rply.h
rename to vendor/rply-1.1.4/rply.h
index c284568..9fa6da9 100644
--- a/vendor/rply-1.1.3/rply.h
+++ b/vendor/rply-1.1.4/rply.h
@@ -13,8 +13,8 @@
 extern "C" {
 #endif
 
-#define RPLY_VERSION   "RPly 1.1.3"
-#define RPLY_COPYRIGHT "Copyright (C) 2003-2013 Diego Nehab"
+#define RPLY_VERSION   "RPly 1.1.4"
+#define RPLY_COPYRIGHT "Copyright (C) 2003-2015 Diego Nehab"
 #define RPLY_AUTHORS   "Diego Nehab"
 
 /* ----------------------------------------------------------------------
@@ -30,13 +30,13 @@ typedef struct t_ply_argument_ *p_ply_argument;
 typedef enum e_ply_storage_mode_ {
     PLY_BIG_ENDIAN,
     PLY_LITTLE_ENDIAN,
-    PLY_ASCII,   
+    PLY_ASCII,
     PLY_DEFAULT      /* has to be the last in enum */
 } e_ply_storage_mode; /* order matches ply_storage_mode_list */
 
 /* ply data type */
 typedef enum e_ply_type {
-    PLY_INT8, PLY_UINT8, PLY_INT16, PLY_UINT16, 
+    PLY_INT8, PLY_UINT8, PLY_INT16, PLY_UINT16,
     PLY_INT32, PLY_UIN32, PLY_FLOAT32, PLY_FLOAT64,
     PLY_CHAR, PLY_UCHAR, PLY_SHORT, PLY_USHORT,
     PLY_INT, PLY_UINT, PLY_FLOAT, PLY_DOUBLE,
@@ -52,7 +52,7 @@ typedef enum e_ply_type {
 typedef void (*p_ply_error_cb)(p_ply ply, const char *message);
 
 /* ----------------------------------------------------------------------
- * Gets user data from within an error callback 
+ * Gets user data from within an error callback
  *
  * ply: handle returned by ply_open or ply_create
  * idata,pdata: contextual information set in ply_open or ply_create
@@ -68,7 +68,7 @@ int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata);
  *
  * Returns 1 if successful, 0 otherwise
  * ---------------------------------------------------------------------- */
-p_ply ply_open(const char *name, p_ply_error_cb error_cb, long idata, 
+p_ply ply_open(const char *name, p_ply_error_cb error_cb, long idata,
         void *pdata);
 
 /* ----------------------------------------------------------------------
@@ -99,57 +99,57 @@ typedef int (*p_ply_read_cb)(p_ply_argument argument);
  * pdata/idata: user data that will be passed to callback
  *
  * Returns 0 if no element or no property in element, returns the
- * number of element instances otherwise. 
+ * number of element instances otherwise.
  * ---------------------------------------------------------------------- */
-long ply_set_read_cb(p_ply ply, const char *element_name, 
-        const char *property_name, p_ply_read_cb read_cb, 
+long ply_set_read_cb(p_ply ply, const char *element_name,
+        const char *property_name, p_ply_read_cb read_cb,
         void *pdata, long idata);
 
 /* ----------------------------------------------------------------------
  * Returns information about the element originating a callback
  *
- * argument: handle to argument 
+ * argument: handle to argument
  * element: receives a the element handle (if non-null)
- * instance_index: receives the index of the current element instance 
+ * instance_index: receives the index of the current element instance
  *     (if non-null)
  *
  * Returns 1 if successfull, 0 otherwise
  * ---------------------------------------------------------------------- */
-int ply_get_argument_element(p_ply_argument argument, 
+int ply_get_argument_element(p_ply_argument argument,
         p_ply_element *element, long *instance_index);
 
 /* ----------------------------------------------------------------------
  * Returns information about the property originating a callback
  *
- * argument: handle to argument 
+ * argument: handle to argument
  * property: receives the property handle (if non-null)
  * length: receives the number of values in this property (if non-null)
  * value_index: receives the index of current property value (if non-null)
  *
  * Returns 1 if successfull, 0 otherwise
  * ---------------------------------------------------------------------- */
-int ply_get_argument_property(p_ply_argument argument, 
+int ply_get_argument_property(p_ply_argument argument,
         p_ply_property *property, long *length, long *value_index);
 
 /* ----------------------------------------------------------------------
- * Returns user data associated with callback 
+ * Returns user data associated with callback
  *
  * pdata: receives a copy of user custom data pointer (if non-null)
  * idata: receives a copy of user custom data integer (if non-null)
  *
  * Returns 1 if successfull, 0 otherwise
  * ---------------------------------------------------------------------- */
-int ply_get_argument_user_data(p_ply_argument argument, void **pdata, 
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
         long *idata);
 
 /* ----------------------------------------------------------------------
  * Returns the value associated with a callback
  *
- * argument: handle to argument 
+ * argument: handle to argument
  *
  * Returns the current data item
  * ---------------------------------------------------------------------- */
-double ply_get_argument_value(p_ply_argument argument); 
+double ply_get_argument_value(p_ply_argument argument);
 
 /* ----------------------------------------------------------------------
  * Reads all elements and properties calling the callbacks defined with
@@ -215,7 +215,7 @@ int ply_get_element_info(p_ply_element element, const char** name,
  *
  * Returns element if successfull or NULL if no more properties
  * ---------------------------------------------------------------------- */
-p_ply_property ply_get_next_property(p_ply_element element, 
+p_ply_property ply_get_next_property(p_ply_element element,
         p_ply_property last);
 
 /* ----------------------------------------------------------------------
@@ -226,7 +226,7 @@ p_ply_property ply_get_next_property(p_ply_element element,
  * type: receives the property type (if non-null)
  * length_type: for list properties, receives the scalar type of
  *     the length field (if non-null)
- * value_type: for list properties, receives the scalar type of the value 
+ * value_type: for list properties, receives the scalar type of the value
  *     fields  (if non-null)
  *
  * Returns 1 if successfull or 0 otherwise
@@ -239,10 +239,12 @@ int ply_get_property_info(p_ply_property property, const char** name,
  *
  * name: file name
  * storage_mode: file format mode
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
  *
  * Returns handle to PLY file if successfull, NULL otherwise
  * ---------------------------------------------------------------------- */
-p_ply ply_create(const char *name, e_ply_storage_mode storage_mode, 
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
         p_ply_error_cb error_cb, long idata, void *pdata);
 
 /* ----------------------------------------------------------------------
@@ -262,7 +264,7 @@ int ply_add_element(p_ply ply, const char *name, long ninstances);
  * ply: handle returned by ply_create
  * name: name of new property
  * type: property type
- * length_type: scalar type of length field of a list property 
+ * length_type: scalar type of length field of a list property
  * value_type: scalar type of value fields of a list property
  *
  * Returns 1 if successfull, 0 otherwise
@@ -275,12 +277,12 @@ int ply_add_property(p_ply ply, const char *name, e_ply_type type,
  *
  * ply: handle returned by ply_create
  * name: name of new property
- * length_type: scalar type of length field of a list property 
+ * length_type: scalar type of length field of a list property
  * value_type: scalar type of value fields of a list property
  *
  * Returns 1 if successfull, 0 otherwise
  * ---------------------------------------------------------------------- */
-int ply_add_list_property(p_ply ply, const char *name, 
+int ply_add_list_property(p_ply ply, const char *name,
         e_ply_type length_type, e_ply_type value_type);
 
 /* ----------------------------------------------------------------------
@@ -295,7 +297,7 @@ int ply_add_list_property(p_ply ply, const char *name,
 int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type);
 
 /* ----------------------------------------------------------------------
- * Adds a new comment item 
+ * Adds a new comment item
  *
  * ply: handle returned by ply_create
  * comment: pointer to string with comment text
@@ -305,7 +307,7 @@ int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type);
 int ply_add_comment(p_ply ply, const char *comment);
 
 /* ----------------------------------------------------------------------
- * Adds a new obj_info item 
+ * Adds a new obj_info item
  *
  * ply: handle returned by ply_create
  * comment: pointer to string with obj_info data
@@ -328,7 +330,7 @@ int ply_write_header(p_ply ply);
  * Writes one property value, in the order they should be written to the
  * file. For each element type, write all elements of that type in order.
  * For each element, write all its properties in order. For scalar
- * properties, just write the value. For list properties, write the length 
+ * properties, just write the value. For list properties, write the length
  * and then each of the values.
  *
  * ply: handle returned by ply_create
@@ -340,7 +342,7 @@ int ply_write(p_ply ply, double value);
 /* ----------------------------------------------------------------------
  * Closes a PLY file handle. Releases all memory used by handle
  *
- * ply: handle to be closed. 
+ * ply: handle to be closed.
  *
  * Returns 1 if successfull, 0 otherwise
  * ---------------------------------------------------------------------- */
@@ -353,7 +355,7 @@ int ply_close(p_ply ply);
 #endif /* RPLY_H */
 
 /* ----------------------------------------------------------------------
- * Copyright (C) 2003-2011 Diego Nehab. All rights reserved.
+ * Copyright (C) 2003-2015 Diego Nehab. All rights reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
diff --git a/vendor/rply-1.1.4/rplyfile.h b/vendor/rply-1.1.4/rplyfile.h
new file mode 100644
index 0000000..206e716
--- /dev/null
+++ b/vendor/rply-1.1.4/rplyfile.h
@@ -0,0 +1,68 @@
+#ifndef RPLY_FILE_H
+#define RPLY_FILE_H
+/* ----------------------------------------------------------------------
+ * RPly library, read/write PLY files
+ * Diego Nehab, IMPA
+ * http://www.impa.br/~diego/software/rply
+ *
+ * This library is distributed under the MIT License. See notice
+ * at the end of this file.
+ * ---------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ----------------------------------------------------------------------
+ * Opens a PLY file for reading (fails if file is not a PLY file)
+ *
+ * file_pointer: FILE * to file open for reading
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
+ *
+ * Returns 1 if successful, 0 otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_open_from_file(FILE *file_pointer, p_ply_error_cb error_cb,
+    long idata, void *pdata);
+
+/* ----------------------------------------------------------------------
+ * Creates new PLY file
+ *
+ * file_pointer: FILE * to a file open for writing
+ * storage_mode: file format mode
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
+ *
+ * Returns handle to PLY file if successfull, NULL otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_create_to_file(FILE *file_pointer, e_ply_storage_mode storage_mode,
+        p_ply_error_cb error_cb, long idata, void *pdata);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RPLY_FILE_H */
+
+/* ----------------------------------------------------------------------
+ * Copyright (C) 2003-2015 Diego Nehab. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ---------------------------------------------------------------------- */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pdal.git



More information about the Pkg-grass-devel mailing list